AirSim传感器模型深度解析:IMU、GPS、气压计与磁力计工作原理详解
【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research项目地址: https://gitcode.com/gh_mirrors/ai/AirSim
AirSim 是微软出品的开源自动驾驶模拟器,基于 Unreal Engine 与 Unity 构建。它的最大特色之一,就是在软件层面为无人机和汽车仿真了 IMU、GPS、气压计、磁力计等真实传感器,包括噪声、漂移、启动收敛和更新延迟,让算法在"带噪世界"中先跑通再上真机。本文带你深度解析 AirSim 四大核心传感器模型的工作原理,看懂每份传感器数据从"真值"到"读数"之间经历了什么。
AirSim 传感器体系:从真值到带噪读数
理解 AirSim 传感器模型,先要理解它统一的"流水线"设计。每种传感器都遵循相同的数据流:
- 读取真值:从物理引擎的
GroundTruth(真实位姿、速度、环境状态)中取理想数据; - 注入噪声:叠加随机游走、偏差、量化误差等,模拟真实器件的不完美;
- 限频控制:用
FrequencyLimiter控制传感器以固定频率(如 50Hz)输出; - 延迟缓冲:用
DelayLine模拟传感器固有的更新延迟,最后才把数据交给上层算法。
所有传感器继承自统一的基类体系,各传感器按"Base(接口/输出结构)+ Simple(简单仿真实现)"成对组织:
- 基类:AirLib/include/sensors/SensorBase.hpp
- 传感器集合:AirLib/include/sensors/SensorCollection.hpp
- 工厂类:AirLib/include/sensors/SensorFactory.hpp
🎯 默认传感器配置:多旋翼模式下,AirSim 默认启用IMU + 磁力计 + GPS + 气压计四件套——这正是本文主角,也是飞控(如 PX4)定位融合所需的最小传感器组合。
完整的传感器列表与配置方法见官方文档 docs/sensors.md。
IMU 传感器模型:角速度与加速度的"噪声解剖学"
IMU(惯性测量单元)是无人机"感知自身运动"的第一传感器,输出角速度、线加速度和姿态。AirSim 的实现在 AirLib/include/sensors/imu/ImuSimple.hpp 中,其核心逻辑分为两步:
第一步:从真值生成理想数据(updateOutput方法,见 ImuSimple.hpp#L52-L73)
- 角速度直接取自运动学的角速度(twist.angular);
- 线加速度 = 真实线性加速度减去重力分量,并旋转到机体坐标系——这正是加速度计"测不到自身重力"的真实物理特性;
- 姿态四元数直接取自真值位姿。
第二步:叠加三层噪声(addNoise方法)
| 噪声类型 | 符号 | 物理含义 |
|---|---|---|
| 角度随机游走 | ARW(Angular Random Walk) | 陀螺仪随时间累积的随机误差,标准差与 √dt 成正比 |
| 速度随机游走 | VRW(Velocity Random Walk) | 加速度计的随机积分误差 |
| 偏差随机游走 | Bias Random Walk | 传感器零偏随时间缓慢漂移,由偏置稳定度参数 τ 控制 |
这套模型参考了经典文献《An Introduction to Inertial Navigation》(Oliver J. Woodman)。默认参数直接对标真实芯片MPU-6000:陀螺 ARW 0.3°/√h、偏置稳定度 4.6°/h(τ=500s);加速度计 VRW 0.24mg、偏置稳定度 36µg(τ=800s),参数定义见 ImuSimpleParams.hpp#L29-L49。
💡调参提示:你可以在 settings.json 中通过AngularRandomWalk、GyroBiasStability、VelocityRandomWalk等字段替换为你所用真实 IMU 芯片的参数,让仿真噪声"长"成真机的样子。
GPS 模型:模拟卫星定位的"冷启动收敛"
真实 GPS 冷启动时精度很差,需要几十秒才能收敛。AirSim 的 GpsSimple.hpp 用两个一阶滤波器完美复刻了这一过程:
- eph / epv(水平/垂直位置精度因子)初始值高达 100,通过一阶滤波器随时间平滑收敛到默认值 0.1;
- 系统根据 eph 自动判定定位类型(见 GpsBase.hpp#L80-L94):eph ≤ 3 →3D 定位,eph ≤ 4 →2D 定位,否则无定位;
- 默认更新频率 50Hz、更新延迟 0.2s、启动延迟 1s,全部可在
GpsSimpleParams.hpp中配置。
这意味着仿真中飞控启动初期会真的"等不到好 GPS",与真机行为一致——这是很多仿真器做不到的细节。
气压计模型:从标准大气压到 10 米/小时的漂移
气压计通过"气压—高度"关系测高。AirSim 在 BarometerSimple.hpp 中实现了完整的三层模型:
- 标准大气压换算:由真值海拔调用
EarthUtils::getStandardPressure得到理想气压; - 缓慢漂移:叠加一个高斯马尔可夫过程(Gaussian Markov)模拟气压基准漂移,默认参数下约10 米/小时的累积偏差——足以让飞控明显"漂高/漂低";
- 瞬时噪声:约 0.2m 高度的无相关噪声,其取值参考真实芯片 MS5611-01 数据手册的 0.027mbar 分辨率。
最后用气压高度公式反解出海拔,并支持QNH(海平面气压修正)参数,模拟不同天气条件下的气压基准变化,参数细节见 BarometerSimpleParams.hpp。
磁力计模型:地球磁场方向从何而来
磁力计为无人机提供"磁罗盘"航向参考。AirSim 的 MagnetometerSimple.hpp 支持两种磁场参考源(updateReference方法):
- Constant:使用固定的磁力场向量(默认取西雅图地区的真实磁场值 0.34252, 0.09805, 0.93438 高斯);
- DipoleModel:基于地磁偶极子模型,按车辆所在地理坐标实时计算磁场(
EarthUtils::getMagField),可开启dynamic_reference_source让磁场随移动变化。
在理想磁场之上,模型还叠加了真实器件的三大误差:比例因子(scale_factor)、高斯噪声(noise_sigma,默认 0.005)和恒定偏差(noise_bias),最终转换到机体坐标系输出。
实战:配置参数与观测传感器数据
1. 在 settings.json 中配置传感器。所有默认传感器都挂在DefaultSensors节点下,例如开启/调参 IMU:
"DefaultSensors": { "Imu": { "SensorType": 2, "Enabled": true, "AngularRandomWalk": 0.3, "GyroBiasStability": 4.6, "VelocityRandomWalk": 0.24, "AccelBiasStability": 36 } }各传感器支持的全部字段见 docs/sensors.md。
2. 用 LogViewer 观测数据。每种传感器的reportState方法会把关键量写入日志通道,如 IMU 的IMU-Ang/IMU-Lin、GPS 的GPS-Loc/GPS-Eph/GPS-Epv(见 ImuBase.hpp#L33-L40、GpsBase.hpp#L113-L122)。结合仓库自带的 LogViewer 工具(源码在 LogViewer/),可以直观回放出各传感器通道的噪声与收敛曲线,验证你的调参是否生效。
总结:一张表看懂四大传感器
| 传感器 | 输出数据 | 核心噪声模型 | 源码位置 |
|---|---|---|---|
| IMU | 角速度、线加速度、姿态 | ARW + VRW + 偏置随机游走 | AirLib/include/sensors/imu/ |
| GPS | 经纬度、速度、eph/epv、定位类型 | 一阶滤波收敛 + 0.2s 延迟 | AirLib/include/sensors/gps/ |
| 气压计 | 气压、海拔、QNH | 高斯马尔可夫漂移 + 0.2m 噪声 | AirLib/include/sensors/barometer/ |
| 磁力计 | 机体坐标系磁场 | 高斯噪声 + 恒定偏差 + 比例因子 | AirLib/include/sensors/magnetometer/ |
AirSim 传感器模型的设计哲学可以概括为一句话:先有真值,后有噪声。它用最小而精确的随机过程逼近真实器件的"不完美",让你在烧钱飞真机之前,先在虚拟世界里把传感器噪声的"脾气"摸透。
【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research项目地址: https://gitcode.com/gh_mirrors/ai/AirSim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考