ROS探索总结(六十八)—— 古月私房课 |“手眼”结合完成物体抓取应用

  • 内容
  • 评论
  • 相关

~欢迎关注~

微信公众号:古月居

新浪微博:古月春旭

知乎专栏:古月居

原文链接:古月私房课 | “手眼”结合完成物体抓取应用

 

古月居联合深蓝学院推出的“古月私房课”第一弹——《ROS机械臂开发:从入门到实战》已经上线啦,欢迎各位小伙伴前来围观,以下是第九讲《“手眼”结合完成物体抓取应用》的内容精要。

大家好,这里是《ROS机械臂开发:从入门到实战》的第九讲——“手眼”结合完成物体抓取应用,我是主讲人胡春旭。

幻灯片1

视觉是机械臂应用中的关键传感器,上讲我们在仿真环境中实现了物体在图像坐标系下的识别,本讲我们继续结合机械臂实现视觉抓取。

幻灯片2

在正式开始前,我们先来了解下视觉抓取中的关键技术。

幻灯片3

以下几个视频展示了一些典型视觉抓取的案例,无论摄像头安装在机械臂上,还是固定在周围环境中,都需要确定相机和机械臂本身的位置关系,视觉识别方面不仅要完成物体位置的识别,还需要分析抓取姿态。

幻灯片4

我们来整理下其中涉及的关键技术,主要是以下四个方面,接下来我们看看在这四个部分中,ROS分别有哪些包可以为我们提供支持。

幻灯片5

首先是手眼标定,也就是相机内参和外参的标定,上讲我们已经详细介绍了camera_calibration功能包实现相机内参标定的过程。

幻灯片6

在外参标定方面,ROS也提供了不少好用的功能包,本讲第二节会详细介绍外参的标定原理和easy_handeye功能包的使用方法。

幻灯片7

视觉抓取中非常重要的一个部分就是对抓取物体的识别,无论是二维图像还是三维点云,在ROS中都可以找到对应的功能包,如果需要机器学习的话,也可以集成Tensorflow轻松实现。

幻灯片8

抓取姿态分析是视觉抓取中的一个难点,因为生活中物体种类和摆放场景的复杂度太高,谷歌曾尝试用几十台机械臂进行抓取训练,最终还是由于无法大规模推广而放弃,有兴趣的小伙伴可以试下ROS中这些姿态分析的功能包。

幻灯片9

除了以上技术外,机械臂的运动规划当然也是重头,这也是ROS MoveIt!最擅长的部分。

幻灯片10

手眼标定是机械臂中非常重要的一项功能,第二个部分我们就一起来学习下手眼标定的原理和应用。

幻灯片11

手眼标定的场景主要有以下两种,一种是眼在手外,这种场景下我们已知机械臂终端tip_link与base_link、相机camera_link与识别物体object_link之间的关系,需要求解camera_link与base_link之间的变换;两外一种是眼在手上,这种场景是求解camera_link与tip_link之间的变换。

幻灯片12

分别来看两种场景的标定原理,通过采样多个标定位姿下的图像数据,我们可以得到以下公式,最终无论哪种场景,都可以简化为AX=XB的求解问题。

幻灯片13

幻灯片14

在ROS中,有一个开源的手眼标定功能包——easy_handeye,它为我们提供了一套可视化工具,可以完成眼在手上与眼在手外两种场景的外参标定。

幻灯片15

我们也在PROBOT Anno机器人上做了测试,通过以下两个可视化工具,完成17个点的运动采样后,即可自动完成参数的计算。

幻灯片16

手眼标定最终得到了camera_link和base_link之间的坐标变换,那这个数据我们该如何使用呢?且看接下来的分解。

幻灯片17

在上讲中,我们已经完成了绿色物体在图像坐标系下的识别,大家运行本讲例程,将会看到进一步的视觉抓取例程效果。在该例程中,我们将物体在图像坐标系下的位置,变换到机器人base_link下的位姿,并且控制机器人完成抓取动作。

幻灯片18

