UMI Cube Marker 相对定位 - NUSNiuMu/insight-capture-dashboard GitHub Wiki

UMI Cube Marker 相对定位

目标

两只 Insight3 夹爪相机都固定安装 UMI cube。Insight9 看到 cube 后,利用已知的 cube→Insight3 双目中心外参,为各自 VIO 提供低频 T_map_odom 绝对观测,纠正长时间 相对运动的累计漂移。它运行在 insight3-global-localizer 内部,不是独立后台服务。

几何与编号

Cube 外边长为 70 mm,四面 marker 黑框边长为 60 mm。Cube 原点位于几何中心,方向按 Insight3 光学坐标约定:+X 向右、+Y 向下、+Z 向前。

面 Insight3 A Insight3 B 固定坐标
顶面 8 2 Y=-35 mm
后面 9 3 Z=-35 mm
左面 10 4 X=-35 mm
右面 11 5 X=+35 mm

Jetson NX 当前使用的 cube→双目中心平移为:

Insight3 A: [0, -58, 90] mm
Insight3 B: [0, -53, 93] mm
rotation: identity

左右值由同一块 4x4 AprilGrid、同一角点尺度分别测量。统一模型后左右 Y/Z 差异约 4.4/3.7 mm,与单段约 4–5 mm 的重复性相当;早期约 10 mm 的差异包含左右分别拟合 标定板角点尺度产生的系统误差。

坐标链

Insight9 使用压缩彩色图 /insight9_a/camera/color/image_rect_raw/compressed 检测 marker, 联合可见面得到 T_RGB_cube。在图像时间戳处组合:

T_map_camera(marker)
  = T_map_head_center
  * T_head_center_RGB
  * T_RGB_cube
  * T_cube_camera_center

T_map_odom(marker)
  = T_map_camera(marker)
  * inverse(T_odom_camera_center(VIO))

最终对外 Pose 仍以 Insight3 VIO 提供高频运动:

T_map_camera_center
  = T_map_odom(EKF)
  * T_odom_imu(VIO)
  * T_imu_camera_center

共识与 EKF

Cube marker 与自然地图重定位各有独立候选窗口,但最终更新同一个六自由度 T_map_odom 误差状态 EKF。

  • 检测频率:10 Hz;
  • 共识:5 帧窗口内至少 3 帧;候选间不超过 30 mm / 3 度;
  • PnP:内点比例至少 0.75,重投影中位不超过 2.5 px;
  • Cube marker 观测噪声:10 mm / 1 度;
  • 小修正:进入 EKF,发布值按 1 秒时间常数平滑;
  • 达到 150 mm 或 10 度:已确认观测触发 hard relocalization;
  • 实际修正强制要求至少两个非共面标记面,每面至少三个 RANSAC 内点;即使配置为 min_markers=1,单面也不能修正。只看到单面时继续沿用 VIO,等待多面或自然特征定位。
  • 离线 shadow 模式仍允许 min_markers=1,用于分析单面歧义。

头部位姿时间戳回退或 New Map 时,同时重置图像时间戳门槛、候选窗口和待处理队列。 每次重置递增会话编号,检测过程中发生重置时,旧结果不能写回共识、诊断状态或定位。

状态位于 /insight_global/insight3_a/status 与 insight3_b/status 的 cube_marker 字段, 包含 marker_ids、角点/内点数、重投影误差、observations、updates、 correction_mode 和 hard_relocalizations。

运行配置

生产配置位于 config/devices/jetson-nx/runtime.json:

"enabled": true,
"apply_corrections": true

没有该配置段时功能默认关闭;apply_corrections 缺省时默认只做 shadow。修改 profile 后 需执行 ./scripts/select_device.sh jetson-nx,再重建 insight3-global-localizer。

离线检查命令:

python3 tools/diagnostics/replay_cube_marker_shadow.py \
  --config config/devices/jetson-nx/runtime.json \
  --camera insight3_a /path/to/bag

该工具固定为只读 shadow,不受生产配置中 apply_corrections=true 影响。

验证边界与已知风险

修复前的 Take 54 回放结果:

相机 有效 PnP 重投影中位 局部相对误差中位
Insight3 A 132 0.87 px 60.0 mm / 5.31 度
Insight3 B 148 0.81 px 30.1 mm / 2.59 度

Insight3 A 在 ID 9、10、9+11 等部分视角出现过平面 PnP 错误分支,Z 方向错误可达约 0.7 m;多帧共识能过滤短暂异常,但持续错误解仍可能通过。因此当前实机必须监控 hard_relocalizations 和换面连续性。像素重投影只能说明投影自洽,不能作为机械外参或 全局定位绝对精度的独立真值。

2026-09-08 修复后,实际修正拒绝单面和共面内点。修复前可复现的约 0.54 px 角点扰动、 三帧稳定错误解不再进入修正;正确的双面合成观测仍能恢复位姿。相关测试共 130 项通过, 包括时间从 100 秒回退到 1 秒后的处理恢复,以及在途检测遇到时间回退/New Map 后的 成功、未检测到和异常三种结果隔离。回归脚本位于 ~/workspaces/insight_capture_tests/cube_marker_safety/test_regression.py。 验证时没有运行中的 Docker 容器,未进行在线 ROS 或真实相机部署验证;这些合成测试 不能代替现场精度与覆盖率评估。

对应主仓库提交:初始功能 ea2828d,安全修复 b8b53bc。