AR Tag 在 ROS 中的使用

本文涉及的产品
资源编排,不限时长
简介: 本文简单介绍了 AR Tag 及其运用的场景,并介绍了其在 ROS 中的安装和使用。

什么是 AR Tag

AR Tag 是一种用于增强现实(AR)应用中的视觉标记,用于跟踪和定位虚拟物体在现实世界中的位置。 AR Tag由黑白正方形图像表示,图像内部有黑色边框中的某些图案。它与我们经常用到的二维码长得类似,原理其实也一样,但其编码系统和二维码有很大的区别。

AR Tag 要用于做位姿识别,即通过相机图像识别 AR Tag 的位置和姿态,从而实现对AR标记物的定位。与二维码相比,AR Tag 的图案相对简单,仅包含黑白色块以及一些辅助图形,编码信息相对较少,因此其图案识别度更高。相比之下,二维码的图案复杂度较高,需要包含大量的信息,这会使得二维码在图像失真或光线不足等情况下更难以识别。

AR Tag 的类型有很多,他们使用不同的标签系统,每种类型各有优缺,下面展示了几种常见的图案。

AR Tag

AR Tag 的使用场景

AR Tag 是一种低成本的位姿识别方式,因为它只需要使用相机和打印的标记(AR Tag)来进行实时跟踪,而不需要使用昂贵的传感器和硬件设备。另外,其算法实现也比其他传感器技术简单得多,所以可以快速而准确地识别位姿。基于其在应用上的便捷,这使得 AR Tag 成为许多实际场景的理想选择,比如:机器人导航、物体跟踪、增强现实和其他计算机视觉任务。

使用场景

在 ROS 中的使用

通过前面的介绍,我们知道 AR Tag 是一种低成本、高精度的位姿识别方式。当然,这也使得它广泛地应用于各种机器人应用场景中,提高机器人的感知和控制能力,从而实现更多的机器人应用。

安装 ar_track_alvar

在 ROS 中使用 AR Tag 我们需要安装 ar_track_alvar 包,该软件包是一个 ROS 封装 Alvar 的开源 AR 标记跟踪库。

ar_track_alvar 有四个主要功能:

  • 生成不同大小、分辨率和数据的 AR Tag
  • 识别和跟踪单个 AR Tag,可以选择与 kinect 深度数据集成获得更好的位姿识别效果
  • 识别和跟踪由多个 AR Tag 组成的 “捆绑包”。以此可以获得更稳定的位姿识别、提高遮挡鲁棒性以及对多边物体的跟踪效果。
  • 使用相机图像自动计算“捆绑包”中 AR Tag 之间的空间关系

多标签

安装 ar_track_alvar 可以使用下面的命令:

sudo apt-get install ros-melodic-ar-track-alvar
注意:这里的 melodic 代表了你的 ROS 版本,这里使用的是 ROS1 的 Melodic Morenia。目前,ar_track_alvar 只支持ROS 1版本,并没有官方的 ROS2 版本。如果想在 ROS2 中使用 ar_track_alvar,可能需要自己进行一些修改和适配。

标签的生成

ar_track_alvar 包安装好后,就可以使用其提供的生成工具进行标签的生成了。一般常用的为数字编码的标签,其图案简单(也是相对的,数字0-9),可识别度相对较高:

rosrun ar_track_alvar createMarker 9

使用上面的命令即可在当前目录生成数字标签,9是你要生成的数字编号,可选范围为 0-65535。

当然也是可以使用字符串的,使用参数-1后跟需要生成的字符串即可:

rosrun ar_track_alvar createMarker -1 "bottle"

以下是几个生成的标签示例:

标签

在 ROS 中的使用

创建 launch 文件

我们这里需要使用深度摄像头,示例使用的是奥比中光的 gemini,需要编译安装好 ros_astra_camera 包,下面的测试 launch 中直接引用深度摄像头的启动包。

<launch>

    <node pkg="tf" type="static_transform_publisher" name="base_to_camera" args="0.34 0 0.15 0 0 0 base_footprint camera_link 100" />

    <!-- AR tag 边框宽度 厘米  -->
    <arg name="marker_size" default="4.0" />
    <arg name="max_new_marker_error" default="0.08" />
    <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_link" />

    <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>

    <!-- 开启摄像头  -->
    <include file="$(find astra_camera)/launch/gemini.launch" />

</launch>

launch 文件解析

上面的 launch 文件主要为四个部分:

  1. 定义坐标转换
  2. 配置节点参数
  3. 开启摄像头

