视觉与IMU的融合,也就是视觉惯性里程计(VIO),本质上是利用两种传感器在特性上的互补来提升定位系统的整体性能。视觉提供丰富的环境结构信息,但易受光照和纹理影响;IMU提供高频的运动信息,但存在累积漂移。融合之后,系统能在精度、鲁棒性和适用场景上取得显著的平衡。

### 🤝 视觉与IMU融合的优势

融合的核心优势在于解决单一传感器难以应对的挑战,具体体现在三个方面:

- **精度与鲁棒性提升**:视觉能修正IMU的长期漂移,而IMU的高频数据则能在视觉短暂失效(如快速运动导致模糊、光照突变)时,通过运动预测维持系统的持续跟踪,避免定位丢失。
- **适应更复杂的环境**:融合后系统能在弱纹理区域、低光照甚至夜间环境下工作,例如通过融合热成像来补偿可见光图像在低光下的特征缺失。
- **降低硬件依赖**:VIO仅需一个相机和低成本的IMU,就能在GPS信号缺失的室内、城市峡谷或地下环境中提供可靠的定位。

### ⚙️ 常见的融合方案与工业应用

VIO的融合架构主要分为松耦合、紧耦合,以及基于滤波或优化的方案。

- **紧耦合是当前主流**:它通过将视觉观测的误差(如特征点重投影误差)和IMU的预积分误差放在同一个优化问题中联合求解,精度和鲁棒性通常优于将两者结果简单平均的松耦合方案。其中,基于**非线性优化**的方法(如VINS-Mono)和基于**滤波**的方法(如MSCKF)是两大经典流派。近年来,**多传感器融合**成为趋势,例如FAST-LIVO2将激光雷达、视觉和IMU紧耦合,以应对更复杂的场景。

在工业界,VIO已广泛应用于多个领域:
- **无人机与机器人**:在无GPS环境下实现自主导航与避障,例如基于Jetson平台的自主无人机,完全依赖VIO进行定位与控制。也有基于地平线RDK X3等嵌入式平台的VIO定位方案。
- **智能手机与AR/VR**:为手机上的AR应用提供无需外部标记的6DoF运动追踪。
- **自动驾驶**:作为组合导航系统的一部分,在隧道或城市高楼间增强定位的连续性。

### 🚀 学术界的新进展与学习方法

VIO的研究前沿正从传统几何方法向**与深度学习融合**的方向快速演进。学习方法的引入并非完全替代传统几何模型,更多是作为模块化的增强手段,提升在挑战性场景下的性能。

- **端到端学习**:早期研究如**VINet**将VIO视为序列到序列的学习问题,尝试直接由图像和IMU数据回归出位姿。
- **模块化增强**:当前更主流的做法是用神经网络替换或增强传统流程中的特定模块。例如:
    - **特征提取与匹配**:使用**SuperPoint**等深度学习特征点替代传统ORB特征,在光照变化和弱纹理下更鲁棒。
    - **噪声与不确定性建模**:利用**LSTM或Transformer**来学习IMU的测量噪声特性,或动态调整视觉与IMU在融合中的权重,如**Adaptive VIO**所做的工作。
    - **场景理解与动态处理**:通过**语义分割**来识别并剔除场景中的动态物体(如行人、车辆),避免它们对静态环境定位的干扰。
- **提升计算效率**:部分研究如**MixVIO**,通过策略网络判断何时需要处理视觉信息,在保证精度的同时减少不必要的计算,更适合资源受限的嵌入式平台。
- **应对极端条件**:**Ultimate SLAM**等工作融合了事件相机,专门解决高动态范围(HDR)和高速运动下的定位难题。

如果你想深入了解某一种具体的融合算法(如MSCKF或VINS-Mono),或者对某个学习方法(如深度学习特征点)在VIO中的具体实现细节感兴趣,我们可以继续探讨。

FAST-LIVO2 在建图后,可以通过**ICP重定位**进入纯定位模式,并结合 `Octomap` 将三维地图转换为二维栅格地图,与 `Nav2` 栈无缝衔接,实现完整的自主导航与路径规划。

### 🗺️ FAST-LIVO2 建立的地图类型

FAST-LIVO2 本身维护的是一张 **统一体素地图(Unified Voxel Map)**,而非传统的二维栅格或单纯的视觉特征地图。

它在一个空间索引结构(体素)中,同时存储了 LiDAR 构建的**几何结构**(平面/点云)和附着其上的**视觉图像块**(纹理信息)。这意味着地图同时包含用于定位的几何特征和用于视觉跟踪的纹理,实现了几何与纹理的深度协同。不过,该算法默认不提供直接的纯定位启动模式,需要依赖社区改进版来实现。

