Night Office

CABINET  / Machines in Motion / 具身智能研究

状态估计与SLAM

2026-04 · 26.5k 字


具身智能系统在物理世界中运行,必须持续回答两个基本问题:我在哪里(localization),周围环境的几何结构是什么(mapping)。状态估计与SLAM(Simultaneous Localization and Mapping)层提供对这两个问题的联合求解。本文从概率理论基础出发,逐层展开视觉、惯性、激光雷达等传感器模态下的主流算法架构,覆盖前端里程计、后端图优化、地图表示、多传感器融合,并附主要工业公司格局。


1. 概率状态估计基础

1.1 贝叶斯滤波框架(Bayesian Filtering)

状态估计的核心任务:给定传感器观测序列 $z_{1:t}$ 和控制输入序列 $u_{1:t}$,推断系统当前状态 $x_t$ 的后验概率分布。

贝叶斯滤波的递推公式由两步组成:

预测步骤(Prediction):

$$ p(x_t | z_{1:t-1}, u_{1:t}) = \int p(x_t | x_{t-1}, u_t) \cdot p(x_{t-1} | z_{1:t-1}, u_{1:t-1}) , dx_{t-1} $$

其中 $p(x_t | x_{t-1}, u_t)$ 为运动模型(motion model),描述状态转移的概率。

更新步骤(Update):

$$ p(x_t | z_{1:t}, u_{1:t}) = \frac{p(z_t | x_t) \cdot p(x_t | z_{1:t-1}, u_{1:t})}{p(z_t | z_{1:t-1}, u_{1:t})} $$

其中 $p(z_t | x_t)$ 为观测模型(observation model),分母为归一化常数。

这一框架是所有概率状态估计方法的理论基础,不同算法的区别在于如何参数化分布、如何近似积分。

1.2 卡尔曼滤波(Kalman Filter)

当系统满足以下条件时,贝叶斯滤波存在解析解:

  1. 线性运动模型:$x_t = F_t x_{t-1} + B_t u_t + w_t$,其中 $w_t \sim \mathcal{N}(0, Q_t)$
  2. 线性观测模型:$z_t = H_t x_t + v_t$,其中 $v_t \sim \mathcal{N}(0, R_t)$
  3. 初始状态服从高斯分布:$x_0 \sim \mathcal{N}(\hat{x}_0, P_0)$

在这些条件下,后验分布始终保持高斯形式 $p(x_t | z_{1:t}) = \mathcal{N}(\hat{x}_t, P_t)$。

完整推导:

预测步骤:

$$ \hat{x}t^{-} = F_t \hat{x}{t-1} + B_t u_t $$

$$ P_t^{-} = F_t P_{t-1} F_t^T + Q_t $$

更新步骤:

新息(Innovation): $$ y_t = z_t - H_t \hat{x}_t^{-} $$

新息协方差: $$ S_t = H_t P_t^{-} H_t^T + R_t $$

卡尔曼增益(Kalman Gain): $$ K_t = P_t^{-} H_t^T S_t^{-1} $$

状态更新: $$ \hat{x}_t = \hat{x}_t^{-} + K_t y_t $$

协方差更新: $$ P_t = (I - K_t H_t) P_t^{-} $$

卡尔曼增益的物理含义:$K_t$ 决定了预测值与观测值之间的权重分配。当观测噪声 $R_t$ 趋近于零时,$K_t \to H_t^{-1}$,系统完全信任观测;当预测协方差 $P_t^{-}$ 趋近于零时,$K_t \to 0$,系统完全信任预测。

数值示例:一维匀速运动目标跟踪

状态: x = [position, velocity]^T
F = [[1, dt], [0, 1]], dt = 0.1s
H = 1, 0  (只观测位置)
Q = [[0.01, 0], [0, 0.01]]
R = 0  (观测噪声方差)

初始: x_hat = [0, 1]^T, P = [[1, 0], [0, 1]]

Step 1 预测:
  x_hat^- = [[1, 0.1], [0, 1]] * [0, 1]^T = [0.1, 1]^T
  P^- = F*P*F^T + Q = [[1.02, 0.11], [0.11, 1.02]]

Step 1 更新 (假设 z_1 = 0.5):
  y = 0.5 - [1,0]*[0.1, 1]^T = 0.4
  S = [1,0]*P^-*[1,0]^T + 1.0 = 1.02 + 1.0 = 2.02
  K = P^-*[1,0]^T / S = [1.02/2.02, 0.11/2.02]^T = [0.505, 0.054]^T
  x_hat = [0.1, 1]^T + [0.505, 0.054]^T * 0.4 = [0.302, 1.022]^T
  P = (I - K*H)*P^- = [[0.505, 0.054], [0.054, 0.965]]

1.3 扩展卡尔曼滤波(Extended Kalman Filter, EKF)

实际系统几乎都是非线性的。EKF 通过一阶泰勒展开将非线性系统局部线性化。

非线性系统模型: $$ x_t = f(x_{t-1}, u_t) + w_t $$ $$ z_t = h(x_t) + v_t $$

线性化过程:在当前估计值处计算雅可比矩阵(Jacobian):

$$ F_t = \frac{\partial f}{\partial x}\bigg|{\hat{x}{t-1}, u_t} $$

$$ H_t = \frac{\partial h}{\partial x}\bigg|_{\hat{x}_t^{-}} $$

预测步骤变为: $$ \hat{x}t^{-} = f(\hat{x}{t-1}, u_t) $$ $$ P_t^{-} = F_t P_{t-1} F_t^T + Q_t $$

更新步骤中的 $H_t$ 使用线性化后的雅可比矩阵,其余公式与标准 KF 相同。

EKF 的局限性:

  1. 一阶线性化在强非线性区域产生较大误差
  2. 雅可比矩阵的解析计算对复杂系统可能困难
  3. 无法表示多模态分布

1.4 无迹卡尔曼滤波(Unscented Kalman Filter, UKF)

UKF 的核心思想:用确定性采样点(sigma points)来近似概率分布通过非线性变换后的统计特性,精度可达三阶(对高斯输入)。

对于 $n$ 维状态,生成 $2n+1$ 个 sigma 点:

$$ \chi_0 = \hat{x} $$ $$ \chi_i = \hat{x} + \left(\sqrt{(n+\lambda)P}\right)i, \quad i = 1, \ldots, n $$ $$ \chi{i+n} = \hat{x} - \left(\sqrt{(n+\lambda)P}\right)_i, \quad i = 1, \ldots, n $$

其中 $\lambda = \alpha^2(n + \kappa) - n$ 为缩放参数,$\left(\sqrt{(n+\lambda)P}\right)_i$ 表示矩阵平方根的第 $i$ 列。

权重: $$ W_0^{(m)} = \frac{\lambda}{n+\lambda}, \quad W_0^{(c)} = \frac{\lambda}{n+\lambda} + (1 - \alpha^2 + \beta) $$ $$ W_i^{(m)} = W_i^{(c)} = \frac{1}{2(n+\lambda)}, \quad i = 1, \ldots, 2n $$

