2. 数学基础

视觉惯性里程计(VIO)的核心任务,是在三维空间中持续估计传感器(相机与IMU)的运动轨迹与姿态。无论是特征点三角化、IMU预积分,还是滑动窗口优化,所有计算都建立在严谨的数学表达之上。本章将系统梳理VIO中最基础的数学工具:从坐标系定义与刚体变换出发,对比旋转矩阵与四元数的表达差异,最后引入李群与李代数(SO(3)、SE(3))及其在优化中的核心作用。这些概念不仅是公式推导的基石,更直接决定了工程实现中数值稳定性与计算效率。

VIO数学基础:坐标系与刚体运动表达 坐标系定义 • 世界系 W:固定参考 • 相机系 C:光心为原点 • IMU系 I:加速度计/陀螺仪 • 刚体变换:R∈SO(3), t∈R³ 旋转矩阵 vs 四元数 • 旋转矩阵 R:3×3,9个参数 • 四元数 q:4个参数,无万向锁 • 转换关系:q→R 使用 Rodrigues • 插值:四元数球面线性插值 李群与李代数 • SO(3):旋转矩阵群 • so(3):反对称矩阵,3维 • SE(3):齐次变换矩阵群 • se(3):6维,旋转+平移 VIO中的核心应用 IMU预积分 ΔR, Δv, Δp 李代数局部扰动 视觉重投影 相机位姿变换 SE(3) 链式变换 滑动窗口优化 李代数求导 左/右扰动模型 外参标定 相机-IMU 外参 T_CI ∈ SE(3) 优化求解流程 定义残差 李代数求导 增量更新 指数映射回群 核心思想:在流形(李群)上做优化,在切空间(李代数)上做求导与增量

上图展示了本章的知识框架:坐标系定义是描述一切运动的前提;旋转矩阵与四元数是两种最常用的姿态表达方式;而李群与李代数则连接了“状态表达”与“优化求解”之间的鸿沟。下面我们逐一深入剖析。

2.1 坐标系定义与刚体变换

核心原理:在VIO系统中,我们通常定义三个主要坐标系:世界坐标系(W,通常与IMU初始位置对齐或定义为重力方向为Z轴)、相机坐标系(C,光心为原点,Z轴指向相机前方)、IMU坐标系(I,加速度计与陀螺仪的敏感轴方向)。刚体变换描述了一个坐标系相对于另一个坐标系的旋转与平移,数学上表示为 T = [R | t],其中 R ∈ SO(3) 是旋转矩阵,t ∈ R³ 是平移向量。齐次坐标形式为 T ∈ SE(3),即 4×4 矩阵。

操作流程:在实际工程中,坐标变换遵循“链式法则”。例如,将相机观测到的3D点 p_C 转换到世界系:

p_W = R_WC * p_C + t_WC
     = T_WC * p_C_homogeneous

其中 T_WC 表示从相机系到世界系的变换。VIO中常见的变换链为:T_WI = T_WC * T_CI,即通过外参 T_CI(相机-IMU外参)将IMU位姿转换到相机位姿。

坐标系对变换矩阵物理含义VIO中的用途
W → IT_WIIMU在世界系中的位姿状态变量(待估计)
I → CT_CIIMU到相机的固定外参标定参数(离线/在线估计)
W → CT_WC相机在世界系中的位姿视觉重投影计算
经验提醒:在代码实现中,务必统一坐标变换的“方向”约定。例如,Eigen库中 Isometry3d 默认表示 T_world_from_body,若混用方向,会导致严重的轨迹漂移且难以排查。

2.2 旋转矩阵与四元数

核心原理:旋转矩阵 R 是正交矩阵(RᵀR = I,det(R)=1),拥有9个参数但只有3个自由度,因此存在冗余。四元数 q = [w, x, y, z] 是单位四元数(w²+x²+y²+z²=1),用4个参数表达3个自由度,避免了欧拉角的万向锁问题,且插值方便。两者可以互相转换:

// 四元数转旋转矩阵(Eigen)
Eigen::Matrix3d R = q.toRotationMatrix();
// 旋转矩阵转四元数
Eigen::Quaterniond q(R);

判断方法:在VIO中,选择哪种表达方式取决于使用场景。优化变量通常使用四元数(因为归一化约束容易处理),而坐标变换计算时使用旋转矩阵(因为矩阵乘法效率高)。IMU预积分中,旋转增量使用四元数乘法:Δq = q_i ⊗ q_j。

