当您获得本文档时,可至 RVS 开发者社区下载 model_matching.zip 3D 模型匹配教程配套数据。解压后其内容应包括:
其中本案例中需要用到的有:
-
RVSCommonGroup:常用的 Group 组,根据需要加载。
-
new_model.pcd:该文件为制作完成的模板点云文件。
-
match_model.rvs:用于离线模板匹配,使用时需要更新 ReadDirectoryNames 算子中离线数据的路径和 LoadModelCloud 算子中的模板点云文件。使用时先点击交互面板中 start 按钮启动工程后,再点击 iterate 按钮迭代 test_data 中的离线数据。
-
test_data:用于模板匹配数据的加载,使用时请注意路径正确。
-
workpiece.obj:用于create_model.xml中 Load-Polydata 算子加载的 3D 模型文件。(RVS支持的模型文件格式有:*.ply *.stl *.obj *.gltf *.glb。如果当前拥有的模型文件格式不符,需要提前完成转换。)
案例所有使用到的文件均保存在 model_matching 下,请放在 RVS 安装目录下的 projects 内运行。如:
说明:若在windows版本,请放在 RVS 安装目录下运行即可。
说明:如不想调整工程项目中的文件路径。可以将 model_matching 重命名为 runtime 。
注:本文档所使用RVS软件版本为1.8.259,若在使用中出现问题或版本不兼容问题,请及时与我们反馈,发送邮件 rvs-support@percipio.xyz !
模板点云生成
在模板匹配流程中,需要用到模板点云。在拥有 3D 模型文件的前提下,我们需要根据 3D 模型生成模板点云,并对点云进行预处理、调整并保存。本章节主要介绍如何使用制作点云模板
工具生成模板点云,包括以下步骤:
-
网格采样:根据给定的 3D 模型创建点云。
-
模板点云生成:划分点云中合适的工作区域并调整模板点云物体面与坐标系。
-
保存点云:保存模板点云。
网格采样
加载 3D 模型文件,使用制作点云模板
中网格采样
将其转化为点云。
操作步骤
-
点击菜单栏中的打开
制作点云模板
界面,然后点击图标进入网格采样的设置界面。 -
点击图标加载点云模型(workpiece.obj)。
-
点击打开
参数表格面板
,进行参数调整:-
leaf_size → 0.001
-
sample_points → 10000
-
-
点击图标完成网格采样。
模板点云生成
模板点云要求
-
将 3D 模型转化为点云后,根据模板匹配的作业要求,需切割点云,只保留模型点云的上表面作为工作区域。
-
模板匹配算子( Match3D 算子)要求输入的模板点云与实际来料物体点云的 Oxy 平面平行,且模板点云中心在 RVS 的 3D 世界坐标系的原点。
由于实际来料物体点云位于机器人坐标系下,而机器人坐标系与 RVS 中的 3D 世界坐标系重合。因此,将模板点云进行空间变换,使得其姿态的 Oxy 平面平行于 RVS 3D 世界坐标系的 Oxy 平面,且点云中心在 RVS 的 3D 世界坐标系的原点,即可满足 Match3D 算子的输入要求。
操作步骤:
-
点击 进入点云修改界面。
-
将立方体包围住所需的点云。鼠标点击立方体以显示旋转轴,通过拖拽进行旋转和移动至指定区域,也可以在左侧填写参数来移动和旋转立方体。
-
点击图标进行裁剪。裁剪完成后在视图中显示结果。
-
点击 将模板点云中心移动至 RVS 的 3D 世界坐标系的原点。
-
将点云 RY 值填写
3.141926
,将模板点云绕着 Y 轴旋转180°,使得模板点云 Oxy 平面与实际来料物体点云的 Oxy 平面平行。
保存点云
根据调整点云的流程后,我们获得了点云中心在RVS 中的 3D 世界坐标系原点的模板点云,现在保存该模板点云,以便在模板匹配中使用。
操作步骤:
-
点击 导出制作好的模板点云,输入文件名称,点击
保存
。
运行结果
此时可以在 runtime 目录下看到保存的 “new_model.pcd” 。
模板匹配
在创建好模板点云后,可以进行模板匹配工作。本案例中主要依赖于 Match3D 算子进行模板匹配,Match3D 算子需要准备模型点云、场景点云。
本章节主要介绍如何进行模板匹配,包括以下步骤:
-
模板点云准备:加载模板点云。对点云进行稀疏化处理,提高算子执行效率。
-
目标点云准备:本案例有多组离线测试数据,用 Foreach-String 算子遍历读取目标点云名称,并用 Load 算子加载对应目标点云。
-
目标点云预处理:去除目标点云中的背景点云(如地面)。
-
模板匹配:Match3D 算子获得结果坐标,将模板点云根据该 pose 进行空间变换后与目标点云重合。
模板点云准备
加载模板点云。对点云进行稀疏化处理,提高算子执行效率。
操作步骤:
说明:可直接使用 model_matching/ 路径下的 match_model.rvs 进行模板匹配。也可按照以下步骤自行连接。
-
新建工程项目match_model.rvs。(可直接导入 model_matching/RVSCommonGroup 目录下的 LoadModelCloud.group,注意文件路径)
-
在算子图中创建一个新的 Group 。添加 Trigger、Load、Emit、DownSampling 算子。
-
设置算子参数。
-
设置 Group 参数:算子名称 → LoadModelCloud
-
设置 Trigger 算子参数:类型 → InitTrigger
说明:用于自动触发 LoadModelCloud 算子和 Emit 算子。
-
设置 Load 算子参数:
-
算子名称 → LoadModelCloud
-
类型 → 点云
-
文件 → new_model.pcd ( 已保存的 new_model.pcd 的文件路径,注意文件路径 )
-
点云 → 可视 → 90
-
-
设置 Emit 算子参数:
-
类型 → 坐标
-
坐标 → 0 0 0 0 0 0
-
坐标 → 可视
说明:生成基于RVS 3D世界坐标原点Pose(0,0,0,0,0,0)。
-
-
设置 DownSampling 算子参数:
-
算子名称 → DownSampling_model
-
类型 → DownSample
-
X方向采样 → 0.002
-
Y方向采样 → 0.002
-
Z方向采样 → 0.002
说明:表示在0.002m * 0.002m * 0.002m的空间尺度内仅取一个点。
-
-
-
连接算子。
-
点击 RVS 运行按钮。
运行结果
如下图所示,在 3D 视图中显示加载的模板点云和生成的原点 pose,此时的原点pose也是点云的中心点。
目标点云准备
加载测试数据,本案例有多组离线数据,因此需要使用 Foreach-String 算子进行遍历加载目标点云文件。
操作步骤:
-
添加 Trigger(2个)。
-
设置 Trigger 算子参数:
-
算子名称 → start
-
Trigger →
-
-
设置 Trigger_1 算子参数:
-
算子名称 → iterate
-
Trigger →
-
-
-
在算子图中创建一个新的 Group 。(可以直接导入 model_matching/RVSCommonGroup 目录下的 LoadTargetCloud.group,注意文件路径)
-
添加 DirectoryOperation、Foreach、Emit(2个)、Load(2个)算子。
-
设置 Group 参数:算子名称 → LoadTargetCloud
-
设置 DirectoryOperation 算子参数:
-
类型 → ReadDirectory
-
父目录 → test_data (如果您是直接加载已有的match_model.xml,注意文件路径)
说明:这步操作用于加载离线数据文件夹。
-
-
设置 Foreach 算子参数:类型 → 字符串
-
设置 Emit 算子参数:
-
算子名称 → image_name
-
类型 → 字符串
-
字符串 → /rgb.png
-
-
设置 Load 算子参数:
-
算子名称 → LoadImage
-
类型 → 图像
-
字符串 → 可视
-
-
设置 Emit_1 算子参数:
-
算子名称 → cloud_name
-
类型 → 字符串
-
字符串 → /cloud.pcd
-
-
设置 Load_1 算子参数:
-
算子名称 → LoadPointCloud
类型 → 点云
-
点云 → 可视
-
-
-
在交互面板中添加 2 个输入工具——“按钮”控件,鼠标双击重新命名→ start 和 iterate 。鼠标中键点击按钮,选择同名的曝光属性绑定。
-
连接算子。
-
点击 RVS 运行按钮。点击面板上的
start
按钮时,触发后续算子。当点击面板上iterate
按钮时,遍历 test_data 文件夹中的离线数据。
运行结果
如下所示,在 2D 视图中显示当前遍历的图像,在 3D 视图中显示当前遍历的点云。
点云预处理
加载测试点云数据后,需要剔除背景点云,筛选出工作区域。
操作步骤:
步骤1:裁剪点云,筛选出工作区域
-
添加 Emit 、CloudSegment 算子至算子图。
-
设置算子参数。
-
设置 Emit 算子参数:
-
算子名称 → EmitCube
-
类型 → 立方体
-
坐标→ -0.126006 -0.085611 0.621984 -3.141590 -3.117050 3.035830
-
宽度 → 0.5
-
高度 → 0.5
-
深度 → 0.2
-
立方体 → 可视
-
-
设置 CloudSegment 算子参数:
-
类型 → 立方体切割
-
点云 → 可视 → 90
说明:CloudSegment 算子用于根据给定的立方体切割出所需要的点云。
-
-
-
连接算子 。
-
点击 RVS 运行按钮。点击面板上
start
按钮。
运行结果
如下图所示,下图为裁剪框前后的点云。左图为切割前点云,中间图为生成的 立方体,右图为切割后点云(绿色部分)。
模板匹配
经过上述步骤后,已经准备好了模型点云、场景点云,此时,我们需要使用 Match3D 算子获得最优变换结果坐标 ,将模板点云根据该 pose 进行空间变换后与目标点云重合。
操作步骤:
-
添加 Match3D 、Transform 算子至算子图。
-
连接算子。
-
右击 Match3D 算子,打开
匹配3D面板
:-
downsampling → 勾选
-
downsampling_leaf → 0.002
-
initial_guess_step → 4
-
-
点击
匹配3D面板
中加载点云
,加载场景点云。 -
点击
匹配3D面板
中预处理
,将场景点云进行降采样处理,提高算子执行效率。 -
勾选
匹配3D面板
中显示初值猜测坐标
,点云 模型点云 Oxy 和场景点云 Oxy 平面平行,但可能出现标点云 X(Y)轴转化成目标点云 Y(X)轴。因此,场景点云的最小包围框中心点坐标 ,沿着其 z 轴依次旋转 90 度总共获得 4 个 pose ,全部作为初始推测值,则可保证 4 个 pose 中必有一个接近真实值。 -
勾选
匹配3D面板
中显示结果
,显示匹配结果。 -
当匹配结果符合要求时,点击
√
保存面板参数值设置。 -
设置 Transform 算子参数:
-
类型 → 点云
-
点云 → 可视 →180
-
-
点击 RVS 运行按钮,点击面板上的
start
按钮,匹配开始。点击面板上iterate
按钮时,迭代离线数据中的目标点云进行模板匹配。
运行结果
如下图所示。在 3D 视图中最终显示原始色彩点云为目标点云,红色为匹配前模板点云,蓝色为匹配后点云。
至此您已经完成了本文档的所有内容,感谢您的耐心查阅,相信您一定对于 RVS 软件已有所了解,可以自主创造属于您的独特项目,若在使用中出现问题,请及时与我们反馈,发送邮件rvs-support@percipio.xyz!