PX4 从上电到起飞经历了什么?——不看代码的系统级全流程认知

这篇文章不贴源码、不讲函数细节,而是从系统架构视角梳理 PX4 从上电到起飞到底经历了什么
帮你建立“脑海中的流程图”,真正理解 PX4 是如何活起来的


一、上电瞬间:Bootloader 阶段

当飞控上电(插电池或 USB),第一段运行的并不是 PX4 主程序,而是 Bootloader

Bootloader 做了什么?

  • 初始化最基础硬件(时钟、Flash、串口)

  • 检查是否需要:

    • 进入固件升级模式(如 QGC 刷固件)

    • 进入 DFU 模式

  • 校验主固件完整性

  • 跳转到主程序

如果固件损坏,系统会停留在 Bootloader,不会进入 PX4


二、进入 PX4 主程序:NuttX 启动阶段

PX4 在大多数飞控(如 Pixhawk)上运行在 NuttX 实时操作系统 之上

所以接下来是 RTOS 的启动流程

NuttX 做了什么?

  • 初始化:

    • 中断系统

    • 内存管理

    • 任务调度器

    • 驱动框架

  • 创建 idle 任务

  • 启动第一个用户空间进程

然后执行:

/etc/init.d/rcS

这才真正进入 PX4 世界


三、rcS 脚本:PX4 真正“活起来”的开始

rcS 可以理解为 PX4 的“开机启动脚本”

它的作用类似 Linux 里的 /etc/rc.local

rcS 做的几件大事


1、加载参数系统

  • 从 SD 卡读取参数

  • 没有就加载默认参数

  • 建立参数服务(param)

参数系统是 PX4 的“全局配置数据库”


2、启动 uORB 消息总线

uORB 是 PX4 的核心通信机制

可以把它理解为 PX4 的“神经系统”

所有模块之间都通过 uORB 发布 / 订阅消息


3、启动传感器驱动

rcS 会根据板卡配置启动:

  • IMU

  • 陀螺仪

  • 加速度计

  • 磁力计

  • 气压计

  • GPS

  • 电调输出

  • PWM

驱动启动后:

  • 读取底层数据

  • 发布 uORB 话题(如 sensor_accel)


4、启动核心模块

依次启动:

  • commander(状态管理)

  • estimator(状态估计)

  • mc_att_control(姿态控制)

  • mc_pos_control(位置控制)

  • navigator(任务导航)

  • mavlink(通信)

至此,PX4 主要“功能器官”全部就位


四、系统稳定阶段:等待解锁

此时飞控已经:

  • 所有任务正在运行

  • 传感器持续发布数据

  • EKF 正在融合状态

  • MAVLink 正在和地面站通信

但此时飞机不能起飞

因为:

系统还未 ARM(电机未解锁)


五、Commander:系统状态大脑

PX4 的核心状态机模块是:

commander

它负责:

  • 解锁逻辑

  • 飞行模式切换

  • 安全检查

  • 失控保护

  • 电池监测

  • 预飞检查


解锁前会做什么检查?

包括:

  • 传感器是否正常

  • 陀螺仪是否校准

  • 磁罗盘是否正常

  • GPS 是否可用

  • EKF 是否收敛

  • 电池电压是否安全

  • 油门是否归零

全部通过才允许 ARM


六、ARM 解锁那一刻发生了什么?

当你:

  • 遥控器打杆

  • 或 QGC 点击解锁

Commander 状态机切换为:

ARMED

发生几件关键事情:

  1. 输出允许电调工作

  2. mixer 开始输出 PWM

  3. 电机开始怠速旋转

  4. 控制回路正式闭环

但此时仍未起飞


七、起飞前的控制链条

当你推油门(或自动起飞):

控制数据流如下:

遥控器输入
    ↓
uORB 发布 manual_control_setpoint
    ↓
commander 处理飞行模式
    ↓
姿态/位置控制器
    ↓
姿态控制(角速度 PID)
    ↓
混控 mixer
    ↓
PWM 输出
    ↓
电机转速变化

八、EKF 状态估计在做什么?

PX4 使用:

EKF2

融合:

  • IMU

  • GPS

  • 气压计

  • 磁罗盘

输出:

  • 位置

  • 速度

  • 姿态

  • 偏航角

所有控制器都依赖 EKF 输出

如果 EKF 不健康:

Commander 会拒绝解锁


九、起飞瞬间:闭环控制生效

当油门超过起飞阈值:

  • thrust > 重力

  • 姿态控制保持水平

  • 位置控制保持高度

此时飞机真正离地

系统进入:

Flying

飞行阶段开始


十、从系统角度看完整流程图

上电
 ↓
Bootloader
 ↓
NuttX 启动
 ↓
rcS 脚本执行
 ↓
参数加载
 ↓
uORB 初始化
 ↓
驱动启动
 ↓
核心模块启动
 ↓
EKF 开始融合
 ↓
Commander 等待解锁
 ↓
ARM
 ↓
控制器闭环
 ↓
起飞

十一、本质理解:PX4 是什么结构?

从架构角度看,PX4 是:

RTOS
  ↓
任务(模块)
  ↓
uORB 消息总线
  ↓
发布/订阅
  ↓
控制闭环

它不是一个“主循环程序”

而是:

多任务并行 + 消息驱动架构


十二、总结

1、PX4 是模块化系统

  • 每个功能是一个独立任务

  • 通过 uORB 通信

  • 彼此低耦合


2、启动顺序非常重要

  • 先驱动

  • 再估计

  • 再控制

  • 最后解锁

顺序错了系统无法工作


3、真正的核心三件套

  • commander(状态机)

  • EKF2(状态估计)

  • 控制器(PID)


PX4 从上电到起飞,本质是一个“从硬件初始化 → 任务并行启动 → 状态估计收敛 → 安全检查通过 → 控制闭环建立”的渐进过程

它不是“启动一个程序”,而是:

让一个分布式实时系统逐步进入稳定可飞状态

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