2、AR二维码2.1、概述2.2、创建ARTag2.2.1、安装软件包2.2.2、创建AR二维码2.3、ARTag识别2.3.1、启动识别实例2.3.2、launch文件解析(以单目相机/树莓派CSI相机为例)2.3.3、ar_track_alvar节点2.3.4、查看节点图2.3.5、查看tf树2.3.6、查看输出信息
wiki:http://wiki.ros.org/ar_track_alvar/
源码:https://github.com/ros-perception/ar_track_alvar.git
功能包位置:~/yahboomcar_ws/src/yahboomcar_visual
ARTag(AR标签,AR是“增强现实”的意思)是一种基准标记系统,可以理解为其他物体一种参照物,看起来类似二维码,但其编码系统和二维码还是有很大区别,多用在相机标定,机器人定位,增强现实(AR)等应用场合,其中一个很重要的作用就是识别物体与相机的位姿关系。物体上可以贴上ARTag,或者在平面上贴上ARTag标签,用来标定相机。摄像头识别到ARTag后,可以算出标签在相机坐标中的位置与姿态。
ar_track_alvar 有 4 个主要功能:
Alvar 比 ARToolkit 更新、更先进,ARToolkit 一直是其他几个 ROS AR 标签包的基础。Alvar 具有自适应阈值处理以处理各种光照条件、基于光流的跟踪以实现更稳定的姿态估计,以及改进的标签识别方法,该方法不会随着标签数量的增加而显着减慢。
melodic:
sudo apt install ros-melodic-ar-track-alvar
noetic系统没有命令来安装ar-track-alvar,只能通过源码安装:
xxxxxxxxxxsudo apt install python3-colcon-common-extensions
xxxxxxxxxx# 在工作空间的src文件夹下git clone https://github.com/machinekoder/ar_track_alvar.git -b noetic-devel#然后重新编译工作空间catkin build

ar_track_alvar是一个开源的marker库,它提供了pr2+kinect的示例。该软件包的第一个用例是识别和跟踪(可能的)多个AR标签的姿势,每个AR标签都是单独考虑的。
xxxxxxxxxxrosrun ar_track_alvar createMarker

可以在这里输入【ID】和位置信息,输入【-1】结束。可生成一个或多个,布局自己设计。

命令+参数直接生成数字图片;例如
xxxxxxxxxxrosrun ar_track_alvar createMarker 11rosrun ar_track_alvar createMarker -s 5 33
11:数字是11的二维码。 -s:指定图像大小。 5:5x5的图片。33:数字是33的二维码。
注意:启动摄像头时,需要加载相机标定文件,否则无法识别。
xxxxxxxxxxroslaunch yahboomcar_visual ar_track.launch open_rviz:=true
open_rviz参数默认打开就好。
如果是单目相机或者树莓派CSI相机则需要将 ar_track_usb.launch 修改成 ar_track.launch
如果是Jetson CSI相机,则需要将ar_track_csi.launch 修改成 ar_track.launch

在rviz中,需要设置对应的相机话题名。
xxxxxxxxxx<launch> <!-- 设置camDevice参数,默认是USBCam --> <arg name="open_rviz" default="true"/> <arg name="marker_size" default="5.0"/> <arg name="max_new_marker_error" default="0.08"/> <arg name="max_track_error" default="0.2"/> <!-- 设置相机图像话题、相机内参话题、相机frame --> <arg name="cam_image_topic" default="/usb_cam/image_raw"/> <arg name="cam_info_topic" default="/usb_cam/camera_info"/> <arg name="output_frame" default="/usb_cam"/> <!-- 启动相机节点 --> <include file="$(find usb_cam)/launch/usb_cam-test.launch"/> <!-- 设置相机坐标系和世界坐标系对应关系 --> <node pkg="tf" type="static_transform_publisher" name="world_to_cam" args="0 0 0.5 0 1.57 0 world usb_cam 10"/> <!-- 启动 AR识别节点 --> <node name="ar_track_alvar" pkg="ar_track_alvar" type="individualMarkersNoKinect" 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 --> <node pkg="rviz" type="rviz" name="rviz" args="-d $(find yahboomcar_visual)/rviz/ar_track.rviz" if="$(arg open_rviz)"/></launch>节点参数:
| 话题名 | 数据类型 |
|---|---|
| /camera_info | (sensor_msgs/CameraInfo) |
| /image_raw | (sensor_msgs/Image) |
| 话题名 | 数据类型 |
|---|---|
| /visualization_marker | (visualization_msgs/Marker) |
| /ar_pose_marker | (ar_track_alvar/AlvarMarkers) |
单个二维码:相机坐标系 → AR标签坐标系
多个二维码:提供从相机坐标系到每个AR标签坐标系(命名为ar_marker_x)的变换,其中x是标记的ID号。
xxxxxxxxxxrqt_graph

xxxxxxxxxxrosrun rqt_tf_tree rqt_tf_tree

通过rviz,我们可以很直观的看到二维码和相机的相对位置。相机和世界坐标系是自己设定的。
xxxxxxxxxxrostopic echo /ar_pose_marker
显示如下:
xxxxxxxxxxheader:seq: 0stamp:secs: 1630584915nsecs: 196221070frame_id: "/usb_cam"id: 3confidence: 0pose:header:seq: 0stamp:secs: 0nsecs: 0frame_id: ''pose:position:x: 0.0249847882514y: 0.0290736736336z: 0.218054183012orientation:x: 0.682039034537y: 0.681265739969z: -0.156112715404w: 0.215240718735