AprilTag是由University of Michigan的APRIL Robotics Laboratory提出的,官网是这里。官方自己对AprilTag的描述是视觉基准系统(Visual Fiducial System),其应用领域包括AR、机器人、相机校正等。通过对AprilTag Marker的识别,可以确定相机的位姿(相对于Marker)。AprilTag除了常规的方形,还可以包含其它“奇形怪状”的样子,如下。.
一个普通的AprilTag大约长下面这个样子。
AprilTag
优点:
- (1) BSD许可
- (2) 更少的可调节参数
- (3) 在长距离场景中表现依然较好
- (4) 被NASA采用
- (5) 更加灵活的marker设计(maker不一定是方形的)
- (6) 计算量更少
- (7) 支持Tag bundle,减少旋转歧义性
- (8) 更多的误检测(默认参数)
apriltag_ros功能包简介
【注意:apriltags2_ros这个包已经被重新命名为apriltag_ros,所以如果去ROS-wiki官网上搜索apriltags2_ros会自动跳转到apriltag_ros上,但是其教程和内容还是写的apriltag2_ros,但是并不影响其使用,在此说明一下。】
由上图可知,此包通过接收
/camera/image_rect
和 /camera/camera_info
两个话题,并且通过自身的两个配置文件
tags.yaml 和 settings.yaml ,
通过算法处理以后,发布
/tf 、/tag_detections
和 /tag_detections_image
三个话题。
其中:
/camera/image_rect
话题发布消息类型为
/sensor_msgs/Image,该消息包含了从相机采集到的图像数据。
/camera/camera_info
话题发布消息类型为
/sensor_msgs/CameraInfo ,
该消息包含了相机的内参矩阵K和其他的一些标定参数。可以通过 camera_calibration
(camera_calibration - ROS Wiki)或者kalibr(GitHub - ethz-asl/kalibr: The Kalibr visual-inertial calibration toolbox)获得标定参数。
tag.yaml
文件中包含了用于检测的二维码信息。
settings.yaml
文件中包含了apriltag算法核心配置。
/tf 话题包含了每个被检测到的二维码相对于相机的位置和方向的数据。只有在settings.yaml文件中将 publish_tf 设置为 true 才会发布。
/tag_detections
话题发布的内容和 /tf 一样,只是包含了一个自定义消息 tag ID,该消息主要用于一簇标签(tag bundles)的检测。
/tag_detections_image
话题发布的内容和 /camera/image_rect 内容一样,只是包含了标签绑定的内容(即在输出的图像上实时高亮显示标签的位置)。只有在continuous_detection.launch文件中,设置publish_tag_detections_image==true才会发布。
2.AprilTag的使用(opencv)
2.1 AprilTag的生成
apriltag功能包的使用
【注意:该包的使用需要
OpenCV库,Eigen3库,以及 cv_bridge包、usb_cam包、camera_calibration包】
1. 二维码的生成
下载
openmv(https://openmv.io/pages/download)
这里选用的是linux版本
找到下载的源文件,赋予运行权限
sudo chmod +x openmv-ide-linux-x86_64-2.6.5.run (这里要修改为自己下载的版本名称)
运行openmv./openmv-ide-linux-x86_64-2.6.5.run
然后选择 工具---机器视觉---ApirlTag生成器---TAG36H11,在弹出的对话框中选择需要的标签数量和对应的ID【这里选择的是TAG36H11,在
apriltag_ros/config/settings.yaml
文件中也要设置成对应的标签名称,否则算法将无法识别】
2. 启动相机
roslaunch usb_cam usb_cam-test.launch
3. 启动camera_calibration
校准相机
rosrun camera_calibration cameracalibrator.py --size 11x9 --square 0.100 image:=/usb_cam/image_raw camera:=/usb_cam
size 为棋盘标定板的大小,square为棋盘的边长,image为相机发布的图像信息(此处需要根据实际情况修改为自己相机发布的话题,可以通过 rostopic list 查看)
camera 为相机发布的相机消息,同样,根据实际情况修改为自己的相机
4. 启动apriltag_ros
roslaunch apriltag_ros continuous_detection.launch
需要注意的是,在
apriltag_ros/launch/continuous_detection.launch 文件下,
<arg name="camera_name" default="/usb_cam" />
<arg name="camera_frame" default="usb_cam" />
<arg name="image_topic" default="image_raw" />
将上面三个参数改为自己相机参数。
在apriltag_ros/config/tags.yaml 文件中修改为自己的标签设置。
standalone_tags:
[
{id: 0, size: 0.05},
{id: 1, size: 0.05},
{id: 2, size: 0.05},
{id: 3, size: 0.05},
{id: 4, size: 0.05},
{id: 5, size: 0.05},
{id: 6, size: 0.05},
{id: 7, size: 0.05},
{id: 8, size: 0.05},
{id: 9, size: 0.05},
]
上面为此次测试时用的标签参数,包含了标签的ID和每个标签的大小0.05m
5. 启动rqt_image_view
话题选择 /tag_detectios_image,就可以观看到带有标签高亮的图像
6. 启动rviz
将固定坐标设置为 相机的坐标系(这里为 /usb_cam),并且添加TF模块,就可以实时看见每个tag相对于相机的位置和方向了
3. ros上实现Apriltags位姿输出
在github上我们可以找到很多相关的代码,我用的是https://github.com/shijiwensjw/apriltags2_ros 下的代码实现了Apriltags位姿输出,既然有了算法,那麽我们需要通过摄像头输入图像,既然有了摄像头引入,我们便需要进行相机内参的标定,只有这样才可以保证精度。
具体实现:
首先下载usb_cam的包,然后在在launch文件修改如下:
“/dev/video1” /是插入usb摄像头具体的设备口
相机标定实现参考网址:https://blog.csdn.net/harrycomeon/article/details/91126256
然后在ros下,建立工作空间,将apriltags2,apriltags2_ros,camera_calibration,usb_cam文件夹复制到所建的工作空间的src目录下。catkin_make编译通过后,便可以依次运行
roslaunch usb_cam usb_cam-test.launch
roslaunch apriltags2_ros continuous_detection.launch
然后自己将两个launch文件整合到一起,只需要运行一个就可以
roslaunch apriltags2_ros continuous_detection.launch
此时已经发布了话题,然后我们便可以查看话题下的内容,其中在/tag_detections和/tf话题下,发布了tag相对于相机的相对位姿。
注意下面文件下有指定识别tag的标号和实际大小
参考博客:
技术分享 | apriltag_ros的基础讲解 - 知乎 (zhihu.com)
(8条消息) Apriltags+Ros+Ur5项目--Apriltags位姿输出_光头明明的博客-CSDN博客_apriltags