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

6112
15
2019年4月25日 20时40分

~欢迎关注~

微信公众号:古月居

新浪微博:古月春旭

知乎专栏:古月居

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

 

古月居联合深蓝学院推出的“古月私房课”第一弹——《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)

新浪微博:古月春旭

知乎专栏:古月居

发表评论

后才能评论

评论列表(15条)

  • R.D 2020年4月16日 下午3:56

    古月老师您好,我想问一下如何通过kinect获得指定x,y位置的深度值? 有相关项目或者代码吗,我找不到,谢谢您!

  • R.D 2020年3月21日 下午10:02

    古月老师您好,我最近在做视觉抓取,我尝试用欧拉角来描述末端姿态,因为相机获得目标物体的x,y,theta相对容易,且不知道如何从相机画面中获取四元数。但是注意到您教程中的手眼标定获得的关系是用四元数描述的,easy_hand_eye也可以把标定用欧拉角表示吗?如果继续用欧拉角,在坐标变换的时候仍然是两个矩阵相乘即可获得obj_to_robot的坐标吗?有什么方法解决我的问题吗,谢谢古月老师!!!

    • 古月 回复 R.D 2020年3月25日 下午8:26

      欧拉角和四元数是两种姿态的描述方式,本质都是一样的,所以使用哪个并不影响原理

    • R.D 回复 古月 2020年4月6日 下午7:25

      谢谢老师解答!还有两个问题麻烦您看看:第一个问题,那如果我想用欧拉角。是用setRPYtarget这个接口吗?可我注意到这个接口没有x,y,z. 如果用setPoseTarget,只能用四元数;第二个问题,欧拉角描述的话,坐标变换也是那两个坐标转换矩阵相乘后得到obj_to_robot吗

  • 古月光翟氵青 2020年2月21日 上午12:01

    古月老师您好,请问您在深蓝学院还会开关于ROS机械臂开发的课程吗?希望学习一下,谢谢老师!

  • 古月光翟氵青 2020年2月13日 下午11:25

    古月老师您好,请问能不能推荐一个移动抓取机器人实例提供参考,可以实现底盘移动和机械臂控制的功能。我曾尝试解读PR2机器人的功能包但发现功能包之间的依赖关系有点复杂较难理清,曾在硅步机器人的Github上找到过Rabbot机器人的源代码但仿真的时候有bug,机器人可以在Gazebo中显示但无法进行移动。谢谢古月老师!

  • 邓123 2019年11月12日 下午6:10

    古老师,您好,我最近在做手眼标定,运行launch文件后,出现了几个问题,麻烦您帮我看一下
    process[joint_trajectory_action-6]: started with pid [8311]
    process[dummy_handeye-7]: started with pid [8324]
    process[abb_irb120_handeyecalibration_eye_on_hand/hand_eye_solver-8]: started with pid [8330]
    ERROR: cannot launch node of type [easy_handeye/calibrate.py]: can’t locate node [calibrate.py] in package [easy_handeye]
    [ INFO] [1573551978.038486415]: Initializing nodelet with 4 worker threads.
    process[rviz_dc_8254_8360124234510486947-10]: started with pid [8347]
    process[abb_irb120_handeyecalibration_eye_on_hand/namespace_dc_8254_8064152389405360297_rqt-11]: started with pid [8357]
    ERROR: cannot launch node of type [rqt_easy_handeye/rqt_calibrationmovements]: can’t locate node [rqt_calibrationmovements] in package [rqt_easy_handeye]
    [ INFO] [1573551978.083530939]: RealSense ROS v2.2.3
    [ INFO] [1573551978.083789933]: Running with LibRealSense v2.29.0

  • 进击的小胖 2019年8月29日 下午3:10

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

  • 絮絮 2019年8月5日 上午9:40

    古老师,我根据您到相关书籍和资料想将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文件:

    <!– –>

    希望古老师可以指点迷津

    • 古月 回复 絮絮 2019年8月6日 下午3:27

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

    • 15kuw_4428 回复 絮絮 2020年1月30日 下午12:28

      你好 你遇到的问题解决了吗? 我也在做机械臂开发 现在在手眼标定上遇到点问题 能一块儿聊聊吗?

  • 汤波西 2019年6月12日 下午4:39

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