news 2026/5/8 16:24:14

apriltag_ros Quick Start

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
apriltag_ros Quick Start

本文记录一次基于 ROS 2 Humble 的apriltag_ros快速实验:生成 AprilTag 标定板,回放 RealSense rosbag2 数据集,启动 AprilTag 检测节点,并在 RViz 中查看检测结果和 TF。

项目环境
OSUbuntu 22.04
虚拟机VirtualBox 7.0
ROSROS 2 Humble

目录

  • 0. apriltag_ros 概述
  • 1. 安装依赖
  • 2. 准备数据集
  • 3. 实验
    • 3.1 生成 AprilTag 标定板
    • 3.2 回放数据并检测
  • 4. 验证结果
  • 5. 参数说明
    • 5.1 Launch 参数
    • 5.2 YAML 结构
    • 5.3 基础参数
    • 5.4 Detector 调参
    • 5.5 指定 tag ID、frame 和尺寸
  • 6. 常见问题
  • 参考

0. apriltag_ros 概述

AprilTag 是一种视觉基准标记系统,最早由 University of Michigan APRIL Lab 提出,并在 2011 年 ICRA 论文AprilTag: A robust and flexible visual fiducial system中系统介绍。它把类似二维码的黑白标签放到环境或物体上,让机器人只通过一帧相机图像就能识别 tag ID,并结合相机内参估计 tag 相对相机的 6D 位姿。

图1 Applications and users of AprilTags,来自AprilTag 2: Efficient and robust fiducial detection

apriltag_ros是 AprilTag 检测库的 ROS 2 节点封装。它订阅图像和CameraInfo,检测画面中的 AprilTag,然后发布 tag 的 ID、位姿、检测质量信息,以及标准 ROS TF。这样后续节点不需要直接处理图像算法,只要订阅/detections或读取/tf,就可以把 tag 用在定位、标定、导航、抓取、数据集验证等任务里。

本次实验用二进制安装的apriltag_ros做 AprilTag 检测,利用从 Intel RealSense 采集的 rosbag2 数据集回放测试。仓库包含以下内容:

  • launch/detector.launch.py:启动上游apriltag_ros/apriltag_node,并把相机话题、参数文件、输出话题做成 launch 参数。
  • config/tags_36h11.yaml:默认使用tag36h11,标签边长按0.045 m配置。
  • launch/display.launch.py:启动 RViz,并加载rviz/tag_rivz.rviz

上游apriltag_ros节点订阅 rectified image 和CameraInfo,发布/tfapriltag_msgs/msg/AprilTagDetectionArray

1. 安装依赖

以 ROS 2 Humble 为例,先 source ROS 2 环境:

source/opt/ros/humble/setup.bash

安装上游包:

sudoaptupdatesudoaptinstallros-$ROS_DISTRO-apriltag-ros

如果需要重新生成本文使用的 AprilTag 标定板,还需要 Python 依赖:

pip3installopencv-python numpy reportlab

在工作空间根目录构建本 quick start:

mkdir~/ros2_wscd~/ros2_wsgitclone https://gitee.com/jay-tan/robot_mini_projects.gitcdrobot_mini_projects rosdepinstall--from-paths src --ignore-src-r-ycolcon build --symlink-install --packages-select apriltag_ros_quickstartsourceinstall/setup.bash

2. 准备数据集

本项目按 RealSense 采集的数据集(下载链接: https://pan.baidu.com/s/1zePQvusOq-OXeCjO2MszWA?pwd=1024
)来测试, RealSense ROS 2 话题如下:

/camera/camera/color/image_raw -> sensor_msgs/msg/Image /camera/camera/color/camera_info -> sensor_msgs/msg/CameraInfo

apriltag_ros需要图像和CameraInfo的时间戳匹配,camera_info里的相机内参会用于计算 tag pose。拿到数据集后,先检查 bag 里是否包含这两个话题:

ros2 bag info<your_realsense_bag>

如果你的数据集话题名不同,后面启动detector.launch.py时把image_topiccamera_info_topic改成实际话题即可。

3. 实验

3.1 生成 AprilTag 标定板

tools/april_tag_board.py可以生成一张适合 A4 打印的tag36h11AprilTag 标定板。脚本默认生成 3 行 3 列,tag ID 为08,每个 tag 下方带有对应 ID 标注。

运行脚本:

cd~/ros2_ws/robot_mini_projects/src/01_apriltag_ros python3 tools/april_tag_board.py

脚本会在当前目录生成:

apriltag_board_A4.pdf apriltag_board_tmp.png

本仓库已经把生成好的文件放在doc/目录中:

doc/apriltag_board_A4.pdf doc/apriltag_board_tmp.png

实际实验时建议打印doc/apriltag_board_A4.pdf,并保持打印比例为 100%。如果修改了脚本里的tag_sizegaprowscols等参数,需要同步检查config/tags_36h11.yaml中每个 tag 的尺寸配置,保证检测节点使用的物理尺寸和实际打印尺寸一致。

3.2 回放数据并检测

建议开三个终端:一个回放 RealSense 数据集,一个启动 AprilTag 检测,一个启动 RViz。

