当您获得本文档时,可至 RVS 开发者社区下载 model_matching.zip 3D 模型匹配教程配套数据。解压后其内容应包括:

image-20241018132305889

其中本案例中需要用到的有:

  • RVSCommonGroup:常用的 Group 组,根据需要加载。

  • new_model.pcd:该文件为制作完成的模板点云文件。

  • match_model.xml:用于离线模板匹配,使用时需要更新 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 安装目录下运行即可。

说明:如不想调整 XML 中的文件路径。可以将 unstacking_runtime 重命名为 runtime 。

modemacthing_dir2

注:本文档所使用RVS软件版本为1.7.409,若在使用中出现问题或版本不兼容问题,请及时与我们反馈,发送邮件 rvs-support@percipio.xyz !

模板点云生成

在模板匹配流程中,需要用到模板点云。在拥有 3D 模型文件的前提下,我们需要根据 3D 模型生成模板点云,并对点云进行预处理、调整并保存。本章节主要介绍如何使用制作点云模板工具生成模板点云,包括以下步骤:

  1. 网格采样:根据给定的 3D 模型创建点云。

  2. 模板点云生成:划分点云中合适的工作区域并调整模板点云物体面与坐标系。

  3. 保存点云:保存模板点云。

网格采样

加载 3D 模型文件,使用制作点云模板网格采样将其转化为点云。

操作步骤

  1. 点击菜单栏中的create_cloud_model_resized打开制作点云模板界面,然后点击mesh_resized图标进入网格采样的设置界面。

    image-20241018095339368

  2. 点击image-20241018105534205图标加载点云模型(workpiece.obj)。

    image-20241018100054041

  3. 点击image-20241018110232700打开参数表格面板,进行参数调整:

    • leaf_size → 0.001

    • sample_points → 10000

    image-20241018102421729

  4. 点击mesh_resized图标完成网格采样。

    image-20241018103609813

模板点云生成

模板点云要求

  1. 将 3D 模型转化为点云后,根据模板匹配的作业要求,需切割点云,只保留模型点云的上表面作为工作区域。

  2. 模板匹配算子( Match3D 算子)要求输入的模板点云与实际来料物体点云的 Oxy 平面平行,且模板点云中心在 RVS 的 3D 世界坐标系的原点。

    由于实际来料物体点云位于机器人坐标系下,而机器人坐标系与 RVS 中的 3D 世界坐标系重合。因此,将模板点云进行空间变换,使得其姿态的 Oxy 平面平行于 RVS 3D 世界坐标系的 Oxy 平面,且点云中心在 RVS 的 3D 世界坐标系的原点,即可满足 Match3D 算子的输入要求。

操作步骤:

  1. 点击 image-20241018123822680 进入点云修改界面。

    image-20241018110645205

  2. 将立方体包围住所需的点云。鼠标点击立方体以显示旋转轴,通过拖拽进行旋转和移动至指定区域,也可以在左侧填写参数来移动和旋转立方体。

    image-20241018124319021

  3. 点击crop_resized图标进行裁剪。裁剪完成后在视图中显示结果。

    image-20241018124640350

  4. 点击image-20241018125558809 将模板点云中心移动至 RVS 的 3D 世界坐标系的原点。

    image-20241018130858139

  5. 将点云 RY 值填写 3.141926,将模板点云绕着 Y 轴旋转180°,使得模板点云 Oxy 平面与实际来料物体点云的 Oxy 平面平行。

    image-20241018130342877

保存点云

根据调整点云的流程后,我们获得了点云中心在RVS 中的 3D 世界坐标系原点的模板点云,现在保存该模板点云,以便在模板匹配中使用。

操作步骤:

  1. 点击image-20241018131405556 导出制作好的模板点云,输入文件名称,点击保存

image-20241018131314509

运行结果

此时可以在 runtime 目录下看到保存的 “new_model.pcd” 。

image-20241018132205887

模板匹配

