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,只能通过源码安装:
xxxxxxxxxx
sudo 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标签都是单独考虑的。
xxxxxxxxxx
rosrun ar_track_alvar createMarker
可以在这里输入【ID】和位置信息,输入【-1】结束。可生成一个或多个,布局自己设计。
命令+参数直接生成数字图片;例如
xxxxxxxxxx
rosrun ar_track_alvar createMarker 11
rosrun ar_track_alvar createMarker -s 5 33
11:数字是11的二维码。 -s:指定图像大小。 5:5x5的图片。33:数字是33的二维码。
注意:启动摄像头时,需要加载相机标定文件,否则无法识别。
xxxxxxxxxx
roslaunch 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号。
xxxxxxxxxx
rqt_graph
xxxxxxxxxx
rosrun rqt_tf_tree rqt_tf_tree
通过rviz,我们可以很直观的看到二维码和相机的相对位置。相机和世界坐标系是自己设定的。
xxxxxxxxxx
rostopic echo /ar_pose_marker
显示如下:
xxxxxxxxxx
header:
seq: 0
stamp:
secs: 1630584915
nsecs: 196221070
frame_id: "/usb_cam"
id: 3
confidence: 0
pose:
header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: ''
pose:
position:
x: 0.0249847882514
y: 0.0290736736336
z: 0.218054183012
orientation:
x: 0.682039034537
y: 0.681265739969
z: -0.156112715404
w: 0.215240718735