纪念下第一次写博客
手眼标定有两种eye to hand(眼在外)与eye in hand (眼在手上),本文是进行了eye to hand(眼在外)的标定,即相机固定在相对于机械臂固定的基座上。使用的是ubuntu18.04,Ros Melodic, Kinova Jaco2 以及KinectV2。
主要参考链接
- 主链接https://github.com/IFL-CAMP/easy_handeye/issues/19.
博主的launch主要根据上面的链接写的,后面有详细说明。 - 主程序包的依赖:https://github.com/IFL-CAMP/easy_handeye.该程序包提供了对UR5与kinect标定的demo。
- 其他依赖包的安装参考如下两个链接,是一对师兄弟做的关于ur5与kinect的eye to hand标定
(1)https://blog.csdn.net/sinat_23853639/article/details/80276848. (师兄)
(2)https://blog.csdn.net/zhang970187013/article/details/81098175.(师弟) - 该博主进行了kinova与sr300的手眼标定(eye to hand),主要参考其遇到的问题https://blog.csdn.net/qq_29921623/article/details/85547654.
注:链接使用顺序,建议先安装“师弟”的链接进行前面的依赖包安装,当安装完成并分别跑通了kinova与kinect2后,参考链接一中的文件编写自己launch文件。中间遇到其它问题可以参考链接4。
Launch文件说明
参考说明
Launch 文件主要参考了链接一中的两位提问者的代码
代码一进行的是关于Kinova与Poly Camera的eye in hand的标定
<arg name="marker_size" value="0.12558" doc="Size of the ArUco marker used, in meters" />
<arg name="marker_id" value="566" doc="The ID of the ArUco marker used" />
<!-- start the Camera -->
<include file="$(find pylon_camera)/launch/pylon_camera_node.launch" >
</include>
<!-- start ArUco -->
<node name="aruco_tracker" pkg="aruco_ros" type="single">
<remap from="/camera_info" to="/pylon_camera_node/camera_info" />
<remap from="/image" to="/pylon_camera_node/image_rect" />
<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=""/>
<param name="camera_frame" value="pylon_camera"/>
<param name="marker_frame" value="camera_marker" />
</node>
<!-- start the robot -->
<include file="$(find kinova_bringup)/launch/kinova_robot.launch">
</include>
<include file="$(find j2n6s300_moveit_config)/launch/j2n6s300_demo.launch">
</include>
<!-- 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="true" />
<arg name="tracking_base_frame" value="pylon_camera" />
<arg name="tracking_marker_frame" value="camera_marker" />
<arg name="robot_base_frame" value="j2n6s300_link_base" />
<arg name="robot_effector_frame" value="j2n6s300_end_effector" />
<arg name="freehand_robot_movement" value="false" />
<arg name="robot_velocity_scaling" value="0.5" />
<arg name="robot_acceleration_scaling" value="0.2" />
</include>
代码二是关于Kinova与Kinect的eye to hand的标定,与博主一样
其中有代码一中会报错,具体是找到calibrate.launch line 25将group name 设置为arm。
博主的launch.file如下:基本上参考上面两个代码以及链接3中师弟的代码改的
<?xml version="1.0" ?>
<launch>
<arg name="namespace_prefix" default="jaco_kinect_handeyecalibration" />
<arg name="marker_size" value="0.0497" doc="Size of the ArUco marker used, in meters" />
<arg name="marker_id" value="100" doc="The ID of the ArUco marker used" />
<!-- start the robot -->
<include file="$(find kinova_bringup)/launch/kinova_robot.launch">
</include>
<include file="$(find j2n6s300_moveit_config)/launch/j2n6s300_demo.launch">
</include>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
</node>
<!-- start the Camera -->
<include file="$(find kinect2_bridge)/launch/kinect2_bridge.launch" >
</include>
<!-- start ArUco -->
<node name="aruco_tracker" pkg="aruco_ros" type="single">
<remap from="/camera_info" to="/kinect2/hd/camera_info" />
<remap from="/image" to="/kinect2/hd/image_color_rect" />
<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="kinect2_rgb_optical_frame"/>
<param name="camera_frame" value="kinect2_rgb_optical_frame"/>
<param name="marker_frame" value="camera_marker" />
</node>
<!-- 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="tracking_base_frame" value="kinect2_rgb_optical_frame" />
<arg name="tracking_marker_frame" value="camera_marker" />
<arg name="robot_base_frame" value="j2n6s300_link_base" />
<arg name="robot_effector_frame" value="j2n6s300_end_effector" />
<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>
后续标定操作
具体操作可以参考链接三中的师弟做法,后面有详细说明。
但有所不同的是,由于easy_handeye这个包的作者是针对UR5做了个demo,通过让机械臂运动17个点,采集摄像机与机械臂对应的位姿数据。在运行机械臂的时候,没法执行作者给出的17个点,事实上连一个点都无法运行。如下图所示,当点击plan后,窗口直接关闭了。
急中生智
机智的博主并没有死磕这个错误。事实上,在链接1中,有提问者问过相关问题,作者也进行了回答,可是效果如何并没有人知道。当看到下图时发现,当前的Aruco marker位置下,可以读到相机与机械臂四元数,碰巧kinova配备操控杆,于是通过手动移动了20个位置并记录了样本点。记录完成后直接点击compute就可求出机械臂基座到相机坐标系位姿转换了。
总结
虽然粗糙的完成了手眼标定,可是效果如何还不知道,后续会继续更新如何验证标定结果,以及实现简单的基于视觉的工件定位与抓取。
第一次写博客,略感激动,如有不清楚的地方欢迎留言。(o゜▽゜)o☆[BINGO!]