20 视觉基础 · ArUco 与 ChArUco
返回 00 - 项目总览与学习路线 | 前置 19 视觉基础 - 相机模型与内参标定
为什么学这个(项目关联)
ArUco 在本项目出现两次:
- 读夹爪开合宽度(原始 UMI 方案)——被原文对照实验否决,但实验设计是精品教材
- 标定基础设施——手眼标定的 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 文档 | 位姿估计 |
实践任务
- 💻 生成并打印 ArUco + ChArUco 板(注意实测方格物理尺寸!)
- 💻 检测 + 位姿:实时画标记坐标系轴(
drawFrameAxes),移动标记观察 - 📊 复现失败模式实验:固定相机,分别测 正常光/低光、静止/快速晃动、正对/大倾斜 下 100 帧的识别率,做成表
- 💻 像素距离实验:两标记贴在导轨上,滑动改变间距,录”像素距离 vs 实际距离”,拟合三次多项式,报告 RMSE
- 💭 思考:为什么原文说”误差小于某值没有实际意义”?(人手操作卡尺的精度极限 + 胶带形变)→ 精度需求要与物理过程匹配
掌握标准(自测)
- 能解释 ArUco 检测与位姿估计流程
- 能复述三大失败模式与原文量化数据
- 能说清像素距离方案为什么可以不用相机模型
- 完成识别率统计实验并有自己的数据
关联笔记
- 前置:19 视觉基础 - 相机模型与内参标定
- 对照方案:16 嵌入式 - AS5600 编码器与 XIAO ESP32C6(谁赢、为什么)
- 标定应用:21 标定系统 - 手眼标定、22 标定系统 - 支点标定、重力姿态与Quest-标记标定
- 原文对应章节:01 - 原文存档 - Dream-UMI 开发手记 “夹爪钳口位置读取”
实践记录
(学习时在这里追加:日期 / 做了什么 / 踩坑 / 疑问)