4. 传感器仿真:IMU、GPS、气压计、磁力计与故障注入

传感器是飞控系统的眼睛和耳朵。没有准确的传感器数据,再好的控制算法也是白搭。在SITL仿真里,我们得把这些传感器的行为模拟得足够真实,才能让后续的稳定性验证有意义。

我个人习惯把传感器仿真分成两层:物理模型层和噪声/故障层。物理模型层负责把真实世界的运动状态转换成传感器读数;噪声/故障层则负责让这些读数变得“不完美”——毕竟真实传感器从来不会给你完美的数据。

4.1 IMU仿真:加速度计与陀螺仪

IMU是飞控里最核心的传感器。它提供线加速度和角速度,是姿态估计和导航的基础。

4.1.1 加速度计仿真

加速度计测量的是比力(specific force),也就是物体受到的合力减去重力。在仿真里,我们通常这样建模:

// 伪代码:加速度计仿真模型
Vector3f accel_measurement = body_acceleration - gravity_vector + noise + bias;

这里有个坑——很多人直接把世界坐标系下的加速度拿来用,忘了做坐标系变换。加速度计测量的是机体坐标系下的比力,所以你得先把加速度从世界系转到体系,再减去重力在体系下的投影。

我的经验:在ArduPilot的SITL里,加速度计仿真默认加了高斯白噪声和随机游走偏置。我建议你在调试初期先把噪声关掉,等控制逻辑跑通了再逐步加上。否则你分不清是算法问题还是噪声问题。

4.1.2 陀螺仪仿真

陀螺仪测量角速度。仿真模型相对简单:

// 伪代码:陀螺仪仿真模型
Vector3f gyro_measurement = body_angular_velocity + noise + bias + scale_factor_error;

陀螺仪的噪声通常比加速度计大,而且有温度漂移。我在项目中遇到过一个问题:仿真里陀螺仪偏置设得太小,导致实际飞行时姿态发散。后来我养成了一个习惯——仿真时的偏置量至少要比传感器数据手册标称值大两倍,给自己留点余量。

参数 典型值(仿真) 说明
加速度计噪声密度 100 μg/√Hz 高斯白噪声标准差
加速度计偏置稳定性 0.1 mg Allan方差拐点值
陀螺仪噪声密度 0.01 °/s/√Hz 比加速度计大一个量级
陀螺仪偏置稳定性 10 °/h MEMS级别典型值

4.2 GPS仿真

GPS提供位置和速度信息,但更新频率低(通常5-10Hz),而且有延迟。仿真时要注意两个关键点:

  • 更新率匹配:GPS仿真器应该以真实GPS的更新率输出数据,而不是每个仿真步长都输出
  • 延迟模拟:从测量到输出通常有100-200ms的延迟,这个延迟会影响位置控制环的稳定性

我曾经在仿真里忽略了GPS延迟,结果位置控制调得特别好,一上真机就振荡。后来才意识到是仿真太“理想”了。

注意:GPS丢星模拟也很重要。在SITL里,你可以通过设置卫星颗数或HDOP值来模拟信号变差的情况。我建议至少做一次“突然丢星-恢复”的测试,看看你的飞控能不能平稳过渡。

4.3 气压计仿真

气压计用于测量高度。它的特点是:精度不高(米级),但连续性好,不会像GPS那样跳变。

气压计仿真模型:

// 伪代码:气压计仿真
float pressure = sea_level_pressure * pow(1 - altitude * 0.0065 / 288.15, 5.256);
float measurement = pressure + noise + wind_effect;

这里有个容易被忽略的点——风的影响。真实飞行中,气流流过气压计开口会产生动压误差。我在做一款垂直起降固定翼时,发现悬停时高度波动很大,排查了很久才发现是旋翼下洗气流影响了气压计读数。仿真里如果不加这个效应,你永远发现不了这个问题。

4.4 磁力计仿真

磁力计提供航向参考,但它特别容易受干扰。仿真时主要模拟两类干扰:

  1. 硬铁干扰:机载电子设备产生的固定磁场偏置
  2. 软铁干扰:机身铁磁材料对地磁场的扭曲

磁力计仿真代码示例:

// 伪代码:磁力计仿真(含硬铁和软铁)
Vector3f mag_earth = getEarthMagneticField(lat, lon);
Vector3f mag_body = rotation_matrix * mag_earth;
Vector3f hard_iron = Vector3f(0.1, 0.05, -0.03); // 硬铁偏置
Matrix3f soft_iron = Matrix3f(1.02, 0, 0, 0, 0.98, 0, 0, 0, 1.01); // 软铁缩放
Vector3f measurement = soft_iron * mag_body + hard_iron + noise;

关键认知:磁力计校准不是一次性的。在仿真里,你可以故意改变硬铁偏置来模拟“机载设备上电后磁场变化”的场景。我见过不少团队在仿真里磁力计完美无缺,真机一飞航向就飘——就是因为没模拟这个动态变化。

4.5 传感器噪声与故障注入

这部分是仿真最有价值的地方。没有故障注入的仿真,只能叫“理想情况演示”。

4.5.1 噪声模型

我通常用三种噪声模型:

  • 高斯白噪声:最基本的,模拟电子热噪声
  • 随机游走:模拟偏置漂移,IMU里最常见
  • 量化噪声:模拟ADC量化误差,低端传感器比较明显

4.5.2 故障注入场景

以下是我认为必须做的故障注入测试:

故障类型 注入方式 预期系统响应
IMU数据冻结 输出值保持不变 姿态估计应触发故障检测,切换备用传感器
GPS跳变 位置突然偏移10米 位置控制应限幅,避免剧烈响应
气压计堵塞 高度读数缓慢漂移 高度融合应能通过加速度计抑制漂移
磁力计饱和 输出限幅在最大值 航向估计应降低磁力计权重

嗯,这里要注意——故障注入不是随便乱加的。你得先定义清楚“系统应该怎么响应”,再设计故障场景。我曾经在项目里一股脑加了十几种故障,结果仿真日志根本分析不过来。后来学乖了,每次只测1-2种故障,把响应行为看清楚再测下一个。

4.6 传感器仿真知识体系

下面这张图总结了传感器仿真的核心逻辑:

传感器仿真知识体系 真实物理量 传感器物理模型(IMU / GPS / 气压计 / 磁力计) 噪声模型(高斯/随机游走/量化) 故障注入(冻结/跳变/漂移/饱和) 传感器输出(含噪声/故障) 飞控系统(状态估计与控制) 核心思路:从真实物理量出发,经过传感器模型和噪声/故障注入,最终输出给飞控系统。 每一层都可以独立配置,方便针对性测试。

说白了,传感器仿真的核心就一句话:让仿真里的传感器尽可能像真机里的传感器一样“不完美”。你想想看,如果仿真里所有传感器数据都完美无缺,那你验证出来的稳定性结论,拿到真机上大概率要翻车。

我的建议:刚开始做SITL仿真时,先跑一遍“无噪声+无故障”的基线测试,确认你的控制算法本身没问题。然后逐步增加噪声等级,最后再加入故障注入。这样出了问题,你能快速定位是算法问题还是传感器仿真设置问题。