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

PnP 与三角化:前端两条腿的门槛

视差角与深度不确定性、EPnP/迭代 PnP 与内点门控,以及地图点寿命如何预测 LOST。

PnP 与三角化:前端两条腿的门槛

1. LOST 多半不是 BA 不够强

视觉 SLAM 前端两条腿:三角化生地图点,PnP 用地图点定相机位姿。跟踪丢失的多数案例,根因是地图点深度方差爆炸或 PnP 在内点率 30% 时仍被硬接受——不是 BA 不够强,而是前端在「制造垃圾进 BA」。

2. 三角化与视差

两帧位姿 和归一化坐标求射线交点。视差角 (两射线夹角)小时,深度方差 爆炸:

视差角深度精度
> 5°通常可用
2–5°勉强,需 BA 精炼
< 2°应拒绝

关键帧策略必须保证平均视差——不是帧数多,原地抖动视差近零。OpenCV triangulatePoints 用 SVD;ORB-SLAM 用 mid-point + parallax check。三角化后检查:两帧 camera 系 、重投影误差、视差角阈值。

3. PnP 流程

n 个 3D-2D 对应 ,求 使

方法最少点特点
P3P3最多 4 解,需 disambiguate
EPnP4,ORB-SLAM 默认
Iterative4+非线性精炼,需好初值

流程:EPnP 求初值 → Levenberg-Marquardt 精炼 → RANSAC 剔外点。内点门控:内点 < 50% 或绝对数 < 15 → 拒绝跟踪更新。跟踪帧若只有远点 inlier,平移方向弱可观——此时应降权平移或等待近点 inlier,而不是降低内点阈值硬过。

cpp
if (inliers.size() < 15 || inlier_ratio < 0.5) {
  return TRACKING_LOST;  // 不要硬更新
}

跟踪 LOST 恢复时,先用 IMU 传播、 widen 匹配窗口,而不是立刻降 PnP 内点阈值——阈值放松会把错误位姿写进关键帧,恢复比 LOST 更难清理。

4. 不确定性与权重

远点(深度大)对 6-DOF 位姿约束弱——尤其平移方向。信息权重应反映深度不确定性:。所有点等权重在远点占比高时会 over-weight 噪声。

逆深度参数化 对近点数值更稳——VINS/OpenVINS 默认; 等价无穷远,对平移约束弱,应降权或丢弃。

5. 退化与外点

地图点共面时 PnP 仍有解但某些方向弱可观——平面场景更依赖 IMU 或 motion parallax;coplanar ratio 高的 local map 可拒绝 PnP 更新,只传播 IMU 预测。外点来自误匹配(动态物体、重复纹理)、小视差三角化、位姿初值错导致 PnP 局部最优。RANSAC + 鲁棒 BA 是标准组合,匹配质量是第一道门

双目/RGB-D 可直接用视差/深度三角化,比单目 motion triangulation 稳;单目须更 aggressive 的 keyframe 视差策略。匹配 pipeline 里 ratio test 和 cross-check 应在三角化之前——误匹配三角化出的点深度再准也是假点,PnP 会把位姿拉向错误局部最优。

6. 健康度指标

  • 新建地图点平均视差角(< 3° → keyframe 策略有问题)
  • 地图点存活寿命(几帧即 cull → 匹配差)
  • PnP 内点率分布(应集中在 70%+)
  • 三角化成功率 vs 匹配数

秒删的地图点 = 前端在制造垃圾进 BA。单目里我把「最小平移/旋转才插 keyframe」设得比 ORB 默认更 aggressive,帧数少但视差够——跟踪 LOST 率反而降,因为 BA 不再消化一批深度方差爆炸的点。

7. 验收

  • 跟踪更新拒绝次数 / 原因分布
  • 地图点 cull 率 vs 创建率
  • 故意小视差 bag:应拒绝三角化而非进 BA
  • PnP 重投影 RMSE 分布

前端质量看 map point 寿命和 PnP 内点率,比「有没有跑 BA」更能预测现场会不会 LOST。BA 只能精炼已有几何;三角化阶段进来的垃圾点,BA 会把它「优化成看起来合理」的错深度——所以门控必须在 PnP 接受和三角化创建两处同时收紧。Local mapping 里 cull 重投影误差大的点,应和跟踪拒绝用同一套阈值体系,避免前后端标准不一致。三角化拒绝原因应打日志(视差/负深度/重投影),否则 LOST 时只能猜是匹配还是几何门控的问题。

← 全部文章

johan's blog