### 🧭 如何基于 FAST-LIVO2 做纯定位

FAST-LIVO2 官方仓库主要面向建图(Odometry)任务。要实现“建完图后纯定位”,通常需要借助针对 FAST-LIO 系列的**社区改进版**(如 `Fast-LIO2-Localization`),其核心思路相同:

1.  **加载先验地图**:将 FAST-LIVO2(或 Fast-LIO2)保存的 `.pcd` 点云地图加载到定位节点中。
2.  **ICP 重定位**:系统通过 **ICP(迭代最近点)算法** 将当前激光雷达扫描帧与先验地图进行配准。通常采用**多分辨率策略**:先粗配准(低分辨率)再精配准(高分辨率),以避免陷入局部最优。
3.  **进入定位模式**:一旦 ICP 配准成功(通常需要用户提供一个粗略的初始位姿猜测),系统就会锁定重定位结果,并进入纯定位模式,持续输出机器人在**先验地图坐标系**下的高精度位姿。

### 🚗 如何与 Nav2 结合做定位、导航与路径规划

要将 FAST-LIVO2(或其定位模式)接入 ROS 2 的 Nav2 栈,核心是**将三维 SLAM 的能力“降维”并“喂给”导航栈**。一个经过验证的完整方案如下:

1.  **定位与里程计输出**:FAST-LIVO2(或定位版)作为**里程计源**,向 ROS 2 发布连续的 `odom -> base_link` 坐标变换,替代传统的轮式里程计,提供更鲁棒的定位。
2.  **地图转换(关键步骤)**:Nav2 主要基于二维栅格地图进行路径规划。你需要使用 **`Octomap`** 将 FAST-LIVO2 的**三维体素/点云地图**进行**体素化**,并投影生成**二维占据栅格地图(2D Occupancy Grid Map)**,供 Nav2 的全局规划器使用。
3.  **配置 Nav2**:
    *   **全局代价地图**:使用上述转换好的二维栅格地图,用于全局路径规划(如 `Smac Planner`)。
    *   **局部代价地图**:直接订阅 FAST-LIVO2 输出的实时三维点云或激光雷达扫描(`/cloud_registered` 或 `LaserScan`),用于局部避障和路径跟踪。
4.  **发送导航目标**:在 RViz 中通过 `2D Goal Pose` 发送目标点,Nav2 将结合全局地图和实时传感器数据,规划并控制机器人移动到目标位置。

### ❌ ORB-SLAM3 能直接用 FAST-LIVO2 的地图吗?

**不能直接使用。**

这两者的地图格式和本质目的完全不同:
*   **ORB-SLAM3 的地图**:主要是由**稀疏的 ORB 特征点**(地图点)构成的,服务于特征匹配和基于图优化的后端。它通常保存为包含地图点、关键帧及共视关系的二进制文件,**不是通用的点云文件**。
*   **FAST-LIVO2 的地图**:核心是**稠密或半稠密的三维点云/体素地图**,并带有颜色/纹理信息。

由于数据结构、坐标系表达和用途都不兼容,ORB-SLAM3 **无法**直接读取和使用 FAST-LIVO2 生成的地图文件进行定位或建图。若要在两者间转换,理论上需要编写专门的中间件,将 FAST-LIVO2 的点云提取特征点并重新构造 ORB-SLAM3 需要的地图结构,但这在实际工程中非常少见且复杂。

ORB-SLAM3 的地图格式是其自有的 **`.osa` 文件**,而它的“纯定位”模式在官方代码中实现得并不完善,需要用户根据社区经验进行手动修改和配置。

### 🗺️ 地图格式:专有的 `.osa` 文件

ORB-SLAM3 使用一种名为 **Atlas** 的地图集容器来管理多个子地图(Map)。当你通过配置文件指定保存时,系统会将整个 Atlas 序列化为一个 **`.osa` 后缀的二进制文件**。

这个文件内部封装了维护定位所需的核心信息,包括**关键帧(KeyFrame)**、**地图点(MapPoint)** 以及它们之间的**共视关系**,而不是一个通用的三维点云或栅格地图。在 YAML 配置文件中通过 `System.SaveAtlasToFile` 和 `System.LoadAtlasFromFile` 参数即可控制该文件的存取。

### 🎯 纯定位模式:理论可行,实操有坑

ORB-SLAM3 在设计上支持纯定位模式,理论上,你只需加载预先建好的 `.osa` 地图,并设置系统进入定位模式,它就不会再更新或创建新的地图,仅依靠地图进行定位。

