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).