典型参数选择:$\alpha = 10^{-3}$,$\kappa = 0$,$\beta = 2$(对高斯分布最优)。

UKF 预测步骤:

  1. 将 sigma 点通过非线性运动模型传播:$\chi_i^{-} = f(\chi_i, u_t)$
  2. 计算预测均值:$\hat{x}t^{-} = \sum{i=0}^{2n} W_i^{(m)} \chi_i^{-}$
  3. 计算预测协方差:$P_t^{-} = \sum_{i=0}^{2n} W_i^{(c)} (\chi_i^{-} - \hat{x}_t^{-})(\chi_i^{-} - \hat{x}_t^{-})^T + Q_t$

1.5 粒子滤波(Particle Filter)

粒子滤波使用一组加权样本(粒子)来表示任意形状的概率分布,不受高斯假设和线性化限制。

算法流程:

输入: 粒子集 {x_{t-1}^{(i)}, w_{t-1}^{(i)}}_{i=1}^N, 控制 u_t, 观测 z_t

1. 对每个粒子 i = 1, ..., N:
   a. 从提议分布采样: x_t^{(i)} ~ p(x_t | x_{t-1}^{(i)}, u_t)
   b. 计算权重: w_t^{(i)} = p(z_t | x_t^{(i)})

2. 归一化权重: w_t^{(i)} = w_t^{(i)} / sum(w_t^{(j)})

3. 重采样(Resampling):
   根据权重 {w_t^{(i)}} 重新采样 N 个粒子
   常用方法: 系统重采样(Systematic Resampling)

4. 输出: 加权粒子集 {x_t^{(i)}, 1/N}_{i=1}^N

蒙特卡洛定位(Monte Carlo Localization, MCL):

MCL 是粒子滤波在已知地图定位问题中的直接应用。粒子表示机器人可能的位姿,观测模型通常使用激光雷达的 beam model 或 likelihood field model。

粒子退化问题:经过多次迭代后,大部分权重集中在少数粒子上。有效粒子数(Effective Sample Size)用于监控退化:

$$ N_{eff} = \frac{1}{\sum_{i=1}^N (w_t^{(i)})^2} $$

当 $N_{eff}$ 低于阈值(通常 $N/2$)时触发重采样。

1.6 各滤波方法对比

方法分布假设计算复杂度适用非线性程度典型应用
KF线性高斯$O(n^3)$仅线性系统基线对比
EKF近似高斯$O(n^3)$弱非线性IMU积分, VIO
UKF近似高斯$O(n^3)$中等非线性姿态估计
PF任意分布$O(N \cdot n)$强非线性/多模态全局定位, MCL

2. 视觉里程计(Visual Odometry, VO)

视觉里程计通过连续图像帧之间的几何关系估计相机的增量运动。根据信息利用方式分为特征法(feature-based)和直接法(direct method)。

2.1 基于特征的方法(Feature-based VO)

2.1.1 ORB 特征

ORB(Oriented FAST and Rotated BRIEF)是当前实时SLAM中使用最广泛的特征描述子。

检测阶段:使用 FAST(Features from Accelerated Segment Test)角点检测器。对像素 $p$,检查其周围 Bresenham 圆(半径3,16个像素)上是否存在连续 $N$(通常 $N=9$)个像素亮度全部大于 $I_p + t$ 或全部小于 $I_p - t$。

方向计算:使用灰度质心法(Intensity Centroid)。在特征点邻域内计算图像矩:

$$ m_{pq} = \sum_{x,y} x^p y^q I(x, y) $$

质心为 $C = (m_{10}/m_{00}, m_{01}/m_{00})$,方向角 $\theta = \text{atan2}(m_{01}, m_{10})$。

描述子:rBRIEF(旋转 BRIEF),对 256 对点进行二值比较,根据特征点方向旋转采样模式,输出 256-bit 二进制向量。匹配时使用 Hamming 距离,可通过 CPU 的 POPCNT 指令高效计算。

2.1.2 特征匹配

匹配策略:

  1. 暴力匹配(Brute Force):计算描述子间所有两两距离
  2. 快速近似最近邻(FLANN):使用 KD-Tree 或随机化树
  3. 比率测试(Lowe’s Ratio Test):最近邻距离与次近邻距离之比小于阈值(通常 0.7)

2.1.3 对极几何(Epipolar Geometry)

两个相机观测同一3D点 $P$,记其在两帧图像中的归一化坐标为 $p_1$ 和 $p_2$,相机间的相对运动为旋转 $R$ 和平移 $t$。

本质矩阵(Essential Matrix):

$$ p_2^T E , p_1 = 0 $$

其中 $E = [t]\times R$,$[t]\times$ 为平移向量的反对称矩阵。

$E$ 有5个自由度(3旋转 + 2平移方向,尺度不可观)。

基础矩阵(Fundamental Matrix):

当使用像素坐标 $\tilde{p}_1, \tilde{p}_2$ 时:

$$ \tilde{p}_2^T F , \tilde{p}_1 = 0 $$

其中 $F = K_2^{-T} E K_1^{-1}$,$K_1, K_2$ 为相机内参矩阵。$F$ 有7个自由度。

八点法求解 $F$:将对极约束展开为线性方程组 $Af = 0$,其中 $f$ 为 $F$ 的9个元素。至少需要8对匹配点,使用 SVD 分解求解最小二乘问题,并施加 $\text{rank}(F)=2$ 约束。

2.1.4 PnP(Perspective-n-Point)

当已知3D地图点时,PnP 直接求解相机在世界坐标系中的位姿。

给定 $n$ 个3D-2D对应 $(P_i, p_i)$,求解 $[R|t]$ 使得:

$$ s_i \begin{bmatrix} u_i \ v_i \ 1 \end{bmatrix} = K [R|t] \begin{bmatrix} X_i \ Y_i \ Z_i \ 1 \end{bmatrix} $$

常用方法:

  • P3P:使用3个点的几何约束,最多产生4个解,需第4个点消歧
  • EPnP(Efficient PnP):$O(n)$ 复杂度,将3D点表示为4个虚拟控制点的加权和
  • DLS(Direct Least Squares):直接最小化重投影误差

2.1.5 RANSAC(Random Sample Consensus)

特征匹配中不可避免存在误匹配(outliers)。RANSAC 通过随机采样和一致性验证进行鲁棒估计。

算法: RANSAC

输入: 匹配点对集合, 模型(如本质矩阵), 内点阈值 epsilon
参数: 最大迭代次数 k

1. 重复 k 次:
   a. 随机选择最小点集 (E矩阵需5点, F矩阵需8点, H矩阵需4点)
   b. 拟合模型
   c. 计算所有点到模型的误差
   d. 统计内点数 (误差 < epsilon 的点)
   e. 如果内点数 > 当前最优, 更新最优模型

2. 用所有内点重新拟合模型 (最小二乘)

迭代次数估计:
  k = log(1-p) / log(1-w^n)
  其中: p = 成功概率(通常0.99)
        w = 内点比例
        n = 最小样本量
  
  例: w=0.5, n=5, p=0.99 => k = 145

2.2 直接法(Direct Methods)