但根据社区反馈,**官方开源版本在这方面的实现存在已知问题**,直接使用往往无法正常工作:

1.  **加载地图后仍会尝试新建地图**:一个常见的 Bug 是,即使加载了 Atlas 文件,系统依然会创建新的子地图,而不是利用已加载的地图进行定位。
2.  **定位初始化困难**:有用户发现,加载地图后系统会反复报错(如匹配点不足),无法正确定位。
3.  **状态机限制**:在纯定位模式下,跟踪线程的状态可能被限制,导致系统无法像在 SLAM 模式下那样从暂时丢失(`RECENTLY_LOST`)中恢复。

因此,要在 ORB-SLAM3 上实现可靠的纯定位,通常需要**修改源码**。社区中已有一些解决方案,例如强制系统切换到加载的地图,或调整跟踪线程的状态判断逻辑。此外,也存在基于 ORB-SLAM3 修改并提供了 HTTP 接口的定位服务项目,通过 `--localize` 标志来启用纯定位,可作为参考。

如果你需要从 ORB-SLAM3 导出可用于导航的通用地图,则需要修改代码,利用 PCL 库将地图点保存为 **`.pcd`** 格式的点云文件。这与专用的 `.osa` 文件是两种不同的用途。

当前较先进的VIO算法,正从传统的几何优化,向**学习增强**与**紧耦合**的方向快速演进。它们的核心目标都是让机器人仅凭视觉和IMU,就能在复杂环境中稳定地“知道自己走了多远”。

我把几个有代表性的先进算法整理如下:

### 🚀 先进VIO算法一览

| 算法名称 | 核心创新 | 关键性能/特点 | 适用场景 |
| :--- | :--- | :--- | :--- |
| **MixVIO** | **选择性视觉处理** + **混合核建模** | KITTI数据集上平均相对平移误差**1.69%**,能按需调用视觉计算以节省资源 | 对计算资源敏感,且需要高精度定位的户外移动机器人 |
| **DB-VIO** | **深度引导融合** + **姿态引导编码** | 利用单目深度估计和陀螺仪数据增强特征,在KITTI和EuRoC数据集上达到**SOTA**性能 | 单目相机配置,追求高精度的地面车辆或空中机器人 |
| **Sphere-VIO** | **统一球面表示**(专为多相机设计) | EuRoC数据集上ATE RMSE为**0.1072米**,优于VINS-Fusion约**48.3%**,对长走廊等场景鲁棒 | 配备多相机(如广角、鱼眼)的机器人,追求极致鲁棒性 |
| **Dual-Agent RL VIO** | **双智能体强化学习**(决定何时用视觉、信任程度) | 在EuRoC和TUM-VI上取得最佳平均ATE,运行速度比同类GPU方案快**1.77倍**,显存占用更低 | 资源受限的嵌入式平台(如无人机、AR设备),需平衡精度与效率 |
| **Adaptive-VINS** | **图像质量感知** + **自适应调度** | 根据图像质量动态调整特征提取和优化策略,在退化场景下可将绝对轨迹误差**降低58.5%** | 光照突变、运动模糊等视觉条件不稳定的场景 |
| **APL-VIO** | **自适应点线特征** | 有效利用线结构信息,在纹理缺失或光照变化场景下鲁棒性更强,平均精度最高 | 室内结构化环境(如走廊、房间) |

### 💡 如何选择?

选择哪个算法,主要看你的**硬件配置**、**应用场景**和**核心诉求**:

*   **追求极致精度与鲁棒性**:如果你的机器人配备多相机,且对定位精度的要求极高,**Sphere-VIO** 是强有力的候选。
*   **资源受限的嵌入式平台**:无人机或AR设备通常算力有限。**Dual-Agent RL VIO** 通过强化学习智能地决定何时进行昂贵的视觉计算,在精度和效率间取得了很好的平衡。**MixVIO** 也有类似的设计理念。
*   **应对视觉退化场景**:如果你的机器人经常在光照剧变、纹理稀少或动态物体多的环境中工作,**Adaptive-VINS** 的自适应调度机制和 **APL-VIO** 的点线特征融合,能显著提升系统的稳定性。

这些算法大多是在VINS-Fusion、ORB-SLAM3等成熟框架上的改进。如果你想深入了解其中某个算法的具体实现或论文,可以再告诉我。

李群和李代数,本质上是为**旋转、平移等“非线性”运动**,提供一套**线性化**的数学工具,从而让机器人学中的状态估计和优化问题变得可解。

### 📐 它们究竟在讲什么?

