3. 加速度计校准(二):温度补偿校准,高温/低温环境下的漂移处理技巧
上一节我们把加速度计的六面静态校准讲透了。但有个问题,很多朋友做完静态校准后,飞机在冬天飞和夏天飞,悬停姿态会差那么一两度。为什么?
说白了,MEMS 加速度计对温度很敏感。温度一变,零偏和标度因数就跟着漂。我见过不少飞手,冬天调好的参数,到了夏天炸机,查到最后就是温度补偿没做。
这一节,我们就专门啃这块硬骨头。
3.1 温度漂移的根源
加速度计内部是微机械结构。温度变化会引起硅结构应力变化、电路放大倍数漂移、甚至封装形变。这些因素叠加起来,就表现为输出值的缓慢变化。
我习惯把温度漂移拆成两部分:
- 零偏温漂:温度变化时,静止输出值偏离真实 0g 的程度。
- 标度因数温漂:温度变化时,每 g 对应的输出变化量发生偏移。
在 ArduPilot 里,我们主要处理零偏温漂。标度因数温漂通常较小,除非你飞极端环境(比如 -40°C 到 +85°C),否则一般不用管。
核心结论:温度补偿的本质,就是建立一个「温度 → 零偏修正值」的映射表。ArduPilot 会在运行时根据当前温度查表插值,实时修正加速度计读数。
3.2 ArduPilot 的温度补偿机制
ArduPilot 支持两种温度补偿方式:
| 方式 | 原理 | 适用场景 |
|---|---|---|
| 参数式补偿 | 通过 INS_ACCx_TEMPPROC 参数选择多项式拟合,设置 INS_ACCx_TEMP_* 系数 |
温漂曲线平滑、规律性强 |
| 表格式补偿 | 通过 INS_ACCx_TEMP_PX 和 INS_ACCx_TEMP_VX 设置温度-零偏离散点 |
温漂曲线非线性、有拐点 |
我个人更推荐表格式补偿。为什么?因为实际传感器的温漂曲线往往不是完美的二次或三次曲线。表格法更灵活,你可以在关键温度点多采样,非关键点少采样。
小技巧:如果你用参数式补偿,建议先用表格法采集完整数据,再用工具拟合出多项式系数。直接猜系数,很容易过拟合。
3.3 温度补偿校准流程
嗯,这里要注意。温度补偿校准不能像六面校准那样在室内一次性做完。你需要让传感器经历一个完整的温度变化过程。
我在项目中遇到过最典型的场景:无人机要在高原和盆地之间转场飞行。地面温度从 5°C 到 45°C,空中温度可能低至 -10°C。如果不做温度补偿,加速度计零偏能漂 50mg 以上,相当于姿态误差 3°。
3.4 标准流程(推荐)
- 准备阶段:将飞行器置于温箱或可控温度环境中。如果没有温箱,可以利用自然温差——比如夜间室外低温,白天室内高温。
- 数据采集:设置
INS_ACC_SAMPLE_RATE为 100Hz,开启日志记录LOG_BITMASK包含 IMU 数据。从低温到高温,每 5°C 停留 10 分钟,让传感器充分热平衡。 - 提取零偏:每个温度点取静止状态下 1 分钟数据的平均值,作为该温度下的零偏值。
- 生成补偿表:将温度-零偏数据填入
INS_ACCx_TEMP_PX和INS_ACCx_TEMP_VX。 - 验证:重新跑一次温度循环,检查补偿后的零偏是否在 ±5mg 以内。
警告:温度补偿必须在六面校准之后进行。因为六面校准修正的是安装误差和标度因数,温度补偿修正的是零偏。顺序反了,补偿表会包含安装误差,导致温度变化时姿态反而变差。
3.5 参数设置详解
以表格式补偿为例,假设你采集了 5 个温度点:
| 温度 (°C) | X 轴零偏 (m/s²) | Y 轴零偏 (m/s²) | Z 轴零偏 (m/s²) |
|---|---|---|---|
| -10 | 0.12 | -0.08 | 9.82 |
| 0 | 0.08 | -0.05 | 9.80 |
| 25 | 0.00 | 0.00 | 9.81 |
| 45 | -0.06 | 0.04 | 9.83 |
| 60 | -0.10 | 0.07 | 9.85 |
对应的参数设置(以 ACC1 为例):
INS_ACC1_TEMP_P1 = -10
INS_ACC1_TEMP_V1X = 0.12
INS_ACC1_TEMP_V1Y = -0.08
INS_ACC1_TEMP_V1Z = 9.82
INS_ACC1_TEMP_P2 = 0
INS_ACC1_TEMP_V2X = 0.08
INS_ACC1_TEMP_V2Y = -0.05
INS_ACC1_TEMP_V2Z = 9.80
INS_ACC1_TEMP_P3 = 25
INS_ACC1_TEMP_V3X = 0.00
INS_ACC1_TEMP_V3Y = 0.00
INS_ACC1_TEMP_V3Z = 9.81
INS_ACC1_TEMP_P4 = 45
INS_ACC1_TEMP_V4X = -0.06
INS_ACC1_TEMP_V4Y = 0.04
INS_ACC1_TEMP_V4Z = 9.83
INS_ACC1_TEMP_P5 = 60
INS_ACC1_TEMP_V5X = -0.10
INS_ACC1_TEMP_V5Y = 0.07
INS_ACC1_TEMP_V5Z = 9.85
注意,Z 轴零偏在静止时应该是 9.81 左右。你采集到的值如果偏离太多,说明六面校准没做好,或者传感器本身有问题。
3.6 温度补偿的核心逻辑
为了让你更直观地理解整个过程,我画了一张流程图:
3.7 实战避坑指南
我曾经在一个项目中,给客户做农业植保机的温度补偿。飞机在新疆夏天用,地面温度 45°C,空中 5°C。我按标准流程做了补偿表,结果试飞时发现,温度变化快的阶段(比如从地面快速爬升),补偿效果反而变差。
后来排查发现,问题出在热平衡时间不够。传感器封装内部温度变化比外壳慢。你测的是外壳温度,但传感器芯片温度可能滞后 2-3 分钟。所以,每个温度点停留 10 分钟是底线,不是建议。
经验值:如果你用温箱,建议升温速率控制在 1°C/min 以内。自然温差法虽然慢,但热平衡更充分,数据质量反而更高。
3.8 常见问题与排查
- 补偿后零偏反而变大:八成是六面校准和温度补偿的顺序搞反了。重新做六面校准,再跑温度补偿。
- 温度变化时姿态抖动:检查
INS_ACCx_TEMP_PX的温度点是否覆盖了实际工作温度范围。如果只做了 0°C 到 40°C,到了 -10°C 就会外推,外推误差很大。 - 补偿表填了但没生效:确认
INS_ACCx_TEMPPROC设置为 1(表格式)或 2/3(多项式)。默认是 0,表示关闭温度补偿。
再次强调:温度补偿不是万能的。如果传感器本身质量差,温漂曲线非线性严重,或者有迟滞效应(升温曲线和降温曲线不重合),补偿效果会大打折扣。这时候,换传感器比折腾参数更实际。