使用Realsense 测试 aruco 包

86
0
2021年2月24日 09时10分

aruco是一种类似二维码的定位标记辅助工具,通过在环境中部署Markers,可以辅助机器人进行定位,弥补单一传感器的缺陷,纠正误差。在之前的手眼标定easy_handeye程序中,需要使用这个工具进行手眼标定。正好手上有realsense深度相机,就根据资料进行了简单的测试。如下图是手眼标定程序包中的一段:

 

使用Realsense 测试 aruco 包插图

 

通过github下载aruco相关的ROS包,里面会提供现成的Markers,也可以通过aruco包自己生成,或者通过网站http://chev.me/arucogen/可以生成这种图案.该包应用的场景很多,很重要的功能就是物体位姿估计对物体进行定位。从GitHub上下载包后,里面包括了三个包,其中aruco包中只有一个可运行的节点,发现官网文档没细说,我简单的看了以下程序,发现可以通过运行该节点并指定参数来生成图案:

 

$ rosrun aruco optimalmarkers 1 marker 500
第一个参数是生成图案的个数   
第二个参数是名称+标记id      
第三个参数是输出标记图像的像素大小  

 

使用Realsense 测试 aruco 包插图(1)

 

另外一个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 测试 aruco 包插图(2)

 

对于realsense之类的深度相机,出厂就有默认标定好的参数了,所以不需要像usb摄像头那样,只要launch文件中的参数设置正确,就可以获取pose信息,对于测试所用的图案的参数<arg name=”markerId”        default=”582″/>,注意ID要匹配

 

使用Realsense 测试 aruco 包插图(3)

发表评论

后才能评论