IMU 是激光惯性里程计的核心传感器之一。面试中经常被问到噪声模型、参数标定、初始化流程等问题。本文从 IMU 测量模型出发,讲清楚如何从 datasheet 读取参数并配置到 SLAM 算法中。


面试速查(30秒版)

概念 一句话
IMU测量模型 真值 + 零偏 + 白噪声
白噪声 高频随机扰动,积分后→随机游走漂移
零偏(Bias) 缓慢变化的系统偏差,建模为随机游走
噪声密度(ARW/VRW) 白噪声强度,datasheet核心参数,单位 °/√Hz 或 mg/√Hz
零偏不稳定性 Bias随机游走的强度,datasheet核心参数
连续→离散 白噪声: σd=σc/Δt\sigma_d = \sigma_c / \sqrt{\Delta t}σd=σc/Δt ;随机游走: σd=σc⋅Δt\sigma_d = \sigma_c \cdot \sqrt{\Delta t}σd=σcΔt
初始化 静止时:加速度均值→重力方向,角速度均值→陀螺零偏

一、IMU 测量模型

1.1 陀螺仪(Gyroscope)

ωm=ωtrue+bg+ng\omega_m = \omega_{true} + b_g + n_gωm=ωtrue+bg+ng

  • ωm\omega_mωm:测量角速度(IMU输出)
  • ωtrue\omega_{true}ωtrue:真实角速度
  • bgb_gbg:陀螺仪零偏(slowly time-varying)
  • ngn_gng:测量白噪声

零偏的时间演化:
b˙g=nbg\dot{b}_g = n_{bg}b˙g=nbg

nbgn_{bg}nbg 是零偏的随机游走驱动噪声。

1.2 加速度计(Accelerometer)

am=RwbT(atrue−g)+ba+naa_m = R^T_{wb}(a_{true} - g) + b_a + n_aam=RwbT(atrueg)+ba+na

  • ama_mam:测量加速度(IMU输出)
  • atruea_{true}atrue:真实线加速度(世界系)
  • ggg:重力加速度(世界系,约 [0,0,-9.81])
  • RwbR_{wb}Rwb:body到world的旋转
  • bab_aba:加速度计零偏
  • nan_ana:测量白噪声

注意:IMU 测量的是"比力"(specific force),即不含重力的加速度在body系下的投影。静止时加速度计测到的是 −g-gg 在body系的投影(向上9.81),不是零!


二、噪声的数学模型

2.1 测量白噪声

连续时间模型:
ng(t)∼N(0,σg2)n_g(t) \sim \mathcal{N}(0, \sigma_g^2)ng(t)N(0,σg2)

这是一个连续时间白噪声过程,功率谱密度(PSD)为 σg2\sigma_g^2σg2(单位:(rad/s)2/Hz(\text{rad/s})^2/\text{Hz}(rad/s)2/Hz)。

离散化:采样后每个时刻的噪声方差为:
σg,d2=σg2Δt\sigma_{g,d}^2 = \frac{\sigma_g^2}{\Delta t}σg,d2=Δtσg2

注意:离散化后方差比连续版本大(除以 Δt\Delta tΔt),因为采样频率越高每个采样的噪声越大(但积分效果相同)。

2.2 零偏随机游走

连续时间模型:
b˙g(t)=nbg(t),nbg∼N(0,σbg2)\dot{b}_g(t) = n_{bg}(t), \quad n_{bg} \sim \mathcal{N}(0, \sigma_{bg}^2)b˙g(t)=nbg(t),nbgN(0,σbg2)

离散化(对时间积分):
bg[k+1]=bg[k]+nbg,d,nbg,d∼N(0,σbg2⋅Δt)b_g[k+1] = b_g[k] + n_{bg,d}, \quad n_{bg,d} \sim \mathcal{N}(0, \sigma_{bg}^2 \cdot \Delta t)bg[k+1]=bg[k]+nbg,d,nbg,dN(0,σbg2Δt)

注意:随机游走离散化后方差乘以 Δt\Delta tΔt(积分变大)。

2.3 连续→离散转换总结

噪声类型 连续方差 离散方差 直觉
白噪声 nnn σc2\sigma_c^2σc2 σc2/Δt\sigma_c^2 / \Delta tσc2t 采样越快单次噪声越大
随机游走 b˙\dot{b}b˙ σc2\sigma_c^2σc2 σc2⋅Δt\sigma_c^2 \cdot \Delta tσc2Δt 积分时间越长漂越多

三、从 Datasheet 提取参数

3.1 关键参数对照表

Datasheet参数 符号 含义 如何用于算法
Angular Random Walk (ARW) σg\sigma_gσg 陀螺白噪声密度 QQQ 矩阵中 ngn_gng 的方差
Velocity Random Walk (VRW) σa\sigma_aσa 加速度白噪声密度 QQQ 矩阵中 nan_ana 的方差
Bias Instability (陀螺) σbg\sigma_{bg}σbg 陀螺零偏随机游走 QQQ 矩阵中 nbgn_{bg}nbg 的方差
Bias Instability (加速度) σba\sigma_{ba}σba 加速度零偏随机游走 QQQ 矩阵中 nban_{ba}nba 的方差
带宽 / 采样率 fsf_sfs 数据输出频率 离散化中的 Δt=1/fs\Delta t = 1/f_sΔt=1/fs
量程 最大可测范围 超量程数据无效
非线性度/标度因数误差 灵敏度误差 高精度应用需标定

