aruco是一种类似二维码的定位标记辅助工具,通过在环境中部署Markers,可以辅助机器人进行定位,弥补单一传感器的缺陷,纠正误差。在之前的手眼标定easy_handeye程序中,需要使用这个工具进行手眼标定。正好手上有realsense深度相机,就根据资料进行了简单的测试。如下图是手眼标定程序包中的一段:
通过github下载aruco相关的ROS包,里面会提供现成的Markers,也可以通过aruco包自己生成,或者通过网站http://chev.me/arucogen/可以生成这种图案.该包应用的场景很多,很重要的功能就是物体位姿估计和对物体进行定位。从GitHub上下载包后,里面包括了三个包,其中aruco包中只有一个可运行的节点,发现官网文档没细说,我简单的看了以下程序,发现可以通过运行该节点并指定参数来生成图案:
$ rosrun aruco optimalmarkers 1 marker 500
第一个参数是生成图案的个数
第二个参数是名称+标记id
第三个参数是输出标记图像的像素大小
另外一个msgs包不用细看: * aruco_ros/Marker.msg Header header uint32 id geometry_msgs/PoseWithCovariance pose float64 confidence * aruco_ros/MarkerArray.msg Header header aruco_ros/Marker[] markers 重点关注aruco_ros这个包:包中有三个launch文件,分别是single、double、publish,原本的用例是通过USB摄像头工作的,对于realsense或者其他相机,就需要修改参数,修改single.launch如下:
<launch>
<arg name="markerId" default="582"/>
<arg name="markerSize" default="0.034"/> <!-- in m -->
<arg name="eye" default="left"/>
<arg name="marker_frame" default="aruco_marker_frame"/>
<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="/stereo/$(arg eye)/camera_info" />-->
<!-- <remap from="/image" to="/stereo/$(arg eye)/image_rect_color" />-->
<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="stereo_gazebo_$(arg eye)_camera_optical_frame"/>-->
<param name="camera_frame" value="/camera_link"/>
<param name="marker_frame" value="$(arg marker_frame)" />
<param name="corner_refinement" value="$(arg corner_refinement)" />
</node>
</launch>
即将原本的usb或者stereo换成realsense发布的信息,将相机坐标系更换成camera_link:
<remap from="/camera_info" to="/camera/color/camera_info" />
<remap from="/image" to="/camera/color/image_raw" />
<param name="camera_frame" value="/camera_link"/>
接下来依次启动节点,让相机观察图案:
$ roslaunch realsense2_camera rs_camera.launch
# 不指定参数,使用默认参数
$ roslaunch aruco_ros single.launch
# 或指定参数
$ roslaunch aruco_ros single.launch markerId:=26 markerSize:=0.08 eye:="right"
# 或指定姿态相对的参考坐标系
$ roslaunch aruco_ros single.launch markerId:=26 markerSize:=0.08 eye:="right" ref_frame:=/base_link
# 观察识别效果
$ rosrun image_view image_view image:=/aruco_single/result
# 查看位姿
$ rostopic echo /aruco_single/pose
如图所示可以检测到Marker,并识别出其ID,但是对于普通usb摄像头要想得到pose,还需要使用ROS的标定工具对摄像头进行标定,获取其相机内参和畸变系数,标定完成后文件会默认保存在~/.ros/camera_info/head_camera.yaml。如果没有进行标定,在启动摄像头时也会提示~/.ros/camera_info/head_camera.ya不存在。参考:https://blog.csdn.net/learning_tortosie/article/details/83147232
对于realsense之类的深度相机,出厂就有默认标定好的参数了,所以不需要像usb摄像头那样,只要launch文件中的参数设置正确,就可以获取pose信息,对于测试所用的图案的参数<arg name=”markerId” default=”582″/>,注意ID要匹配