Bootstrap

UR10e+d405相机 easy_handeye眼在手上标定过程记录

具体环境搭建可以参考我之前的这篇博客UR10e+D435+ag95夹爪 gazebo 仿真记录(三)D405相机在ROS1中利用官方的包是无法识别的需要修改realsense-ros->realsense2_camera->include->constants.h,第37行D405部分为,即可。

const uint16_t RS405_PID        = 0x0B5B; // DS5U

具体流程参考了这篇知乎文章,整体过程是比较顺利的,这里简单记录一下,主要说说遇到的问题RM机械臂与Realsense D435手眼标定教程 - 知乎 (zhihu.com)

主要用的包有Universal_Robots_ROS_Driver,easy_handeye,aruco_ros,realsense-ros这四个功能包。

一、准备工作

首先要把相机安装到机械臂的末端,这个就不细说了,自己根据需求设计工装安装吧(●ˇ∀ˇ●)

然后就是把数据线都接好,相机的数据线和UR机械臂的网线。具体的配置啥的参考我之前写的这篇博客通过PC驱动真实UR10e机械臂(ROS)_S1aoXuan_的博客-CSDN博客

因为要用到aruco码,所以我们需要打印出来一个,可以从这个网站自行选择Marker ID 和 Marker Size,这两个参数后续需要输入所以务必记住。建议就用Original ArUco的582ID(因为默认是这个,能少改一点是一点吧○| ̄|_)Online ArUco markers generator (chev.me)

二、文件配置

1.aruco_ros single.launch 修改

复制粘贴一个aruco_ros/aruco_ros/launch文件夹下的single.launch文件,进行修改,修改完之后是这样。

修改前面的配置选项,markerId和markerSize根据之前打印时选择的设定。

修改ref_frame为相机的坐标系,对于Realsense相机都是camera_color_frame。

修改节点aruco_single下面的配置文件,对于相机话题不确定的可以在ros中启动自己的相机,通过rostopic去寻找对应的话题。

  • <remap from="/camera_info" to="/camera/color/camera_info" />:将/camera_info重映射为对应Realsense实际发布的相应的Topic即/camera/color/camera_info
  • <remap from="/image" to="/camera/color/image_raw" />:将/image重映射为对应Realsense实际发布的相应的Topic即/camera/color/image_raw
  • camera_frame:相机坐标系,修改为实际的相机坐标系camera_color_frame
<launch>

    <arg name="markerId"        default="582"/>
    <arg name="markerSize"      default="0.1"/>    <!-- in m -->
    <arg name="eye"             default="left"/>
    <arg name="marker_frame"    default="aruco_marker_frame"/>
    <arg name="ref_frame"       default="camera_color_frame"/>  <!-- leave empty and the pose will be published wrt param parent_name -->
    <arg name="corner_refinement" default="LINES" /> <!-- NONE, HARRIS, LINES, SUBPIX -->


    <node pkg="aruco_ros" type="single" name="aruco_single">
        <remap from="/camera_info" to="/camera/color/camera_info" />
        <remap from="/image" to="/camera/color/image_raw" />
        <param name="image_is_rectified" value="True"/>
        <param name="marker_size"        value="$(arg markerSize)"/>
        <param name="marker_id"          value="$(arg markerId)"/>
        <param name="reference_frame"    value="$(arg ref_frame)"/>   <!-- frame in which the marker pose will be refered -->
        <param name="camera_frame"       value="camera_color_frame"/>
        <param name="marker_frame"       value="$(arg marker_frame)" />
        <param name="corner_refinement"  value="$(arg corner_refinement)" />
    </node>

</launch>

2.手眼标定启动文件设置

主要分为相机启动,aruco启动,和easy_handeye节点启动

相机启动部分直接启动rs_camera.launch文件即可,对D405相机要先修改之前提到的头文件编译通过之后才能识别设备,这里设置publish_tf为false可以避免出现无法找到相机坐标系到机械臂base_link的转换,因为这两个就不在一个Tftree里面。

ArUco启动,参数修改和之前修改single.launch文件的思路一样基本就是对着改就行。

easy_handeye启动,设置eye_on_hand为true,robot_effector_frame选择机械臂最末端的坐标系。

眼在手上:得到的转换矩阵为相机坐标系到机械臂末端TCP坐标系

眼在手外:得到的转换矩阵为相机坐标系到机械臂底座坐标系