直接法不提取特征,而是直接最小化像素灰度误差(photometric error)。

2.2.1 光度误差模型

对于参考帧中的像素 $\mathbf{u}$,其深度为 $d$,当前帧相对参考帧的位姿为 $T \in SE(3)$。光度误差定义为:

$$ e(\mathbf{u}) = I_2(\pi(T \cdot \pi^{-1}(\mathbf{u}, d))) - I_1(\mathbf{u}) $$

其中 $\pi$ 为相机投影函数,$\pi^{-1}$ 为反投影。

总体优化目标:

$$ T^* = \arg\min_T \sum_{\mathbf{u} \in \Omega} \rho\left( \frac{e(\mathbf{u})^2}{\sigma^2} \right) $$

其中 $\rho$ 为鲁棒核函数(如 Huber 核),$\Omega$ 为选取的像素集合。

2.2.2 LSD-SLAM(Large-Scale Direct Monocular SLAM)

LSD-SLAM 是半稠密直接法的代表性工作。其特点:

  1. 仅在图像梯度显著的区域(边缘)估计深度,形成半稠密深度图
  2. 深度值用逆深度(inverse depth)参数化,假设服从高斯分布
  3. 通过多帧三角化逐步收敛深度估计
  4. 位姿估计使用 $\mathfrak{se}(3)$ 上的加权光度误差最小化

2.2.3 DSO(Direct Sparse Odometry)

DSO 在直接法中引入了严格的光度标定模型:

$$ I’(\mathbf{u}) = \frac{t_j \cdot e^{a_j}}{t_i \cdot e^{a_i}} \cdot \left( I(\mathbf{u}) - b_i \right) + b_j $$

其中 $t$ 为曝光时间,$a, b$ 为仿射亮度参数。DSO 联合优化几何参数(位姿、逆深度)与光度参数。

DSO 使用稀疏点集(约2000个高梯度点),在滑动窗口内进行联合优化,计算效率优于稠密方法。

2.3 ORB-SLAM3 系统架构

ORB-SLAM3 是当前最完整的视觉SLAM系统,支持单目、双目、RGB-D相机以及视觉惯性模式。

+---------------------------------------------------------------+
|                        ORB-SLAM3 架构                          |
+---------------------------------------------------------------+
|                                                               |
|  +-------------------+  +-------------------+  +-----------+  |
|  |   Tracking Thread |  | Local Mapping     |  | Loop      |  |
|  |                   |  | Thread            |  | Closing   |  |
|  | - ORB提取         |  |                   |  | Thread    |  |
|  | - 初始位姿估计    |  | - 关键帧插入      |  |           |  |
|  |   (恒速模型/      |  | - 局部BA          |  | - DBoW2   |  |
|  |    参考关键帧/    |  | - 地图点剔除      |  |   候选检测|  |
|  |    重定位)        |  | - 新地图点创建    |  | - Sim(3)  |  |
|  | - 局部地图跟踪    |  | - 局部地图维护    |  |   验证    |  |
|  | - 关键帧判定      |  |                   |  | - 位姿图  |  |
|  |                   |  |                   |  |   优化    |  |
|  +--------+----------+  +--------+----------+  +-----+-----+  |
|           |                      |                    |        |
|           v                      v                    v        |
|  +-----------------------------------------------------------+|
|  |                    Map Atlas                               ||
|  |  - 多地图管理 (Active Map + Non-active Maps)               ||
|  |  - 地图合并 (Map Merging)                                  ||
|  |  - DBoW2 数据库                                            ||
|  +-----------------------------------------------------------+|
+---------------------------------------------------------------+

三个并行线程的功能:

Tracking 线程(实时运行,帧率等于相机帧率):

  1. 对每帧提取 ORB 特征(金字塔8层,每层1000个特征)
  2. 通过三种策略之一估计初始位姿:恒速运动模型、与参考关键帧匹配、重定位
  3. 将当前帧投影到局部地图中,搜索更多匹配,优化位姿
  4. 根据规则判定是否插入新关键帧

Local Mapping 线程:

  1. 处理新关键帧,计算 BoW 向量
  2. 通过三角化创建新地图点
  3. 剔除质量差的地图点(观测次数少、跟踪率低)
  4. 执行局部 Bundle Adjustment(优化当前关键帧及其共视关键帧的位姿和地图点)
  5. 剔除冗余关键帧

Loop Closing 线程:

  1. 使用 DBoW2 检测回环候选
  2. 计算 Sim(3) 变换(单目模式下包含尺度校正)
  3. 执行位姿图优化(Pose Graph Optimization)传播校正
  4. 可选的全局 Bundle Adjustment

Map Atlas:ORB-SLAM3 引入多地图管理机制。当跟踪丢失时,系统创建新地图继续运行;当检测到当前地图与已有地图存在重叠时,执行地图合并(Map Merging),将两张地图的关键帧和地图点统一到同一坐标系下。


3. 视觉惯性里程计(Visual-Inertial Odometry, VIO)

3.1 IMU 预积分理论(IMU Preintegration)

IMU 输出加速度计读数 $\tilde{a}_t$ 和陀螺仪读数 $\tilde{\omega}_t$:

$$ \tilde{a}t = R_t^T(a_t - g) + b_a + n_a $$ $$ \tilde{\omega}t = \omega_t + b\omega + n\omega $$

其中 $g$ 为重力向量,$b_a, b_\omega$ 为缓变偏置(bias),$n_a, n_\omega$ 为白噪声。

预积分的动机:IMU 频率通常为 200-1000Hz,如果每次偏置估计更新后都从头重新积分,计算开销极大。预积分将两关键帧之间的 IMU 测量压缩为与起始状态无关的增量。

定义两关键帧 $i, j$ 之间的预积分量:

$$ \Delta R_{ij} = \prod_{k=i}^{j-1} \text{Exp}((\tilde{\omega}k - b\omega) \Delta t) $$

$$ \Delta v_{ij} = \sum_{k=i}^{j-1} \Delta R_{ik} (\tilde{a}_k - b_a) \Delta t $$

$$ \Delta p_{ij} = \sum_{k=i}^{j-1} \left[ \Delta v_{ik} \Delta t + \frac{1}{2} \Delta R_{ik} (\tilde{a}_k - b_a) \Delta t^2 \right] $$

这些预积分量仅依赖 IMU 测量和当前偏置估计。当偏置更新量 $\delta b$ 较小时,可通过一阶近似修正:

$$ \Delta R_{ij}(b_\omega + \delta b_\omega) \approx \Delta R_{ij}(b_\omega) \cdot \text{Exp}\left(\frac{\partial \Delta R_{ij}}{\partial b_\omega} \delta b_\omega\right) $$

3.2 紧耦合与松耦合(Tight Coupling vs Loose Coupling)

特性松耦合紧耦合
融合层级结果层测量层
架构VO输出位姿 + IMU位姿,通过EKF/图优化融合视觉特征观测与IMU预积分在同一优化问题中联合求解
信息利用率低(丢失了视觉不确定性的方向信息)高(完整利用所有约束)
精度较低较高
实现复杂度低高
代表系统早期 MSCKF 变体VINS-Mono, ORB-SLAM3 VI模式

