English | 简体中文
Vis 是一款交互式异步3D可视化工具,旨在让3D视觉和机器人应用开发更简单。
其核心功能包括:
-
图形绘制
-
3D模型文件导入
-
多种交互工具
-
Gzimo
# 安装必要的依赖项
sudo apt-get install build-essential python3-dev cmake git
# 安装libopenscenegraph
sudo apt install libopenscenegraph-3.4-dev
# 如果找不到以上版本,可以安装默认版本
sudo apt install libopenscenegraph-dev
# 下载Vis源码
git clone https://github.com/rvbust/Vis.git
# 编译
mkdir build
cd build
cmake ..
sudo make install -j
# 如果想要使用Vis的Python API,需要在文件.bashrc中加入下列指令:
export PYTHONPATH="$PYTHONPATH:/opt/RVBUST/Vis/Python"
-
安装Vis之前,请确定已经安装OSG。
-
下载OSG安装包
OpenSceneGraph-3.4.1点击下载
-
解压文件和设置路径
解压7z文件和编辑系统环境变量 Add
OSG_BIN_DIR
topath
OSG_ROOT = C:\OpenSceneGraph-3.4.1-VC2017-64-Release OSG_BIN_DIR = %OSG_ROOT%\bin OSG_INCLUDE_DIR = %OSG_ROOT%\include OSG_LIB_DIR = %OSG_ROOT%\lib
-
重启系统
python3 Setup.py install
-
- 在不同窗口共享相同场景.
# 共享场景表示两个视图会显示相同的场景。
from RVBUST import Vis
v1 = Vis.View("View1", shared = True) #< Shared表示是否共享场景.
v2 = Vis.View("View2", shared = True)
v1.Box((0,0,0), (1,1,1))
v2.Box((2,2,2), (1,1,1))
- 不共享场景
# 不共享场景表示两个视图会显示各自的场景。
v1 = Vis.View("View1", shared = False) #< Shared表示是否共享场景.
v2 = Vis.View("View2", shared = False)
v1.Box((0,0,0), (1,1,1))
v2.Box((2,2,2), (1,1,1))
在 Vis 中,只有一个共享场景。 因此,如果您打开共享,所有场景都将添加到同一个视图中。这样做的优点是一个场景可以有多个视图。 如果你在不共享场景的情况下创建视图,它将是唯一可以在其场景中使用的视图。
需要注意的是,Vis 中使用的单位都是国际标准单位制 SI,也即长度为米(m),角度单位为弧度(rad);此外,对于姿态描述,Vis中采用的是四元数形式,其中四元数的实部在最后一位,也即 (ox, oy, oz, ow) 格式。
Vis 支持常见 3D 模型文件格式,如STL,DAE,3DS等等。 Vis 暂时不支持导出模型文件。
from RVBUST import Vis
v = Vis.View("Test")
hs = v.Load(["Models/Visual/BaseLink.stl","Models/Visual/Link1.stl","Models/Visual/Link2.stl",
"Models/Visual/Link3.stl","Models/Visual/Link4.stl","Models/Visual/Link5.stl","Models/Visual/Link6.stl"],
[[0.0,0,0],[0, 0, 0],[0.05, 0, 0.33],[0.05, 0, 0.66],[0.05, 0, 0.695],[0.385, 0, 0.695],[0.385, 0, 0.615]],
[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1],[0, 0.707108, 0, 0.707105],[0, 0.707108, 0, 0.707105]])
Vis提供多种交互工具。
- 选择工具
- IntersectorMode_Polytope
在 IntersectorMode_Polytope 模式,可以通过左键点击场景的物体,并高亮显示选中的物体。(能选择点和线段,但是不能获取到选中点的坐标)
v.SetIntersectMode(IntersectorMode_Polytope)
picked_object_handle = v.Picked()
- IntersectorMode_LineSegment
在 IntersectorMode_LineSegment 模式下,可以通过左键点击场景的物体,并高亮显示选中的物体(不能选择点和线段, 可以获取到选中点的坐标)。还可以通过 Ctrl + 左键点击选择多个物体表面的点,并绘制坐标系。
v.SetInterSectMode(IntersectorMode_LineSegment)
picked_object_handle = v.Picked()
postion_normal = v.PickedPlane()
axes_handles = v.GetPickedPointAxes()
hs = v.MultiPicked()
- IntersectorMode_Point
在 IntersectorMode_Point 模式下,可以通过左键点击在一组点中选择一个点,并在选中的点的位置绘制坐标系。还可以通过 Ctrl + 左键点击选择多个点,并绘制坐标系。
v.SetIntersectMode(IntersectorMode_Point)
picked_object_handle = v.Picked()
postion_normal = v.PickedPlane()
axes_handles = v.GetPickedPointAxes()
hs = v.MultiPicked()
- IntersectorMode_Line
在 IntersectorMode_Line 模式下,可以选中用 View.Line 绘制的线段和 View.Axes 绘制的坐标系,选中的线段会变成高亮。还可以通过 Ctrl + 左键点击选择多条线段。
v.SetInterSectMode(IntersectorMode_Line)
picked_object_handle = v.Picked()
hs = v.MultiPicked()
postion_normal = v.PickedPlane()
- Gzimo
Gizmo 是一个操作场景中物体的工具,可以通过拖拉改变物体的位置和姿态。
from RVBUST import Vis
v = Vis.View("Test")
box = v.Box([0,0,0],[0.5,0.5,0.5])
axes = v.Axes([0,0,0],[0,0,0,1],1,1)
v.EnableGizmo(box,4)
v.SetGizmoDisplayScale(0.6)
Vis可以设置不同日志等级来查看对应的信息,日志等级有info,debug,warn,error:
Vis.SetLogLevel("debug")
以下是 Vis 使用的简单案例,在 Vis 窗口中展示给定尺寸的 box,用户可在窗口中对 box 进行移动。
from RVBUST import Vis
from IPython import embed
# 在Vis窗口中展示给定尺寸的box
def ShowBox():
transparent_box = v.Box([-2, 0, 0], [0.5, 0.5, 0.5], [1, 0, 0, 0.5])
normal_box = v.Box([0, 2, 0], [0.5, 0.5, 0.5], [1, 0, 0])
# 移动box
def MoveBox():
transparent_box = v.Box([-2, 0, 0], [0.5, 0.5, 0.5], [1, 0, 0, 0.5])
v.EnableGizmo(transparent_box, 4)
v.SetGizmoDisplayScale(2)
def Basic():
Vis.SetLogLevel("debug")
axes1 = v.Axes([0, 0, 0], [0, 0, 0, 1], 2, 1)
ShowBox()
MoveBox()
pass
if __name__ == "__main__":
cfg = Vis.ViewConfig()
cfg.x = 0
cfg.y = 40
cfg.width = 800
cfg.height = 600
cfg.name = "Basics"
v = Vis.View(cfg, False)
Basic()
v.Home()
from IPython.terminal import embed
ipshell=embed.InteractiveShellEmbed(config=embed.load_default_config())(local_ns=locals())