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

2023-05-16

  二维码识别作为一种快捷准确的技术已经应用与生活中的购物支付、物体识别及工业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处的物体检测结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维码识别与定位-方法1-利用ar_track_alvar 的相关文章

随机推荐

  • 基于gazebo的无人车编队仿真实战总结(二)

    基于gazebo的无人车编队仿真实战总结 xff08 二 xff09 上一篇博客是通过古月居的多机器人编队仿真考虑讲前期做的基于阿克曼转向的仿真模型 xff0c 进行三台无人小车的编队仿真 问题 1 将无人小车的仿真模型 xff0c 按照博
  • 关于yolov5的调试环境搭建亲测有效ubuntu18.04 +ros+melodic+anaconda+pytorch+torchvision+cuda10.2+cudnn

    运行环境ubuntu18 04 43 ros 43 melodic 43 anaconda3 43 py3 8 43 torch1 12 1 43 torchvision 0 13 1 43 cuda10 2 43 cudnn 1 首先安装
  • yolov5的ros封装移植

    yolov5在上一篇中已经完美运行 但是在工程项目中 需要在ros中使用yolov5进行目标检测 首先 新建ros的工作空间 mkdir span class token operator span p span class token o
  • ubuntu虚拟机安装Cmake

    安装 Cmake官网下载linux下的安装包 xff1a https cmake org download 拷贝进虚拟机中 打开终端 xff0c 进入安装包所在目录tar xzvf tar gz 解压安装包为了便于管理 xff0c 将解压后
  • 经验分享一:UART 可进入空闲中断,DMA却没数据

    条件 xff1a UART DMA配置没有问题 时钟也都使能了 xff0c 对照寄存器表 xff0c 发现该配置的寄存器都配置的没问题 xff0c 调试发现每次接收到数据 xff0c 可以顺利进入空闲中断 且读取 UART 34 数据接收寄
  • Visual Studio 2022 C++ CLR 的艰难除 Bug

    请看下面一段代码 xff1a 运行结果 xff1a 这是一个Button xff0c 要用到这段代码是因为字符串出了问题 xff1a 肯定是我写的类出问题了 xff0c 便是我在控制台下测试是正常的 代码 xff1a 运行结果 xff1a
  • UBX 协议报文整理

    UBX 协议报文整理 UBX 协议的报文格式如下 xff1a 帧头 2 byte CLASS ID MESSAGE ID 2 byte 消息长度 2 byte PAYLOAD校验和 2 byte 帧头 由两个字节组成 xff0c 即0xB5
  • 将串口接收的数据绘制成波形图(使用matlab或Visual Scope)

    一 串口通信配置 结合stm32固件库 xff08 或其它类型单片机 xff09 中usart相关的函数 xff0c 配置好串口通信的寄存器 xff0c 确定 xff08 数据位 停止位 波特率等等 xff09 xff0c 本文主要介绍两种
  • linux下makefile、make、Cmake的区别

    Makefile make工具 linux下makeflie和make的用法 makefile与make详解 人们通常利用make工具来自动完成编译工作 这些工作包括 xff1a 如果仅修改了某几个源文件 xff0c 则只重新编译这几个源文
  • 常见的HTTP请求报文头

    目录 AcceptCookieConnectionCache ControlHostRefererUser Agent 参考链接 HTTP请求行 请求头 请求体详解 关于常用的http请求头以及响应头详解 Accept Accept app
  • C++中::和:的意思

    C 43 43 中的 1 类作用域 指明成员函数所属的类 span class token class name M span span class token operator span span class token function
  • Git 基础知识--打Tag、团队协作

    打 Tag 简述 Git 可以给历史中的某一个提交打上标签 tag xff0c 以示重要 人们一般用 tag 功能来标记发布节点 xff08 v1 0 xff09 tag 与 分支很像 xff0c 区别在于 xff1a 轻量标签 tag 是
  • 第七章——VINS系统初始化

    前言 这一章主要内容是讲的VINS系统初始化的事 xff0c 内容上还是比较全面丰满的 xff0c 有一些有疑问的点我之后读了代码会在博客里补上 一句话总结初始化 xff1a 以优化量与观测值构建残差 xff0c 提取优化量构成最小二乘问题
  • GIT系列之标签

    1 标签列表 git tag 在控制台打印出当前仓库的所有标签 git tag l 39 v1 39 搜索符合模式的标签 2 打标签 git标签分为两种类型 xff1a 轻量标签和附注标签 轻量标签是指向提交对象的引用 附注标签则是仓库中的
  • printf重定向(重新定义发送数据的方向)

    1 串口使用 printf 需要对 printf 重定向 也就是需要重定义 fputc xff08 xff09 这个函数 xff08 这个函数是printf的底层函数 xff09 转 int fputc span class token p
  • 解决nvcc找不到的问题/bin/sh:1:nvcc:not found

    这里写自定义目录标题 问题描述方法探索解决方法 问题描述 在执行make指令进行编译的时候 xff0c 遇到问题 34 bin sh 1 nvcc not found 34 xff0c 如图所示 其原因是未找到nvcc xff0c 于是开始
  • GPS的Heading, Course, and Crab Angle不同与区别

    看了老外这个文章终于知道GPS的Heading Course and Crab Angle不同与区别 xff0c 好东西分享给大家 http www chrobotics com library heading course and cra
  • 交换机对数据帧的转发和过滤

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是交换机对数据帧的转发和过滤 一 单播帧的转发 xff1a 交换机根据MAC地址表项进行数据帧转发 上图中 xff0c PCA发出数据帧
  • python3运行ros方法 No module named 'rospkg'

    我们安装的ros后 其一般的库文件均基于python2 但是当某个项目必须要用python3时 就会出现如下错误 Traceback most recent call last File 34 home jetbot arm all xAr
  • 二维码识别与定位-方法1-利用ar_track_alvar

    二维码识别作为一种快捷准确的技术已经应用与生活中的购物支付 物体识别及工业AGV导航等领域 xff0c 在OpenCV3 4 4版本上均提供了相应的函数cv QRCodeDetector detectAndDecode 用于二维码的检测和解