
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 对应 ,求 使 。
| 方法 | 最少点 | 特点 |
|---|---|---|
| P3P | 3 | 最多 4 解,需 disambiguate |
| EPnP | 4 | ,ORB-SLAM 默认 |
| Iterative | 4+ | 非线性精炼,需好初值 |
流程:EPnP 求初值 → Levenberg-Marquardt 精炼 → RANSAC 剔外点。内点门控:内点 < 50% 或绝对数 < 15 → 拒绝跟踪更新。跟踪帧若只有远点 inlier,平移方向弱可观——此时应降权平移或等待近点 inlier,而不是降低内点阈值硬过。
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