PX4-Autopilot系统架构概述

PX4-Autopilot是一个开源的无人机飞行控制软件栈,采用模块化设计,支持多平台部署。其核心架构分为三层:驱动层、中间层和应用层。驱动层直接与硬件交互,中间层提供通信和任务调度,应用层实现飞行控制算法和任务逻辑。

核心模块组成

飞行控制栈(Flight Stack) 飞行控制栈是PX4的核心,负责状态估计、控制器和导航算法。主要模块包括传感器数据融合(EKF2)、位置/姿态控制器(mc_pos_control)和任务管理器(navigator)。

中间件(Middleware) 中间件基于uORB(微对象请求代理)实现模块间通信,提供轻量级的发布-订阅机制。uORB是PX4模块解耦的关键,允许不同频率的模块高效通信。

驱动层(Driver Layer) 驱动层包含硬件抽象层(HAL)和板级支持包(BSP),提供统一的硬件接口。支持PWM、I2C、SPI等协议,确保在不同飞控硬件(如Pixhawk系列)上可移植。

关键通信机制

uORB消息机制是PX4架构的核心枢纽。每个模块通过orb_advertise发布消息,通过orb_subscribe订阅消息。例如,传感器数据通过sensor_combined主题发布,控制器通过订阅该主题获取数据。

// 发布uORB消息示例
struct sensor_combined_s data = {};
orb_advert_t pub = orb_advertise(ORB_ID(sensor_combined), &data);

// 订阅uORB消息示例
int sub = orb_subscribe(ORB_ID(sensor_combined));
struct sensor_combined_s data;
orb_copy(ORB_ID(sensor_combined), sub, &data);

任务调度机制

PX4采用混合任务调度策略:

  • 高优先级任务(如姿态控制)运行在固定频率(如400Hz)
  • 低优先级任务(如日志记录)基于事件触发
  • 通过work_queue系统管理后台任务

启动脚本(rcS)定义模块加载顺序,px4_module宏实现模块注册。例如,姿态估计模块通过以下方式声明:

PX4_APPLET(ekf2, ModuleBase, "ekf2", "attitude estimator");

硬件抽象实现

PX4通过NuttX RTOS实现硬件抽象:

  • 设备驱动注册为/dev下的虚拟文件
  • 使用px4_register_device统一管理设备
  • 支持动态加载驱动(如fmu模块处理PWM输出)

传感器校准数据存储在/fs/microsd下的参数文件,通过param子系统访问。例如读取IMU校准参数:

param_t accel_x_offset = param_find("CAL_ACC0_XOFF");
float offset;
param_get(accel_x_offset, &offset);

系统启动流程

  1. 硬件初始化阶段:由Bootloader加载NuttX内核,初始化时钟、内存和基本外设
  2. 框架启动阶段:启动px4主任务,加载rcS脚本
  3. 模块加载阶段:按优先级顺序启动估计器、控制器等模块
  4. 安全检测阶段:执行传感器校验和健康检查
  5. 任务调度阶段:进入主循环,维持各模块的定时执行

启动日志可通过ulog工具分析,关键节点包含INIT标记和时间戳。通过commander模块管理状态切换,从ARMINGTAKEOFF的转换需满足所有安全条件。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