当前位置: 首页 > news >正文

滑动窗口法——实践中的BA

引入

带有相机位姿和空间点的图优化称为BA,它能够有效地求解大规模的定位与建图问题。但是在SLAM过程中,往往需要控制BA的规模,以保持计算的实时性。
最简单的控制BA规模的思路,是仅保留离当前时刻最近的N个关键帧。于是,我们的BA将被固定在一个时间窗口内,离开这个窗口的则被丢弃。这种方法称为滑动窗口法
滑动窗口法

SLAM中的滑动窗口法

1. 问题建模

目标:在计算资源受限的情况下,通过维护一个固定大小的状态窗口,持续优化最新的相机位姿和地图点,同时边缘化旧状态以保持计算效率。

变量定义

  • 滑动窗口内包含 M M M 个相机位姿 { ξ 1 , ξ 2 , … , ξ M } \{\xi_1, \xi_2, \dots, \xi_M\} {ξ1,ξ2,,ξM}(李代数表示)。
  • 窗口内关联的 N N N 个地图点 { P 1 , P 2 , … , P N } \{\mathbf{P}_1, \mathbf{P}_2, \dots, \mathbf{P}_N\} {P1,P2,,PN}

优化目标:最小化窗口内所有观测的重投影误差:
E ( x ) = ∑ i = 1 M ∑ j ∈ V i ∥ e i j ∥ 2 , e i j = p i j − π ( T i P j ) E(\mathbf{x}) = \sum_{i=1}^M \sum_{j \in \mathcal{V}_i} \left\| \mathbf{e}_{ij} \right\|^2, \quad \mathbf{e}_{ij} = \mathbf{p}_{ij} - \pi(T_i \mathbf{P}_j) E(x)=i=1MjVieij2,eij=pijπ(TiPj)
其中 V i \mathcal{V}_i Vi表示第 i i i 个相机观测到的地图点集合。


2. 滑动窗口更新流程

当新帧到来时,按以下步骤更新窗口:

(1) 添加新帧
  • 将新相机位姿 ξ M + 1 \xi_{M+1} ξM+1 加入窗口,关联的地图点通过三角化或特征匹配确定。
  • 扩展状态向量 x \mathbf{x} x
    x = [ ξ 1 , … , ξ M , P 1 , … , P N ] → [ ξ 1 , … , ξ M + 1 , P 1 , … , P N + K ] \mathbf{x} = [\xi_1, \dots, \xi_M, \mathbf{P}_1, \dots, \mathbf{P}_N] \rightarrow [\xi_1, \dots, \xi_{M+1}, \mathbf{P}_1, \dots, \mathbf{P}_{N+K}] x=[ξ1,,ξM,P1,,PN][ξ1,,ξM+1,P1,,PN+K]
(2) 移除旧帧
  • 若窗口大小超过设定值 M max M_{\text{max}} Mmax ,移除最旧的帧 ξ 1 \xi_1 ξ1
  • 关键操作:边缘化 ξ 1 \xi_1 ξ1 及其独有观测的地图点,保留其对剩余状态的约束。

3. 边缘化的数学推导

目标:将旧状态 x m = [ ξ 1 , P k ] \mathbf{x}_m = [\xi_1, \mathbf{P}_k] xm=[ξ1,Pk]的影响转化为剩余状态 x r \mathbf{x}_r xr 的先验信息。

(1) 原始优化问题

误差函数可分解为:
E ( x ) = E r ( x r , x m ) + E m ( x m ) E(\mathbf{x}) = E_r(\mathbf{x}_r, \mathbf{x}_m) + E_m(\mathbf{x}_m) E(x)=Er(xr,xm)+Em(xm)
其中:

  • E r E_r Er 为与 x r \mathbf{x}_r xr x m \mathbf{x}_m xm 相关的误差项。
  • E m E_m Em为仅与 x m \mathbf{x}_m xm 相关的误差项。
(2) 边缘化操作

通过舒尔补(Schur Complement)将 x m \mathbf{x}_m xm 积分掉:

  1. 构建信息矩阵
    H = [ H r r H r m H m r H m m ] , b = [ b r b m ] \mathbf{H} = \begin{bmatrix} \mathbf{H}_{rr} & \mathbf{H}_{rm} \\ \mathbf{H}_{mr} & \mathbf{H}_{mm} \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} \mathbf{b}_r \\ \mathbf{b}_m \end{bmatrix} H=[HrrHmrHrmHmm],b=[brbm]
  2. 舒尔补计算
    H ′ = H r r − H r m H m m − 1 H m r , b ′ = b r − H r m H m m − 1 b m \mathbf{H}' = \mathbf{H}_{rr} - \mathbf{H}_{rm} \mathbf{H}_{mm}^{-1} \mathbf{H}_{mr}, \quad \mathbf{b}' = \mathbf{b}_r - \mathbf{H}_{rm} \mathbf{H}_{mm}^{-1} \mathbf{b}_m H=HrrHrmHmm1Hmr,b=brHrmHmm1bm
    新误差函数为:
    E ′ ( x r ) = x r T H ′ x r − 2 b ′ T x r + const. E'(\mathbf{x}_r) = \mathbf{x}_r^T \mathbf{H}' \mathbf{x}_r - 2 \mathbf{b}'^T \mathbf{x}_r + \text{const.} E(xr)=xrTHxr2bTxr+const.
(3) 先验项的线性化点
  • 边缘化时的线性化点需固定(如使用FEJ策略),确保后续优化的雅可比矩阵与先验一致。

