视觉 ========================================== .. |2drange| image:: img/2drange.png :width: 30px .. |rangeselect| image:: img/rangeselect.png :width: 30px 本章节将针对具体场景详细介绍视觉服务的配置过程。在进行视觉配置前,请先参见 :doc:`../../../basic_operation/robot`,完成机械臂连接。 场景要求 ++++++++++ 料箱拆码垛的场景采用 **类料箱拆垛(高精度)** 模板,该流图适用于平铺、紧密摆放、同种已知规格的料箱类物体(如料箱、圆桶、轮胎等)识别及拆码垛。 - 需要装备高精度相机,如结构光相机,且支持混拆 - 需要使用3D相机的彩色图进行2D模板匹配 - 需要使用3D相机的点云和物体CAD模型进行模型点云匹配 本章节描述的相关配置仅供参考,具体操作请以实际项目为准。 基本配置 ++++++++++ 配置前,请依次完成 :doc:`../../../../basic_operation/newproject`、 :doc:`../../../../basic_operation/motion_operation/add_ws`,并使用 **类料箱拆垛(高精度)** 模板创建视觉服务,请参见 :doc:`../../../../basic_operation/vision_operation/flow`。创建完成之后会在左上角生成节点树,如下图所示。 .. image:: img/totevision.png :align: center 根据需求,依次配置这些模块。 **步骤1\. 配置相机模块** (请参见 :doc:`../../../basic_operation/vision_operation/camera_connect`。) **步骤2\. 配置加载标定信息模块** (请参见 :doc:`../../../basic_operation/vision_operation/calibration/handeye`。) **步骤3\. 配置去除料筐外点云模块** 1. 单击左侧节点树中的 **去除料框外点云** 模块,然后在右侧配置点云切割参数,然后单击预览窗口中的 :guilabel:`触发`。 .. image:: img/toteout.png :align: center :width: 350px - X方向收缩长度:料筐沿X方向的收缩长度,负值则意味着扩张。 - Y方向收缩长度:料筐沿Y方向的收缩长度,负值则意味着扩张。 - 底部抬升高度:料筐底部抬升高度,负值则意味着下降。 - 顶部下降高度:料筐顶部下降高度,负值则意味着抬升。 2. 在预览视图中移动料筐模型,使之与点云中的料筐位置吻合。 3. 在 **可视化显示** 区域选择需要查看的图像。 - 未切割点云图:仅显示未去除料筐外点云的图像。 .. image:: img/cloud1.png :align: center :width: 350px - 切割对比图:对比显示切割前后的图像,被切割的点云用白色显示。 .. image:: img/cloud2.png :align: center :width: 350px - 切割完点云图:仅显示去除料筐外点云的图像。 .. image:: img/cloud3.png :align: center :width: 350px **步骤4\. 配置计算最高层高度模块** 1. 单击左侧节点树中的 **计算最高层高度** 模块,然后在右侧配置计算参数。该模块用于计算抓取后,输入工件所在区域的高度,然后通过抓取前后高度差获取工件高度。 .. image:: img/height.png :align: center :width: 350px - 顶层最少点数:最高层的最少点云数量,可根据麻袋大小进行调整。 - 输出高度的坐标系:输出的高度所在坐标系。Tote表示工作空间坐标系,World表示将高度转换到世界坐标系。 - 降采样栅格大小:增大该值会使点云更稀疏,仅用于减少噪点。单位:米。 - 层厚:点云划分每一层的厚度,该值建议经验丰富的工程师使用,一般使用者不建议使用。单位:米。 - 提取点云范围:提取最高层上下该值范围内的点云,为后续模块过滤非最高层麻袋点云,以防止误识别。单位:米。 - 输出点云的类型:Dense模式表示点云线性存储,不存在无效点;Organized模式表示点云存储在2D结构中,包含无效点。 2. 在预览区选择输入、输出,再单击 :guilabel:`运行` 或 :guilabel:`重新拍照后运行`,查看处理后的输出结果。 .. image:: img/heightresult.png :align: center :width: 600px **步骤5\. 配置生成高度图模块** 1. 单击左侧节点树中的 **生成高度图** 模块,然后在右侧配置计算参数。该模块用于将料箱坐标系下的点云投影到料箱底面,形成高度图。 .. image:: img/heightmap.png :align: center :width: 350px - 像素大小:每个像素对应的物理尺寸的大小。 - 可视化像素值:一个像素值对应的高度数值。 2. 在预览区选择输入、输出,再单击 :guilabel:`运行` 或 :guilabel:`重新拍照后运行`,查看处理后的输出结果。 .. image:: img/hmapresult.png :align: center :width: 600px **步骤6\. 配置2D形状匹配模块** 1. 创建模板。 a. (可选,该步骤仅对 **眼在手上** 的场景生效,眼在手外的场景请跳过此步骤。)单击Max右上角的 :guilabel:`设置拍照位姿`,在弹出的窗口中设置视觉服务、相机ID,单击 :guilabel:`获取机械臂位姿`,然后单击 :guilabel:`设置拍照位姿` 即可获取最新的拍照位姿。 .. image:: img/train8.png :align: center :width: 450px b. 单击左侧节点树中的 **2D形状匹配** 模块,在 **检测物体** 页签下单击 :guilabel:`创建模板` 开始训练工件模板。本项目选择 **从图片训练模板** ,如果有3D模型也可选择 **从3D模型训练模板**。如果有已训练好的模板,可以直接选择模板检测物体。 .. image:: img/train0.png :align: center :width: 450px c. 在 **训练工件模板** 页签单击 :guilabel:`创建工件类型` 并给工件类型命名,工件模板名称默认与工件类型名称相同,用户可自行修改。测量工件尺寸,并输入工件长、宽、高。然后根据需求设置基础参数,开始训练工件模板。 .. image:: img/train1.png :align: center :width: 450px 2. 训练模板。 a. 在预览窗口单击 :guilabel:`单次拍照` 获取图像,然后设置检测区域,检测区域尽量贴合工件边缘。如下图所示,是设置好检测区域的结果。 使用 |rangeselect| ,拖动矩形框修改尺寸和位置。如果不满意,可单击预览区左侧的 |2drange|,调整矩形尺寸和位置,也可使用 |rangeselect| 重新设置检测区域。 .. image:: img/train2.png :align: center :width: 450px b. 设置物体中心,对于料箱,尽量贴近矩形的几何中心。设置时,可以选中并拖动坐标系进行移动和旋转,使其基本位于模型中心,x轴(红)沿料箱长边方向,y轴(绿)沿料箱短边方向。 .. image:: img/train3.png :align: center :width: 450px .. |extract| image:: img/extract.png :width: 20px c. 单击 |extract|,根据需要调整对比度,然后单击 **提取一次** 获取特征点。 .. image:: img/extract2.png :align: center :width: 500px 自动提取的特征点如下图所示。 .. image:: img/extract3.png :align: center :width: 500px .. hint:: - Max提供三种注册物体特征的方式:圆形、矩形、自定义图形。对于不规则工件,用户可选择自定义图形,手动勾画特征点并连接成线,尽量与工件边缘保持贴合以更好地注册物体特征。 - 在训练模板时,注意打光方式,使得工件的阴影区域越小越好。 e. 单击 :guilabel:`保存并训练` Max自动完成工件模板训练,然后单击 :guilabel:`完成` 可使用训练好的模板。 3. 检测物体。 a. 在 :guilabel:`检测物体` 页签选择已训练完成的工件模板。 .. image:: img/train5.png :align: center :width: 450px b. 设置显示参数,用户可根据需要选择是否显示匹配点、分数和边缘。 c. 设置检测参数,各参数含义如下。 - 最小检测分数:最大为100,分数越高匹配越准确,但匹配的数量可能减少。 - 有效检测数量:检测物体的最大数量,最小值为1。 - 检测对比度:数值越小,边缘越多,检测速度越慢,精度不一定提升。 - 弱检测对比度:处于该值与对比度之间的点会根据连接性进行选择,可增加边缘点连续性。 - 非极大值抑制分数:检测出来的两个物体的交并比(重叠区域面积/两物体总面积)大于该值时,检测分数低的物体会被略去。 - 启用所有物体非极大值抑制:是否启用所有类型物体的非极大值抑制。 - 扩增像素和金字塔:图像金字塔梯度扩增像素数。 d. 单击 :guilabel:`运行检测`,开始检测物体,根据显示参数的设置会在图像预览区显示结果。 .. image:: img/train6.png :align: center :width: 450px **步骤7\. 配置生成图像掩膜模块** 1. 单击 **生成高度图** 模块,然后单击 **获取输入数据**,以获取物体位姿。 .. image:: img/mask1.png :align: center :width: 600px - 像素大小:每个像素对应的物理尺寸的大小。 - 可视化像素值:一个像素值对应的高度数值。 2. 在列表中选中物体,然后单击“上表面蒙板”的 **注册**。 .. |draw| image:: img/draw.png :width: 20px 3. 选中 |draw| ,勾勒出料箱的外边框和内边框。然后单击 **生成上表面蒙板** 即可生成掩膜。再单击 **完成** 即可注册完成。 .. image:: img/mask2.png :align: center :width: 600px 4. 在 **设置上表面蒙板和模型** 页签下单击 **应用蒙板** ,后续模块即可使用该掩膜。 .. image:: img/mask3.png :align: center :width: 600px **步骤8\. 配置加载点云模块** 单击 **加载点云** 模块,加载指定路径下的点云或模型。 .. image:: img/loadcloud.png :align: center :width: 600px 加载点云支持3种模式。 - file:不使用输入端口的数据,读取指定路径的点云或模型。 - correspondence:此模式使用输入端口0的3D工件,根据工件名读取对应的点云或模型。 - auto:此模式使用输入端口1的字符串,根据解析得到的路径读取的点云或模型。 参数设置及其含义如下。 - 文件:3D模型路径,支持pcd、ply和stl格式。 - 路径:点云或模型文件夹路径。 - 采样点个数:stl模型采样点个数。 - 是否缓存:是否缓存,如果不缓存,则每次运行强制重新读取。 **步骤9\. 配置顶层点云覆盖度检查模块** 1. 单击 **顶层点云覆盖度检查** 模块,然后在右侧配置计算参数。通过最高层的点云和已经检测到的3D物体,来检查最高层点云是否已经被完全覆盖,若没有覆盖则说明漏检。 - 请尽可能保证输入点云没有除工件之外的其他扰乱点,比如地面点云。 .. image:: img/topcover.png :align: center :width: 350px - 模式:可选择relative、points_num两种模式。 - relative:根据未覆盖率检查顶层点云覆盖度。未覆盖率=未覆盖点数量/每个物体平均点数量。未覆盖率越小,未覆盖点越少。如果未被覆盖率大于完整度阈值,完整度检查失败。 - points_num:比较未被覆盖点个数和最大允许的未被覆盖点个数,如果未被覆盖点个数大于最大允许的未被覆盖点个数,完整度检查失败。 - z轴阈值:决定一个点经过投影后是否在3D物体内部的z轴阈值。 - x/y轴阈值:决定一个点是否在3D物体内部的xy轴阈值。 - 完整度阈值:该参数仅在relative模式下有效,表示未覆盖率阈值。 - 最大允许的未被覆盖点个数:该参数仅在points_num模式下有效。 2. 依次单击 **运行并获取输入数据** 和 **检测**,检测通过会有弹窗提示。若未通过检测,请调整前面步骤中的参数。 .. image:: img/coverok.png :align: center :width: 350px