第一章 竞赛飞控硬件选型与传感器标定

做竞赛飞控这么多年,我最大的感触就是:硬件选型决定了你的上限,传感器标定决定了你能不能摸到这个上限。很多新手一上来就追最新的芯片、最贵的传感器,结果飞起来还不如人家几百块的F4飞控稳。为什么?说白了,选型和标定没做好。

今天这一章,我就把我在竞赛飞控硬件选型上的经验,以及传感器标定的完整流程,掰开了讲给你听。

1.1 从STM32F4到H7:选型逻辑

先聊主控芯片。STM32F4和H7,这是目前竞赛飞控的两大主流。我个人的习惯是:新手用F4,老手或者追求极致性能的用H7

为什么会这样?你想想看,F4的主频最高168MHz,对于大多数竞赛场景来说,跑个8kHz的PID控制环,再处理一下姿态解算,绰绰有余。而且F4的生态非常成熟,各种开源飞控代码(比如Betaflight、INAV)都有现成的移植,出了问题网上随便一搜就有答案。

但H7就不一样了。H7主频能到480MHz,还带双精度浮点单元(FPU)。我记得有一次做高速穿越机项目,需要在4kHz的速率下同时跑光流融合和IMU数据,F4的CPU占用率直接飙到85%以上,换成H7后,同样的算法只用了不到40%。这就是差距。

不过,H7也有坑。它的外设配置比F4复杂得多,尤其是时钟树和DMA的设置。我曾经在H7上踩过一个坑:默认的HAL库配置下,SPI通信速率上不去,导致IMU数据读取延迟,飞控直接炸机。后来查了三天,才发现是时钟分频设置的问题。

所以我的建议是:

  • 如果你刚开始做竞赛飞控,或者预算有限,选STM32F405或F427,完全够用。
  • 如果你要做多传感器融合(比如IMU+光流+气压计+GPS),或者需要跑更复杂的控制算法(比如LQR、MPC),那就上H743或H750。
  • 注意:H7的功耗比F4高不少,散热要做好,否则飞着飞着过热降频,那就尴尬了。

核心选型逻辑: 不是越贵越好,而是够用就好。但如果你不确定未来会加什么算法,那就选H7,留出余量。

1.2 IMU传感器选型与标定

IMU是飞控的“眼睛”,选不好,后面所有算法都是白搭。竞赛飞控常用的IMU有:MPU6000、ICM-20602、BMI088、ICM-42688-P。

我个人最推荐的是ICM-42688-P。为什么?因为它噪声低、温漂小、而且支持SPI和I2C双接口。我在项目中遇到过用MPU6000在高温环境下(比如夏天户外飞行)数据漂移严重的情况,换成ICM-42688-P后,问题直接解决。

但要注意,ICM-42688-P的寄存器配置比MPU6000复杂,新手容易搞错。我建议你直接参考开源飞控(比如Betaflight)的驱动代码,别自己从头写。

IMU标定流程

标定IMU,说白了就是消除零偏和尺度误差。我一般分三步走:

  1. 静止标定:把飞控放在水平桌面上,静止采集1000组数据,计算加速度计和陀螺仪的均值,作为零偏。
  2. 六面标定:把飞控分别朝上、朝下、朝左、朝右、朝前、朝后,每个方向采集数据,用于计算加速度计的尺度因子和交叉耦合矩阵。
  3. 温补标定:如果你要做高端竞赛,这一步不能省。把飞控放进恒温箱,从-10°C到60°C,每5°C采集一次数据,拟合温度补偿曲线。

小技巧: 静止标定时,可以用一个水平仪确保桌面绝对水平。我曾经因为桌面不平,导致标定后的飞控在悬停时一直往一个方向偏,查了半天才发现是标定问题。

下面是一个简单的IMU标定代码示例(基于STM32H7):

