3. 磁力计与气压计:辅助航向与高度测量的关键传感器

飞控系统里,IMU(惯性测量单元)是主角,这没错。但光靠它,你飞不了多久就会偏航,高度也会慢慢漂。这时候,磁力计和气压计就派上用场了。它们俩,一个帮你稳住航向,一个帮你锁定高度。

我个人习惯把磁力计比作「电子指南针」,把气压计比作「电子高度尺」。它们不完美,但用好了,能让飞控的稳定性上一个台阶。今天我们就来聊聊这两个传感器的原理、坑点,以及怎么把它们的数据融合进来。

核心观点:磁力计修正航向漂移,气压计修正高度漂移。两者都是「绝对参考」,但都有各自的噪声和误差源。

3.1 磁力计:航向的「定海神针」

磁力计测量的是地球磁场。说白了,它告诉你机头指向哪个方向。但这里有个大坑——地球磁场很弱,很容易被干扰。

3.1.1 工作原理

常见的磁力计(比如HMC5883L、IST8310)内部有三个正交的磁阻传感器。它们分别测量X、Y、Z三个轴向上的磁场强度。通过计算水平分量,就能得到航向角。

公式很简单:

// 假设磁力计数据已经校准
float mag_x, mag_y, mag_z; // 原始读数
float roll, pitch;          // 来自IMU的姿态角

// 将磁力计数据投影到水平面
float mag_x_h = mag_x * cos(pitch) + mag_y * sin(roll) * sin(pitch) + mag_z * cos(roll) * sin(pitch);
float mag_y_h = mag_y * cos(roll) - mag_z * sin(roll);

// 计算航向角(弧度)
float heading = atan2(-mag_y_h, mag_x_h);

嗯,这里要注意:atan2 返回的是弧度,记得转成角度。另外,不同磁力计的坐标系定义可能不同,一定要看数据手册。

3.1.2 校准:绕不开的步骤

我在项目中遇到过最头疼的问题,就是磁力计没校准就上天。结果飞机在空中画圈圈,航向完全乱跳。

校准的核心是消除硬铁干扰和软铁干扰:

  • 硬铁干扰:来自永磁体或电路板上的恒定磁场。表现为读数偏移。校准方法:旋转传感器,记录最大最小值,取中点作为偏移量。
  • 软铁干扰:来自铁磁性材料对磁力线的扭曲。表现为读数椭圆化。校准方法:需要更复杂的椭球拟合算法。

我的经验:对于大多数飞控应用,做一次「8字校准」就够了。就是拿着飞机在空中画8字,让传感器遍历所有方向。然后软件自动计算偏移量和缩放因子。

3.1.3 融合策略:别直接用它

磁力计的更新频率通常只有几十赫兹,而且噪声大。直接用它做航向控制,飞控会抖得像筛子。

我建议的做法是:用磁力计修正IMU的航向漂移,而不是替代它。具体来说:

  1. IMU提供高频(几百赫兹)的角速度积分,得到短期航向。
  2. 磁力计提供低频(几十赫兹)的绝对航向参考。
  3. 用互补滤波或卡尔曼滤波,把两者融合。

互补滤波的代码示例:

// 互补滤波融合航向
float heading_imu;    // 来自陀螺仪积分
float heading_mag;    // 来自磁力计
float dt;             // 时间步长
float tau = 0.1f;     // 滤波时间常数

float alpha = tau / (tau + dt);
float heading_fused = alpha * (heading_imu + gyro_z * dt) + (1.0f - alpha) * heading_mag;

警告:磁力计在电机大电流时会被严重干扰。我见过有人把磁力计装在电调旁边,结果航向偏差30度。一定要远离大电流线路和电机。

3.2 气压计:高度的「稳定锚」

气压计测量大气压强,通过气压-高度公式换算成海拔高度。它不像GPS那样受遮挡影响,也不像IMU那样会漂移。但它有个致命弱点——对气流敏感。