4. 滑动窗口优化步骤
  1. 初始化:维护窗口内状态 x = [ x r , x m ] \mathbf{x} = [\mathbf{x}_r, \mathbf{x}_m] x=[xr,xm]
  2. 边缘化旧状态
    • 计算 H ′ \mathbf{H}' H b ′ \mathbf{b}' b,生成先验项 E prior = 1 2 Δ x r T H ′ Δ x r + b ′ T Δ x r E_{\text{prior}} = \frac{1}{2} \Delta \mathbf{x}_r^T \mathbf{H}' \Delta \mathbf{x}_r + \mathbf{b}'^T \Delta \mathbf{x}_r Eprior=21ΔxrTHΔxr+bTΔxr
  3. 添加新观测
    • 将新帧的观测误差 E new = ∑ ∥ e i j ∥ 2 E_{\text{new}} = \sum \| \mathbf{e}_{ij} \|^2 Enew=eij2 加入目标函数。
  4. 构建新优化问题
    min ⁡ Δ x r ( E prior + E new ) \min_{\Delta \mathbf{x}_r} \left( E_{\text{prior}} + E_{\text{new}} \right) Δxrmin(Eprior+Enew)
  5. 求解增量方程
    ( H ′ + H new ) Δ x r = − ( b ′ + b new ) (\mathbf{H}' + \mathbf{H}_{\text{new}}) \Delta \mathbf{x}_r = -(\mathbf{b}' + \mathbf{b}_{\text{new}}) (H+Hnew)Δxr=(b+bnew)
  6. 更新状态 x r ← x r + Δ x r \mathbf{x}_r \leftarrow \mathbf{x}_r + \Delta \mathbf{x}_r xrxr+Δxr

5. 关键技术与注意事项
  1. 稀疏性保持
    • 窗口内状态的海塞矩阵天然稀疏,需使用稀疏求解器(如Cholesky分解或共轭梯度法)。
  2. FEJ(First Estimate Jacobians)
    • 所有观测的雅可比矩阵在第一次估计时固定,避免边缘化引入线性化点不一致。
  3. 鲁棒性处理
    • 对误匹配使用Huber核函数,降低外点影响:
      ρ ( e ) = { 1 2 e 2 ∣ e ∣ ≤ δ δ ∣ e ∣ − 1 2 δ 2 ∣ e ∣ > δ \rho(e) = \begin{cases} \frac{1}{2} e^2 & |e| \leq \delta \\ \delta |e| - \frac{1}{2} \delta^2 & |e| > \delta \end{cases} ρ(e)={21e2δe21δ2eδe>δ
  4. 窗口大小选择
    • 平衡计算量与精度,通常选择 M max ∈ [ 5 , 15 ] M_{\text{max}} \in [5, 15] Mmax[5,15]

6. 算法伪代码
Algorithm: Sliding Window SLAM
Input: 新帧图像及观测数据
Output: 窗口内优化后的相机位姿和地图点

1. while 新帧到达 do
2.   添加新帧到窗口末尾
3.   if 窗口大小 > M_max then
4.     标记待边缘化的旧帧及独有地图点
5.     构建原问题的H和b,分割为x_r和x_m
6.     计算舒尔补得到H'和b'
7.     从窗口中移除旧帧及独有地图点
8.   end if
9.   构建新观测的误差项,更新H_total = H' + H_new
10.  求解 H_total Δx = -b_total
11.  更新窗口内状态 x_r ← x_r + Δx
12. end while

7. 与全局BA的对比
特性滑动窗口法全局BA
优化变量窗口内局部状态全部历史状态
计算复杂度( O(M^3 + N) )( O((M+N)^3) )
内存占用低(仅维护窗口)高(需存储全部数据)
精度局部一致,可能累积漂移全局一致
适用场景实时SLAM(如VIO、无人机)离线重建、闭环优化后调整

8. 总结

滑动窗口法通过动态维护一个局部状态窗口,结合边缘化技术保留旧状态的约束,在有限计算资源下实现高效优化。其核心在于:

  1. 窗口更新:动态添加新帧、移除旧帧。
  2. 边缘化操作:通过舒尔补将移除状态的影响转化为先验信息。
  3. 稀疏优化:利用海塞矩阵的稀疏性加速求解。

该方法在实时SLAM系统(如OKVIS、VINS-Mono)中被广泛应用,平衡了计算效率与精度。

相关文章:

  • win10 HV主机服务无法启动(wsl安装失败)
  • 缺陷VS质量:为何软件缺陷是质量属性的致命对立面?
  • Python 图像处理之 Pillow 库:玩转图片
  • Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 基础语法:从脚本片段到 EL 表达式
  • 社会力模型:Social force model for pedestrian dynamics
  • 苹果手机备忘录怎么导入安卓手机?
  • 【C#】Clipboard中SetImage(BitmapSource image)的用法
  • Docker 安装与使用
  • 竞争只属于失败者
  • 探索文件IO奥秘:初识文件
  • Java 第十一章 GUI编程(2)
  • C与C++中inline关键字的深入解析与使用指南
  • 景联文科技:以专业标注赋能AI未来,驱动智能时代的精准跃迁
  • Java 大视界 -- Java 大数据在智能金融反欺诈中的技术实现与案例分析(114)
  • 靶场(二)---靶场心得小白分享
  • Stable Diffusion模型高清算法模型类详解
  • ifconfig 不显示 Linux 虚拟机常规网卡的 IP 地址
  • # Kouplele (5)
  • docer swarm集群部署springboot项目