返回专辑
·Johan·4 分钟阅读

相机模型:投影、畸变与 SLAM 连锁

针孔/鱼眼模型选型、去畸变策略与标定验收;错模型对三角化与 VIO 外参的系统性偏。

相机模型:投影、畸变与 SLAM 连锁

1. 模型错了,后面全在错流形上优化

SLAM 每次投影/反投影都假设相机模型正确。鱼眼硬套针孔,边缘重投影 RMSE 飙到 5 pixel,初始化永远过不了——误差能收敛,三角化深度、VIO 外参、回环几何验证却系统性偏。上次在广角模组上硬调畸变参数凑 RMSE,EuRoC 复现正常,真机边缘特征深度全错,外参旋转吸收了模型误差。相机模型错不像 bug 那样立刻 crash,而是让整个 BA 在错几何上「收敛」。

2. 针孔 + 径向切向畸变

残差 。OpenCV 用 ,Kalibr 顺序可能不同——填参极易搞反。雅可比须 chain rule 穿过 distort 和 ;AutoDiff 省心,analytic 快但易在 tangential 项上符号错。标定 yaml 与 SLAM 读参顺序应写进 CI 检查,避免 fx 对、k 顺序反。

3. 鱼眼 / 全向

视场 > 120° 时多项式畸变不够。常用 Kannala-Brandt (kb4)、等距模型、EUCM。硬套针孔 → 边缘特征深度错、回环内点率降、外参旋转「吸收」模型误差。EuRoC 针孔;TUM-VI 鱼眼——换数据集换模型,不是只改 yaml 数字。选型可看边缘 RMSE:中心 < 0.3 px 但四角 > 2 px,多半是模型族错了。Kalibr 标定输出 model 类型须与 SLAM yaml 一致,填错族比填错 fx 更隐蔽。

4. 去畸变策略

策略 Aundistort 后提特征,用针孔——实现简单,但插值模糊特征、边缘 pixel 拉伸/压缩,direct VO 光度一致性被破坏。策略 B:原图提特征,投影里带 distort——ORB-SLAM 默认,精度更好。Direct VO 几乎必须 B 或等价光度模型。策略 A 适合快速原型,上产品前评估边缘特征占比;广角模组边缘特征多,策略 A 往往不够。

5. 标定验收

检查标准
全图重投影 RMSE< 0.3–0.5 px
边缘 vs 中心边缘不应大 3 倍以上
直线度去畸变后棋盘边应直
换镜头/模组强制重标

标定 RMSE 与 SLAM 内部 reported error 不一致 → pipeline 有 model mismatch。换镜头须重跑 cam-imu 外参,不只 mono 内参——我吃过只重标内参、忘了 cam-imu 的亏,真机高速一转弯就掉。左右目外参不一致会在 stereo 三角化上表现为深度 scale 系统性偏。

6. 连锁与 rolling shutter

错模型 → 错三角化 → 错地图点 → PnP/BA 在错初值收敛 → 外参错 → 回环假通过或真失败。全局快门代码套 rolling shutter 相机,高速时像标定错了——要么换相机,要么 Kalibr RS 模型,勿硬调畸变凑。RS 等价于「每行外参略不同」,特征跟踪窗口会表现为系统性 skew;这类问题调 BA 无效,必须换模型或降速。

7. 与 SLAM 模块连锁

text
错误模型 → 错三角化 → 错地图点 → PnP/BA 错收敛 → 外参错 → 回环几何失败

调试法:标定数据上独立算 RMSE,与 SLAM 内部 error 对比——不一致即 model mismatch。Nav2 若共用同一相机 yaml,换镜头后内参版本须全栈同步,否则感知与 SLAM 各用各的内参。

8. 验收

  • 分区域 RMSE(中心/边缘/四角);
  • 换模型前后初始化成功率与 ATE;
  • VIO 高速段单独看重投影与尺度;
  • SLAM 与标定工具独立算 RMSE 应一致;
  • 换镜头后 cam-imu 重标完成再跑回归。

相机模型是视觉 SLAM 的地基;地基歪了,调 BA 窗口和回环阈值都是在错几何上拧旋钮。镜头/模组变更应触发标定工单,而不是只改 fx 两行 yaml。Stereo 左右目 model 不一致时,深度 scale 会在三角化层就偏,BA 救不回来。产线标定应输出 model 类型字段,SLAM 启动时校验与 yaml 一致。内参版本号写入 bag metadata,便于事故袋追溯。Direct VO 对去畸变插值敏感,选策略 B 时勿再走策略 A 捷径。

← 全部文章

johan's blog