具体环境搭建可以参考我之前的这篇博客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会不会准一点