第2章:传感器坐标系与姿态表示
好,咱们正式开始聊坐标系和姿态表示。说实话,这是整个IMU校准里最绕、也最容易出坑的地方。我见过不少工程师,算法写得飞起,结果坐标系定义错了,整个系统全乱套。嗯,咱们今天就把这事彻底理清楚。
2.1 IMU本体坐标系定义
每个IMU芯片出厂时,都会定义自己的本体坐标系。说白了,就是芯片内部那个小小的坐标系,以芯片的物理封装为基准。
我个人习惯这样记:
- X轴:通常指向芯片的某个特定边,比如标有圆点的那一侧
- Y轴:与X轴垂直,在芯片平面内
- Z轴:垂直于芯片表面,遵循右手定则
这里有个坑,我踩过。不同厂家的IMU,坐标系定义可能不一样。比如:
| 厂家 | X轴方向 | Y轴方向 | Z轴方向 |
|---|---|---|---|
| InvenSense (MPU系列) | 芯片长边 | 芯片短边 | 垂直向上 |
| Bosch (BMI系列) | 芯片长边 | 芯片短边 | 垂直向下 |
| ST (LSM系列) | 芯片短边 | 芯片长边 | 垂直向上 |
2.2 导航坐标系:NED与ENU
导航坐标系,就是我们在真实世界里描述位置和姿态用的参考系。最常用的有两种:
NED坐标系(北-东-地)
- X轴:指向地理北
- Y轴:指向地理东
- Z轴:指向地心(向下)
这个坐标系在航空航天领域用得最多。你想想看,飞机在天上飞,高度往下是正的,挺符合直觉——毕竟掉下去是正方向嘛。
ENU坐标系(东-北-天)
- X轴:指向地理东
- Y轴:指向地理北
- Z轴:指向天顶(向上)
这个在机器人、自动驾驶里更常见。说白了,就是地面上的小车,高度往上为正,更符合日常感觉。
2.3 欧拉角与万向锁
欧拉角,就是用三个角度来描述物体的朝向。通常的顺序是:航向角(Yaw)→ 俯仰角(Pitch)→ 横滚角(Roll)。
我刚开始做IMU时,觉得欧拉角特别直观。你看,飞机头朝哪、抬头多少、侧倾多少,一目了然。但后来发现,这东西有个致命问题——万向锁。
为什么会这样?我举个例子。你站在地球的北极点,往哪个方向走都是南。这时候你跟我说「往北走」,我根本不知道你指的是哪个方向。万向锁就是类似的情况。
我在做无人机飞控时,遇到过这个问题。飞机做特技动作,俯仰角拉到90度,结果航向角突然跳变,姿态解算直接崩了。嗯,从那以后,我只要涉及大角度运动,就坚决不用欧拉角。
2.4 四元数基础
四元数,说白了就是解决万向锁问题的终极方案。它用四个数来表示旋转,没有奇点,计算效率也高。
一个四元数长这样:
q = w + x*i + y*j + z*k
其中:
- w:实部,表示旋转的标量部分
- x, y, z:虚部,表示旋转轴的方向
四元数的模长必须为1,这是约束条件:
w² + x² + y² + z² = 1
我个人习惯把四元数想象成「绕着某个轴转多少度」。比如绕Z轴转30°,对应的四元数就是:
q = cos(15°) + 0*i + 0*j + sin(15°)*k
2.5 旋转矩阵与坐标变换
旋转矩阵,就是把一个向量从一个坐标系变换到另一个坐标系的数学工具。说白了,就是一组3x3的矩阵。
从本体坐标系到导航坐标系的旋转矩阵,通常记作 C_b^n(从body到navigation)。
举个例子,假设你在IMU本体坐标系下测得一个向量 v_b,想把它转换到导航坐标系下:
v_n = C_b^n * v_b
旋转矩阵有个重要性质:它是正交矩阵,逆矩阵等于转置矩阵。也就是说:
C_n_b = (C_b^n)^T
这个性质在实际编程中特别有用。你不需要真的去求逆矩阵,直接转置就行,计算量小很多。
| 表示方法 | 优点 | 缺点 |
|---|---|---|
| 欧拉角 | 直观,容易理解 | 有万向锁,插值困难 |
| 四元数 | 无奇点,计算高效 | 不够直观,需要理解 |
| 旋转矩阵 | 数学性质好,容易组合 | 占用内存大,有冗余 |
好了,这一章的内容就这些。坐标系和姿态表示是IMU校准的基石,你花再多时间理解都不为过。下一章,咱们聊聊IMU的误差模型——说白了,就是搞清楚IMU到底会犯哪些错。