20 视觉基础 · ArUco 与 ChArUco

返回 00 - 项目总览与学习路线 | 前置 19 视觉基础 - 相机模型与内参标定

为什么学这个(项目关联)

ArUco 在本项目出现两次:

  1. 读夹爪开合宽度(原始 UMI 方案)——被原文对照实验否决,但实验设计是精品教材
  2. 标定基础设施——手眼标定的 ChArUco 棋盘、Quest-标记标定的 6 个机体标记,都靠它

知识点清单

1. ArUco 标记原理

  • 二维方形码:黑色边框 + 内部比特矩阵编码 ID;按”字典”生成(如 4×4、6×6,DICT_6X6_250)
  • 检测流程:自适应阈值 → 轮廓查找 → 四边形筛选 → 透视校正 → 读比特 → ID 匹配
  • 位姿估计:已知标记物理尺寸 + 相机内参 → solvePnP 得 T_cam_marker(这就是外参)
  • 一个标记 4 角点 → PnP;IPPE_SQUARE 等平面标记专用解法(了解)

2. ChArUco = 棋盘 + ArUco

  • 生成:cv.aruco.CharucoBoard,黑白方块内嵌小 ArUco
  • 优势:部分遮挡仍可检测(丢了角点可用 ArUco 补)、角点亚像素、每个角点有唯一 ID
  • 流程:detectMarkers → interpolateCornersCharuco → 角点(用于标定)/ 板位姿

3. ArUco 的失败模式(原文实验直接量化)

因素影响原文数据
低光照对比度不足 → 检测失败识别率跌到 29%
快速运动运动模糊 + 帧间位移大高速开合时仅 9% 帧识别
大倾斜角透视畸变 → 比特误读 + 抖动纸质不平整加剧
失焦边缘模糊靠内侧摆放轻微失焦反而整体更好
尺寸/距离成像太小 → 比特不可分辨完全对焦位置视角陡峭、成像小,可靠性反降
  • 摆放位置的 trade-off(原文图 1 结论):轻微失焦的内侧位置 > 完全对焦但视角陡峭的位置
  • 帧级统计:自然抓取 90% 帧、快速开合 80%、低光照 29%

4. 像素距离 vs 3D 距离(原文巧妙的降维)

  • 读钳口宽度可用两标记的:
    • 3D 距离:各自 solvePnP 得 3D 位置 → 距离(需要相机模型/内参)
    • 像素距离:两标记图像中心的像素距离(不需要相机模型)
  • 原文结论:高级标定(三次多项式拟合)后,像素距离精度可与 3D 距离持平 → 省掉内参依赖
  • 启示:能在测量中消掉系统性参数(内参)的方案更鲁棒

5. 从 ArUco 读数的标定(对应原文”标定”小节)

  • 简易:全开/全闭两点线性插值
  • 高级:卡尺给一系列已知宽度 → 拟合 读数→宽度 映射(线性/二次/三次对比)
  • 结论:编码器线性即可;ArUco 像素距离需三次多项式(非线性来自透视)

学习资源

资源用途
OpenCV ArUco 模块官方教程(Detection / Pose Estimation / CharucoBoard)核心
Garrido-Jurado et al.《Automatic generation and detection of ArUco markers》原理论文
OpenCV solvePnP 文档位姿估计

实践任务

  1. 💻 生成并打印 ArUco + ChArUco 板(注意实测方格物理尺寸!)
  2. 💻 检测 + 位姿:实时画标记坐标系轴(drawFrameAxes),移动标记观察
  3. 📊 复现失败模式实验:固定相机,分别测 正常光/低光、静止/快速晃动、正对/大倾斜 下 100 帧的识别率,做成表
  4. 💻 像素距离实验:两标记贴在导轨上,滑动改变间距,录”像素距离 vs 实际距离”,拟合三次多项式,报告 RMSE
  5. 💭 思考:为什么原文说”误差小于某值没有实际意义”?(人手操作卡尺的精度极限 + 胶带形变)→ 精度需求要与物理过程匹配

掌握标准(自测)

  • 能解释 ArUco 检测与位姿估计流程
  • 能复述三大失败模式与原文量化数据
  • 能说清像素距离方案为什么可以不用相机模型
  • 完成识别率统计实验并有自己的数据

关联笔记

实践记录

(学习时在这里追加:日期 / 做了什么 / 踩坑 / 疑问)