2. 飞控系统基础
要理解自定义飞控驱动在 SITL 与 HIL 中的验证方式,必须先建立飞控系统的整体认知。飞控并不是“一块板子加几个传感器”的简单组合,而是一个由硬件、实时操作系统、驱动层、中间件与应用层共同构成的实时闭环控制系统。它的核心任务可以概括为:以固定周期采集传感器数据,估计飞行器姿态与位置,计算控制量,并通过执行器接口输出 PWM、DShot 或 CAN 指令,使飞行器稳定飞行。
一、飞控硬件组成
典型飞控硬件由主控 MCU、惯性测量单元 IMU、气压计、磁力计、GPS 接口、电源管理、存储、通信接口和执行器输出接口组成。主控 MCU 负责运行实时操作系统与飞控应用,常见如 STM32H7、STM32F4 系列。IMU 通常包含三轴陀螺仪与三轴加速度计,是姿态控制最关键的传感器;气压计用于高度估计,磁力计用于航向修正,GPS 提供全局位置。
从驱动开发视角看,硬件可划分为三条主线:传感采集链路、执行输出链路和调试通信链路。传感采集链路关注 SPI/I2C 总线时序、采样率与数据就绪中断;执行输出链路关注定时器、DMA、PWM 频率与协议时序;调试通信链路关注 UART、USB、CAN 与日志存储。HIL 验证时,这三条链路都需要被“接管”或“旁路”,否则真实硬件会与仿真信号冲突。
二、传感器与执行器接口
传感器接口常见 SPI、I2C、UART 和 CAN。SPI 速率高、适合 IMU 高频采样;I2C 布线简单但速率有限,常用于气压计与磁力计;UART 常用于 GPS、数传和部分外置传感器;CAN 则用于分布式执行器与冗余总线。执行器接口包括 PWM、OneShot、DShot、CAN 和串行舵机协议。不同协议对时序精度要求不同,DShot 对位时序敏感,PWM 对周期与脉宽敏感。
在 HIL 场景中,飞控仍运行真实驱动,但传感器数据来自仿真机。此时需要明确“注入点”:是在驱动层替换读取函数,还是在总线层模拟器件响应。前者实现简单,后者更接近真实时序。执行器输出则通常被仿真机采集,用于计算飞行器动力学响应,形成闭环。
关键判断:HIL 不是简单地把传感器数据“喂”给飞控,而是要保持驱动层、总线时序和控制周期与真实飞行一致,否则验证结果无法代表真实系统。
三、实时操作系统与任务调度
飞控对实时性要求极高。姿态控制环通常运行在 1 kHz 甚至 8 kHz,任何抖动都可能引起滤波发散或控制振荡。因此飞控普遍采用 RTOS,如 NuttX、FreeRTOS、ChibiOS 或 RT-Thread。RTOS 提供任务、信号量、消息队列、定时器和优先级调度,使传感器采集、姿态估计、控制输出和日志记录可以按优先级并行运行。
典型任务划分如下:高频 IMU 采集任务优先级最高;姿态估计与控制任务次之;导航与位置控制任务频率较低;日志、参数与通信任务优先级最低。驱动开发必须避免在中断或高优先级任务中执行阻塞操作,例如等待 I2C 完成或写 Flash。否则会造成控制周期抖动,在 SITL 中可能表现为仿真步进不稳定,在 HIL 中则可能直接导致飞控解锁失败或失控。
典型飞控任务周期:
IMU 采样 : 1 kHz ~ 8 kHz
姿态估计 : 1 kHz
姿态控制 : 1 kHz
位置控制 : 50 Hz ~ 100 Hz
导航与任务 : 10 Hz ~ 50 Hz
日志与参数 : 1 Hz ~ 10 Hz
四、驱动分层与常见飞控软件架构
现代飞控软件普遍采用分层架构,以隔离硬件差异、提高可移植性。自下而上通常包括:硬件抽象层 HAL、设备驱动层、中间件层、控制与应用层。HAL 封装寄存器、时钟、GPIO、SPI、I2C、UART 和定时器;驱动层实现具体传感器与执行器协议;中间件层提供 uORB、参数系统、日志与消息总线;应用层实现姿态估计、控制律、导航与任务管理。
以 PX4 为例,其架构强调 uORB 发布订阅机制,驱动将传感器数据发布为主题,估计器与控制模块订阅主题。ArduPilot 则采用较传统的调度器与库结构,驱动以库形式组织。无论哪种架构,驱动分层的目的都是让上层不直接操作寄存器,而是通过统一接口访问设备。这样在 SITL 中可以用仿真驱动替换真实驱动,在 HIL 中则保留真实驱动但替换数据源。
五、案例:从真实飞控到 HIL 验证
假设我们要验证一个自定义 IMU 驱动。在真实飞控上,驱动通过 SPI 读取陀螺仪与加速度计,发布 sensor_imu 主题。在 SITL 中,我们不需要真实 IMU,而是让仿真模型直接发布 sensor_imu,驱动层被旁路。在 HIL 中,飞控仍运行真实 IMU 驱动,但 SPI 读取到的数据来自仿真机注入的传感器数据。此时需要确保 SPI 时序、采样率、量程和单位与真实器件一致,否则姿态估计器会认为数据异常。
执行器方向同样如此。SITL 中控制输出直接进入仿真模型;HIL 中飞控输出真实 PWM 或 DShot 信号,由仿真机采集并计算动力学响应。若 PWM 频率或 DShot 协议不匹配,仿真机可能无法正确解析,导致闭环失败。
常见误区:把 SITL 当成“纯软件仿真”,忽略驱动层接口语义;或在 HIL 中直接修改控制周期,导致仿真结果与真实飞行不一致。正确做法是保持接口、单位、周期和协议与真实系统一致,只替换数据来源或执行器接收端。
六、核心要点清单
| 层次 | 主要职责 | SITL 处理方式 | HIL 处理方式 |
|---|---|---|---|
| 应用层 | 姿态估计、控制律、导航 | 运行真实算法 | 运行真实算法 |
| 中间件层 | 消息总线、参数、日志 | 运行真实中间件 | 运行真实中间件 |
| 驱动层 | 传感器与执行器协议 | 替换为仿真驱动 | 保留真实驱动,替换数据源 |
| HAL | 总线、定时器、GPIO | 仿真或桩函数 | 真实 HAL,部分总线被仿真接管 |
| 硬件层 | MCU、传感器、电调 | 不存在 | 真实飞控板 + 仿真机接口 |
掌握飞控硬件组成、传感器与执行器接口、RTOS 任务调度以及驱动分层架构,是后续编写自定义驱动并进行 SITL/HIL 验证的基础。只有明确每一层的职责与替换边界,才能在仿真中复现真实飞控行为,并让验证结果具备工程可信度。