一、飞控系统概述

什么是飞控系统

飞控系统,说白了就是无人机的大脑。我做了这么多年嵌入式,见过不少刚入行的朋友把飞控想得太神秘。其实没那么复杂——它就是一块电路板,上面跑着控制算法,负责让飞机稳稳地飞起来。

你想想看,一架四旋翼无人机在空中,四个电机转速稍有不同,飞机就会倾斜。飞控系统的任务就是:感知这种倾斜,然后立刻调整电机转速,让飞机恢复平衡。整个过程每秒要重复几百次。

我在项目中遇到过最典型的例子:有个客户说他们的飞机总是往一边偏。查了半天,发现是飞控的加速度计安装角度偏了0.5度。嗯,这种小问题在实际中特别常见。

飞控系统的核心组成:

  • 传感器——IMU(惯性测量单元)、磁力计、GPS、气压计
  • 处理器——运行控制算法和任务调度
  • 执行器——电调、舵机、电机
  • 通信模块——遥控器接收机、数传电台

飞控系统的核心任务

飞控要干的事,其实就三件:

  1. 姿态估计——搞清楚飞机现在是什么姿势
  2. 控制计算——算出该给电机多少油门
  3. 任务管理——处理遥控指令、记录日志、管理电池

我习惯把飞控比作一个交响乐指挥。传感器是乐手,控制算法是乐谱,而任务调度就是指挥棒。指挥棒挥得好,整场演出才流畅。

这里有个避坑指南:我曾经在一个项目里把姿态估计和控制计算放在同一个任务里。结果呢?传感器数据更新频率一高,控制计算就被卡住了。飞机直接翻了个跟头。从那以后,我再也不敢把实时性要求不同的任务混在一起。

任务类型 实时性要求 典型周期
姿态估计 硬实时 1-4 kHz
控制计算 硬实时 1-4 kHz
GPS处理 软实时 5-10 Hz
日志记录 非实时 尽力而为

为什么需要实时操作系统

你可能会问:不用RTOS行不行?当然行。我早期做飞控时就用过裸机,一个超级循环搞定所有事。但后来项目越来越复杂,裸机就扛不住了。

裸机的问题在哪?说白了就是:一个任务卡住,所有任务都完蛋

举个例子:假设你在主循环里先做姿态估计,再做控制计算,最后处理GPS数据。如果GPS数据处理时因为I2C总线卡住了,那姿态估计和控制计算都得等着。飞机在这几百毫秒里可能已经翻了。

RTOS能解决这个问题。它让每个任务都有自己的优先级。高优先级的任务(比如姿态估计)可以随时打断低优先级的任务(比如日志记录)。这就是所谓的抢占式调度

我的建议:飞控系统至少需要满足以下实时性要求:

  • 姿态估计和控制计算:1ms以内必须响应
  • 传感器数据读取:250μs以内必须完成
  • 遥控器信号解析:10ms以内必须更新

这些要求,裸机很难同时满足。但FreeRTOS可以。

我记得有一次调试一个四旋翼,发现飞机在高空突然失控。查了三天,最后发现是裸机代码里一个延时函数写错了,导致控制循环被阻塞了200ms。换成RTOS后,这种问题再也没出现过。

注意:RTOS不是万能药。如果任务设计不合理,优先级设置错误,照样会出问题。我曾经见过一个团队把所有任务都设成同一个优先级——那跟裸机有什么区别?

飞控系统的任务调度模型

下面这张图是我自己总结的飞控任务调度模型。你可以看到,不同任务有不同的周期和优先级。RTOS要做的就是保证每个任务都能在截止时间前完成。

飞控系统任务调度模型 姿态估计 周期:250μs | 优先级:最高 控制计算 周期:1ms | 优先级:高 传感器融合 周期:5ms | 优先级:中 GPS处理 周期:100ms | 优先级:低 FreeRTOS 内核 抢占式调度器 任务优先级管理 时间片轮转 中断管理 信号量/互斥锁 消息队列 软件定时器 硬件层 STM32/ARM 传感器 执行器

这张图展示的是典型的飞控任务分层。最左边是各个任务,中间是FreeRTOS内核,最右边是硬件。每个任务都有自己固定的周期和优先级。FreeRTOS负责在正确的时间唤醒正确的任务。

我习惯把姿态估计和控制计算放在最高优先级。为什么?因为这两个任务直接关系到飞机的稳定性。你想想看,如果姿态估计被延迟了1ms,控制计算就会用旧数据,飞机可能就抖起来了。

GPS处理这种任务,优先级就可以放低。GPS数据更新本来就慢(5-10Hz),偶尔延迟几十毫秒问题不大。日志记录更是可以放到后台慢慢写。

经验之谈:任务优先级不要超过5级。我见过有人设了20个优先级,结果调度器光切换任务就占用了30%的CPU。飞控这种实时系统,优先级越简单越好。

好了,这一章我们聊了飞控系统是什么、它的核心任务、以及为什么需要RTOS。下一章我会深入讲FreeRTOS的任务创建和管理,到时候会带大家手写一个简单的飞控任务调度框架。

专注资料整理