终端一,回放数据集:

# 循环播放ros2 bag play rosbag2_2026_05_05-20_41_42_0.db3-l--clock

本文示例数据集文件名为rosbag2_2026_05_05-20_41_42_0.db3,如果使用自己的数据集,请替换为实际 rosbag2 路径。

终端二,启动检测节点:

ros2 launch apriltag_ros_quickstart detector.launch.py\image_topic:=/camera/camera/color/image_raw\camera_info_topic:=/camera/camera/color/camera_info

终端三,启动 RViz。回放 bag 时建议打开仿真时间:

ros2 launch apriltag_ros_quickstart display.launch.py use_sim_time:=true

如果直接接 RealSense 相机实时运行,而不是回放 bag,RViz 可以保持默认:

ros2 launch apriltag_ros_quickstart display.launch.py

4. 验证结果

查看检测数组:

ros2 topicecho/detections

查看 TF。默认 frame 名形如tag36h11:<id>

ros2 run tf2_ros tf2_echo camera_color_opuical_frame tag36h11:0

图2 运行效果图。

5. 参数说明

这个 quick start 有两层参数:

  • launch 参数:控制本 demo 如何把话题和配置文件传给上游节点。
  • apriltag_ros参数:写在config/tags_36h11.yaml,控制 AprilTag 检测行为。

5.1 Launch 参数

detector.launch.py参数:

参数默认值说明
image_topic/camera/image_rect输入图像话题,对应上游节点内部的image_rect订阅。RealSense 数据集通常覆盖为/camera/camera/color/image_raw
camera_info_topic/camera/camera_info相机内参话题。时间戳需要和图像消息匹配,位姿估计会使用其中的投影矩阵;RealSense 数据集通常覆盖为/camera/camera/color/camera_info
detections_topic/detectionsAprilTag 检测结果输出话题。消息类型是apriltag_msgs/msg/AprilTagDetectionArray
configconfig/tags_36h11.yaml传给apriltag_ros的 YAML 参数文件路径。换 tag family、尺寸、检测参数时通常改这个文件。

display.launch.py参数:

参数默认值说明
use_sim_timefalseRViz 是否使用/clock。回放 rosbag2 数据集并使用ros2 bag play --clock时设为true

5.2 YAML 结构

config/tags_36h11.yaml的顶层 key 是apriltag

apriltag:ros__parameters:family:36h11size:0.045

这个名字要和 launch 文件中启动的节点名一致。本 demo 里节点名是apriltag

Node(package="apriltag_ros",executable="apriltag_node",name="apriltag",)

如果以后把节点名改成tag_detector,YAML 顶层也要对应改成tag_detector,否则参数不会加载到目标节点。

5.3 基础参数

参数类型本 demo 默认值说明
image_transportstringraw图像传输方式。raw订阅普通sensor_msgs/msg/Imagecompressed会使用压缩图像传输。先用raw跑通,确认带宽有压力时再考虑压缩。
familystring36h11Tag family。实际使用的标签必须和这里一致,否则不会被当前 detector 识别。常用36h11,官方还支持16h525h9Circle21h7Circle49h12Custom48h12Standard41h12Standard52h13
sizefloat0.045默认 tag 边长,单位米。这里指黑白 tag 外边框的真实边长,会直接影响/tf里的距离尺度。
profileboolfalse是否输出性能 profiling 信息。调性能时打开,正常 demo 保持关闭。
max_hammingint2允许的最大纠错位数。0最严格、误检少;12更宽松,但复杂画面里误检风险更高。
pose_estimation_methodstringpnp位姿估计方法。本 quick start 使用pnp。改这个参数前建议先确认当前安装版本支持的取值。

size是最容易影响结果的参数。只看 2D 检测时它不太敏感,但做定位、抓取、相机外参验证时必须量准,图3中红色箭头即不同 tag 的尺寸位置。

图3 AprilTag size 示意。

这里的size不是整张纸的宽度,也不是白色留边后的外框尺寸,而是 AprilTag 图案本身的边长:从黑色外边框的一侧量到另一侧。实际使用前建议用尺子量打印后的实物尺寸,并把米制数值写入配置,例如 4.5 cm 对应0.045

5.4 Detector 调参

这些参数位于 YAML 的detector下:

detector:threads:2decimate:1.0blur:0.0refine:truesharpening:0.25debug:false
参数类型本 demo 默认值调参方向
detector.threadsint2检测线程数。提高后可能增加吞吐,但会占更多 CPU;小主机上不要盲目设太大。
detector.decimatefloat1.0检测前对图像降采样。数值越大速度越快,但远处或画面里很小的 tag 更容易漏检;RealSense 数据集回放测试默认用1.0提高稳定性。
detector.blurfloat0.0quad detection 前的高斯模糊 sigma。0.0表示不模糊;噪声很重时可小幅增加,过大则会抹掉边缘。
detector.refinebooltrue是否把 quad 边缘贴合到更强的图像梯度上。必须写成 YAML bool,例如truefalse
detector.sharpeningfloat0.25解码阶段的锐化强度。画面轻微虚焦时可小幅调整;过高可能放大噪声。
detector.debugboolfalse是否写出调试图像到当前工作目录。必须写成 YAML bool,例如truefalse;排查检测失败时可临时打开,长期运行不要打开。

