2. PX4飞控基础

PX4 是目前开源无人机领域最活跃、工程化程度最高的飞控软件栈之一。它不仅仅是一套运行在 STM32 或高通骁龙平台上的固件,更是一个由实时操作系统、中间件、模块化应用层和地面站生态组成的完整系统。理解 PX4 的架构,是后续进行视觉模型部署、MAVLink 协议开发以及 Offboard 模式联调的基石。如果只停留在“调参能飞”的层面,一旦遇到传感器数据异常、日志分析或自定义控制逻辑注入等问题,就会陷入无从下手的困境。本章将从系统架构、核心模块、通信机制和地面站操作四个维度,为你构建一个完整的 PX4 认知框架。

应用层 (App Layer) 导航 (Navigator) 位置估计 (LPE/EKF) 任务控制 (MC) Offboard 接口 MAVLink 桥接 中间件层 (Middleware) uORB 消息总线 MAVLink 协议层 参数/日志系统 传感器驱动接口 实时系统层 (RTOS) NuttX / RTOS 内核 设备驱动 (PX4IO/SPI/I2C) 硬件抽象层 (HAL) 硬件平台:STM32F7/H7、传感器组合(IMU/磁力计/气压计)、GPS、PWM输出、SD卡 QGC 地面站 MAVLink

上图清晰地展示了 PX4 的分层架构。自下而上分别为硬件层、实时系统层、中间件层和应用层。这种分层设计使得 PX4 具备了极强的可移植性和可扩展性。对于开发者而言,最需要关注的是中间件层中的 uORB 消息总线和应用层中的 Offboard 接口。uORB 是模块间通信的“神经系统”,而 Offboard 则是外部计算机(如运行视觉模型的机载电脑)接入飞控的“大门”。下面我们逐一拆解这些核心组件。

2.1 PX4 系统架构与核心设计思想

PX4 的架构设计遵循了“模块化”与“发布-订阅”两大原则。所有功能(如姿态估计、位置控制、任务规划)都被封装为独立的模块(进程或任务),模块之间不直接调用函数,而是通过 uORB 主题(Topic)进行数据交换。这种设计带来了三个显著优势:第一,单个模块崩溃不会导致整个系统宕机,提高了可靠性;第二,开发者可以独立替换或修改某个模块而不影响其他部分;第三,新增功能(如视觉避障)只需订阅或发布新的 uORB 主题,无需改动飞控核心代码。

在 PX4 中,多旋翼姿态控制是理解系统工作的最佳切入点。其控制链路通常为:传感器数据(IMU)→ 姿态估计(EKF2)→ 姿态控制(mc_att_control)→ 混控器(Mixer)→ 电机输出。这条链路中的每一个环节都对应一个或多个 uORB 主题,例如 sensor_combined、vehicle_attitude、actuator_controls 等。

层级核心模块主要职责关键 uORB 主题
应用层EKF2 / LPE融合 IMU、GPS、气压计等数据,输出位置与姿态估计vehicle_attitude, vehicle_local_position
应用层Navigator解析任务指令,生成期望航点与航线mission_result, vehicle_command
应用层mc_att_control根据期望姿态与当前姿态计算姿态控制量vehicle_attitude_setpoint, actuator_controls
中间件uORB提供进程间通信的发布/订阅总线所有主题的传输通道
中间件MAVLink与地面站或机载电脑通信的协议栈mavlink_receiver, mavlink_from_external
RTOS层NuttX任务调度、文件系统、网络协议栈—
经验提醒:在阅读 PX4 源码时,不要试图一次性读懂所有模块。建议从 src/modules/mc_att_control 和 src/modules/ekf2 入手,结合 uORB 主题定义(位于 msg/ 目录)进行学习。理解一个消息从传感器到电机的完整流向,比死记硬背代码更有效。

2.2 uORB 通信机制:飞控的“神经网络”

uORB 是 PX4 自研的轻量级进程间通信(IPC)机制,其核心概念是 主题(Topic)、发布(Publish) 和 订阅(Subscribe)。任何模块都可以向某个主题发布数据,也可以订阅它感兴趣的主题。uORB 采用“无锁队列”和“多订阅者单发布者”模型,保证了实时性和数据一致性。

