二维码识别与定位-方法1-利用ar_track_alvar

  二维码识别作为一种快捷准确的技术已经应用与生活中的购物支付、物体识别及工业AGV导航等领域,在OpenCV3.4.4版本上均提供了相应的函数cv::QRCodeDetector::detectAndDecode()用于二维码的检测和解析,但是在ROS kinetic中自带的版本是OpenCV3.3.1,不能使用API,幸运地是在ROS中有一个开源功能包ar_track_alvar用于二维码相关的操作。
其安装方式为:

   $ sudo apt-get install ros-melodic-ar-track-alvar

  本节主要讲在ROS中如何创建二维码以及如何利用相机识别二维码来获得有用的信息。并利用两个不同的二维码来表征不同的物体,进而通过识别二维码来完成物体的定位。

1. 二维码创建

  二维码的创建一般是离线进行的,是二维码识别的前提。制作好的二维码粘贴到地面、物体上后才可以实现实时定位。每一个二维码通常对应一个标签,如有的二维码代表一个网站,有的二维码代表一个坐标位置,有的二维码代表一个字符串等。

  在ROS中,ar_track_alvar功能包提供了创建二维码的节点,可以根据其定义的规则,创建不同标签的二维码。例如执行如下命令,就会在终端的当前路径下,创建一个命名为MarkerData_标签.png的二维码图像。其中标签可以为整数、字符串、网址等属性。例如执行如下命令,会在终端生成一个名为MarkerData_0.png的图像,如图7.16所示。

    $ rosrun ar_track_alvar createMarker 0

在这里插入图片描述

图 MarkerData_0.png图像
  执行如下命令可以查看创建二维码的规则:
  $ rosrun ar_track_alvar createMarker

在这里插入图片描述

图 创建二维码的一般规则

  可以看出使用-1 “string”的形式,可以创建字符串标签的二维码。在这里我们使用如下命令,创建多个不同的物体标签,包括cup、bottle、book、celephone,起二维码如图7.17所示。

    $ rosrun ar_track_alvar createMarker -1 “cup”
    $ rosrun  ar_track_alvar createMarker -1 “bottle”
    $ rosrun  ar_track_alvar createMarker -1 “book”
    $ rosrun  ar_track_alvar createMarker -1 “celphone

在这里插入图片描述

(a)标签为“cup”的二维码

在这里插入图片描述

(b)标签为“book”的二维码

在这里插入图片描述

(c)标签为“bottle”的二维码

在这里插入图片描述

(d)标签为“celephone”的二维码

  做好二维码后我们就可以将其用于物体识别和定位了。

2. 二维码识别

  ar_track_alvar功能包支持USB摄像头和RGB摄像头进行二维码识别,分别对应节点individualMarkersNoKinect适用于彩色摄像头,individualMarkers适用于深度相机。本节以astra mini相机为例进行二维码识别。
创建二维码识别的启动文件:

$ roscd cv_learn
<launch>
<node pkg="tf" type="static_transform_publisher" name="world_to_cam" 
args="0 0 0.5 0 1.57 0 world camera_rgb_optical_frame 10" />

<arg name="marker_size" default="4.7" />
<arg name="max_new_marker_error" default="0.2" />
<arg name="max_track_error" default="0.2" />

<arg name="cam_image_topic"   default="/camera/depth_registered/points" />
<arg name="cam_info_topic" default="/camera/rgb/camera_info" />
<arg name="output_frame" default="/camera_rgb_optical_frame" />

<node name="ar_track_alvar" pkg="ar_track_alvar" type="individualMarkers" respawn="false" output="screen">
<param name="marker_size" type="double" value="$(arg marker_size)" />
<param name="max_new_marker_error" type="double" value="$(arg max_new_marker_error)" />
<param name="max_track_error" type="double" value="$(arg max_track_error)" />
<param name="output_frame" type="string" value="$(arg output_frame)" />

<remap from="camera_image" to="$(arg cam_image_topic)" />
<remap from="camera_info" to="$(arg cam_info_topic)" />
</node>

<!-- rviz view /-->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find cv_learn)/config/ar_track_astra.rviz"/>

</launch> 

  启动文件由三部分组成,首先设置相机坐标系与世界坐标系之间的坐标变换;其次是设置individualMarkers节点所需要的参数,主要是订阅图像数据的话题,二维码的尺寸,最大尺寸误差等参数;最后是启动可视化插件rviz用于显示tf、marker及图像。
  下面启动相机与该启动文件进行测试,与之前的相机驱动程序不同,二维码的识别和定位需要相机的标定参数,又,在4.2节中已对astra mini相机进行了标定,直接使用即可,我们可以新建一个启动文件,并将标定参数加入到启动文件中,如astra_with_calibration.launch所示:

<launch>
<!-- Launch the freenect driver -->
<include file="$(find astra_launch)/launch/astra.launch">
<arg name="publish_tf" value="false" /> 

<!-- use device registration -->
<arg name="depth_registration" value="true" /> 

<arg name="rgb_processing" value="true" />
<arg name="ir_processing" value="false" />
<arg name="depth_processing" value="false" />
<arg name="depth_registered_processing" value="true" />
<arg name="disparity_processing" value="false" />
<arg name="disparity_registered_processing" value="false" />
<arg name="sw_registered_processing" value="false" />
<arg name="hw_registered_processing" value="true" />

<arg name="rgb_camera_info_url"
value="file://$(find cv_learn)/data/camera_calibration/astra_calib/rgb_calibration/astra_rgb_calibration.yaml" />
<arg name="depth_camera_info_url"
value="file://$(find cv_learn)/data/camera_calibration/astra_calib/depth_calibration/astra_depth_calibration.yaml" />
</include>
</launch>

按如下命令依次启动相机和二维码识别节点:

$ roslaunch  cv_learn astra_with_calibration.launch
$ roslaunch  cv_learn ar_track_astra.launch

  拿起打印好的二维码,放置在摄像头前面,如图所示。可以在rviz看到已识别出了每个二维码,且包括其相对与摄像头的位置和姿态。
在这里插入图片描述

图4.40 二维码检测结果

3 基于二维码的物体检测与识别

  我们可以将二维码粘贴在物体的表面,这样当相机检测到二维码的位置和姿态时,可以间接计算出物体当前的位置和姿态通过运行如下命令:

$ rostopic echo /ar_pose_marker 

如图所示,可以查看当前二维码所处的位置和姿态,变换位置后,位姿有相应的变化.
在这里插入图片描述

图 位置1处的物体检测结果

在这里插入图片描述

图 位置2处的物体检测结果
  • 6
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值