案例拆解:假设IMU输出角速度 ω,在时间 Δt 内积分得到旋转增量。使用四元数更新:q_new = q_old ⊗ Δq,其中 Δq ≈ [1, 0.5*ω*Δt]。若使用旋转矩阵更新,则需计算 R_new = R_old * Exp(ω*Δt),其中 Exp 为指数映射。工程中,四元数更新更简洁且数值稳定性更好。
常见误区:四元数存在“双覆盖”问题,即 q 和 -q 表示同一旋转。在优化中若不加约束,可能导致符号跳变,影响雅可比计算。解决方法是保持四元数实部为正,或在更新时检查点积符号。

2.3 李群与李代数:SO(3) 与 SE(3)

核心原理:李群是连续光滑的群,SO(3) 是三维旋转群,SE(3) 是三维刚体运动群。李代数是对应李群在单位元处的切空间,SO(3) 对应 so(3)(三维反对称矩阵),SE(3) 对应 se(3)(六维向量,前三维平移,后三维旋转)。核心关系通过指数映射和对数映射连接:

R = Exp(φ) = I + sin(θ) * φ_hat + (1-cos(θ)) * φ_hat²   // Rodrigues公式
φ = Log(R)  // 旋转向量

其中 φ 是旋转向量,θ = ||φ||,φ_hat 是 φ 的反对称矩阵。

操作流程:在VIO的优化问题中,我们通常将位姿 T 视为李群元素,但在求导时使用李代数。具体步骤为:

  1. 定义残差 r = z - h(T),其中 z 是观测值(如特征点像素坐标),h 是预测模型。
  2. 对 T 施加左扰动 δξ(李代数增量),计算雅可比 J = ∂r/∂δξ。
  3. 求解增量方程 H δξ = b,更新 T ← T * Exp(δξ)。

案例拆解:以视觉重投影误差为例。设相机位姿 T_WC,3D点 p_W,观测像素 z。残差为 r = z - π(T_WC * p_W)。对 T_WC 求导时,使用左扰动模型:

J = ∂r/∂δξ = ∂r/∂p_C * ∂p_C/∂δξ
其中 ∂p_C/∂δξ = [I, -p_C_hat]  // 平移部分和旋转部分

这种求导方式避免了旋转矩阵的复杂链式法则,且雅可比形式简洁,便于在Ceres或g2o中实现。

对比维度旋转矩阵 R四元数 q李代数 φ
参数数量943
冗余性有(正交约束)有(单位约束)无
求导难度复杂中等简单(扰动模型)
插值困难容易(Slerp)线性插值
VIO用途坐标变换状态存储/更新优化求导
实战场景:在VINS-Mono中,优化变量使用四元数+平移向量,但雅可比矩阵全部基于李代数推导。例如,IMU预积分残差对位姿的雅可比,使用 SE(3) 的左扰动模型,得到6×6的雅可比矩阵。这种混合使用方式既保证了状态表达的紧凑性,又利用了李代数求导的便利性。
风险提示:李代数求导时,需注意左扰动与右扰动的区别。左扰动模型(T ← Exp(δξ) * T)与右扰动模型(T ← T * Exp(δξ))得到的雅可比不同,但最终优化结果一致。在代码中必须统一约定,否则会导致梯度方向错误,优化不收敛。

2.4 本章总结与常见误区

核心要点回顾:坐标系定义是VIO的“世界语言”,刚体变换 T ∈ SE(3) 是连接所有坐标系的桥梁。旋转矩阵适合直观理解与坐标变换,四元数适合状态存储与插值,李代数适合优化求导。三者之间的转换关系必须熟练掌握。

常见误区清单:

  • 误区1:混淆旋转矩阵的转置与逆。对于旋转矩阵,R⁻¹ = Rᵀ,但平移向量不能直接转置,必须使用 t' = -Rᵀ * t。
  • 误区2:四元数乘法顺序。四元数乘法 q1 ⊗ q2 表示先应用 q2 再应用 q1,与旋转矩阵乘法顺序相反,容易出错。
  • 误区3:忽略李代数的局部有效性。指数映射仅在原点附近是局部同胚,当旋转角度接近 π 时,对数映射可能产生奇异,需做特殊处理。
  • 误区4:在优化中直接对四元数四个分量求导,而不施加单位约束。这会导致优化结果不再是合法旋转,必须使用扰动模型。
工程建议:在代码中封装统一的位姿类,内部使用四元数+平移存储,对外提供 toMatrix()、toVector() 接口。所有优化库(Ceres/g2o)的雅可比计算,统一使用李代数扰动模型,并编写单元测试验证雅可比正确性(可用数值求导对比)。