一、IMU基础与坐标系:从原理到实战

大家好,我是你们的定位工程师老K。今天咱们聊聊IMU和坐标系——这两个东西,说白了就是自动驾驶定位的"地基"。地基没打好,后面盖什么楼都得塌。

我记得刚入行那会儿,有个项目IMU数据怎么都对不上,折腾了两周才发现是坐标系定义搞反了。嗯,从那以后,我每次做新项目第一件事就是:确认坐标系!

1.1 IMU工作原理:它到底在测什么?

IMU,全称惯性测量单元。你把它想象成一个"六维传感器"就对了——它同时测量三个轴的加速度和三个轴的角速度。

核心输出:

  • 加速度计:测量比力(包含重力分量),单位 m/s²
  • 陀螺仪:测量角速度,单位 rad/s

这里有个坑,我必须要说。加速度计测的不是"运动加速度",而是"比力"。什么意思?你静止放在桌上,加速度计读数是9.8 m/s²,不是0。因为它在测重力。这个区别,很多新手一开始会懵。

避坑指南:我曾经在车辆静止时看到加速度计读数不是9.8,差点以为是传感器坏了。后来发现是安装角度问题——IMU没放水平,重力被分解到了三个轴上。所以,静止时三轴加速度的平方和开根号应该等于9.8,这是最基础的校验方法。

1.2 加速度计与陀螺仪模型:数学上怎么描述?

实际传感器都有误差,不可能完美。咱们得建个数学模型来描述它。

加速度计模型

a_measured = a_true + b_a + n_a + S_a * a_true + ...

其中:

  • b_a:零偏(bias),随时间缓慢变化
  • n_a:白噪声,随机波动
  • S_a:比例因子误差

说白了,你测到的值 = 真实值 + 各种乱七八糟的误差。我习惯把零偏看作"系统误差",白噪声看作"随机误差"。前者可以标定补偿,后者只能靠滤波。

陀螺仪模型

ω_measured = ω_true + b_g + n_g + S_g * ω_true + ...

结构跟加速度计类似。但注意,陀螺仪的零偏漂移比加速度计更严重。为什么?因为加速度计有重力这个"绝对参考",陀螺仪没有。你想想看,陀螺仪测的是相对惯性空间的角速度,没有外部基准可参考。

个人经验:我做过一个实验,把IMU放在转台上,静止采集10分钟。加速度计零偏变化不到0.01 m/s²,陀螺仪零偏漂移了0.5 °/s。所以做融合定位时,陀螺仪的零偏估计一定要在线更新,不能只用出厂标定值。

1.3 常用坐标系:搞不清这个,代码全是bug

坐标系是定位的"语言"。语言不通,数据交换就是鸡同鸭讲。我见过最惨的案例:两个模块用的坐标系定义不同,融合出来的轨迹在天上飞。

三大核心坐标系

坐标系 英文缩写 原点 轴定义 用途
IMU坐标系 b系(body) IMU几何中心 x前、y右、z上(右手系) 传感器原始数据输出
车体系 v系(vehicle) 车辆后轴中心 x前、y左、z上(右手系) 车辆运动控制
导航系 n系(navigation) 载体当前位置 x东、y北、z天(ENU) 全局定位输出

这里有个细节:IMU系和车体系通常不重合。IMU可能装在车顶、后备箱、或者后视镜后面。所以必须做外参标定,把IMU数据转换到车体系。

坐标系转换公式(旋转矩阵形式):

X_v = R_b2v * X_b + t_b2v

其中 R_b2v 是旋转矩阵,t_b2v 是平移向量。

为什么导航系用ENU?

你想想看,自动驾驶定位最终要告诉车"你在哪里"。这个"哪里"是相对于地球的。ENU(东-北-天)坐标系直观,符合人的认知习惯。东就是东,北就是北,天就是天。

我习惯把导航系看作"绝对参考系",IMU系和车体系都是"相对参考系"。所有定位结果最终都要统一到导航系下。

1.4 坐标系转换实战:从IMU到导航系

咱们走一遍完整流程。假设IMU装在车上,我们要把IMU的加速度数据转换到导航系。

// 伪代码示例
// 1. IMU原始数据(IMU系)
Vector3 acc_imu = imu.readAccelerometer();

// 2. IMU系 -> 车体系(外参标定得到R_b2v)
Vector3 acc_vehicle = R_b2v * acc_imu;

// 3. 车体系 -> 导航系(姿态矩阵,由陀螺仪积分得到)
Vector3 acc_nav = R_v2n * acc_vehicle;

// 4. 扣除重力
acc_nav.z -= 9.8;

// 5. 积分得到速度和位置
velocity += acc_nav * dt;
position += velocity * dt;

注意第4步,扣除重力。如果你在导航系下看到z轴加速度一直有9.8,那说明重力没扣干净,积分出来的位置会飞掉。

我曾经踩过的坑:有一次做车载测试,车辆在平路上行驶,定位结果却显示车辆在"爬坡"。查了两天,发现是姿态矩阵算错了,导致重力方向投影不对,扣重力时扣歪了。所以,重力补偿的质量直接决定定位精度。

1.5 本章知识体系总览

下面这张图,是我自己画的IMU定位知识框架。你看一遍,心里就有谱了。

IMU定位知识体系 IMU硬件 加速度计 + 陀螺仪 坐标系定义 IMU系 / 车体系 / 导航系 误差模型 零偏 / 白噪声 / 比例因子 数据处理核心流程 原始数据 → 误差补偿 → 坐标系转换 → 姿态解算 → 重力扣除 → 积分 纯惯性导航(INS) 短时高精度,长期发散 融合定位(IMU+其他) 互补滤波 / 卡尔曼滤波 最终输出:位置 + 速度 + 姿态

这张图把IMU定位的整个链条串起来了。从硬件到坐标系,从误差模型到数据处理,最后到应用和输出。你每次做项目,都可以拿这张图对照一下,看看自己卡在哪一环。

1.6 小结与个人建议

好了,这一章的内容就这些。总结几个关键点:

  • IMU测的是比力和角速度,不是直接的位置和速度
  • 坐标系转换是定位的"语言",搞错了全盘皆输
  • 误差模型要理解透彻,零偏和白噪声是滤波的核心状态量
  • 重力补偿必须做对,否则积分结果没法看

我个人建议,初学者先别急着跑代码。拿一个IMU,静止采集几分钟数据,看看加速度计和陀螺仪的噪声特性。亲手算一下零偏和方差,比看十篇论文都管用。

一个小练习:找一块IMU(手机里的也行),静止放在桌上。采集1000个加速度计数据,计算均值。你会发现z轴接近9.8,x和y接近0。然后旋转一下IMU,再算一次。感受一下坐标系变换对读数的影响。

下一章,咱们会深入讲IMU的标定方法。到时候我会分享一个我实际用过的六面法标定流程,保证干货满满。

可可精品资料库