简单说,**李群是“弯曲”的集合,李代数是它“拉直”后的样子**。

- **李群 (Lie Group)**:一个**光滑的、连续的曲面**(流形),同时定义了一种“乘法”运算。在SLAM和VIO中,我们最关心的两个李群是:
    - **SO(3)**:所有三维旋转的集合。它是一个在三维空间里“弯曲”的球面。
    - **SE(3)**:所有三维刚体变换(旋转+平移)的集合。
    这些集合的“弯曲”特性,意味着你无法用简单的线性加减法来直接计算或更新一个旋转(比如,两个旋转矩阵相加不再是旋转矩阵)。

- **李代数 (Lie Algebra)**:是李群在**单位元处的切空间**,可以理解为一个**平直的向量空间**。李群上复杂的乘法运算,对应到李代数上就变成了简单的**向量加法**。SO(3)的李代数 **so(3)** 就是所有三维向量的集合,这些向量被称为**旋转向量**或**轴角**。

连接两者的桥梁是指数映射和对数映射:
- **指数映射 (Exp)**:将李代数(向量,如旋转向量)映射到李群(旋转矩阵)。
- **对数映射 (Log)**:将李群(旋转矩阵)映射回李代数(向量)。

### 🎯 用于解决什么问题?

李群和李代数在机器人领域,主要解决以下三个核心问题:

**1. 旋转/位姿的表示与更新**
这是最基础的应用。用旋转向量(李代数)表示旋转,其**自由度是3**,与旋转的3个自由度完美匹配,没有冗余。而在优化中,我们可以直接对李代数进行**加法**更新(例如 `ΔR ≈ Exp(δθ)`),简单且无约束,避免了用旋转矩阵更新时需强制正交化的麻烦。

**2. 求导与优化**
这是李代数最强大的用途。在优化位姿时,我们需要求误差函数对位姿的导数(雅可比矩阵)。直接对旋转矩阵求导会非常复杂,但利用李代数的小量扰动模型(左乘或右乘一个微小旋转 `Exp(δθ)`),可以很自然地推导出简洁的雅可比矩阵,从而使用高斯-牛顿或列文伯格-马夸尔特等算法高效优化。

**3. 插值与滤波**
在处理IMU数据时,需要在两个位姿之间进行平滑插值。在流形上直接插值很复杂,但转换到李代数空间,就可以用**线性插值**(如SLERP球面线性插值)来实现平滑过渡。同样,在扩展卡尔曼滤波(EKF)中,状态误差通常定义在李代数空间,以保证协方差的正确传播。

### 💡 一个直观的比喻

你可以把**李群**想象成一个**弯曲的球面**,而**李代数**是球面上某一点(通常是北极点)的**切平面**。

- 你无法在球面上直接画一条直线,但可以在切平面上画一条直线,然后通过“投影”(指数映射)把它“卷”到球面上。
- 优化一个旋转,就像在球面上找一条最短路径。我们先在切平面上计算一个小的步长(李代数的更新量),然后通过指数映射把这个步长“卷”回球面,得到一个新的、合法的旋转。这样,每次迭代都在一个“平直”的空间里进行,计算就变得简单了。

总结来说,李群和李代数就是一套**将非线性的旋转/位姿问题,转化为线性问题来求解**的数学框架,是所有现代机器人状态估计(如VIO、SLAM)和控制的基石。

基于Bundle Adjustment(BA)的VIO融合,是当前视觉惯性里程计(VIO)中**精度最高、最主流**的技术路线之一。它的核心思想是:**把视觉的观测误差和IMU的运动误差,放在同一个优化问题里,通过调整机器人的运动轨迹和地图点,让所有误差同时最小。**

简单说,就是**“视觉和IMU互相纠错,一起优化”**。

---

## 🧩 先理解什么是 Bundle Adjustment (BA)

BA 原本是纯视觉SLAM里的概念:

- 你有一串相机位姿(轨迹)和一堆三维地图点。
- 每个地图点会被多个相机看到,形成“观测”。
- 由于噪声,这些观测和理论投影位置有偏差(重投影误差)。
- BA 就是**同时优化相机位姿和地图点位置**,让所有重投影误差的平方和最小。

数学上是一个大规模非线性最小二乘问题:

\[
\min_{\{T_i\}, \{P_j\}} \sum_{i,j} \| \pi(T_i, P_j) - z_{ij} \|^2
\]

其中 \(T_i\) 是相机位姿,\(P_j\) 是地图点,\(z_{ij}\) 是观测到的像素坐标,\(\pi\) 是投影函数。

---

## 🔗 把 IMU 加进来:VIO 的 BA

