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 中则保留真实驱动但替换数据源。

飞控系统分层架构与 SITL / HIL 注入点 应用层:姿态估计、控制律、导航、任务管理 SITL:直接运行仿真模型,替换真实传感器与执行器 中间件层:uORB / 参数系统 / 日志 / 消息总线 驱动与上层解耦,便于替换与测试 设备驱动层:IMU / 气压计 / 磁力计 / GPS / PWM / DShot / CAN HIL:保留真实驱动,替换数据源或采集执行器输出 硬件抽象层 HAL:SPI / I2C / UART / CAN / 定时器 / GPIO / DMA 屏蔽 MCU 差异,提供统一寄存器与总线接口 硬件层:MCU、IMU、气压计、磁力计、GPS、电调、舵机、电源 真实物理接口与电气时序 SITL 注入点 应用层以下全仿真 HIL 注入点 驱动层保留 数据源替换 驱动分层使 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 验证的基础。只有明确每一层的职责与替换边界,才能在仿真中复现真实飞控行为,并让验证结果具备工程可信度。