concepts
标定链总览
六条链的顺序、依赖关系、各自的判据,以及「链」这个说法的含义。
为什么是「链」不是「一堆标定」
因为它们有依赖顺序,而且前一条做错时,后一条不会报错,只会给出一个看起来合理的错值。
┌──────────────────────┐
│ C3 相机内参与畸变 │ 先把「相机看到的」矫正成「几何上正确的」
└──────────┬───────────┘
↓
┌──────────────────────┐
│ C1 像素当量 │ 把像素换算成毫米
└────┬─────────────┬───┘
↓ ↓
┌────────────────┐ ┌──────────────────┐
│ C2 手眼标定 │ │ C4 振镜场校正 │
└────────┬───────┘ └──────────────────┘
↓
┌────────────────┐ ┌──────────────────┐
│ C6 平台几何 │ │ C5 Z 轴焦点 │(独立,但要先有清晰成像)
└────────────────┘ └──────────────────┘
六条链
| # | 名称 | 解什么 | 依赖 | 典型判据 |
|---|---|---|---|---|
| C1 | 像素当量 | mm/px、旋转角、非正交量 | C3 | 20 mm 行程偏差 < 0.05 mm |
| C2 | 手眼标定 | T_Tool_Cam 或 T_World_Cam |
C1 | 九点残差 RMS < 0.03 mm |
| C3 | 相机内参与畸变 | fx, fy, cx, cy, k1, k2, p1, p2 | — | 重投影误差 < 0.15 px |
| C4 | 振镜场校正 | 场内网格畸变校正表 | C1 | 场内残差 RMS < 15 µm |
| C5 | Z 轴焦点 | 最佳焦面位置、景深范围 | — | 焦点重复性 < 10 µm |
| C6 | 平台几何 | 正交度、旋转中心、平面度 | C1、C2 | 正交度偏差 < 50 µrad |
判据里的数字是 demo-2axis-vision 这台虚拟机的默认容差。
真机上按你的精度预算改,改的地方在机台配置里,不在代码里。
每条链的五步是一样的
所有链都实现同一个接口,所以界面、日志、存档、重跑逻辑全部复用:
public interface ICalibrationProcedure
{
string Id { get; }
IReadOnlyList<string> DependsOn { get; } // 依赖的其他链
Task<CalibResult> RunAsync(CalibContext ctx, IProgress<CalibProgress> p, CancellationToken ct);
}| 步骤 | 做什么 | 失败时 |
|---|---|---|
| prepare | 检查依赖链是否已完成、器材是否就位、参数是否合法 | 直接拦住,不要让人跑完 5 分钟才发现依赖没做 |
| acquire | 按规划的位姿采集数据 | 单点失败可重采,不必整条重来 |
| solve | 求解,输出参数与残差 | 残差异常要给出可能原因,不只是数字 |
| verify | 用没参与求解的数据回算 | 这里出偏差数字与 PASS/FAIL |
| persist | 版本化落盘 | 永远追加,不覆盖,可回滚 |
verify 用的数据必须没参与 solve。 用同一批数据既求解又验证, 残差一定好看,但什么也没验证——这是标定报告里最常见的自欺欺人。
真值评分:虚拟设备独有
真机上你只有残差,没有真值。虚拟设备知道真值,所以能多给一行:
solve: mm/px = 0.019823
truth: mm/px = 0.019841
verify: 20 mm 行程上偏差 0.018 mm,容差 0.05 mm → PASS
这行的意义不是「让数字好看」,而是让你知道残差小到什么程度才算真的准。 很多人第一次发现「残差 0.02 px 但实际偏差 0.3 mm」时,才真正理解了标定。
结果存哪
%ProgramData%\PreciSim\calibration\
demo-2axis-vision\
C1-pixel-size\
2026-09-21T10-24-13.json ← 每次跑一条记录,永不覆盖
latest.json ← 指向当前生效的那条
每条记录含:参数、残差、真值对照(虚拟设备才有)、采集原始数据的引用、软件版本、操作者。 出了问题要能回溯到「哪次标定开始不对的」,这份存档就是全部依据。
最后更新: 2026/9/21
这页有帮助吗?