第1章:传感器校准——飞控系统调试的第一步

传感器校准,说白了就是让飞控知道「什么是正确的」。

我刚开始做飞控时,总觉得校准是个走过场的步骤。直到有一次,一架四轴在起飞后直接侧翻——嗯,从那以后我再也不敢跳过校准了。

1.1 加速度计校准

加速度计测量的是重力加速度在三个轴上的分量。理想情况下,静止时它应该输出(0, 0, 1)g。但实际器件总有偏差。

校准目标:消除零偏和比例因子误差。

标准流程:

  1. 将飞控水平放置,记录X、Y、Z轴读数
  2. 分别绕X、Y、Z轴旋转90度,记录6个姿态下的数据
  3. 用最小二乘法拟合出零偏和比例因子

核心公式:

// 加速度计校准模型
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 磁力计校准

磁力计校准是最容易出问题的环节。为什么?因为地磁场很弱,很容易被干扰。

校准原理:

理想情况下,磁力计在三维空间旋转时,输出应该落在一个球面上。但实际由于硬铁干扰和软铁干扰,会变成一个椭球。

校准步骤:

  1. 在无磁干扰环境中,将飞控绕所有轴旋转
  2. 采集至少200个点,覆盖整个球面
  3. 用椭球拟合算法求出偏移和缩放

常见问题:

  • 校准环境中有铁磁性物体(桌子腿、钢筋)
  • 飞控附近有大电流导线
  • 电机未安装时校准,装好后磁干扰变了

我建议在飞控安装到机架上之后再做磁力计校准。因为电机和电源线都会产生磁场。

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中,这样下次上电可以直接读取。

传感器校准流程 开始校准 步骤1:加速度计六面校准 步骤2:陀螺仪零偏采集 步骤3:磁力计椭球拟合 步骤4:气压计温度补偿

校准完成后,记得验证一下。让飞控静止,观察各传感器输出是否在合理范围内。

验证标准:

传感器 静止时输出 允许误差
加速度计 (0, 0, 1)g ±0.05g
陀螺仪 (0, 0, 0)°/s ±0.5°/s
磁力计 模长≈当地地磁场强度 ±10%
气压计 当地海拔对应气压 ±50Pa

嗯,校准这一步做扎实了,后面的调试才能顺利进行。别嫌麻烦,这是飞控稳定飞行的基础。

专注资料整理