整个过程分为以下三步
<launch>
<arg name="markerId" default="582"/>
<arg name="markerSize" default="0.1"/> <!-- in m -->
<arg name="eye" default="left"/>
<arg name="marker_frame" default="camera_marker"/>
<arg name="ref_frame" default=""/> <!-- 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_info" />
<remap from="/image" to="/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="stereo_gazebo_left_camera_optical_frame"/> <!-- frame in which the marker pose will be refered -->
<param name="camera_frame" value="stereo_gazebo_left_camera_optical_frame"/>
<param name="marker_frame" value="$(arg marker_frame)" />
<param name="corner_refinement" value="$(arg corner_refinement)" />
</node>
</launch>
<launch>
<arg name="namespace_prefix" default="aubo_kinect_handeyecalibration" />
<!-- 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="stereo_gazebo_left_camera_optical_frame" />
<!-- camera_marker -->
<arg name="tracking_marker_frame" value="camera_marker" />
<arg name="robot_base_frame" value="base_link" />
<arg name="robot_effector_frame" value="wrist3_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>
注意: 看似这些坐标系设置的挺乱,他的原则就是,这些坐标系放在一起组成一个集合,其中每个坐标系要能通过其他坐标系,得到每个坐标系之间的相互转换关系。所以上述两个launch文件提到的坐标系写法可以有很多,我选择了比较简单的。
依次启动机械臂、相机、aruco、easy_hand。没问题就会出现三个在启动 easy_handeye 后会出现三个窗口。
easy_handeye 作者给出建议:
这就好了吗??
如果真这么容易就好了!
将 handeye_calibration_backend_opencv.py 文件中 import cv2 改为
import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
import cv2
sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')
这个问题是由于 ros 安装的 python 和自己系统中安装的 python 调用时出问题,具体什么问题?我不知道。出处
如果还不行,卸载掉opencv相关包,重新安装opencv_contrib_python。如python版本也是2.7的话,将其版本指定 “==4.2.0.32”,具体支持见 opencv-python版本对应
这个问题是这两个坐标系不能联系起来,即一个坐标系通过已知的坐标系,求得另一个坐标系。一般是 aruco 中 reference_frame 和 camera_frame 设置不对,把这两个设为一样通常可解决。同时easy_hanyeye 里复制的launch文件中要参考 single.launch 设置对。
代码问题,将easy_handeye 中文件 handeye_sample.py 65行(左右)time = Time.now() 改为 time=Time(0)
可能有些问题忘了,一些细节没说清楚,请大家评论区批评指正。有问题评论我会回复。