视觉 ========================================== 本章节将针对具体场景详细介绍视觉服务的配置过程。在进行视觉配置前,请先参见 :doc:`../../../basic_operation/robot`,完成机械臂连接。 场景要求 ++++++++++ 圆柱体抓取的场景采用 **3D 深筐乱序抓取** 模板,该流图适用于工作空间内同种物体乱序摆放,且拥有物体 STL 模型的情况。目前广泛应用于汽车零件、:term:`机加工件` 等多种场景。 - 相机为结构光相机 - 需要计算点云碰撞 本章节描述的相关配置仅供参考,具体操作请以实际项目为准。 基本配置 ++++++++++ 配置前,请依次完成 :doc:`../../../../basic_operation/newproject`、 :doc:`../../../../basic_operation/motion_operation/add_ws`,并使用 **3D深筐乱序抓取** 模板创建视觉服务,请参见 :doc:`../../../../basic_operation/vision_operation/flow`。创建完成之后会在左上角生成节点树,如下图所示。 .. image:: img/3dscene.png :align: center 根据需求,依次配置这些模块。 **步骤1\. 配置相机模块** 1. 单击左侧节点树中的 **相机** 模块,然后在右侧单击 :guilabel:`相机资源管理器` 以连接相机,接着在 **相机配置** 区域设置相机基本信息,请参见 :doc:`../../../../basic_operation/vision_operation/camera_connect`。 2. 在 **相机参数** 区域单击 :guilabel:`验证相机精度`。 .. image:: img/camconfig.png :align: center :width: 450px 3. 依次选择标定板、标定内参数、验证标定结果等步骤,以验证相机精度。 .. image:: img/intrcali.png :align: center :width: 450px **步骤2\. 配置加载标定信息模块** 1. 单击左侧节点树中的 **加载标定信息** 模块,然后在右侧依次标定相机和工作空间。 .. image:: img/caliconfig.png :align: center :width: 450px 2. 单击 **相机标定** 区域中的 :guilabel:`新建标定数据`,设置标定数据名称,然后单击 :guilabel:`编辑标定数据`,设置标定方法和其它标定信息,请参见 :doc:`../../../../basic_operation/vision_operation/calibration/handeye` 。 .. image:: img/excali.png :align: center :width: 450px 3. 依此单击 :guilabel:`开始` 和 :guilabel:`计算标定结果` 完成数据标定,然后单击 :guilabel:`下一步` 进入 **检查标定结果** 页签。 .. image:: img/excali2.png :align: center :width: 450px 4. 检查并根据界面提示确认标定误差后,单击 **完成**,即可完成相机标定。 .. image:: img/excali3.png :align: center :width: 650px 5. 若要提高精度,则勾选 :guilabel:`点云标定`,完成点云标定,请参见 :doc:`../../../../basic_operation/vision_operation/calibration/handeye` 中的步骤5点云标定的相关内容。 6. 标定工作空间,请参见 :doc:`../../../../basic_operation/vision_operation/calibration/workspace`。3D相机使用3D拖拽的方式标定工作空间。 **步骤3\. 配置ROI裁剪点云模块** 对于圆柱体抓取的项目,可以在加载标定信息之后增加 **ROI裁剪点云** 模块,使识别的区域更加准确。 1. 单击左侧节点树中的 **ROI裁剪点云** 模块,然后在右侧单击 :guilabel:`触发` 获取点云图像。 2. 在右侧基础设置里单击 **感兴趣区域配置文件** 下拉菜单中的 **新建配置文件**,然后在弹出的 **新建** 窗口给配置文件命名。也可选择并修改已有的配置文件。选择配置文件完成后如下图所示。 .. image:: img/newfile.png :align: center :width: 700px 3. 根据实际需求,选择 **感兴趣区域所在坐标系**,Max提供 **世界坐标系** 和 **相机坐标系** 两种选项,本章节以世界坐标系为例。 a. 设置 **感兴趣区域尺寸**,可手动测量工作空间实际尺寸,并在此基础上做调整,一般能够覆盖整个工作空间即可。 b. 在预览视图中拖动感兴趣区域,使之与点云中的工作空间吻合,可在手动输入数字调整位姿。设置好ROI裁剪点云后如下图所示。 .. image:: img/setroi.png :align: center :width: 700px 4. 在 **可视化** 区域查看点云图,Max提供三种类型的点云图,未切割点云、切割对比、切割后点云,如下是切割完成后的ROI区域点云。 .. image:: img/roicut.png :align: center :width: 650px 5. 单击 :guilabel:`保存`,保存感兴趣区域配置文件,也可单击 :guilabel:`重置` 修改配置文件。 **步骤4\. 配置降采样点云模块** 1. 单击左侧节点树中的 **降采样点云** 模块,然后在右侧配置降采样参数。 .. image:: img/desample.png :align: center :width: 350px - 栅格边长:将点云中的点划分到指定大小的三维栅格(即正方体)中,栅格边长越大,输出的点云越稀疏。单位:米。 - 输出点云尺寸上限值:如果该值大于0,将会进行两次采样,第二次降采样操作将会基于第一次进行。 2. 在 **可视化显示** 区域选择需要查看的图像。 - 降采样点云前:仅显示降采样前的图像。 .. image:: img/desample1.png :align: center :width: 350px - 降采样点云对比图:对比显示降采样前后的图像,被去除的点云部分用白色显示。 .. image:: img/desample2.png :align: center :width: 350px - 降采样点云后:仅显示降采样后的图像,如下是放大细节后的降采样后点云图。 .. image:: img/desample3.png :align: center :width: 350px **步骤5\. 配置去除点云噪声模块** 1. 单击左侧节点树中的 **去除点云噪声** 模块,然后在右侧配置去噪声参数,噪声即离群点。过滤方法分为Statistical和Radius两种。 **Statistical** 是基于统计的离群点过滤,运行时间比基于距离的离群点过滤方法更久,其参数配置如下: .. image:: img/statistical.png :align: center :width: 350px - 标准差倍数:过滤掉与最邻近点平均距离大于平均值+倍标准数*标准差以外的点,该值越小则过滤点越多。 - 用于统计的临近点个数:该值越大则统计越准确,但计算时间更久。 **Radius** 表示基于距离的离群点过滤,建议经验丰富的工程师使用,其参数配置如下: .. image:: img/radius.png :align: center :width: 350px - 临近点搜索半径:统计临近点数量时,只考虑该半径范围内的点,该值越大则计算时间越长。单位:米。 - 最小临近点个数:如果一个点附近的临近点数量小于该值,则会被视为噪声过滤,该值越大则过滤强度越高。 2. 在 **可视化显示** 区域选择需要查看的图像。 - 去除点云噪声前:仅显示去除点云噪声前的图像。 .. image:: img/denoise1.png :align: center :width: 350px - 去除点云噪声对比图:对比显示去除噪声前后的图像,被去除的点云用白色显示。 .. image:: img/denoise2.png :align: center :width: 350px - 去除点云噪声后:仅显示去除点云噪声后的图像,如下是放大细节之后的图像。 .. image:: img/denoise3.png :align: center :width: 350px **步骤6\. 配置3D模板匹配模块** 1. 单击 :guilabel:`创建模板`,选择一个已有的或者新建一个工具类型,新建工具类型时不可重名,且工件类型必须和注册抓取时使用的工件名称一致。然后选择模型文件,并给模板命名即可。需要修改模型时,可单击 :guilabel:`编辑模型文件` 编辑模型。 .. image:: img/3dmatch2.png :align: center :width: 450px .. hint:: 如果已有模板,单击 :guilabel:`选择模板`,直接选择包含模型的文件夹即可。 2. 根据需要选择 :guilabel:`特征类型`,如果模型表面整体较为扁平,且平面和直线较多,建议尝试edge-I/edge-II模式。:guilabel:`限制物体朝向` 建议使用no_limit,其作用是增加可抓取的朝向和角度,提升抓取概率。 3. 根据需要设置检测参数。模板匹配时,小于 :guilabel:`最小分数` 的结果将被过滤。超过 :guilabel:`最大检测数量` 的结果,也将被过滤。 .. image:: img/3dmatch3.png :align: center :width: 450px 4. 设置不同检测阶段的参数,系统会根据物体模型在点云中寻找匹配结果。 .. image:: img/3dmatch4.png :align: center :width: 450px 用户也可以查看分步执行的检测结果,各阶段参数设置如下。 - 通过 **投票** 阶段,点云中的每个关键点都会得到一个最可能对应的模型关键点和对应的位姿结果,该阶段各参数配置如下。 .. image:: img/vote.png :align: center :width: 450px 该步骤运行结果如下图所示。 .. image:: img/voteexe.png :align: center :width: 450px - 通过 **聚类** 阶段,合并相近的位姿结果,去除得票数较少的结果,该阶段各参数配置如下。 .. image:: img/cluster.png :align: center :width: 450px 该步骤运行结果如下图所示。 .. image:: img/clusterout.png :align: center :width: 450px - 通过 **粗配准** 阶段,使用ICP迭代,优化结果的精度、去除误差较大的结果,该阶段各参数配置如下。 .. image:: img/sparse.png :align: center :width: 450px 该步骤运行结果如下图所示。 .. image:: img/sparseout.png :align: center :width: 450px - 通过 **精配准** 阶段,使用ICP迭代,优化结果的精度、去除误差较大的结果,该阶段各参数配置如下。 .. image:: img/dense.png :align: center :width: 450px 5. 单击 :guilabel:`执行检测`,然后在预览区域查看检测结果。 .. image:: img/result.png :align: center :width: 700px **步骤7\. 配置工件遮挡率模块** 1. 单击左侧节点树中的 **工件遮挡率** 模块,然后在右侧配置参数。 .. image:: img/coverrate.png :align: center :width: 350px - 遮挡率计算方法:有两种计算方法,UseDetected仅考虑已检测出的工件,UseCloud使用点云计算遮挡率。 - 遮挡距离阈值:只有遮挡点与被遮挡点之间的距离大于该阈值才被认为是遮挡关系,否则会被认为是噪声而忽略。该值一般与工件的尺寸相关。单位:米。 - 遮挡图尺寸大小:增大尺寸可以提高遮挡率计算的精度,但需要提高输入点云的密度,否则会出现计算错误。 2. 单击 :guilabel:`运行`,然后在预览区选择输入、输出,查看处理后数据。单击 :guilabel:`保存` 可以存储数据。 .. image:: img/coverrate2.png :align: center :width: 550px **步骤8\. 配置去除识别工件的点云模块** 1. 单击左侧节点树中的 **去除识别工件的点云** 模块,然后在右侧配置参数。 .. image:: img/cutitem.png :align: center :width: 350px - 最大去除半径:工件表面附近一定半径内的点将被去除,通常该值为2~10毫米。 - 去除长方体primitive点云时的XY阈值:去除primitive长方体内部点云时使用的XY阈值。 - 去除长方体primitive点云时的Z阈值:去除primitive长方体内部点云时使用的Z阈值。 2. 单击 :guilabel:`运行`,然后在预览区选择输入、输出,查看处理后的点云图像。单击 :guilabel:`保存` 可以存储图像。 .. image:: img/cutitem2.png :align: center :width: 550px 流图详解 ++++++++++ 视觉流图的配置是Max中的高级用法,对于一般用户而言,配置完节点树中的模块即可运行整个视觉流程,无需再配置视觉流图。视觉流图中包含了节点树中没有的模块,可以配置一些高级参数,如有需要可以按照以下内容操作。 3D深筐乱序抓取场景的标准视觉流图配置如下。 1. 创建工作空间,使用 **3D深筐乱序抓取** 模板创建流图,请参见 :doc:`../../../../basic_operation/vision_operation/flow`。创建成功的视觉流图如下。 .. image:: img/deeptote.png :align: center :width: 700px 2. 配置 **相机** 模块,获取彩色图、深度图及点云。请参见 :doc:`../../../../basic_operation/vision_operation/camera_connect`。 3. 配置 **加载标定信息** 模块,请参见 :doc:`../../../../basic_operation/vision_operation/calibrate`。 4. 基于步骤3得到的点云,配置 **ROI裁剪点云** 模块,仅保留裁剪框内的点云。 5. 基于步骤4得到的点云,配置 **降采样点云** 、 **去除点云噪声**,合理降低点云数量,去除噪声。然后配置2个 **变换点云坐标系** 模块,分别如下。 a. 配置一个 **变换点云坐标系** 模块,得到工作空间坐标系下的点云,用于计算工件遮挡率。 b. 再配置一个 **变换点云坐标系** 模块,得到世界坐标系下的点云,用于去除识别工件的点云。 .. image:: img/movenoise.png :align: center :width: 350px 6. 结合步骤3得到的彩色图和步骤4得到的点云,配置 **3D模板匹配**,得到3D工件位姿、工件点云,也可通过 **保存图像**、**可视化图像** 模块保存或查看彩色图。 7. 基于步骤4得到的3D工件位姿,配置 **变换工件位姿3D** ,得到世界坐标系下的3D工件位姿。 8. 基于步骤7的位姿,再结合步骤4得到的工件模型点云和步骤5.a得到的工作空间坐标系下的点云,配置 **工件遮挡率计算** 模块,得到工件的3D位姿。然后通过 **变换工件位姿3D** 模块的到世界坐标系下的工件3D位姿,并使用 **发布3D位姿** 模块查看3D位姿。 9. 结合步骤5.b得到世界坐标系下的点云、步骤6得到的工件点云、步骤8得到的工件3D位姿,配置 **去除识别工件的点云** 模块用于去除已检测工件所在位置的点云。 10. 结合步骤8得到的工件3D位姿、步骤9得到的点云,使用 **输出结果** 模块输出识别到的工件的位姿和点云图像。 11. 重复上述步骤,完成其它料筐的视觉流图的设置。