首先我们需要定义摄像头的位置,演示示例的摄像机是安装的机器人身上的,所以我们使用了 static_transform_publisher 发布了一个静态坐标转换,指定 camera_link,用于表示相机的位置和方向。使用TF(Transformation)库可以将坐标系之间的变换关系(transform)发布到ROS中,从而可以方便地进行相机的姿态控制和图像处理等操作。指定 camera_link 位姿时,我们使用的是 base_footprint ,其为机器人在地面上的投影位置,一般选择机器人中心。static_transform_publisher 的参数中我们定义了 camera_link 在空间的位置,是在 base_footprint 的前方 34cm 高 15cm 处。

配置 individualMarkers 的节点参数主要是定义 marker_size 黑色方块一侧的宽度,这里使用的单位是厘米,你可以在打印出 AR Tag 后进行测量填入。max_new_marker_errormax_track_error 是识别上的一些参数,分别表示在不确定的情况下检测到新标记的阈值和跟踪误差多少时认为标签消失,调整这些参数可以改变识别和跟踪效果,这里我们使用官方示例中的参考值。

另外,我们还需要配置一些摄像机图像数据相关的话题,cam_image_topic 深度摄像机点云数据,cam_info_topic 相机校准参数的主题名称,以便图像可以被校正,output_frame 发布的AR标签的笛卡尔坐标相对于哪个位置。

rviz 展示效果

启动写好的 launch 后,我们就可以打开 rviz 来查看 AR Tag 的识别效果了。启动 rviz 后,我们首先修改 Global Option 的 Fixed Frame 为 base_footprint

修改Fixed Frame

接下来添加 TF 和 Marker 即可在界面中看到识别到的 AR Tag 了。在实际应用中,选择简单易识别的图案效果会更好,简单来说使用数字小的ID会更易识别。这其实取决于多个因素,如标签的大小,分辨率,摄像头的类型,光照条件等。

展示效果

如上图所示,我们可以看到,识别出来的标签 ar_marker_6 准确地显示在空间中。

在程序中使用

在程序中使用我们需要订阅 /ar_pose_marker 话题,其数据类型为 AlvarMarkers ,其数据格式如下:

Header header
uint32 id
uint32 confidence
geometry_msgs/PoseStamped pose
  • id:标签的ID号
  • confidence:标签识别的置信度
  • pose:标签的姿态

以下是一个简单的 Python 示例:

# 订阅 ar_pose_marker 话题,数据类型为 AlvarMarkers ,回调 artag_sign
rospy.Subscriber("/ar_pose_marker", AlvarMarkers, artag_sign )

在回调中根据实际需求进行消息处理,如 marker.id 判断标签ID,或是根据 marker.pose 进行距离和姿态的计算:

def artag_sign(msg):
    try:
        if len(msg.markers) < 1:
            return
        # 使用第一个检测到的标签
        marker = msg.markers[0]
        # 可以根据需求进行业务处理
    except:
        return

References

《AR Tags and their Applications in Computer Vision Tasks》

ar_track_alvar

QualiaT/ar_track_alvar

launch 参考

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
4月前
|
Web App开发 应用服务中间件 Serverless
第一个Angular应用创建问题之使用Angular CLI创建新的工作区和一个初始应用如何解决
第一个Angular应用创建问题之使用Angular CLI创建新的工作区和一个初始应用如何解决
|
4月前
|
JavaScript
如何在 Angular 中使用 ng-container 元素
如何在 Angular 中使用 ng-container 元素
56 0
|
4月前
|
JavaScript
如何在自定义 Angular 指令中使用 @HostBinding 和 @HostListener
如何在自定义 Angular 指令中使用 @HostBinding 和 @HostListener
44 0
解决Cannot find module &#39;@angular/compiler-cli&#39;
解决Cannot find module &#39;@angular/compiler-cli&#39;
179 0
解决Cannot find module &#39;@angular/compiler-cli&#39;
|
JavaScript
Angular入门,开发环境搭建,使用Angular CLI创建你的第一个Angular项目
Angular入门,开发环境搭建,使用Angular CLI创建你的第一个Angular项目
417 0
Angular入门,开发环境搭建,使用Angular CLI创建你的第一个Angular项目
angular8-本地运行ng文档
angular8-本地运行ng文档
107 0
angular8-本地运行ng文档
|
敏捷开发 Web App开发 前端开发
创建第一个Angular应用的正确姿势
作为Google公司提供的一套开源的项目框架,Angular的模版功能强大且丰富,是一个比较完善的前端框架,包含服务,模版,数据双向绑定,模版化,路由,过滤器,自定义指令,依赖注入等所有功能,ng模块化比较大胆的引入了Java的一些东西(依赖注入),能够很容易的写出可复用的代码,对于敏捷开发的团队来说非常有帮助。
创建第一个Angular应用的正确姿势