3.3 VINS-Mono 架构

VINS-Mono(Visual-Inertial Navigation System)是紧耦合滑动窗口优化VIO的代表系统。

系统流程:

IMU数据 ──────────────────────────────────┐
                                          v
图像 ─> 特征提取 ─> KLT光流跟踪 ─> 预处理 ─> 滑动窗口优化 ─> 位姿输出
                                          ^
                                          │
                         初始化(SfM+IMU对齐) 
                         回环检测(DBoW2)
                         全局位姿图优化

状态向量(滑动窗口内包含 $n+1$ 个关键帧):

$$ \mathcal{X} = [x_0, x_1, \ldots, x_n, \lambda_0, \lambda_1, \ldots, \lambda_m] $$

其中每帧状态 $x_k = [p_k, v_k, R_k, b_{a,k}, b_{\omega,k}]$,$\lambda_l$ 为特征点逆深度。

优化目标函数:

$$ \min_{\mathcal{X}} \left{ |r_p|^2 + \sum_{k \in \mathcal{B}} |r_{\mathcal{B}}(\hat{z}{b_k b{k+1}}, \mathcal{X})|{P{b_k b_{k+1}}}^2 + \sum_{(l,j) \in \mathcal{C}} |r_{\mathcal{C}}(\hat{z}l^{c_j}, \mathcal{X})|{P_l^{c_j}}^2 \right} $$

三项分别为:边缘化先验(marginalization prior)、IMU预积分残差、视觉重投影残差。

3.4 MSCKF(Multi-State Constraint Kalman Filter)

MSCKF 是基于滤波的VIO方法,通过维护滑动窗口内多帧相机状态来构建约束。

核心思想:当一个特征点被多帧观测到并即将离开视野时,不将其加入状态向量(避免状态维度增长),而是利用该点在多帧中的观测构建对相机状态的约束(nullspace projection消除特征点坐标)。

状态向量仅包含 IMU 状态和滑动窗口内的相机位姿:

$$ x = [x_{IMU}, x_{C_1}, x_{C_2}, \ldots, x_{C_N}] $$

计算优势:状态维度固定(与特征点数无关),更新步骤为 $O(N^2)$($N$ 为窗口大小),适合计算资源受限的平台。

3.5 OpenVINS

OpenVINS 是 MSCKF 的现代开源实现,提供模块化架构:

  • 支持多种特征跟踪器(KLT, 描述子匹配)
  • 支持多相机配置
  • 在线标定(相机-IMU外参、时间偏移、内参)
  • FEJ(First Estimates Jacobian)保证一致性
  • 提供仿真器用于算法验证

3.6 时间同步(Time Synchronization)

相机和 IMU 的时间戳之间通常存在固定偏移 $t_d$:

$$ t_{cam} = t_{imu} + t_d $$

VINS-Mono 将 $t_d$ 作为状态变量联合估计。对于特征观测,时间偏移的影响通过一阶近似建模:

$$ \hat{z}(t + t_d) \approx \hat{z}(t) + \frac{\partial \hat{z}}{\partial t} t_d $$

其中 $\frac{\partial \hat{z}}{\partial t}$ 可通过特征点的像素速度近似。

3.7 退化运动(Degenerate Motions)

VIO 系统在特定运动模式下会出现可观测性退化:

退化运动不可观测状态原因
匀速直线运动加速度计偏置、重力方向无法区分偏置与重力投影
纯旋转视觉尺度、平移三角化失败
静止陀螺仪偏置(部分)缺乏激励
单轴旋转该轴方向陀螺仪偏置偏置与角速度耦合

工程实践中,通过检测运动激励不足并降低相关状态的更新权重来缓解退化问题。


4. LiDAR SLAM

4.1 LOAM 框架(Lidar Odometry and Mapping)

LOAM 是激光雷达 SLAM 的奠基性工作,其双频率架构设计被后续大量系统继承。

特征提取:根据局部曲率将点分类:

  • 边缘点(Edge Points):曲率最大的点,对应环境中的边缘
  • 平面点(Planar Points):曲率最小的点,对应环境中的平面

曲率计算: $$ c_i = \frac{1}{|S_i|} \left| \sum_{j \in S_i} (p_j - p_i) \right| $$

其中 $S_i$ 为点 $p_i$ 的邻域点集。

双频率架构:

10Hz LiDAR扫描
    │
    v
┌──────────────────┐     ┌───────────────────────┐
│ Lidar Odometry   │     │ Lidar Mapping          │
│ (高频, 10Hz)     │────>│ (低频, 1Hz)            │
│                  │     │                        │
│ 扫描内运动补偿   │     │ 点到地图的精配准       │
│ 帧间特征匹配     │     │ 全局地图维护           │
│ 粗略位姿估计     │     │ 精确位姿估计           │
└──────────────────┘     └───────────────────────┘

点到边缘距离(Edge point residual):

点 $p$ 到由 $a, b$ 两点确定的直线的距离: $$ d_e = \frac{|(p-a) \times (p-b)|}{|a-b|} $$

点到平面距离(Planar point residual):

点 $p$ 到由 $a, b, c$ 三点确定的平面的距离: $$ d_p = \frac{|(p-a) \cdot ((b-a) \times (c-a))|}{|(b-a) \times (c-a)|} $$

4.2 LIO-SAM(LiDAR Inertial Odometry via Smoothing and Mapping)

LIO-SAM 将 LOAM 的思想融入因子图(factor graph)框架,实现激光雷达-惯性紧耦合。

因子图结构:

因子类型:
  [I] IMU预积分因子
  [L] LiDAR里程计因子  
  [G] GPS因子 (可选)
  [C] 回环因子

     x0 ─[I]─ x1 ─[I]─ x2 ─[I]─ x3 ─[I]─ x4
      |         |         |         |         |
     [L]       [L]       [L]       [L]       [L]
      |         |                             |
     [G]       [G]                           [C]───────┐
                                              |        |
                                              └────────┘
                                            (回环: x4 与 x1)

关键设计:

  1. IMU 预积分提供帧间初始位姿估计和运动畸变校正
  2. 关键帧选择基于位移和角度阈值
  3. 局部地图使用基于关键帧的滑动窗口,而非全局点云
  4. 使用 GTSAM 库的增量平滑(iSAM2)进行在线优化

4.3 FAST-LIO2(Fast LiDAR-Inertial Odometry)

FAST-LIO2 通过 iKD-Tree(incremental KD-Tree)实现了极高的计算效率。

核心创新:

  1. iKD-Tree:增量式 KD-Tree 数据结构,支持高效的点插入、删除和最近邻查询。避免每次扫描后重建 KD-Tree 的开销。

  2. 迭代卡尔曼滤波(IEKF):将 LiDAR 点到地图的配准问题嵌入 EKF 的更新步骤中。状态包含位姿和 IMU 偏置。

  3. 直接配准:不提取特征,对每个原始点直接搜索最近邻平面,计算点到平面残差。

状态方程:

$$ x_{k+1} = x_k \boxplus (\Delta t \cdot f(x_k, u_k, w_k)) $$