在创建好模板点云后,可以进行模板匹配工作。本案例中主要依赖于 Match3D 算子进行模板匹配,Match3D 算子需要准备模型点云、场景点云。

本章节主要介绍如何进行模板匹配,包括以下步骤:

  1. 模板点云准备:加载模板点云。对点云进行稀疏化处理,提高算子执行效率。

  2. 目标点云准备:本案例有多组离线测试数据,用 Foreach-String 算子遍历读取目标点云名称,并用 Load 算子加载对应目标点云。

  3. 目标点云预处理:去除目标点云中的背景点云(如地面)。

  4. 模板匹配:Match3D 算子获得结果坐标,将模板点云根据该 pose 进行空间变换后与目标点云重合。

模板点云准备

加载模板点云。对点云进行稀疏化处理,提高算子执行效率。

操作步骤:

说明:可直接使用 model_matching/ 路径下的 match_model.xml 进行模板匹配。也可按照以下步骤自行连接 xml 。

  1. 新建工程项目match_model.xml。(可直接导入 model_matching/RVSCommonGroup 目录下的 LoadModelCloud.group,注意文件路径

  2. 在算子图中创建一个新的 Group 。添加 Trigger、Load、Emit、DownSampling 算子。

  3. 设置算子参数。

    • 设置 Group 参数:算子名称 → LoadModelCloud

    • 设置 Trigger 算子参数:类型 → InitTrigger

    说明:用于自动触发 LoadModelCloud 算子和 Emit 算子。

    • 设置 Load 算子参数:

      • 算子名称 → LoadModelCloud

      • 类型 → 点云

      • 文件 → new_model.pcd ( 已保存的 new_model.pcd 的文件路径,注意文件路径 )

      • 点云 → icon_visOn可视 → icon_color 90

    • 设置 Emit 算子参数:

      • 类型 → 坐标

      • 坐标 → 0 0 0 0 0 0

      • 坐标 → icon_visOn可视

      说明:生成基于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的空间尺度内仅取一个点。

  4. 连接算子。

    image-20240826165012092

  5. 点击 RVS 运行按钮。

运行结果

如下图所示,在 3D 视图中显示加载的模板点云和生成的原点 pose,此时的原点pose也是点云的中心点。

result_3.1.1

目标点云准备

加载测试数据,本案例有多组离线数据,因此需要使用 Foreach-String 算子进行遍历加载目标点云文件。

操作步骤:

  1. 添加 Trigger(2个)。

    • 设置 Trigger 算子参数:

      • 算子名称 → start

      • Trigger → light

    • 设置 Trigger_1 算子参数:

      • 算子名称 → iterate

      • Trigger → light

  2. 在算子图中创建一个新的 Group 。(可以直接导入 model_matching/RVSCommonGroup 目录下的 LoadTargetCloud.group,注意文件路径

  3. 添加 DirectoryOperation、Foreach、Emit(2个)、Load(2个)算子。

    • 设置 Group 参数:算子名称 → LoadTargetCloud

    • 设置 DirectoryOperation 算子参数:

      • 类型 → ReadDirectory

      • 父目录 → test_data (如果您是直接加载已有的match_model.xml,注意文件路径

      说明:这步操作用于加载离线数据文件夹。

    • 设置 Foreach 算子参数:类型 → 字符串

    • 设置 Emit 算子参数:

      • 算子名称 → image_name

      • 类型 → 字符串

      • 字符串 → /rgb.png

    • 设置 Load 算子参数:

      • 算子名称 → LoadImage

      • 类型 → 图像

      • 字符串 → icon_visOn可视

    • 设置 Emit_1 算子参数:

      • 算子名称 → cloud_name

      • 类型 → 字符串

      • 字符串 → /cloud.pcd

    • 设置 Load_1 算子参数:

      • 算子名称 → LoadPointCloud

        类型 → 点云

      • 点云 → icon_visOn可视

  4. 在交互面板中添加 2 个输入工具——“按钮”控件,鼠标双击重新命名→ start 和 iterate 。鼠标中键点击按钮,选择同名的曝光属性绑定。

    pannel_3.2.1

  5. 连接算子。

    image-20240826170112568

  6. 点击 RVS 运行按钮。点击面板上的start按钮时,触发后续算子。当点击面板上 iterate 按钮时,遍历 test_data 文件夹中的离线数据。

运行结果

如下所示,在 2D 视图中显示当前遍历的图像,在 3D 视图中显示当前遍历的点云。

result_3.2.1

result_3.2.2

点云预处理

加载测试点云数据后,需要剔除背景点云,筛选出工作区域。

操作步骤:

步骤1:裁剪点云,筛选出工作区域

  1. 添加 Emit 、CloudSegment 算子至算子图。

  2. 设置算子参数。

    • 设置 Emit 算子参数:

      • 算子名称 → EmitCube

      • 类型 → 立方体

      • 坐标→ -0.126006 -0.085611 0.621984 -3.141590 -3.117050 3.035830

      • 宽度 → 0.5

      • 高度 → 0.5

      • 深度 → 0.2

      • 立方体 → icon_visOn 可视

    • 设置 CloudSegment 算子参数:

      • 类型 → 立方体切割

      • 点云 → icon_visOn 可视 → icon_color 90

      说明:CloudSegment 算子用于根据给定的立方体切割出所需要的点云。

  3. 连接算子 。

    image-20240826165920951

  4. 点击 RVS 运行按钮。点击面板上 start按钮。

运行结果

如下图所示,下图为裁剪框前后的点云。左图为切割前点云,中间图为生成的 立方体,右图为切割后点云(绿色部分)。 resullt_3.3.1

模板匹配

经过上述步骤后,已经准备好了模型点云、场景点云,此时,我们需要使用 Match3D 算子获得最优变换结果坐标 ,将模板点云根据该 pose 进行空间变换后与目标点云重合。

操作步骤:

  1. 添加 Match3D 、Transform 算子至算子图。

  2. 连接算子。

    image-20240826142123146

  3. 右击 Match3D 算子,打开匹配3D面板

    • downsampling → 勾选

    • downsampling_leaf → 0.002

    • initial_guess_step → 4

      image-20240826143518865

  4. 点击匹配3D面板加载点云,加载场景点云。

    image-20240826143606469

  5. 点击匹配3D面板预处理,将场景点云进行降采样处理,提高算子执行效率。

    image-20240826144130785

  6. 勾选匹配3D面板显示初值猜测坐标,点云 模型点云 Oxy 和场景点云 Oxy 平面平行,但可能出现标点云 X(Y)轴转化成目标点云 Y(X)轴。因此,场景点云的最小包围框中心点坐标 ,沿着其 z 轴依次旋转 90 度总共获得 4 个 pose ,全部作为初始推测值,则可保证 4 个 pose 中必有一个接近真实值。

    image-20240826144310067

  7. 勾选匹配3D面板显示结果,显示匹配结果。

    image-20240826153922190

  8. 当匹配结果符合要求时,点击保存面板参数值设置。

    image-20240826154040976

  9. 设置 Transform 算子参数:

    • 类型 → 点云

    • 点云 → icon_visOn 可视 → icon_color 180

  10. 点击 RVS 运行按钮,点击面板上的start按钮,匹配开始。点击面板上 iterate 按钮时,迭代离线数据中的目标点云进行模板匹配。

运行结果

如下图所示。在 3D 视图中最终显示原始色彩点云为目标点云,红色为匹配前模板点云,蓝色为匹配后点云。

result_3.5.1

至此您已经完成了本文档的所有内容,感谢您的耐心查阅,相信您一定对于 RVS 软件已有所了解,可以自主创造属于您的独特项目,若在使用中出现问题,请及时与我们反馈,发送邮件rvs-support@percipio.xyz!