// 静止标定:采集1000组数据,计算均值
void imu_calibrate_static(imu_t *imu) {
    float acc_sum[3] = {0, 0, 0};
    float gyro_sum[3] = {0, 0, 0};
    
    for (int i = 0; i < 1000; i++) {
        imu_read_raw(imu);
        acc_sum[0] += imu->acc_raw[0];
        acc_sum[1] += imu->acc_raw[1];
        acc_sum[2] += imu->acc_raw[2];
        gyro_sum[0] += imu->gyro_raw[0];
        gyro_sum[1] += imu->gyro_raw[1];
        gyro_sum[2] += imu->gyro_raw[2];
        delay_ms(1);
    }
    
    imu->acc_offset[0] = acc_sum[0] / 1000.0f;
    imu->acc_offset[1] = acc_sum[1] / 1000.0f;
    imu->acc_offset[2] = acc_sum[2] / 1000.0f - 9.80665f; // 减去重力
    imu->gyro_offset[0] = gyro_sum[0] / 1000.0f;
    imu->gyro_offset[1] = gyro_sum[1] / 1000.0f;
    imu->gyro_offset[2] = gyro_sum[2] / 1000.0f;
}

注意: 标定完成后,一定要把参数保存到Flash或EEPROM中,否则断电就丢了。我见过有人每次上电都重新标定,结果飞着飞着参数变了,直接炸机。

1.3 气压计选型与标定

气压计主要用于定高。竞赛飞控中常用的气压计有:BMP280、MS5611、DPS310。

我个人最推荐MS5611。它的分辨率高(10cm级别),而且响应速度快。BMP280虽然便宜,但温漂大,在快速升降时数据滞后明显。DPS310性能不错,但驱动复杂,而且市面上假货多。

气压计的标定相对简单,主要是消除零偏和温度补偿。我一般这样做:

  • 在静止状态下采集100组气压数据,取均值作为基准气压。
  • 记录当前温度,用于后续的温度补偿。
  • 如果你需要更精确的高度,可以结合GPS或光流进行融合。

避坑指南: 我曾经在室内飞定时,发现气压计高度一直在跳,后来发现是空调的风直接吹到了飞控上。气压计对气流非常敏感,安装时一定要加海绵或防风罩。

1.4 光流传感器选型与标定

光流传感器用于室内或无GPS环境下的定位。常用的有:PMW3901、LC306、以及基于OpenMV的自制方案。

我个人最推荐PMW3901。它体积小、功耗低、而且输出的是直接的光流数据(x/y方向的速度),不需要额外计算。LC306虽然精度更高,但体积大,而且需要额外的MCU处理数据。

光流标定的核心是焦距和分辨率校准。具体流程如下:

  1. 把飞控固定在一个平移台上,以已知速度移动(比如0.5m/s)。
  2. 记录光流传感器输出的x/y速度值。
  3. 计算实际速度与传感器输出之间的比例因子。
  4. 如果传感器支持,还可以校准镜头畸变。

核心要点: 光流传感器对地面纹理非常敏感。如果你在纯色地面(比如白色地板)上飞行,光流数据会完全失效。我建议在室内飞行时,地面铺一些有纹理的贴纸或地毯。

1.5 传感器标定整体流程

下面这张图是我总结的传感器标定整体流程,你可以照着做:

传感器标定整体流程 硬件准备与安装 IMU标定(静止标定 → 六面标定 → 温补) 气压计标定(基准气压 + 温度补偿) 光流标定(焦距校准 + 比例因子) 验证与微调 不通过则返回重新标定 注意:每次更换传感器或飞控硬件后,都需要重新标定

1.6 总结

硬件选型和传感器标定,是竞赛飞控的基础。基础不牢,地动山摇。我见过太多人花大价钱买最好的硬件,结果因为标定没做好,飞起来还不如别人的入门级飞控。

记住三点:

  • 选型:够用就好,但留有余量。
  • 标定:每一步都要做扎实,尤其是IMU的温补。
  • 验证:标定完成后,一定要在实际飞行中验证,发现问题及时调整。

嗯,这一章就到这里。下一章我们会聊PID控制器的调参实战,到时候我会分享一些我在竞赛中总结的“暴力调参法”,保证让你眼前一亮。