其中 $\boxplus$ 为流形上的加法运算(对 $SO(3)$ 使用指数映射)。

性能:在中等规模环境中,FAST-LIO2 可在嵌入式平台(如 ARM Cortex-A72)上实时运行,单帧处理时间约 10-20ms。

4.4 KISS-ICP(Keep It Small and Simple ICP)

KISS-ICP 追求极简设计,仅包含四个核心组件:

  1. 自适应阈值:基于当前运动速度动态调整对应点搜索半径
  2. 体素降采样:对输入点云进行体素网格滤波
  3. 点到点 ICP:迭代最近点配准
  4. 局部地图管理:固定大小的体素化滑动窗口地图

无需 IMU、无需特征提取、无需回环检测,仅依赖逐帧 ICP 配准。在多个公开数据集上展现了与复杂系统相当的精度。

4.5 ICP 变体对比

点到点 ICP(Point-to-Point):

$$ E = \sum_i | p_i - T q_i |^2 $$

使用 SVD 求解闭式解。收敛慢,对初值敏感。

点到平面 ICP(Point-to-Plane):

$$ E = \sum_i \left( n_i^T (p_i - T q_i) \right)^2 $$

$n_i$ 为目标点处的法向量。收敛速度显著快于点到点。

GICP(Generalized ICP):

将每个对应点对建模为两个局部平面分布的配准:

$$ E = \sum_i d_i^T (C_i^B + T C_i^A T^T)^{-1} d_i $$

其中 $C_i^A, C_i^B$ 为对应点邻域的协方差矩阵,$d_i = p_i - Tq_i$。GICP 统一了点到点和点到平面 ICP 作为特殊情况。

4.6 主要 LiDAR SLAM 系统对比

系统传感器配准方法后端回环实时性能开源
LOAMLiDAR特征(边缘+平面)无无10Hz (高频) + 1Hz (低频)是
LeGO-LOAMLiDAR地面分割+特征位姿图ICP验证实时是
LIO-SAMLiDAR+IMU(+GPS)特征因子图(iSAM2)距离+ICP实时是
FAST-LIO2LiDAR+IMU直接(点到平面)IEKF无>100Hz是
KISS-ICPLiDAR点到点ICP无无实时是
CT-ICPLiDAR连续时间ICP无无实时是
Faster-LIOLiDAR+IMU直接(iVox)IEKF无>FAST-LIO2是
LiDAR-SLAM (Cartographer)LiDAR(+IMU)子图匹配位姿图分支定界实时是

5. 图优化后端(Graph-based Backend)

5.1 因子图(Factor Graph)

因子图是一种二部图(bipartite graph),包含变量节点(variable nodes)和因子节点(factor nodes)。

定义:因子图表示联合概率分布的因子分解:

$$ p(\mathcal{X}) \propto \prod_i f_i(\mathcal{X}_i) $$

其中 $\mathcal{X}$ 为所有变量,$f_i$ 为第 $i$ 个因子,$\mathcal{X}_i \subseteq \mathcal{X}$ 为该因子涉及的变量子集。

SLAM 中的典型因子:

因子类型          连接变量             残差定义
─────────────────────────────────────────────────────────────
先验因子          x_0                  r = x_0 - x_prior
里程计因子        x_i, x_{i+1}        r = x_{i+1} ⊖ (x_i ⊕ Δx_meas)
GPS因子           x_i                  r = pos(x_i) - p_GPS
IMU预积分因子     x_i, x_{i+1}        r = 预积分残差(见3.1节)
视觉因子          x_i, l_j            r = π(T_i, l_j) - z_ij
回环因子          x_i, x_j            r = x_j ⊖ (x_i ⊕ Δx_loop)

5.2 位姿图优化(Pose Graph Optimization)

位姿图是因子图的简化形式,仅保留位姿节点,路标点已被边缘化。

优化问题:

$$ \mathcal{X}^* = \arg\min_{\mathcal{X}} \sum_{(i,j) \in \mathcal{E}} | e_{ij}(\mathcal{X}) |{\Omega{ij}}^2 $$

其中 $e_{ij} = \log(T_{ij}^{-1} T_i^{-1} T_j)^\vee$ 为相对位姿误差在李代数上的表示,$\Omega_{ij}$ 为信息矩阵。

使用高斯-牛顿法(Gauss-Newton)求解:

  1. 在当前估计处线性化:$e_{ij}(\mathcal{X} + \delta) \approx e_{ij} + J_{ij} \delta$
  2. 构建法方程:$H \delta^* = -b$
    • $H = \sum J_{ij}^T \Omega_{ij} J_{ij}$(信息矩阵/Hessian)
    • $b = \sum J_{ij}^T \Omega_{ij} e_{ij}$
  3. 求解 $\delta^$ 并更新:$\mathcal{X} \leftarrow \mathcal{X} \boxplus \delta^$
  4. 重复直到收敛

5.3 回环检测(Loop Closure Detection)

5.3.1 DBoW2(Bags of Binary Words)

DBoW2 使用视觉词袋模型进行基于外观的位置识别。

离线阶段:对大量 ORB 描述子进行层次 K-means 聚类,构建视觉词典树(vocabulary tree)。

在线阶段:

  1. 将当前帧的描述子量化为词袋向量 $v$
  2. 使用 TF-IDF(Term Frequency-Inverse Document Frequency)加权
  3. 计算与数据库中所有关键帧的 L1 距离
  4. 时间一致性验证(temporal consistency):连续多帧检测到同一候选才接受

5.3.2 NetVLAD

NetVLAD 是基于深度学习的全局描述子,将整张图像编码为固定维度向量。

网络结构:CNN backbone(VGG-16)+ VLAD pooling layer。VLAD 层学习 $K$ 个聚类中心 $c_k$,对特征进行软分配:

$$ V(j,k) = \sum_i \frac{e^{w_k^T x_i + b_k}}{\sum_{k’} e^{w_{k’}^T x_i + b_{k’}}} (x_i(j) - c_k(j)) $$

输出经过 L2 归一化和 PCA 降维后得到紧凑描述子(通常 4096 维降至 256 维)。

使用三元组损失(triplet loss)训练:使同一位置图像对描述子接近,不同位置图像对描述子远离。

5.4 优化库

5.4.1 g2o(General Graph Optimization)

g2o 的核心抽象:

// g2o 使用示例: 2D 位姿图优化
typedef g2o::BlockSolver<g2o::BlockSolverTraits<3, 3>> BlockSolverType;
typedef g2o::LinearSolverEigen<BlockSolverType::PoseMatrixType> LinearSolverType;

auto solver = new g2o::OptimizationAlgorithmLevenberg(
    std::make_unique<BlockSolverType>(
        std::make_unique<LinearSolverType>()));

g2o::SparseOptimizer optimizer;
optimizer.setAlgorithm(solver);

// 添加位姿顶点
for (int i = 0; i < num_poses; i++) {
    auto v = new g2o::VertexSE2();
    v->setId(i);
    v->setEstimate(initial_poses[i]);
    optimizer.addVertex(v);
}