代码中的关键部分如下,调用上讲的visionManager完成物体识别,然后将图像坐标系变换到相机坐标系,接着再左乘相机与机器人坐标系的变换矩阵,即可得到物体在机器人坐标系下的位姿,这里的camera_to_link_其实就是手眼标定的求解目标。

幻灯片19

在例程仿真中,相机的位置是在URDF中已知的,此处就省略了标定过程,直接通过tf获取。

幻灯片20

使用同样的流程和第二节标定得到的结果,我们在PROBOT Anno机器人上实现了视觉分拣应用,视频中大家可以看到easy_handeye标定的精度完全可以满足应用的需要。

幻灯片21

以上就是本讲的内容精要,详细讲解和仿真/真机演示过程请见具体课程。

幻灯片22

更多精彩,欢迎大家关注“古月居”。

幻灯片25

 

更多内容欢迎关注:

微信公众号:古月居 (guyue_home)

新浪微博:古月春旭

知乎专栏:古月居

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

4条评论
  1. Gravatar 头像

    进击的小胖 回复

    古月老师您好,我想请问一下您easy_handeye功能包是否只能适用于UR5这种有6个关节的机械臂上,之前采用4关节的turtlebot_arm进行手眼标定发现点击checking start pose时会报错。

  2. Gravatar 头像

    絮絮 回复

    古老师,我根据您到相关书籍和资料想将easy_hand运用到我自己到机器人上,但三遇到点问题(内参已经设置好,个人感觉是launch文件改写的有点问题)
    以下是我的错误:
    [FATAL] [1564968761.109970896]: Group 'manipulator' was not found.
    PluginManager._load_plugin() could not load plugin "rqt_easy_handeye/Hand-eye Calibration automatic movement":
    Traceback (most recent call last):
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/qt_gui/plugin_handler.py", line 99, in load
    self._load()
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/qt_gui/plugin_handler_direct.py", line 54, in _load
    self._plugin = self._plugin_provider.load(self._instance_id.plugin_id, self._context)
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/qt_gui/composite_plugin_provider.py", line 71, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/qt_gui/composite_plugin_provider.py", line 71, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/rqt_gui_py/ros_py_plugin_provider.py", line 60, in load
    return super(RosPyPluginProvider, self).load(plugin_id, plugin_context)
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/qt_gui/composite_plugin_provider.py", line 71, in load
    instance = plugin_provider.load(plugin_id, plugin_context)
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/rqt_gui/ros_plugin_provider.py", line 101, in load
    return class_ref(plugin_context)
    File "/home/zx/catkin_ws2/src/easy_handeye/rqt_easy_handeye/src/rqt_easy_handeye/rqt_calibrationmovements.py", line 296, in __init__
    self._widget = CalibrationMovementsGUI()
    File "/home/zx/catkin_ws2/src/easy_handeye/rqt_easy_handeye/src/rqt_easy_handeye/rqt_calibrationmovements.py", line 149, in __init__
    self.local_mover = CalibrationMovements(move_group_name, max_velocity_scaling, max_acceleration_scaling)
    File "/home/zx/catkin_ws2/src/easy_handeye/rqt_easy_handeye/src/rqt_easy_handeye/rqt_calibrationmovements.py", line 26, in __init__
    self.mgc = MoveGroupCommander(move_group_name)
    File "/opt/ros/kinetic/lib/python2.7/dist-packages/moveit_commander/move_group.py", line 52, in __init__
    self._g = _moveit_move_group_interface.MoveGroupInterface(name, robot_description, ns)
    RuntimeError: Group 'manipulator' was not found.
    以下是我修改到launch文件:

    <!-- -->

    希望古老师可以指点迷津

    • 古月

      古月 回复

      @絮絮 提示报错manipulator不存在,请检查你的group名称

  3. Gravatar 头像

    汤波西 回复

    古月老师您好,我想请问下您参考的PROBOT Anno手眼标定步骤有链接吗,方便的话麻烦发我一份哦,谢谢

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据