3.2 单位转换示例

假设 datasheet 给出:

  • ARW = 0.15 °/√hr = 0.15 × (π/180) / √3600 = 4.36e-5 rad/√s
  • VRW = 0.04 m/s/√hr = 0.04 / √3600 = 6.67e-4 m/s/√s
  • Gyro Bias Instability = 10 °/hr = 10 × (π/180) / 3600 = 4.85e-5 rad/s

转化为算法参数(假设采样率200Hz,Δt=0.005s\Delta t = 0.005sΔt=0.005s):

  • 陀螺白噪声离散标准差:σg,d=ARW/Δt=4.36e-5/0.005=6.17e-4\sigma_{g,d} = \text{ARW} / \sqrt{\Delta t} = 4.36\text{e-5} / \sqrt{0.005} = 6.17\text{e-4}σg,d=ARW/Δt =4.36e-5/0.005 =6.17e-4 rad/s
  • Bias 随机游走离散标准差:σbg,d=BI×Δt=4.85e-5×0.005=3.43e-6\sigma_{bg,d} = \text{BI} \times \sqrt{\Delta t} = 4.85\text{e-5} \times \sqrt{0.005} = 3.43\text{e-6}σbg,d=BI×Δt =4.85e-5×0.005 =3.43e-6 rad/s

3.3 FAST-LIO2 中的参数配置

# config yaml
mapping:
    gyr_cov: 0.1         # 陀螺测量噪声(离散标准差)
    acc_cov: 0.1         # 加速度测量噪声
    b_gyr_cov: 0.0001    # 陀螺零偏随机游走
    b_acc_cov: 0.0001    # 加速度零偏随机游走

对应源码中的处理(IMU_Processing.hpp:280-283):

Q.block<3, 3>(0, 0).diagonal() = cov_gyr;      // 陀螺白噪声
Q.block<3, 3>(3, 3).diagonal() = cov_acc;      // 加速度白噪声
Q.block<3, 3>(6, 6).diagonal() = cov_bias_gyr; // 陀螺零偏随机游走
Q.block<3, 3>(9, 9).diagonal() = cov_bias_acc; // 加速度零偏随机游走

四、Allan 方差

4.1 什么是 Allan 方差?

Allan 方差是分析 IMU 噪声特性的标准工具,通过对不同平均时间 τ\tauτ 的方差分析,识别各类噪声成分。

在 log-log 图上:

  • 斜率 -1/2:角度/速度随机游走(白噪声)→ 读取 τ=1\tau=1τ=1 处的值即为噪声密度
  • 斜率 0(平坦段):零偏不稳定性 → 读取最低点的值
  • 斜率 +1/2:速率随机游走(零偏随机游走)
log(σ)
  |    \
  |     \ 斜率-1/2 (白噪声)
  |      \_____ 斜率0 (零偏不稳定性)
  |            /
  |           / 斜率+1/2 (随机游走)
  |──────────────── log(τ)

4.2 Allan 方差标定流程

  1. 静止采集长时间 IMU 数据(通常 2-4 小时)
  2. 对数据计算不同 τ\tauτ 下的 Allan 方差
  3. 在 log-log 图上拟合斜率,提取各噪声参数
  4. 开源工具:imu_utils(ROS包)、kalibr_allan

五、IMU 初始化

5.1 静止初始化(FAST-LIO2 采用)

前提:系统启动时保持静止

流程

  1. 累积 N 帧 IMU 数据
  2. 计算加速度均值 → 重力方向
  3. 计算角速度均值 → 陀螺零偏

FAST-LIO2 源码(IMU_Processing.hpp:159-214):

void IMU_init(...) {
    // 增量均值(Welford算法)
    mean_acc += (cur_acc - mean_acc) / N;
    mean_gyr += (cur_gyr - mean_gyr) / N;
    
    // 重力初始化:静止时 acc ≈ -g(body系)
    init_state.grav = S2(-mean_acc / mean_acc.norm() * G_m_s2);
    
    // 陀螺零偏初始化:静止时 gyro ≈ bias
    init_state.bg = mean_gyr;
}

5.2 动态初始化

当系统无法保证启动时静止(如车辆行驶中上电):

  1. 利用短时间(1-2秒)的 IMU 数据和 LiDAR 第一帧的位姿变化
  2. 联合估计初始速度、重力方向和零偏
  3. 通常通过构建线性方程组求解(类似 VINS-Mono 的初始化)

5.3 重力校准

目的:将重力从 IMU body 系对齐到世界系的 z 轴方向