// 添加里程计边
for (auto& constraint : odometry_constraints) {
    auto e = new g2o::EdgeSE2();
    e->setVertex(0, optimizer.vertex(constraint.from));
    e->setVertex(1, optimizer.vertex(constraint.to));
    e->setMeasurement(constraint.measurement);
    e->setInformation(constraint.info_matrix);
    optimizer.addEdge(e);
}

optimizer.initializeOptimization();
optimizer.optimize(20);  // 20次迭代

5.4.2 GTSAM(Georgia Tech Smoothing and Mapping)

GTSAM 基于 Bayes Tree 数据结构实现增量式优化(iSAM2),适合在线 SLAM。

// GTSAM 使用示例
#include <gtsam/navigation/CombinedImuFactor.h>
#include <gtsam/nonlinear/ISAM2.h>

gtsam::ISAM2Params params;
params.relinearizeThreshold = 0.1;
params.relinearizeSkip = 1;
gtsam::ISAM2 isam(params);

gtsam::NonlinearFactorGraph graph;
gtsam::Values initial_values;

// 添加 IMU 预积分因子
graph.add(gtsam::CombinedImuFactor(
    X(i), V(i), X(i+1), V(i+1), B(i), B(i+1),
    preintegrated_imu));

// 添加视觉因子
graph.add(gtsam::GenericProjectionFactor<Pose3, Point3, Cal3_S2>(
    measured_pixel, noise_model, X(i), L(j), calibration));

// 增量更新
isam.update(graph, initial_values);
gtsam::Values result = isam.calculateEstimate();

5.4.3 Ceres Solver

Ceres 是 Google 开发的通用非线性最小二乘求解器,在 SLAM 中广泛使用。

// Ceres 使用示例: 重投影误差
struct ReprojectionError {
    double observed_x, observed_y;
    
    template <typename T>
    bool operator()(const T* const camera, // 6-DOF pose
                    const T* const point,   // 3D point
                    T* residuals) const {
        // 旋转和平移 (angle-axis)
        T p[3];
        ceres::AngleAxisRotatePoint(camera, point, p);
        p[0] += camera[3]; p[1] += camera[4]; p[2] += camera[5];
        
        // 投影
        T predicted_x = p[0] / p[2];
        T predicted_y = p[1] / p[2];
        
        residuals[0] = predicted_x - T(observed_x);
        residuals[1] = predicted_y - T(observed_y);
        return true;
    }
};

ceres::Problem problem;
for (auto& obs : observations) {
    problem.AddResidualBlock(
        new ceres::AutoDiffCostFunction<ReprojectionError, 2, 6, 3>(
            new ReprojectionError(obs.x, obs.y)),
        new ceres::HuberLoss(1.0),
        cameras[obs.camera_idx],
        points[obs.point_idx]);
}

ceres::Solver::Options options;
options.linear_solver_type = ceres::SPARSE_SCHUR;
options.num_threads = 8;
ceres::Solve(options, &problem, &summary);

5.5 边缘化(Marginalization)与舒尔补(Schur Complement)

在滑动窗口优化中,当旧关键帧被移出窗口时,不能简单丢弃,需要通过边缘化保留其对剩余变量的约束信息。

将变量分为要保留的 $x_r$ 和要边缘化的 $x_m$,法方程为:

$$ \begin{bmatrix} H_{mm} & H_{mr} \ H_{rm} & H_{rr} \end{bmatrix} \begin{bmatrix} \delta x_m \ \delta x_r \end{bmatrix} = \begin{bmatrix} b_m \ b_r \end{bmatrix} $$

通过 Schur 补消除 $\delta x_m$:

$$ (H_{rr} - H_{rm} H_{mm}^{-1} H_{mr}) \delta x_r = b_r - H_{rm} H_{mm}^{-1} b_m $$

$$ H_{prior} = H_{rr} - H_{rm} H_{mm}^{-1} H_{mr} $$

$$ b_{prior} = b_r - H_{rm} H_{mm}^{-1} b_m $$

$H_{prior}$ 和 $b_{prior}$ 构成了边缘化先验因子,作为下一次优化的约束项加入。

注意事项:

  1. 边缘化操作使稀疏矩阵变稠密(fill-in 效应)
  2. 边缘化的线性化点不能改变(First Estimates Jacobian, FEJ),否则会引入不一致性
  3. 在 VINS-Mono 中,边缘化策略为:如果次新帧是关键帧则边缘化最旧帧;否则丢弃次新帧的视觉观测但保留 IMU 约束

5.6 滑动窗口优化(Sliding Window Optimization)

滑动窗口优化在有界的计算资源下实现近似最优估计。

窗口管理策略:

时间轴: ─────────────────────────────────────────>
关键帧: KF0  KF1  KF2  KF3  KF4  KF5  KF6  KF7
                   └─────── 窗口 ──────┘
                   边缘化              当前帧

新关键帧到来:
  情况A (KF8质量高): 边缘化KF2, 窗口变为 [KF3..KF8]
  情况B (KF8质量低): 丢弃KF7的部分信息, 保持窗口大小

窗口内执行完整的 Bundle Adjustment,包含所有因子(视觉、IMU、先验)。典型窗口大小:VINS-Mono 使用 10 个关键帧。


6. 地图表示(Map Representation)

6.1 稀疏点云地图(Sparse Point Cloud)

ORB-SLAM 等系统维护的地图由离散3D路标点组成。每个地图点存储:

  • 3D坐标
  • 代表性描述子(从所有观测帧中选择与其他描述子中位距离最小的)
  • 观测方向范围
  • 有效距离范围(对应特征金字塔层级)

用途:仅用于定位,不适合避障和路径规划。 存储效率:极高,典型场景仅需数万至数十万个点。

6.2 占据栅格地图(Occupancy Grid, 2D)

将环境划分为均匀网格,每个单元存储占据概率 $p(m_i | z_{1:t})$。

使用对数几率(log-odds)表示避免数值问题:

$$ l(m_i | z_{1:t}) = l(m_i | z_{1:t-1}) + l(m_i | z_t) - l_0 $$

其中 $l = \log \frac{p}{1-p}$,$l_0 = \log \frac{p_0}{1-p_0}$ 为先验。

栅格地图示例 (分辨率 0.05m):

   0 1 2 3 4 5 6 7 8 9
0  . . . . . . . . . .
1  . . . # # # . . . .
2  . . . # . # . . . .
3  . . . # . # . . . .
4  . . . # # # . . . .
5  . . . . . . . . . .
6  . . . . . . # # . .
7  . . . . . . # # . .
8  . . . . . . . . . .
9  . . . . . . . . . .

图例: . = 空闲(free), # = 占据(occupied)
每个单元存储 log-odds 值

适用场景:2D 导航(移动机器人地面规划)。 局限:仅表示单层平面,无法表示三维结构。

6.3 OctoMap(3D Octree Map)

OctoMap 使用八叉树(octree)高效表示三维占据信息。

数据结构:每个节点代表一个立方体空间,可递归细分为8个子节点。通过概率更新判定节点状态(空闲/占据/未知),状态一致的子节点可被剪枝合并到父节点。

