一、为什么要有后端章首引入前面你学的前端VO / 特征跟踪 / PnP / ICP做的是✅ 根据相邻帧图像估计相机的相对运动特点是局部只关心当前帧 ↔ 上一帧 / 关键帧递推每帧算一次噪声会累积​ → 漂移drift问题是前端一旦有小误差乘上时间 → 轨迹慢慢歪掉无法利用历史信息和回环后端Backend / Optimization的作用把前端产生的相机位姿估计landmark三维点观测统一放到一个概率 / 优化框架联合优化所有位姿 所有地图点使结果全局一致对噪声鲁棒可消除累积误差回环一句话概括引入段前端给出初值后端通过批量优化得到最优解SLAM 后端的三层抽象这一节本质是帮你建立三个认知层次(1) 状态估计的概率解释 ← MAP (2) 线性系统 KF ← 特殊情况 (3) 非线性系统 EKF ← 过渡 ↓ (下一节) BA / 图优化 ← 实际用的下面逐个小节细说。10.1.1 状态估计的概率解释⭐最重要1️⃣ SLAM 状态定义通常定义系统状态xk​[Tk​, p1​,…,pm​]TTk​第 k 时刻相机位姿SE(3)pi​第 i 个路标landmark3D点观测zk,j​h(Tk​,pj​)noise例如h 相机投影模型观测 像素坐标2️⃣ 核心问题贝叶斯视角已知所有观测 {z1​,…,zn​}求x^argxmax​p(x∣z)用贝叶斯公式p(x∣z)p(z)p(z∣x)p(x)​p(z∣x)似然Likelihood如果世界是 x看到 z 有多可能p(x)先验Prior比如运动模型预测忽略分母与 x 无关最大化x^argmaxp(z∣x)p(x)3️⃣ 取负对数 → 最小二乘假设观测噪声 ∼ N(0, Σ)运动噪声 ∼ N(0, R)取 −ln乘法变加法指数变平方和x∗argmin(∥z−h(x)∥Σ2​∥x−x^pred​∥R2​)✅这就是 SLAM 后端优化的标准形式 你要记住的结论考试 / 面试都爱问SLAM 后端 最大后验估计MAPMAP 在 Gaussian noise 假设下 非线性最小二乘BA 就是这种形式的具体实例重投影误差10.1.2 线性系统和 KF现在假设运动是线性的xk1​Fk​xk​wk​观测是线性的zk​Hk​xk​vk​噪声均为高斯→ 得到卡尔曼滤波KFKF 两大步预测Predict用运动模型预测状态和协方差更新Update用新观测修正状态特点✅ 递归、实时✅ 最优在线性 高斯前提下❌ 相机投影不是线性不能直接用 KF 所以这节是铺垫理论不是视觉 SLAM 主流程。10.1.3 非线性系统和 EKF现实中运动可能是非线性观测一定是非线性相机投影 π(T·P)EKF 做法在当前估计值处做一阶泰勒展开局部线性化套用 KF 框架即zh(x)J(x−x^)⋯EKF SLAM状态向量包含所有相机位姿所有 landmark协方差矩阵dim × dim巨大EKF 的讨论高博重点吐槽为什么现代视觉 SLAM 几乎不用 EKF问题说明线性化误差大相机模型非线性强一阶近似差协方差维度爆炸O((nm)²)无法存、算强依赖初值线性化点不好 → 发散难处理回环需频繁增删状态全局一致性差仍是递推不是真正的全局 BA✅ 结论EKF 适合小尺度 / 状态少 / 有 IMU 的 VIO纯视觉 SLAMPTAM / ORB-SLAM→ BA 图优化三、这一块你该怎么学实操建议✅理解层面能口述SLAM 后端是 MAP 估计在高斯噪声下化成非线性最小二乘知道 KF → EKF → BA 的历史演进逻辑✅不要求不要求你现在能完整推导 KF 五个公式不要求背 EKF 雅可比形式✅自测问题为什么前端漂移后端能减小MAP 和最小二乘是什么关系EKF 为什么在大规模 SLAM 中被淘汰BA 属于上面哪一层抽象① 为什么前端会漂移而后端能减小漂移✅ 前端为什么会漂前端VO通常是增量式/递推式Tk​Tk−1​⋅ΔTk−1→k​每一帧只估计相对运动相对运动带有噪声特征误配、像素噪声、光照误差会不断相乘累积 结果即使每个 ΔT 只偏一点点长时间下轨迹会越来越歪​→ 这就是积分漂移drift而且前端❌ 只用最近帧/关键帧❌ 不知道同一个点之前见过✅ 后端为什么能减小漂移后端BA / 图优化做的是把所有帧、所有地图点、所有观测放在一起统一优化假设你第 1 帧和第 100 帧看到了同一个路标前端根本不利用这个信息后端第 1 帧 → 观测该点第 100 帧 → 也观测该点BA 会强制这两个位姿必须同时满足该点的投影数学上前端链式估计局部后端闭回路约束全局如果还有回环Loop Closure后端直接把错掉的轨迹掰回来前端永远做不到这一点 一句话总结**前端漂移是因为只看局部、递推累加误差后端减小漂移是因为利用所有观测 回路约束做全局最小二乘拟合。**② MAP 和最小二乘是什么关系这是 10.1.1 的核心结论。1️⃣ MAP最大后验估计x^argxmax​p(x∣z)argxmax​p(z∣x)p(x)2️⃣ 假设高斯噪声观测噪声zh(x)ε, ε∼N(0,Σ)运动/先验噪声N(0,R)那么p(z∣x)∝exp(−21​∥z−h(x)∥Σ2​)p(x)∝exp(−21​∥x−xpred​∥R2​)3️⃣ 取负对数x^argmin(∥z−h(x)∥Σ2​∥x−xpred​∥R2​)✅这就是加权非线性最小二乘 结论MAP 是概率意义上的最优估计在高斯噪声假设下MAP ⇔ 非线性最小二乘SLAM 后端BA就是在解这个最小二乘问题如果无先验、只优化观测就是普通 LS加先验 MAP③ EKF 为什么在大规模视觉 SLAM 中被淘汰再给你一个结构化、面试可直接背版的回答❌ 问题 1状态维数爆炸EKF SLAM 状态x[相机位姿1​...n​, landmark1​...m​]协方差矩阵Σ∈R(6n3m)×(6n3m)存储O((nm)²)更新O((nm)³)实际根本存不下、算不动❌ 问题 2线性化误差大EKF 在相机状态处对投影函数做一阶泰勒相机模型强非线性线性化点稍偏 → 误差大 → 滤波发散❌ 问题 3强依赖初值EKF 是递推的若早期线性化不准 → 后续修正困难BA 可以多次迭代、重新线性化❌ 问题 4难处理回环 动态结构增加 / 删除 landmark 要改整个协方差回环需要全局约束EKF 只能局部更新✅ 现代视觉 SLAMPTAM / ORB-SLAM用关键frame BA 滑窗 / 位姿图EKF 主要留在VIOIMU视觉不在大规模纯视觉 BA 一句话EKF 在小型/状态少时尚可在大规模、非线性强、需回环的视觉 SLAM 中效率和精度都不如 BA。④ BA 属于上面哪一层抽象回顾 10.1 的三层✅状态估计的概率解释MAP➖ 线性系统 KF特例➖ 非线性 EKF近似方法✅BABundle Adjustment属于第 1 层的具体实现把 MAP 写成Ti​,Pj​min​∑∥uij​−π(Ti​,Pj​)∥2假设高斯噪声 → MAP 非线性最小二乘用图优化 LM / Gauss–Newton​ 求解 标准说法BA 是在 MAP最大后验估计框架下以重投影误差为残差的非线性最小二乘问题是 SLAM 后端的主流实现方式。✅ 超简总结版你可以默念这句前端漂递推累加噪声只看局部后端减漂全局约束 回环统一优化MAP 最小二乘高斯噪声下取负对数EKF 淘汰原因维数爆炸 线性化误差 无全局回环BA MAP 框架下的具体非线性最小二乘问题10.2 BA 与图优化先给一张全局地图你看完再回头对照BA 问题来源重投影误差 ↓ 构建最小二乘 ⇒ 图模型节点 边 ↓ 求解Gauss–Newton / LM ↓ Hessian 矩阵具有稀疏性 ↓ 用 Schur 补边缘化地图点 ⇒ 加速 ↓ 加 Robust Kernel ⇒ 抗外点10.2.1 投影模型与 BA 代价函数1️⃣ BA 要解决什么问题前端给你若干相机位姿 T1​,…,Tm​若干地图点 P1​,…,Pn​观测第 i 个相机看到第 j 个点 → 像素坐标 uij​BABundle Adjustment同时优化所有相机位姿 所有三维点使它们最好地解释所有观测2️⃣ 相机投影模型对第 i 个相机、第 j 个地图点u^ij​π(Ti​Pj​)K⋅[Ri​∣ti​]⋅Pj​(齐次→像素)Ti​∈SE(3)Pj​∈R33️⃣ 重投影误差核心观测像素 uij​与 预测像素 u^ij​之差eij​(Ti​,Pj​)uij​−π(Ti​Pj​)BA 代价函数Ti​,Pj​min​(i,j)∈O∑​​eij​(Ti​,Pj​)​Σij​2​O有效观测集合通常 ΣI等权→ 普通欧氏距离平方 你要建立的认知✅ BA 非线性最小二乘✅ 残差 2D 重投影误差✅ 待优化变量位姿6DoF each点3DoF each 这和 10.1.1 说的MAP → 最小二乘​ 完全对应10.2.2 BA 的求解非线性最小二乘因为 π(T,P)是非线性函数 ⇒不能闭式求解常用方法Gauss–NewtonGNLevenberg–MarquardtLM更常用迭代形式简化对当前估计 x(JTJλI)Δx−JTe(x)J整体雅可比对位姿 点对误差Δx更新量LM 加阻尼 λ 保证稳定收敛雅可比说明很重要但先不深推JTi​​误差对李代数 ξ位姿扰动JPj​​误差对三维点坐标后面 g2o / Ceres 会自动求但你要知道每条边只连接 1 个位姿节点 1 个点节点这点直接决定下一个小节的稀疏性。稀疏性和边缘化⭐整章最关键这是为什么 BA 能在万级变量下实时跑​ 的根本原因。1️⃣ Hessian 矩阵的稀疏结构BA 的二次型近似F(x)≈21​ΔxTHΔxgTΔx其中HJTJ变量顺序x[位姿T1​,…,Tm​​​,点P1​,…,Pn​​​]2️⃣ 为什么 H 是稀疏的每条重投影误差只依赖一个相机 Ti只依赖一个点 Pj⇒ 每个误差项只在 H 中产生HTi​,Ti​​HPj​,Pj​​HTi​,Pj​​和 HPj​,Ti​​➡️没有 Ti–Tkk≠i直接耦合➡️没有 Pi–Pjj≠i直接耦合画成图位姿–位姿之间无直接边点–点之间无直接边位姿–点之间有边当且仅当被观测 这就是稀疏性Sparsity3️⃣ 分块写 HH[Hcc​Hpc​​Hcp​Hpp​​]Hcc​相机–相机块对角 / 稀疏Hpp​点–点对角因为每个点只被若干相机看4️⃣ Schur 补边缘化地图点对线性系统[Hcc​Hpc​​Hcp​Hpp​​][ΔTΔP​][bc​bp​​]先消元 ΔP(Hcc​−Hcp​Hpp−1​Hpc​)ΔTbc​−Hcp​Hpp−1​bp​记H~Hcc​−Hcp​Hpp−1​Hpc​Hpp​是对角 ⇒逆很容易求先解只有位姿的缩简系统再回代求 ΔP✅ 好处未知数从 (6m3n)→ 6m大幅降低计算量现代 BAg2o / Ceres / gtsam都这么干 一句人话总结因为 BA 图中每个误差只连一个位姿和一个点Hessian 高度稀疏通过舒尔补边缘化掉地图点只需先解一个更小的位姿系统从而高效求解。ORB-SLAM / PTAM 的 BA 能实时全靠这个① BA 的残差物理意义是什么BA 残差是观测像素 ↔ 当前模型预测像素之间的距离eij​uijmeasured​−π(Ti​,Pj​)物理意义人话**假如世界中有这个点 Pj​、相机在位姿 Ti​它应该投到像素 u^实际图像中检测到它在 u两者差多少——这个差就是重投影误差。**若 BA 优化完美 ⇒ 所有重投影误差 ≈ 0→ 同一三维点在不同帧中严丝合缝地解释所有观测残差单位像素 一句话背诵BA 残差是当前位姿点预测出的像素位置与真实图像观测像素之间的偏差重投影误差。② 为什么 BA 的 Hessian 矩阵是稀疏的核心原因只有一个每条重投影误差只依赖于【一个相机位姿 一个地图点】推导直觉BA 的误差项eij​(Ti​,Pj​)不含 Tk​ (ki)不含 Pl​ (lj)对 Hessian HJTJ∂Tk​∂eij​​0仅当 ki∂Pl​∂eij​​0仅当 lj⇒ 每个误差项只在 H 中填充HTi​,Ti​​HPj​,Pj​​HTi​,Pj​​与 HPj​,Ti​​因此不同位姿之间无直接耦合不同点之间无直接耦合只有看到该点的相机 ↔ 该点之间有非零块画成图[相机] —— [点] —— [相机] \ / (不直接相连) 一句话BA 图的每个边只连接一个位姿节点和一个路标点节点导致 Jacobian 列不重叠Hessian 呈块稀疏结构。③ Schur 补边缘化掉的是什么为什么要这么做✅ 边缘化掉的是地图点landmark变量BA 变量x[T1​…Tm​, P1​…Pn​]线性化系统[Hcc​Hpc​​Hcp​Hpp​​][ΔTΔP​][bc​bp​​]通过 Schur 补先消去 ΔP得到仅关于位姿的系统(Hcc​−Hcp​Hpp−1​Hpc​)ΔTbc​−Hcp​Hpp−1​bp​✅ 为什么要这么做降维原变量6m3nn 常几千几万消元后6mm 远小于 nHpp​是对角阵每个地图点只被少数相机观测求逆极快逐元素取倒数数值稳定 快避免直接解超大稠密方程组是现代 BA 能实时的根本原因 一句话Schur 补边缘化掉地图点变量把 BA 化为一个规模更小、只关于位姿的线性系统因 Hpp 对角消元高效从而大幅加速求解。ORB‑SLAM / PTAM / g2o / Ceres 全靠这一步④ 鲁棒核解决的是前端还是后端的问题✅它是后端优化中的机制用来弥补前端不可避免的缺陷更精确地说问题来源前端特征误匹配动态物体重复纹理 / 遮挡→ 产生外点Outlier观测解决位置后端 BA不用原始 ∥e∥2改用 ρ(e)Huber / Cauchy抑制大残差对整体优化的过度影响所以严谨说法是鲁棒核函数在后端使用用来抵抗前端引入的外点误匹配对非线性优化的破坏。 面试最简版外点来自前端鲁棒核作用在后端。它们解决的是什么问题你刚学的 BA 最终变成这个要求**给我一堆未知量位姿、点给我一堆误差函数重投影误差帮我找到让所有误差平方和最小的那个解**这个问题叫非线性最小二乘优化Nonlinear Least Squaresg2o 和 Ceres 就是帮你解这个问题的优化库。你自己写 Gauss–Newton / LM 很麻烦求雅可比组装 H 矩阵处理稀疏性迭代、收敛判断→这些库全帮你做了你只负责描述问题。二、用一个生活例子类比——调家具位置想象你在布置客厅有几把椅子地图点有相机/你站的位置位姿你从不同角度看椅子记下看到的角度观测但所有椅子和你站的位置都稍微不对劲你想微调椅子和你的站位让所有看起来的角度最符合记录这就是 BA。g2o / Ceres 一个专业装修调整团队你告诉它有哪些东西可动椅子、站位每条我看它应该长这样的规则误差它自动帮你一点点拧、推、转直到整体最协调三、g2o 是什么Graph Optimizationg2o General Graph Optimization 它怎么看问题节点Vertex​ → 待优化的东西相机位姿三维点边Edge​ → 误差/约束重投影误差一个相机看到一个点的观测图结构[位姿节点] ──边── [点节点]你说这个边连这两个节点误差函数长这样g2o 就帮你建图算雅可比利用稀疏性Schur 补LM 迭代求解 g2o 适合干啥✅SLAM / BA / 位姿图Pose Graph✅ 问题天然是图结构节点 边 一句话g2o 是你告诉它图里有啥节点、啥边、误差怎么算它帮你把整张图调到最优。四、Ceres Solver 是什么通用非线性最小二乘Ceres 是 Google 出的通用数值优化库。 它怎么看问题不强调图而是ParameterBlock​ → 待优化变量位姿、点ResidualBlock​ → 残差函数重投影误差LossFunction​ → 鲁棒核Huber 等你说我有这些变量 每个残差 f(变量) 我想最小化 Σ‖残差‖²Ceres 自动自动求导 / 数值求导 / 你给解析导Trust RegionLM稀疏求解可配 Ceres 适合干啥✅ BA✅ 标定相机 / IMU / 手眼✅ 任意自定义非线性最小二乘问题 一句话Ceres 是你定义变量 残差函数它帮你最小化残差平方和不局限于图结构。五、g2o vs Ceres —— 一张表看懂区别维度g2oCeres设计理念图优化框架通用非线性最小二乘建模方式Vertex Edge图ParameterBlock ResidualBlockSLAM 贴合度⭐⭐⭐⭐BA / Pose Graph 天然⭐⭐⭐⭐也很常用自动求导❌一般手写/数值✅非常强学习曲线稍陡要懂顶点/边继承相对平滑工业使用学术界/早期 SLAMGoogle / 工业界广泛视觉 SLAM 十四讲示例两个都给了g2o → 强调图模型、稀疏 BACeres → 强调自动求导、更现代写法六、结合你正在看的 BA一句话定位BA 是数学问题最小化重投影误差​g2o / Ceres 是帮你解 BA 的工具​你只要告诉它们✅ 哪些量是待优化的✅ 每个误差怎么算✅ 是否加鲁棒核它们负责 Jacobian、Hessian、稀疏求解、迭代