通过ROS控制真实机械臂(17) — 视觉抓取之ORK实现三维物体识别

142
0
2021年2月13日 09时39分

视觉抓取中非常重要的一个部分就是对抓取物体的识别,无论是二维图像还是三维点云,在ROS中都可以找到对应的功能包,https://blog.csdn.net/qq_34935373/article/details/103757619该篇博客就基于模板匹配算法的find_object_2d包进行了简单的测试,本次测试的是三维的物体识别的框架,该框架是基于物体的三维模型进行训练并识别,大致的思想也是模板匹配。

 

本文参考:http://wg-perception.github.io/ork_tutorials/tutorial03/tutorial.html#setup-the-working-environment

 

一、ORK功能包下载安装:

 

$ sudo apt-get install ros-indigo-object-recognition-kitchen-*


ORK框架中提供了很多子功能包:

 

  • object-recognition-core:核心功能包,提供物体识别算法以及模型训练和数据库配置
  • object-recognition-linemod:基于OpenCV中linemod方法的物体识别,擅长刚性物体的识别
  • object-recognition-tebletop:用于同一平面上pick-and-place操作中的物体识别方法
  • object-recognition-tod:基于物体外部纹理识别方法
  • object-recognition-reconstruction:三维物体重建,基于RGBD摄像头
  • object-recognition-render:渲染相关
  • object-recognition-msgs:ROS话题相关
  • object-recognition-capture:通过3D视图获取物体信息
  • object-recognition-transparent-objects:识别和物体位姿估计
  • object-recognition-ros-visualization:可视化显示的RViz插件

ROS源码包链接:https://github.com/wg-perception/ork_tutorials/

 

二、ORK功能包使用:
由于该框架的思想也是模板匹配,大致使用的流程为:

 

  1. 创建需要识别的物体模型,建立模型数据库
  2. 针对模型进行训练,生成识别模型模板
  3. 使用训练后的识别模型实现物体识别

    1. # 创建数据库,需要用到CouchDB工具
      $ sudo apt-get install couchdb
      # 安装完成,可以使用一下命令测试是否安装成功
      $ curl -X GET http://localhost:5984
      输出:{“couchdb”:“Welcome”,“uuid”:“c5c9d1857cc3677dd54a658c744bf51e”,“version”:“1.5.0”,“vendor”:{“version”:“14.04”,“name”:“Ubuntu”}}
      # 在数据库中创建一条可乐罐模型数据
      # 名字可以修改,接着在自己的资料库查看是否已经新增了该物体,将id记录下来
      $ rosrun object_recognition_core object_add.py -n “coke “ -d “A universal can of coke”
      # 把可乐罐模型加入到数据库中
      $ rosrun object_recognition_core mesh_add.py <YOUR_OBJECT_ID> <path to ork_tutorials/data/coke.stl>
      $ rosrun object_recognition_core mesh_add.py 0be612246c9b0a00baaa4adefb0009eb ~/catkin_ws/src/ork_tutorials/data/coke.stl –commit
      # 训练模型
      $ rosrun object_recognition_core training -c `rospack find object_recognition_linemod`/conf/training.ork
      # 启动深度相机kinect
      $ roslaunch freenect_launch freenect.launch
      或者
      $ roslaunch zed_wrapper_ros zedm.launch
      # 修改点云的话题映射,话题要一一匹配
      # 三维物体识别 (通过三维点云数据),使用linemod刚体方法
      $ rosrun object_recognition_core detection -c `rospack find object_recognition_linemod`/conf/detection.ros.ork
      # 三维物体识别 (通过三维点云数据),使用tabletop物体抓取方法
      $ rosrun object_recognition_core detection -c `rospack find object_recognition_tabletop`/conf/detection.ros.ork
      # RViz可视化
      $ rosrun rviz rviz

    目标的3D姿态估计是一个非常有意思的问题对于刚性的目标,我们的三维姿态可能是一个6DoF的Pose,对于柔性的物体,这个姿态就复杂一点,通常直接给出重建出来的目标模型(mesh)。

    对于刚性的目标:如果是纹理丰富,特征点比较多的物体,最简单直接的方式莫过于直接通过特征点对来直接计算Pose了。如果没有特征点,现在流行的做法应该是使用梯度信息了。比较流行的是linemod。http://campar.in.tum.de/Main/StefanHinterstoisser

    git clone http://github.com/wg-perception/object_recognition_coregit clone http://github.com/wg-perception/linemodgit clone http://github.com/wg-perception/ork_renderer

    linemod 的基本思路是以CAD模型为出发点,提取离散的normal(就是与梯度方向垂直的一个方向向量),然后去原图里面做金字塔搜索。思路很朴实,技巧主要在于实现上,毕竟速度还是很重要的。linemod使用了图像normal和来自于深度摄像头的曲面normal,两个都是离散采样的。在实际中如果场景比较复杂,由于normal本身只有位置和方向属性,很容易出现误检,所以也有人在这一点上下功夫,回过头来利用颜色等信息来减少一些误检。另外,现在能买到的商业深度传感器的精度和范围都存在较强的限制,所以还是有很多人在想着直接使用双目视觉的方式来估算梯度,甚至加入一些Bias,通过单张图来估计物体表面的Normal。但是这些方法现在大多比较慢,在实际中很难用上。因为这些算法对精度要求高,并且不需要dense,所以工业上会有厂商用激光扫描获取一个稀疏的深度图,然后利用这个深度图来做一些工作。基于CAD模型的3D目标姿态估计的另外一个方向是减少CAD生成的模型跟实际模型之间的差异性,毕竟CAD出来的图,跟现实中图的光照条件等还是很不一样的,这个时候,哎,讨巧的人就幸运了,比如最新的ICCV2015有一篇论文,学习一个卷积网络来比较CAD出来的图像和实际中的图像,期望能去掉光照等因素的影响,典型的老思路用在新地方……是值得在实际中尝试的。

 

4. 2D图片中框出的物体上的点在物理世界座标中距离相机成像平面的距离对于RGB,可以利用geometry来求解,比如CVPR17上的Deep3DBox和Deep MANTA 论文。

在Deep3DBox 中,已知2D box、orientation、3D size,利用3D box 投影到图像上的顶点和2D box 的边的对应关系可以求解出物体的3D坐标。

在Deep MANTA中,已知2D keypoints、3D size,首先通过CAD model 获得3D keypoints,

然后求解PnP就可以得到物体的3D坐标和orientation。这类方法的3D定位精度本质上受限于重投影误差,

而keypoints、2D box 的定位精度是有限的,所以瓶颈也很明显。如果有RGB-D,玩法就更多了,

你不一定要先得到2D box再求解3D坐标,你还可以直接在点云里面做。

发表评论

后才能评论