1. 传感器基础与坐标系:IMU工作原理、机体坐标系与导航坐标系定义、欧拉角与四元数基础
各位同学,欢迎来到飞控课程的第一章。
说实话,传感器融合这块内容,我当年刚入行时也觉得头大。但后来我发现,只要把坐标系和姿态表达搞明白了,后面那些卡尔曼滤波、互补滤波什么的,其实都是水到渠成的事。今天我们就从最基础的IMU工作原理讲起,一步步把坐标系和姿态数学基础打牢。
1.1 IMU工作原理——它到底在测什么?
IMU,全称Inertial Measurement Unit,惯性测量单元。说白了,它就是飞控系统的「感觉器官」。
一个典型的IMU包含三个核心传感器:
- 三轴加速度计——测量物体受到的比力(包括重力)
- 三轴陀螺仪——测量物体绕各轴的角速度
- 三轴磁力计(可选)——测量地磁场方向
我习惯把加速度计想象成一个「弹簧秤」。你想想看,当无人机悬停时,加速度计感受到的就是重力加速度g,方向竖直向下。但如果飞机倾斜了,它感受到的重力分量就会发生变化。嗯,这里要注意:加速度计测的不是运动加速度,而是「比力」——也就是除了重力以外的外力引起的加速度加上重力本身。
核心概念:加速度计在静止时测量的是重力矢量,陀螺仪测量的是角速度。两者互补——加速度计低频准但高频噪声大,陀螺仪高频准但会漂移。这就是传感器融合的根本原因。
陀螺仪呢?它测量的是角速度,单位通常是°/s或rad/s。我在项目中遇到过一个问题:陀螺仪的数据直接积分会得到角度,但积分会累积漂移误差。你想想看,如果陀螺仪有0.1°/s的零偏,积分10秒就差了1°,飞控肯定要炸。
避坑指南:我曾经在调试一款四旋翼时,发现悬停时姿态一直在缓慢漂移。查了两天才发现是陀螺仪温度补偿没做好,温度变化导致零偏漂移。后来我养成了习惯——每次上电后先做静态初始化,采集几秒陀螺仪数据取平均作为零偏补偿值。
1.2 机体坐标系与导航坐标系——给飞机一个「参考系」
做飞控,坐标系是绕不开的坎。我见过太多新手因为坐标系搞混,导致控制方向反了、融合结果错乱。
机体坐标系(Body Frame,b系):固定在飞行器上,原点在质心。
- X轴:指向机头方向(前进方向)
- Y轴:指向机身右侧(右翼方向)
- Z轴:指向机身下方(符合右手定则)
导航坐标系(Navigation Frame,n系):通常采用北东地(NED)或东北天(ENU)。
- NED坐标系:X轴指北,Y轴指东,Z轴指向地心
- ENU坐标系:X轴指东,Y轴指北,Z轴指天(朝天)
我个人习惯用NED坐标系,因为和大多数飞控开源项目(如PX4、ArduPilot)保持一致。但要注意,如果你做的是室内无人机,可能用ENU更直观——毕竟「向上为正」符合直觉。
| 坐标系 | X轴 | Y轴 | Z轴 | 常见应用 |
|---|---|---|---|---|
| 机体坐标系(b系) | 机头方向 | 机身右侧 | 机身下方 | IMU原始数据、控制输出 |
| NED导航系 | 北 | 东 | 地 | GPS导航、姿态估计 |
| ENU导航系 | 东 | 北 | 天 | 室内定位、视觉SLAM |
重要提醒:坐标系定义必须统一!我见过一个团队,飞控用NED,但视觉定位模块用ENU,结果融合出来的位置直接反了180°。建议在项目一开始就明确坐标系约定,并在代码注释里写清楚。
1.3 欧拉角与四元数——姿态的两种「语言」
有了坐标系,接下来就是如何描述两个坐标系之间的旋转关系。说白了,就是「飞机相对于地面转了多少」。
1.3.1 欧拉角
欧拉角用三个角度来描述旋转:横滚角(Roll,φ)、俯仰角(Pitch,θ)、偏航角(Yaw,ψ)。
旋转顺序通常是Z-Y-X(先偏航、再俯仰、最后横滚)。为什么是这个顺序?你想想看,如果你先横滚再偏航,那偏航轴的方向就变了——这会导致「万向锁」问题。
万向锁(Gimbal Lock):当俯仰角接近±90°时,横滚和偏航的旋转轴会重合,导致丢失一个自由度。这就是为什么飞控里很少直接用欧拉角做姿态融合——我曾在一次特技飞行测试中,飞机翻转到接近90°俯仰时,欧拉角表示直接炸了。
欧拉角的优点很明显:直观,人脑容易理解。但缺点也很致命:存在万向锁、三角函数计算量大、插值不连续。
1.3.2 四元数
四元数是一个超复数,形式为 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。它用四个参数表示三维旋转,没有万向锁问题。
我建议你记住这个核心公式:
// 四元数乘法(表示两次旋转的复合)
q_result = q1 * q2
// 用四元数旋转向量
v_rotated = q * v * q_conjugate
// 四元数到欧拉角的转换(Z-Y-X顺序)
roll = atan2(2*(w*x + y*z), 1 - 2*(x² + y²))
pitch = asin(2*(w*y - z*x))
yaw = atan2(2*(w*z + x*y), 1 - 2*(y² + z²))
说实话,四元数刚接触时确实有点抽象。我当年第一次看四元数乘法公式时,心里想的是「这玩意儿是人能想出来的吗?」但后来发现,它其实就是把三维旋转映射到了四维单位球面上,避免了欧拉角的奇异性。
实用技巧:在代码里,我习惯用四元数做姿态更新和融合,只在需要显示或给上层控制时,才转成欧拉角。这样既避免了万向锁,又保留了人机交互的直观性。
1.4 小结与思考
这一章我们聊了三个核心内容:
- IMU里加速度计和陀螺仪各自测什么、有什么优缺点
- 机体坐标系和导航坐标系怎么定义、为什么必须统一
- 欧拉角和四元数两种姿态表达方式,以及各自的适用场景
嗯,最后留个思考题吧:如果你用加速度计数据去估计俯仰角和横滚角,为什么不能估计偏航角?想明白这个问题,下一章讲传感器融合时你就知道为什么需要磁力计了。
下一章我们聊传感器校准——那些「出厂参数」到底靠不靠谱?