// FAST-LIO2 的重力表示:S2流形
// 在初始化时:
init_state.grav = S2(-mean_acc / mean_acc.norm() * G_m_s2);
// 意味着:重力方向 = 加速度均值的反方向 × 9.81

// 世界系的 z 轴定义为重力方向的反方向
// 即:g_world = [0, 0, -9.81]^T

六、传感器时间戳同步

6.1 为什么时间同步重要?

IMU 频率通常 200-400Hz,LiDAR 通常 10-20Hz。如果时间戳不对齐:

  • 去畸变时用错了 IMU 位姿 → 点云扭曲
  • 融合时匹配错误的测量 → 估计发散

6.2 常见同步策略

方法 适用场景 精度
硬件同步(PPS/PTP) 工程部署 <1μs
时间戳对齐(host clock) ROS系统 ~1ms
在线时间偏移估计 无硬件同步 ~ms级

6.3 FAST-LIO2 的时间同步

// 自动检测并补偿 LiDAR-IMU 时间偏移
if (time_sync_en && !timediff_set_flg && abs(last_timestamp_lidar - last_timestamp_imu) > 1) {
    timediff_set_flg = true;
    timediff_lidar_wrt_imu = last_timestamp_lidar + 0.1 - last_timestamp_imu;
}

原理:如果检测到 LiDAR 和 IMU 时间戳差异过大(>1秒),说明时钟基准不同,自动估计偏移量。


七、IMU Datasheet 中指导算法配置的参数

7.1 决定 Q 矩阵的参数

Datasheet 参数 对应 Q 矩阵位置 影响
ARW (陀螺噪声密度) QngQ_{ng}Qng:陀螺白噪声 影响旋转估计的不确定性
VRW (加速度噪声密度) QnaQ_{na}Qna:加速度白噪声 影响位置/速度估计不确定性
Gyro Bias Instability QnbgQ_{nbg}Qnbg:陀螺零偏游走 影响零偏估计收敛速度
Accel Bias Instability QnbaQ_{nba}Qnba:加速度零偏游走 影响零偏估计收敛速度

7.2 决定初始协方差 P 的参数

Datasheet 参数 对应 P 矩阵位置
Bias Repeatability PbgP_{bg}Pbg, PbaP_{ba}Pba 的初始值
开机零偏 Turn-on Bias PbgP_{bg}Pbg, PbaP_{ba}Pba 的初始值

7.3 用于异常检测的参数

Datasheet 参数 用途
量程 (Full Scale Range) 超量程数据标记为无效
非线性度 高动态下精度评估
交叉轴耦合 高精度应用需补偿

面试真题与答题要点

Q1: IMU 的噪声模型是什么?测量噪声和零偏各自属于什么数学模型?

IMU 测量 = 真值 + 零偏 + 白噪声。

  • 测量白噪声:高斯白噪声模型(每次采样独立同分布),积分后产生随机游走
  • 零偏(Bias):随机游走模型(布朗运动),即每一步在上一步基础上加一个小随机扰动

数学表达:ωm=ω+bg+ng\omega_m = \omega + b_g + n_gωm=ω+bg+ngb˙g=nbg\dot{b}_g = n_{bg}b˙g=nbg

Q2: 怎么实现 IMU 初始化和重力校准?

静止初始化:累积N帧IMU数据,加速度均值的反方向即重力方向(静止时 acc ≈ -g_body),角速度均值即陀螺零偏。
重力校准:将估计的重力方向定义为世界坐标系 -z 方向,由此确定 IMU 到世界系的初始旋转。
FAST-LIO2用S2流形表示重力(2自由度),避免过参数化。

Q3: Datasheet 中哪些参数指导配置算法?

核心参数:

  1. 噪声密度(ARW/VRW) → 配置过程噪声 Q 中的白噪声项
  2. 零偏不稳定性 → 配置 Q 中的随机游走项
  3. 采样率 → 连续到离散的转换系数
  4. 量程 → 异常数据检测
  5. 开机零偏 → 初始协方差 P 的设置

Q4: 连续噪声和离散噪声怎么转换?

  • 白噪声(连续→离散):σd=σc/Δt\sigma_d = \sigma_c / \sqrt{\Delta t}σd=σc/Δt ,频率越高单次噪声越大
  • 随机游走(连续→离散):σd=σc⋅Δt\sigma_d = \sigma_c \cdot \sqrt{\Delta t}σd=σcΔt ,积分时间越长漂越多

实际代码中通常直接用离散方差配置 Q 矩阵。


延伸阅读

  • 参考文档:Joan Sola, “Quaternion kinematics for the error-state Kalman filter” — 第5章 IMU噪声模型
  • 工具imu_utils (ROS包) — Allan方差标定
  • 工具kalibr — 多传感器联合标定(IMU-Camera、IMU-LiDAR外参)
  • 论文:Qin T, et al. “VINS-Mono” — 动态初始化参考
  • Datasheet范例:BMI088 (Bosch)、ICM-20689 (InvenSense)、ADIS16470 (Analog Devices)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