5.5 指定 tag ID、frame 和尺寸

默认不写tag.ids时,会按检测到的 tag 发布结果。想只关心指定 tag,或给不同 tag 配不同 frame/尺寸,可以加入:

tag:ids:[0,1]frames:[tag_0,tag_1]sizes:[0.162,0.120]
参数类型说明
tag.idsint array需要单独配置的 tag ID。
tag.framesstring array每个 tag 对应的 TF child frame 名。如果为空,上游会使用默认格式,形如tag36h11:0
tag.sizesfloat array每个 tag 对应的实际边长,单位米;会覆盖全局size

idsframessizes如果同时填写,长度需要一致。只要不同 tag 的真实尺寸不一样,就不要只依赖全局size,应该给每个 ID 单独写tag.sizes

6. 常见问题

1./detections没有输出怎么办?

先确认图像话题和相机内参话题是否正确:

ros2 topic list ros2 topicecho/camera/camera/color/camera_info--once

然后确认画面中的 tag family 和配置文件里的family一致。例如本文使用的是tag36h11,配置中应为family: 36h11

2. 能看到图像,但检测不到 tag 怎么办?

优先检查打印质量、光照、运动模糊和 tag 在画面中的大小。远距离或 tag 很小时,可以先把detector.decimate保持为1.0,避免降采样导致漏检。

3. 检测到了 tag,但距离或位姿不准怎么办?

重点检查size。它必须是 AprilTag 黑白图案本身的真实边长,单位是米,不是整张纸的宽度,也不是白色留边后的外框尺寸。打印后建议用尺子重新量一遍。

4. RViz 看不到 TF 怎么办?

回放 rosbag2 时,需要ros2 bag play--clock,并且 RViz 使用use_sim_time:=true。如果实时接相机运行,则 RViz 可以保持默认的use_sim_time:=false

5. 公众号或 CSDN 中图片不显示怎么办?

Gitee README 可以直接使用仓库内的相对路径,例如images/the_tag_size.png。发布到 CSDN 或微信公众号时,建议把图片上传到对应平台,再把 Markdown 中的图片链接替换为平台生成的图片地址。

参考

  • apriltag_ros官方文档:https://docs.ros.org/en/ros2_packages/humble/api/apriltag_ros/
  • apriltag_rosROS Index:https://index.ros.org/p/apriltag_ros/
  • apriltag_msgsROS Index:https://index.ros.org/p/apriltag_msgs/
  • AprilTag 原始论文:https://april.eecs.umich.edu/papers/details.php?name=olson2011tags
  • AprilTag 检测库文档:https://docs.ros.org/en/ros2_packages/rolling/api/apriltag/index.html
  • AprilTag 2: Efficient and robust fiducial detectionhttps://april.eecs.umich.edu/pdfs/wang2016iros.pdf
  • apriltag_ros githubhttps://github.com/christianrauch/apriltag_ros

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 16:24:14

在多模型聚合平台上进行模型选型与成本对比的实践

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在多模型聚合平台上进行模型选型与成本对比的实践 对于开发者而言&#xff0c;在项目中引入大模型能力时&#xff0c;面对众多厂商…

作者头像 李华
网站建设 2026/5/8 16:23:47

深蓝词库转换:终极输入法词库迁移解决方案完全指南

深蓝词库转换&#xff1a;终极输入法词库迁移解决方案完全指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为更换输入法时丢失个人词库而烦恼吗&#xff1f;…

作者头像 李华
网站建设 2026/5/8 16:23:37

ComfyUI-Manager安全配置终极指南:如何快速解决远程访问限制

ComfyUI-Manager安全配置终极指南&#xff1a;如何快速解决远程访问限制 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various…

作者头像 李华
网站建设 2026/5/8 16:22:56

85个公共Tracker终极指南:让BT下载速度提升300%的秘密武器

85个公共Tracker终极指南&#xff1a;让BT下载速度提升300%的秘密武器 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 你是否曾经面对BT下载时进度条纹丝不动&#xff0c;而…

作者头像 李华
网站建设 2026/5/8 16:22:49

专业XNB文件处理工具:xnbcli完整实践指南

专业XNB文件处理工具&#xff1a;xnbcli完整实践指南 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli xnbcli是一款专为《星露谷物语》游戏模组开发设计的专业XN…

作者头像 李华
网站建设 2026/5/8 16:22:27

从《视觉SLAM十四讲》到新书:高翔博士的激光SLAM课程,8月开课手把手教你实现自动驾驶核心算法

从视觉到激光SLAM&#xff1a;构建自动驾驶感知系统的进阶指南 当《视觉SLAM十四讲》成为国内SLAM学习者的启蒙教材时&#xff0c;许多工程师已经在这本书的指引下完成了从理论到实践的第一次跨越。如今&#xff0c;随着自动驾驶和机器人行业对多传感器融合需求的增长&#xff…

作者头像 李华