<launch>
    <arg name="namespace_prefix" default="ur10e_realsense_handeyecalibration" />

    <arg name="marker_size" doc="Size of the ArUco marker used, in meters" default="0.1"/>
    <arg name="marker_id" doc="The ID of the ArUco marker used" default="582"/>


    <!-- start the Realsense405 -->
    <include file="$(find realsense2_camera)/launch/rs_camera.launch" >
        <arg name="publish_tf" value="false" />
    </include>

    <!-- 2. start ArUco -->
    <node name="aruco_tracker" pkg="aruco_ros" type="single">
        <!--<remap from="/camera_info" to="/camera/rgb" />-->
        <remap from="/camera_info" to="/camera/color/camera_info" />
        <!--<remap from="/image" to="/camera/rgb/image_rect_color" />-->
        <remap from="/image" to="/camera/color/image_raw" />
        <param name="image_is_rectified" value="true"/>
        <param name="marker_size"        value="$(arg marker_size)"/>
        <param name="marker_id"          value="$(arg marker_id)"/>
        <!--<param name="reference_frame"    value="camera_link"/>-->
        <param name="reference_frame"    value="camera_color_frame"/>
        <!--<param name="camera_frame"       value="camera_rgb_optical_frame"/>-->
        <param name="camera_frame"       value="camera_color_frame"/>
        <param name="marker_frame"       value="aruco_marker_frame" />
    </node>


    <!-- 4. start easy_handeye -->
    <include file="$(find easy_handeye)/launch/calibrate.launch" >
        <arg name="namespace_prefix" value="$(arg namespace_prefix)" />
        <!--<arg name="eye_on_hand" value="false" />-->
        <arg name="eye_on_hand" value="true" />

        <!--<arg name="tracking_base_frame" value="camera_link" />-->
        <arg name="tracking_base_frame" value="camera_color_frame" />
        <arg name="tracking_marker_frame" value="aruco_marker_frame" />
        <!--<arg name="robot_base_frame" value="base_link" />-->
        <arg name="robot_base_frame" value="base_link" />
        <arg name="robot_effector_frame" value="wrist_3_link" />

        <arg name="freehand_robot_movement" value="false" />
        <arg name="robot_velocity_scaling" value="0.5" />
        <arg name="robot_acceleration_scaling" value="0.2" />
    </include>
</launch>

三、节点启动

这里我们一共要启动4个节点,机械臂与ROS通信的节点,机械臂moveit规划节点(这两个直接有用官方的包,不用任何修改),以及我们上述配置的两个launch文件,依次启动即可。机械臂运动记得在示教器上加载external control程序。

roslaunch ur_robot_driver ur10e_bringup.launch robot_ip:=192.168.56.2

roslaunch ur10e_moveit_config moveit_planning_execution.launch limited:=true

出现这个才说明可以通过远程控制了!!!

 Robot connected to reverse interface. Ready to receive control commands.

之后启动我们配置的两个launch文件,弹出如下窗口

roslaunch ur10e_realsense_handeyecalibration.launch 

roslaunch single_rs_no_robot.launch 

Rviz界面和easy_handeye的两个界面,rviz启动之后会提示坐标错误,修改Global Options->fixed frame 从world修改成base_link。如果motionplanning没有出现末端的圆球无法拖动机械,只需移除重新添加即可。

 可以启动一个rqt_image_viewer节点看一看相机是否识别了ArUco码,订阅aruco_single/result节点即可。(之前的single.launch文件好像就是为了启动这个话题,不然看不到结果)

识别到就是这个样子

之后点击Check starting pose成功了话会提示Ready to start: click on next pose,如果提示失败了需要移动机械臂,继续调整。比较玄学,多试试就行

 之后点击该界面中的Take sample即可得到蓝色部分

 之后就是一直重复1,2,3步骤。规划好了会提示Good plan,然后执行就行,可以看到机械臂会运动,运动完看一下是不是可以识别到目标,识别不到直接next pose让他重新规划,能识别到再点take sample。当达到100%时就标定结束了,点击compute就可以结算出转换矩阵了。计算的转换矩阵点击save会存到.ros/easy_handeye目录下。

 我这里就是中间有个点识别不了,所以最后只有16个路点了。😓

 四、杂谈

在整个过程中我之前是把这些节点写到一个launch文件里依次启动,不知道为啥效果很差。反正把机器人运动的那个单独拎出来启动就能好点,目前就是这样启动了,略显麻烦。

我的笔记本没有网口用的拓展坞,网线接到主机会出现接收不到数据的报错,但是接到虚拟机就没这个问题了,所以建议接好网线直接选择接入虚拟机。。

在手眼标定时,会出现Plan->Execute机械臂没动,然后提示已经到了,看机械臂运动的终端有一个这个报错,这时候看看示教器可能external control程序重启就好了。。。

Could not stop controller 'pos_joint_traj_controller' since it is not running

之后我想试试把机器人末端缓存tool0会不会准一点 

;