优势:

  • 多分辨率:根据需要选择不同精度
  • 压缩存储:大面积同质区域自动合并
  • 概率更新:支持传感器噪声建模

典型参数:分辨率 0.05-0.2m,内存占用约 50-200MB/大场景。

6.4 TSDF(Truncated Signed Distance Function)

TSDF 在每个体素中存储到最近表面的截断有符号距离值。

$$ D(v) = \begin{cases} \min(1, d(v) / \tau) & \text{if } d(v) > 0 \text{ (表面前方)} \ \max(-1, d(v) / \tau) & \text{if } d(v) \leq 0 \text{ (表面后方)} \end{cases} $$

其中 $\tau$ 为截断距离。表面位于 $D(v) = 0$ 的等值面上。

融合更新:对每次新观测,使用加权平均融合:

$$ D_{new}(v) = \frac{W_{old}(v) \cdot D_{old}(v) + w(v) \cdot d_{obs}(v)}{W_{old}(v) + w(v)} $$

$$ W_{new}(v) = \min(W_{old}(v) + w(v), W_{max}) $$

表面提取:使用 Marching Cubes 算法从 TSDF 中提取等值面网格。

应用:KinectFusion、Voxblox、NVIDIA nvblox 等实时三维重建系统。

6.5 语义地图(Semantic Maps)

在几何地图基础上附加语义标签。实现方式:

  1. 点级语义:对每个3D点赋予类别标签(来自语义分割网络,如 DeepLab, SegFormer)
  2. 物体级语义:检测物体实例,估计6DoF位姿和三维边界框
  3. 场景图(Scene Graph):节点为物体/区域,边为空间关系(on, in, near, support 等)

语义地图使机器人能够理解”桌子上的杯子”而非仅仅”坐标 (1.2, 0.8, 0.7) 处的点云簇”。

6.6 神经隐式地图(Neural Implicit Maps)

使用神经网络隐式表示三维场景,通过网络参数编码几何和外观信息。

6.6.1 iMAP

iMAP 是首个实时神经隐式 SLAM 系统。使用单个 MLP 表示整个场景的 TSDF:

$$ f_\theta: \mathbb{R}^3 \to (\text{SDF value}, \text{RGB color}) $$

同时优化网络参数 $\theta$ 和关键帧位姿。使用分层采样策略在已有关键帧和当前帧之间平衡训练。

局限:单 MLP 容量有限,大场景下出现”遗忘”(catastrophic forgetting)。

6.6.2 NICE-SLAM

NICE-SLAM 引入层次化特征网格(hierarchical feature grid)解决 iMAP 的容量问题:

  • 粗分辨率网格:编码全局几何
  • 中分辨率网格:编码局部细节
  • 细分辨率网格:编码精细表面

每层使用小型 MLP 解码器将特征转换为 SDF 值。使用深度监督和光度监督联合训练。

6.6.3 NeRF-SLAM

将 Neural Radiance Fields 与视觉里程计结合。前端使用 DROID-SLAM 提供位姿估计和深度图,后端使用 Instant-NGP(哈希编码)实现实时 NeRF 地图构建。

神经隐式地图的优劣势:

优势劣势
连续表示,无分辨率限制GPU 计算需求高
自然支持补全(fill holes)训练/推理速度制约实时性
可微分,支持端到端学习难以增量更新(全局优化)
紧凑存储(网络参数)缺乏动态场景处理能力

6.7 地图表示方法总结

方法维度存储效率导航适用重建质量语义扩展
稀疏点云3D极高差差困难
占据栅格2D中好不适用容易
OctoMap3D高好中中等
TSDF3D低中好中等
神经隐式3D高差(当前)极好自然支持
场景图拓扑极高中不适用核心

7. 多传感器融合 SLAM(Multi-sensor Fusion SLAM)

7.1 多模态融合的动机

单一传感器在特定条件下存在固有局限:

传感器失效场景原因
相机暗光/过曝光照依赖
相机无纹理区域特征/光度信息不足
LiDAR退化几何(长走廊)缺乏沿走廊方向的约束
LiDAR雨/雪/雾激光散射
IMU长时间静止后偏置漂移无法校正

多模态融合的目标:利用不同传感器的互补特性,在各种环境条件下保持鲁棒性和精度。

7.2 R3LIVE(Robust Real-time RGB-colored point cloud LiDAR-Inertial-Visual)

R3LIVE 实现了 LiDAR-惯性-视觉三模态紧耦合。

系统架构:

┌─────────────────────────────────────────────────────────┐
│                        R3LIVE                            │
├─────────────────────────┬───────────────────────────────┤
│     LIO 子系统          │      VIO 子系统               │
│                         │                               │
│  LiDAR点 + IMU          │   图像 + IMU                  │
│       │                 │       │                       │
│       v                 │       v                       │
│  FAST-LIO2              │   光度误差最小化              │
│  (IEKF, iKD-Tree)       │   (直接法, 帧到地图)         │
│       │                 │       │                       │
│       v                 │       v                       │
│  位姿 + 几何地图        │   位姿精化 + RGB着色          │
│                         │                               │
├─────────────────────────┴───────────────────────────────┤
│            共享状态 + RGB点云地图                         │
└─────────────────────────────────────────────────────────┘

设计要点:

  1. LIO 子系统提供高频位姿估计和几何点云
  2. VIO 子系统利用图像信息精化位姿并为点云着色
  3. 两个子系统共享 IMU 状态,但异步运行
  4. 最终输出带有真实颜色的稠密3D点云地图

7.3 LVI-SAM(LiDAR-Visual-Inertial SLAM via Smoothing and Mapping)

LVI-SAM 将 LIO-SAM 和 VINS-Mono 集成到统一的因子图框架中。

因子图结构:

变量节点: x_0, x_1, ..., x_n (位姿+速度+偏置)

因子:
  1. IMU预积分因子: 连接相邻帧
  2. LiDAR里程计因子: LiDAR帧间配准提供的位姿增量
  3. 视觉里程计因子: 视觉特征跟踪提供的位姿增量
  4. GPS因子(可选): 全局位置约束
  5. 回环因子: 视觉DBoW2 + LiDAR ICP联合验证

     x0 ──[IMU]── x1 ──[IMU]── x2 ──[IMU]── x3
      |            |            |            |
    [LiDAR]     [LiDAR]     [LiDAR]     [LiDAR]
      |            |            |            |
    [Visual]    [Visual]    [Visual]    [Visual]
      |                                     |
    [GPS]                                 [Loop]

互补机制:

  • LiDAR 提供精确的近距离几何约束和尺度信息
  • 视觉在 LiDAR 退化场景(如长走廊)中提供额外约束
  • 视觉回环检测能力强于纯 LiDAR(外观信息更丰富)
  • IMU 提供高频运动估计并桥接传感器之间的时间间隔

