3. 传感器原理与数据融合:IMU、磁力计、GPS与姿态解算
各位同学,欢迎来到第三讲。今天我们要聊的,是飞控系统里最核心、也最让人头疼的部分——传感器与数据融合。
说白了,无人机在空中飞,它怎么知道自己“歪了”?怎么知道自己在往哪飞?靠的就是这一堆传感器。但每个传感器都有脾气,都有毛病。我的任务,就是教你怎么“哄”好它们,让它们齐心协力,给你一个靠谱的姿态。
3.1 IMU:加速度计与陀螺仪
IMU,惯性测量单元,是飞控的“前庭系统”。它通常包含两个关键部件:加速度计和陀螺仪。
3.4.1 加速度计:感知“重力方向”
加速度计测量的是比力,也就是物体受到的惯性力与引力的合力。在静止状态下,它测到的就是重力加速度g。
原理: 内部有一个微小的质量块,当有加速度时,质量块会移动,改变电容或压电效应,从而输出电压信号。
关键点:
- 只能测“姿态角”中的俯仰和横滚: 因为它无法区分重力与水平加速度。你想想看,如果无人机在水平加速,加速度计会误以为机身倾斜了。
- 高频噪声大: 振动、电机干扰都会叠加在信号上。
- 长期稳定,短期不准: 静态时非常准,动态时一塌糊涂。
3.4.2 陀螺仪:感知“角速度”
陀螺仪测量的是绕各轴的旋转角速度。通过积分,就能得到角度变化。
原理: 基于科里奥利力。一个振动的质量块,当有旋转时,会受到一个垂直于振动方向的力,从而产生位移。
关键点:
- 动态响应快: 瞬间的旋转,陀螺仪立刻就能感知到。
- 有零偏和温漂: 静止时输出不为0,且随温度变化。
- 积分会累积误差: 这是最要命的。微小的零偏,积分几秒钟后就会变成几度的角度误差。
3.2 磁力计与GPS:提供“绝对参考”
IMU只能提供相对变化,时间长了会漂。我们需要绝对参考来“拉”它一把。这就是磁力计和GPS的用武之地。
3.2.1 磁力计:告诉你“北”在哪
磁力计测量地球磁场,从而确定航向角(偏航角)。
原理: 基于霍尔效应或磁阻效应。不同方向的磁场强度不同,通过三轴测量,就能解算出方向。
问题:
- 极易受干扰: 电机、大电流导线、铁磁物质都会扭曲磁场。
- 需要校准: 硬铁干扰和软铁干扰必须通过旋转校准来消除。
3.2.2 GPS:告诉你“在哪”和“速度”
GPS提供位置(经纬度)和速度(地速)。
原理: 通过接收多颗卫星的信号,计算时间差来定位。
关键点:
- 更新频率低: 通常5-10Hz,远低于IMU的100-1000Hz。
- 有延迟: 信号传输和处理需要时间。
- 受环境影响大: 高楼、树荫下信号差。
GPS的速度信息比位置信息更可靠,因为它是通过多普勒频移直接测量的,没有积分漂移。我个人习惯用GPS速度来辅助修正加速度计的积分漂移。
3.3 卡尔曼滤波基础
好了,现在我们有了多个传感器,每个都有优点和缺点。怎么把它们融合起来,得到最优的姿态估计?卡尔曼滤波就是答案。
核心思想: 卡尔曼滤波是一种最优估计算法。它根据系统的“预测”和“观测”,不断修正状态估计。
简单来说,它做两件事:
- 预测: 根据上一时刻的状态和陀螺仪数据,预测当前时刻的状态(姿态角)。
- 更新: 用加速度计和磁力计的观测值,来修正这个预测。
卡尔曼滤波假设噪声是高斯白噪声。它通过计算“卡尔曼增益”,来决定更相信预测还是更相信观测。
// 预测步骤
x_pred = A * x_prev + B * u
P_pred = A * P_prev * A^T + Q
// 更新步骤
K = P_pred * H^T * (H * P_pred * H^T + R)^-1
x_est = x_pred + K * (z - H * x_pred)
P_est = (I - K * H) * P_pred
其中,Q是过程噪声协方差(陀螺仪的噪声),R是观测噪声协方差(加速度计/磁力计的噪声)。调参就是调Q和R。
3.4 姿态解算:互补滤波与Mahony滤波
卡尔曼滤波计算量大,在低算力的MCU上跑起来吃力。互补滤波和Mahony滤波是更轻量、更实用的选择。
3.4.1 互补滤波
原理: 陀螺仪动态响应快但低频漂移,加速度计静态准但高频噪声大。互补滤波就是让它们“互补”:
- 陀螺仪积分得到的角度,通过高通滤波器(保留快速变化)。
- 加速度计解算的角度,通过低通滤波器(保留静态准确值)。
- 两者相加,得到最终角度。
公式:
angle = (1 - alpha) * (angle + gyro * dt) + alpha * acc_angle
其中,alpha是互补系数,通常在0.01-0.1之间。alpha越大,越相信加速度计;越小,越相信陀螺仪。
3.4.2 Mahony滤波
Mahony滤波是互补滤波的进阶版。它不直接融合角度,而是融合四元数。
核心思想: 用加速度计和磁力计的观测,来修正陀螺仪的积分误差。它通过一个PI控制器,来估计陀螺仪的零偏。
步骤:
- 用陀螺仪数据更新四元数。
- 计算加速度计和磁力计的“预测”方向。
- 计算预测方向与实际观测方向的误差。
- 用PI控制器将这个误差反馈到陀螺仪数据上,修正积分。
// 计算误差
error = cross(acc_measured, acc_predicted) + cross(mag_measured, mag_predicted);
// PI控制器修正陀螺仪
gyro_corrected = gyro_raw + Kp * error + Ki * integral_error;
// 用修正后的陀螺仪更新四元数
q = q + 0.5 * omega_matrix * q * dt;
Kp和Ki是PI参数。Kp决定了修正的强度,Ki决定了消除稳态误差的能力。
3.5 总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 互补滤波 | 简单、计算量小、易调参 | 无法估计陀螺仪零偏 | 低算力MCU、振动小 |
| Mahony滤波 | 能估计零偏、抗干扰强 | 参数调校稍复杂 | 大多数四旋翼、固定翼 |
| 卡尔曼滤波 | 理论最优、精度高 | 计算量大、模型依赖强 | 高算力平台、高精度需求 |
嗯,这一章内容不少。传感器原理是基础,数据融合是灵魂。我个人建议,初学者先从互补滤波入手,理解“互补”的思想,再过渡到Mahony滤波。等你把Mahony滤波调明白了,再考虑卡尔曼滤波。
下一章,我们会把这些算法真正跑在STM32上,看看实际效果。到时候,你会发现,理论是一回事,实战又是另一回事。做好准备吧。