纯视觉 BA 有两个致命弱点:

1. **尺度不确定**:单目视觉无法知道真实尺度;
2. **快速运动/纹理缺失时容易丢**。

IMU 正好能补上:

- IMU 有加速度计,能提供**尺度信息**;
- IMU 高频输出,能在视觉失效时**维持运动估计**;
- IMU 能提供**重力方向**,约束轨迹。

于是,基于 BA 的 VIO 就是把 IMU 的**预积分误差**也加入优化目标:

\[
\min_{\{T_i\}, \{P_j\}, \{v_i\}, \{b_i\}} \underbrace{\sum \|r_{visual}\|^2}_{\text{重投影误差}} + \underbrace{\sum \|r_{imu}\|^2}_{\text{IMU预积分误差}}
\]

其中:

- \(r_{visual}\):视觉重投影误差;
- \(r_{imu}\):IMU 预积分残差,约束相邻两帧之间的位置、速度、旋转;
- \(v_i\):速度;
- \(b_i\):IMU 零偏(加速度计和陀螺仪)。

优化变量包括:**相机位姿、速度、IMU零偏、地图点位置**。

---

## 🧠 关键概念:IMU 预积分

IMU 输出频率很高(100~1000Hz),而相机只有 10~30Hz。如果直接把每个 IMU 采样都放进优化,变量太多,计算爆炸。

**预积分**的做法是:

- 在两个视觉关键帧之间,把大量 IMU 数据**积分成一个相对运动约束**;
- 这个约束只依赖 IMU 零偏,与初始状态无关;
- 优化时,只需要调整零偏,就能快速重新计算这个约束。

预积分残差通常写成:

\[
r_{imu} = \begin{bmatrix} r_p \\ r_q \\ r_v \\ r_{ba} \\ r_{bg} \end{bmatrix}
\]

它约束了相邻两帧之间的**位置、旋转、速度**,并估计**零偏**。

---

## 🔄 基于 BA 的 VIO 融合流程

1. **前端**:提取视觉特征,跟踪特征点,IMU 预积分。
2. **初始化**:估计重力方向、尺度、速度、零偏。
3. **滑动窗口**:只保留最近 N 帧关键帧,旧帧被边缘化。
4. **构建优化问题**:
   - 视觉重投影误差;
   - IMU 预积分误差;
   - 边缘化先验(保留被移除帧的信息)。
5. **非线性优化**:用高斯-牛顿或列文伯格-马夸尔特求解。
6. **输出**:位姿、速度、零偏、地图点。

---

## 🆚 与滤波方法的区别

| 维度 | 基于 BA 的 VIO | 基于滤波的 VIO(如 MSCKF) |
|------|----------------|----------------------------|
| 核心方法 | 非线性优化 | 扩展卡尔曼滤波 |
| 精度 | 通常更高 | 稍低 |
| 计算量 | 较大,但可滑动窗口控制 | 较小 |
| 一致性 | 更好 | 容易过度自信 |
| 代表 | VINS-Mono、OKVIS、ORB-SLAM3 | MSCKF、ROVIO |

---

## 🏆 代表算法

| 算法 | 特点 |
|------|------|
| **VINS-Mono** | 香港科技大学,单目+IMU,滑动窗口BA,开源经典 |
| **VINS-Fusion** | VINS-Mono 扩展,支持双目、GPS、多传感器 |
| **OKVIS** | ETH,双目+IMU,关键帧BA |
| **ORB-SLAM3** | 支持单目/双目/RGB-D + IMU,多地图,BA |
| **Kimera** | MIT,语义+VIO,BA |
| **BASALT** | 基于非线性优化,精度高 |

---

## 💡 直观理解

把 VIO 想象成一场**拔河**:

- 视觉说:“根据图像,你应该在这里。”
- IMU 说:“根据我的加速度和角速度,你应该在那里。”
- BA 就是**裁判**,它同时听取两边意见,调整轨迹,让两边都尽可能满意。

视觉提供**长期准确、但易受干扰**的约束;IMU 提供**短期精确、但会漂移**的约束。BA 把它们放在一起优化,取长补短。

---

## ✅ 总结

- **基于 BA 的 VIO** = 视觉重投影误差 + IMU 预积分误差,联合非线性优化。
- 核心是**滑动窗口 + 预积分 + 边缘化**。
- 优点是**精度高、一致性好、尺度可观测**;缺点是**计算量大**。
- 代表算法:VINS-Mono、VINS-Fusion、OKVIS、ORB-SLAM3。
- 它是当前 VIO 领域**精度最高、最主流**的技术路线之一。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