7.4 融合架构分类

              ┌─────────────────┐
              │  融合层级分类    │
              └────────┬────────┘
                       │
          ┌────────────┼────────────┐
          │            │            │
    ┌─────v─────┐ ┌───v───┐ ┌─────v─────┐
    │ 数据层融合 │ │特征层 │ │ 决策层融合 │
    │           │ │融合   │ │           │
    │ 原始数据  │ │中间   │ │ 各传感器  │
    │ 直接融合  │ │表示   │ │ 独立处理  │
    │ (点云着色)│ │融合   │ │ 结果融合  │
    └───────────┘ └───────┘ └───────────┘
    
    精度: 高         中高        中
    耦合度: 紧       中          松
    复杂度: 高       中          低
    容错性: 低       中          高

7.5 标定(Calibration)

多传感器系统的精度高度依赖外参标定质量。

需要标定的参数:

标定对参数方法
Camera-IMU$T_{CI} \in SE(3)$, $t_d$Kalibr (Allan Variance + 靶标)
LiDAR-Camera$T_{LC} \in SE(3)$棋盘格对齐 / 互信息最大化
LiDAR-IMU$T_{LI} \in SE(3)$LI-Init (运动对齐)
Multi-Camera$T_{C_i C_j}$多视角靶标观测

在线标定:部分系统(OpenVINS, VINS-Mono)支持在运行时联合估计外参,将外参作为状态变量加入优化。这对初始标定不精确或外参随时间漂移的场景尤为重要。


8. 公司格局

8.1 行业主要公司

公司国家/地区核心技术主要产品/场景技术路线
Clearpath Robotics加拿大自主导航平台工业移动机器人 (Husky, Jackal, Dingo)LiDAR SLAM + 多传感器融合
NavVis德国室内测绘VLX 移动扫描仪, IVION 数字孪生平台LiDAR-Visual SLAM + 全景相机
Leica Geosystems瑞士精密测量RTC360 扫描仪, BLK 系列高精度 LiDAR + IMU
Google (Cartographer)美国开源 SLAMCartographer 库, Google Maps 室内子图匹配 + 位姿图 + 分支定界回环
SLAMTEC中国低成本 SLAMRPLIDAR 系列, Slamware 导航模块2D LiDAR SLAM (粒子滤波/图优化)
Kudan英国/日本SLAM 引擎KudanSLAM SDK (嵌入式)视觉 + LiDAR 融合, 专利算法
HERE Technologies荷兰/美国高精地图HD Live Map, 自动驾驶地图服务众包 SLAM + 地图压缩
Matterport美国3D扫描Pro3 相机, 数字孪生平台RGB-D SLAM + 深度学习补全
Zillow (已并入)美国室内3D房产3D导览NeRF + 传统SLAM混合
Foxglove美国机器人可视化Foxglove StudioSLAM数据可视化与调试工具

8.2 开源生态

项目维护方传感器特点
ORB-SLAM3Universidad de ZaragozaMono/Stereo/RGB-D + IMU最完整的视觉SLAM
VINS-Mono/FusionHKUSTMono/Stereo + IMUVIO 标杆
LIO-SAMMITLiDAR + IMU + GPS因子图 LiDAR-Inertial
FAST-LIO2HKULiDAR + IMU极致效率
OpenVINSUniversity of DelawareMulti-cam + IMU模块化 MSCKF
CartographerGoogleLiDAR + IMU工业级2D/3D SLAM
RTAB-MapIntRoLabMulti-sensor通用图优化框架
KimeraMITStereo + IMU语义SLAM + 3D场景图
DROID-SLAMPrincetonMono/Stereo深度学习端到端VO
Gaussian Splatting SLAM多个研究组RGB-D/Mono3DGS地图表示

8.3 技术趋势

  1. 基于学习的前端:深度网络取代手工特征(SuperPoint, SuperGlue, LightGlue),端到端里程计(DROID-SLAM, DPVO)
  2. 神经地图表示:3D Gaussian Splatting 正在取代 NeRF 成为实时神经渲染的首选,同步 SLAM 系统(SplaTAM, Gaussian-SLAM)快速发展
  3. 基础模型集成:大型视觉模型(DINOv2, SAM)提供的语义特征增强回环检测和位置识别鲁棒性
  4. 边缘部署:模型量化、算子融合、专用硬件(SLAM加速器 ASIC)推动嵌入式实时运行
  5. 动态环境:从静态世界假设走向动态物体检测与跟踪的联合估计(DynaSLAM, DOT)

参考文献

  1. Thrun, S., Burgard, W., & Fox, D. (2005). Probabilistic Robotics. MIT Press.
  2. Hartley, R., & Zisserman, A. (2003). Multiple View Geometry in Computer Vision. Cambridge University Press.
  3. Cadena, C., et al. (2016). Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Perception Age. IEEE Transactions on Robotics, 32(6), 1309-1332.
  4. Mur-Artal, R., Montiel, J. M. M., & Tardós, J. D. (2015). ORB-SLAM: A Versatile and Accurate Monocular SLAM System. IEEE Transactions on Robotics, 31(5), 1147-1163.
  5. Campos, C., et al. (2021). ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM. IEEE Transactions on Robotics, 37(6), 1874-1890.
  6. Qin, T., Li, P., & Shen, S. (2018). VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator. IEEE Transactions on Robotics, 34(4), 1004-1020.
  7. Forster, C., et al. (2017). On-Manifold Preintegration for Real-Time Visual-Inertial Odometry. IEEE Transactions on Robotics, 33(1), 1-21.
  8. Zhang, J., & Singh, S. (2014). LOAM: Lidar Odometry and Mapping in Real-time. Robotics: Science and Systems (RSS).
  9. Shan, T., et al. (2020). LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping. IEEE/RSJ IROS.
  10. Xu, W., et al. (2022). FAST-LIO2: Fast Direct LiDAR-Inertial Odometry. IEEE Transactions on Robotics, 38(4), 2053-2073.
  11. Vizzo, I., et al. (2023). KISS-ICP: In Defense of Point-to-Point ICP. IEEE Robotics and Automation Letters, 8(2), 1029-1036.
  12. Engel, J., Koltun, V., & Cremers, D. (2018). Direct Sparse Odometry. IEEE Transactions on Pattern Analysis and Machine Intelligence, 40(3), 611-625.
  13. Sucar, E., et al. (2021). iMAP: Implicit Mapping and Positioning in Real-Time. ICCV.
  14. Zhu, Z., et al. (2022). NICE-SLAM: Neural Implicit Scalable Encoding for SLAM. CVPR.
  15. Lin, J., & Zhang, F. (2022). R3LIVE: A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled state Estimation and mapping package. ICRA.
  16. Shan, T., et al. (2021). LVI-SAM: Tightly-coupled Lidar-Visual-Inertial Odometry via Smoothing and Mapping. ICRA.
  17. Dellaert, F., & Kaess, M. (2017). Factor Graphs for Robot Perception. Foundations and Trends in Robotics, 6(1-2), 1-139.
  18. Mourikis, A. I., & Roumeliotis, S. I. (2007). A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation. ICRA.
  19. Arandjelović, R., et al. (2016). NetVLAD: CNN architecture for weakly supervised place recognition. CVPR.
  20. Kerbl, B., et al. (2023). 3D Gaussian Splatting for Real-Time Radiance Field Rendering. ACM TOG (SIGGRAPH).