IMU 模型与标定 — 从 Datasheet 到算法参数
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(atrue−g)+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-g−g 在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),nbg∼N(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,d∼N(0,σbg2⋅Δt)
注意:随机游走离散化后方差乘以 Δt\Delta tΔt(积分变大)。
2.3 连续→离散转换总结
| 噪声类型 | 连续方差 | 离散方差 | 直觉 |
|---|---|---|---|
| 白噪声 nnn | σc2\sigma_c^2σc2 | σc2/Δt\sigma_c^2 / \Delta tσc2/Δt | 采样越快单次噪声越大 |
| 随机游走 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 方差标定流程
- 静止采集长时间 IMU 数据(通常 2-4 小时)
- 对数据计算不同 τ\tauτ 下的 Allan 方差
- 在 log-log 图上拟合斜率,提取各噪声参数
- 开源工具:
imu_utils(ROS包)、kalibr_allan
五、IMU 初始化
5.1 静止初始化(FAST-LIO2 采用)
前提:系统启动时保持静止
流程:
- 累积 N 帧 IMU 数据
- 计算加速度均值 → 重力方向
- 计算角速度均值 → 陀螺零偏
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-2秒)的 IMU 数据和 LiDAR 第一帧的位姿变化
- 联合估计初始速度、重力方向和零偏
- 通常通过构建线性方程组求解(类似 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+ng,b˙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 中哪些参数指导配置算法?
核心参数:
- 噪声密度(ARW/VRW) → 配置过程噪声 Q 中的白噪声项
- 零偏不稳定性 → 配置 Q 中的随机游走项
- 采样率 → 连续到离散的转换系数
- 量程 → 异常数据检测
- 开机零偏 → 初始协方差 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)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)