3.2.1 工作原理

常用的气压计有MS5611、BMP280等。它们内部有一个MEMS压力传感器,输出数字化的气压值。

高度换算公式(简化版):

// 气压转高度(米)
float pressure;       // 当前气压(Pa)
float pressure_sea;   // 海平面气压(Pa,通常101325)

float altitude = 44330.0f * (1.0f - pow(pressure / pressure_sea, 1.0f / 5.255f));

这个公式假设标准大气模型。实际上,天气变化会导致海平面气压波动,所以每次上电后需要做一次「归零」——记录当前高度作为参考点。

3.2.2 噪声与滤波

气压计的原始数据噪声很大,尤其是受到风的影响。我在做四旋翼定高时,发现气压计读数在室外有风时会跳变半米多。

解决办法:

  • 硬件上:用海绵或泡沫包裹气压计,减少气流直吹。但别堵死通气孔。
  • 软件上:用低通滤波或滑动平均。我习惯用一阶低通滤波,简单有效。
// 一阶低通滤波
float altitude_raw;       // 原始高度
float altitude_filtered;  // 滤波后高度
float alpha = 0.2f;       // 滤波系数(越小越平滑)

altitude_filtered = alpha * altitude_raw + (1.0f - alpha) * altitude_filtered;

小技巧:滤波系数 alpha 不要固定。在剧烈机动时,可以增大 alpha 让响应更快;在悬停时,减小 alpha 让高度更稳。

3.2.3 融合策略:与加速度计互补

气压计更新慢(几十赫兹),而且有延迟。加速度计可以瞬间感知垂直加速度,但积分会漂移。

我常用的方案是:用加速度计的垂直分量做短期高度变化估计,用气压计做长期绝对参考。还是互补滤波的思路:

// 高度互补滤波
float altitude_baro;      // 气压计高度
float accel_z;            // 加速度计Z轴(已转换到世界坐标系)
float velocity_vert;      // 垂直速度
float dt;

// 加速度积分得到速度
velocity_vert += accel_z * dt;

// 用气压计修正速度漂移
float error = altitude_baro - altitude_fused;
velocity_vert += error * 0.1f;  // 比例修正

// 速度积分得到高度
altitude_fused += velocity_vert * dt;

你看,这里其实是一个简单的互补滤波器。它比直接滤波气压计数据响应更快,而且不会漂移。

3.3 知识体系总览

下面这张图,是我自己总结的磁力计和气压计在飞控中的角色定位。你可以把它当作一个快速参考:

磁力计与气压计在飞控中的角色 飞控系统 磁力计 测量地球磁场 提供绝对航向参考 气压计 测量大气压强 提供绝对高度参考 航向修正 高度修正 稳定航向 + 稳定高度 磁力计和气压计提供「绝对参考」,IMU提供「相对变化」,两者互补才能稳定

3.4 实战中的避坑指南

最后,分享几个我踩过的坑,希望能帮你少走弯路:

  • 磁力计安装位置:我曾经把磁力计装在碳纤维机架上,结果读数完全乱套。碳纤维是导电的,会屏蔽磁场。一定要装在远离碳纤维和金属的地方。
  • 气压计防风:有一次我在大风天试飞,气压计高度跳了2米。后来用泡沫做了一个小风罩,效果立竿见影。
  • 温度补偿:气压计对温度敏感。从室内拿到室外,温度变化会导致读数漂移。好的气压计芯片自带温度补偿,但便宜的没有。我建议在代码里加一个温度补偿表。
  • 融合频率匹配:磁力计和气压计的更新频率远低于IMU。在融合时,一定要做时间戳对齐,否则会出现相位滞后。

总结一下:磁力计和气压计是飞控的「眼睛」,但它们看东西有点模糊。你需要用IMU这个「内耳」来补充细节。两者结合,才能让飞机飞得又稳又准。

专注资料整理