已知物理尺寸的单目 AprilTag 在可见时能够给出带尺度的相机到标签位姿,足以完成开阔、低速、可视范围内的目标相对跟随。
IMU 与气压计仍然是 PX4 的常规飞行传感器。IMU 姿态还会在图像时刻参与刚体坐标变换,但这不是把视觉测量融合进 EKF。
核心边界
它是目标相对视觉伺服,不是全局导航。这个边界决定了为什么不需要 LiDAR,也决定了失去 Tag 后不能宣称水平定点。
已知物理尺寸的单目 AprilTag 在可见时能够给出带尺度的相机到标签位姿,足以完成开阔、低速、可视范围内的目标相对跟随。
IMU 与气压计仍然是 PX4 的常规飞行传感器。IMU 姿态还会在图像时刻参与刚体坐标变换,但这不是把视觉测量融合进 EKF。
摄像头看不到标签时,系统没有新的水平位置观测。
外环只发送姿态与推力设定值,不重造姿态控制器。
脚本轨迹和键盘控制共用同一个差速小车模型。
图形化运行
完整运行时保存在项目目录内。默认命令同时打开 Gazebo 3D 世界与紧凑的 AprilTag 标注相机窗口,结束后自动下降、disarm 和清理。
$ git clone https://github.com/albert17github/\ PX4-AprilTag-Follow-Demo.git $ cd PX4-AprilTag-Follow-Demo $ ./setup.sh $ ./demo.sh
首次构建需要约 20 GiB 可用空间。虚拟机里的 Gazebo 窗口可能需要 30–90 秒出现。
运行 ./demo.sh --keyboard,保持终端焦点并按住运动键。前进方向始终以小车橙色车头为准;0.4 秒未续按会自动停车。
姿态反解
控制器按图像曝光时刻配对 PX4 姿态,而不是使用检测回调到达时的“最新姿态”。这避免把渲染、桥接和检测延迟误认为目标移动。
apriltag_ros 使用图像、内参与已知标签尺寸计算 6DoF pose。
把 optical 轴转换到 PX4 body FRD,并只应用一次相机平移。
从姿态缓冲进行 SLERP,将倾斜机体系相对向量旋转到重力对齐坐标。
PD、低通、加速度和 8° 倾角限制共同生成姿态与推力。
末端样本无法被姿态时间包围、时间差过大或图像过期时,测量会被明确拒绝,不会盲目拼接。
Tag pose/quality、源图像时间戳、CameraInfo、相机外参、PX4 attitude/state 和气压高度。
Gazebo truth、GPS/local position、LiDAR odometry、SLAM pose 或 optical-flow position。
飞行证据
正式移动目标运行持续 120 秒。视觉误差与只读 Gazebo truth evaluator 的评分相互接近;evaluator 没有 publication,真值没有形成控制回路。
| 验证场景 | 条件 | 正式结果 |
|---|---|---|
| 静态检测 | 1–3 m、偏移、不同 yaw | 5/5 · 100% valid · hamming 0 |
| 姿态补偿 | roll/pitch ±15° | RMSE 0.459 m → 0.000957 m |
| 静止 Tag 飞行 | 连续 60 秒 | XY RMS 0.096 m · p95 0.227 m |
| 移动目标跟随 | 0.5 m/s · 120 秒 | visual RMS 0.319 m · p95 0.560 m |
| 独立真值评分 | 同一移动运行,只读 | truth RMS 0.324 m · p95 0.574 m |
| 键盘控制 | WASD / arrows / deadman | PASS · final armed=false |
图片 SHA256 可在 assets/SHA256SUMS 复核。完整运行编号与机器可读指标:reports/status.json
丢标处理
丢标后的目标是先消除危险水平追逐,再给识别恢复留出时间。只有持续丢标达到 10 秒才锁存下降;落地后也不会立即退出。
保留短时恢复机会,所有新测量仍需重新通过质量和时效门控。
不继续追逐最后一个目标速度,避免丢标后加速飞离。
气压计只提供竖直安全信号;系统不宣称水平位置保持。
正式测试在 9.94 秒离散周期触发,下降后重新识别也不会取消落地。
确认落地与 disarm,再保持零推力 3 秒并清理项目进程。
开发者入口
公开仓库只保留复现、架构、验证和维护需要的内容;本机运行时、原始日志与内部工作记录不进入 Git。
上游依据:AprilTag 3 · apriltag_ros · PX4 Offboard · Gazebo Harmonic ROS 2 integration