在实际开发中,我们经常需要查看某个主题的数据。PX4 提供了命令行工具 uorb top 来实时查看主题列表和频率,listener sensor_combined 可以打印指定主题的内容。例如,当你在 Offboard 模式下发送速度指令时,实际上是在向 vehicle_local_position_setpoint 主题发布数据。

# 查看所有 uORB 主题及其频率
uorb top

# 监听姿态数据(频率通常为 250Hz)
listener vehicle_attitude

# 查看位置设定点(Offboard 控制时常用)
listener vehicle_local_position_setpoint

理解 uORB 的另一个关键点是数据缓存与延迟。uORB 默认保留最近 1 条消息(除非配置了队列深度),订阅者读取的是最新数据。这意味着如果某个模块处理速度慢于发布频率,它会跳过中间数据,只处理最新值。这在控制系统中是合理的,但在日志分析时需要注意,.ulog 文件记录的频率可能与实际发布频率不同。

风险提示:在编写 Offboard 控制代码时,必须确保以稳定的频率(通常 10-50Hz)向 vehicle_local_position_setpoint 或 offboard_control_mode 发布消息。如果飞控在 500ms 内未收到新的 Offboard 指令,会自动退出 Offboard 模式并切换回之前的飞行模式(如 Position 或 Land)。这是 PX4 的安全保护机制,但也是初学者最容易触发的“掉模式”问题。

2.3 QGroundControl 地面站:调试与监控的利器

QGroundControl(简称 QGC)是 PX4 官方推荐的地面站软件。它不仅是飞行控制的遥控面板,更是参数调校、固件升级、日志分析和 MAVLink 通信调试的集成环境。对于课程后续的视觉模型联调,QGC 的“MAVLink Inspector”和“Analyze”工具至关重要。

QGC 的核心功能模块包括:

  • 飞行界面:显示实时姿态、位置、电池电压、信号强度等遥测数据,并提供虚拟摇杆和飞行模式切换按钮。
  • 规划界面:用于创建航点任务,支持多边形区域扫描、断点续飞等高级任务规划。
  • 设置界面:包含机架选择、传感器校准(加速度计、罗盘、水平)、遥控器校准、电源设置和参数调整(参数树)。
  • 分析界面:提供日志下载与回放(Log Download)、MAVLink 消息查看(MAVLink Inspector)以及地理标签视图。

在联调阶段,我们最常用的是 MAVLink Inspector。它可以实时列出所有 MAVLink 消息,并显示其频率和最新值。例如,当你的视觉模型通过 MAVLink 发送 SET_POSITION_TARGET_LOCAL_NED 消息时,你可以在这里看到消息是否被飞控正确接收,以及消息中的坐标值是否符合预期。

实战场景:假设你正在调试一个视觉跟随系统,机载电脑通过 MAVLink 向飞控发送目标位置。初始现象是无人机不响应指令,且 QGC 提示“Offboard enabled but no setpoint received”。此时,打开 MAVLink Inspector,过滤出 POSITION_TARGET_LOCAL_NED 消息。如果发现消息频率为 0,说明机载电脑没有正确发送;如果频率正常但坐标值全为 0,说明视觉节点输出的坐标系或单位有误。通过这一排查,可以快速定位问题在通信链路还是算法逻辑。

2.4 常见误区与总结复盘

在学习 PX4 基础时,初学者常陷入以下误区:

  1. 混淆“飞控固件”与“地面站”:PX4 是运行在飞控硬件上的固件,QGC 是运行在电脑上的软件。两者通过 MAVLink 协议通信。修改 QGC 参数不会直接改变飞控行为,必须点击“写入”并重启飞控才生效。
  2. 忽视 uORB 与 MAVLink 的区别:uORB 是飞控内部模块间的通信总线,MAVLink 是飞控与外部设备(QGC、机载电脑)的通信协议。外部设备无法直接访问 uORB 主题,必须通过 MAVLink 消息进行转换。PX4 的 mavlink 模块负责这种双向翻译。
  3. 认为 Offboard 模式是“自动驾驶”:Offboard 只是提供外部控制指令的通道,飞控仍然负责姿态控制和电机输出。如果外部指令不合理(如瞬间要求极大加速度),飞控会执行但可能导致姿态发散或触发保护机制。