第1章:传感器校准——飞控系统调试的第一步
传感器校准,说白了就是让飞控知道「什么是正确的」。
我刚开始做飞控时,总觉得校准是个走过场的步骤。直到有一次,一架四轴在起飞后直接侧翻——嗯,从那以后我再也不敢跳过校准了。
1.1 加速度计校准
加速度计测量的是重力加速度在三个轴上的分量。理想情况下,静止时它应该输出(0, 0, 1)g。但实际器件总有偏差。
校准目标:消除零偏和比例因子误差。
标准流程:
- 将飞控水平放置,记录X、Y、Z轴读数
- 分别绕X、Y、Z轴旋转90度,记录6个姿态下的数据
- 用最小二乘法拟合出零偏和比例因子
核心公式:
// 加速度计校准模型
acc_calibrated = (acc_raw - bias) * scale_factor
// 其中 bias = [bx, by, bz]^T
// scale_factor = diag(sx, sy, sz)
我个人习惯用六面法校准。就是让飞控的每个面朝下,各采集一次数据。这样能覆盖所有轴向。
小技巧:校准前先让飞控通电预热5分钟。温度变化会影响零偏,我吃过这个亏。
1.2 陀螺仪校准
陀螺仪测量角速度。静止时,理想输出应该是(0, 0, 0)。但实际会有零偏。
校准流程:
- 将飞控静止放置,采集1000个样本
- 取平均值作为零偏值
- 在后续使用中实时减去这个零偏
注意:陀螺仪零偏会随温度漂移。我曾经在冬天调试时,室内校准完,拿到室外零偏就变了。后来我加了温度补偿。
代码示例:
// 陀螺仪零偏计算
float gyro_bias[3] = {0};
for(int i = 0; i < 1000; i++) {
gyro_bias[0] += gyro_raw_x[i];
gyro_bias[1] += gyro_raw_y[i];
gyro_bias[2] += gyro_raw_z[i];
}
gyro_bias[0] /= 1000;
gyro_bias[1] /= 1000;
gyro_bias[2] /= 1000;
// 使用时
gyro_corrected = gyro_raw - gyro_bias;
1.3 磁力计校准
磁力计校准是最容易出问题的环节。为什么?因为地磁场很弱,很容易被干扰。
校准原理:
理想情况下,磁力计在三维空间旋转时,输出应该落在一个球面上。但实际由于硬铁干扰和软铁干扰,会变成一个椭球。
校准步骤:
- 在无磁干扰环境中,将飞控绕所有轴旋转
- 采集至少200个点,覆盖整个球面
- 用椭球拟合算法求出偏移和缩放
常见问题:
- 校准环境中有铁磁性物体(桌子腿、钢筋)
- 飞控附近有大电流导线
- 电机未安装时校准,装好后磁干扰变了
我建议在飞控安装到机架上之后再做磁力计校准。因为电机和电源线都会产生磁场。
1.4 气压计校准
气压计用于高度测量。但它对温度敏感,而且有噪声。
校准内容:
- 零高度校准:在已知海拔处记录基准气压
- 温度补偿:读取内部温度传感器,修正气压值
代码示例:
// 气压计温度补偿(以BMP280为例)
float compensate_pressure(int32_t adc_P, int32_t adc_T) {
// 先补偿温度
float t_fine = compensate_temperature(adc_T);
// 再补偿气压
float pressure = ...; // 具体公式参考数据手册
return pressure;
}
避坑指南:我曾经在风洞中测试,气压计读数跳得厉害。后来发现是气流直接吹到了传感器上。给气压计加个海绵罩就好了。
1.5 校准流程总结
校准不是一次性的工作。每次更换飞控位置、更换机架、或者温度变化较大时,都应该重新校准。
我个人习惯把校准结果保存到EEPROM中,这样下次上电可以直接读取。
校准完成后,记得验证一下。让飞控静止,观察各传感器输出是否在合理范围内。
验证标准:
| 传感器 | 静止时输出 | 允许误差 |
|---|---|---|
| 加速度计 | (0, 0, 1)g | ±0.05g |
| 陀螺仪 | (0, 0, 0)°/s | ±0.5°/s |
| 磁力计 | 模长≈当地地磁场强度 | ±10% |
| 气压计 | 当地海拔对应气压 | ±50Pa |
嗯,校准这一步做扎实了,后面的调试才能顺利进行。别嫌麻烦,这是飞控稳定飞行的基础。