【无人机】无人机PX4飞控系统高级软件架构

目录

1、概述(图解)

一、数据存储层(Storage)

二、外部通信层(External Connectivity)

三、核心通信枢纽(Message Bus)

四、硬件驱动层(Drivers)

五、飞行控制核心层(Flight Control)

2、Flight Stack 飞行栈

PX4 高级飞行栈

3、中间件

4、更新速率

5、运行时环境

后台任务

6、特定操作系统信息

NuttX 操作系统

Linux/macOS 操作系统


参考:PX4用户手册

PX4 Architectural Overview | PX4 Guide (v1.15)

1、概述(图解)

如图所示,为 PX4 的各个组成部分,图的上半部分是中间件模块,下半部分则展示了飞行栈的各个组件。

上图中展示了系统各模块的功能及交互关系,具体分析如下:

一、数据存储层(Storage)

  • Database:通过 dataman 存储任务(Missions)、地理围栏(Geofence)等数据,可写入 SD 卡或内存(RAM)。
  • Parameters:借助 param 存储参数,支持 EEPROM、SD 卡、FLASH 等存储介质,实现参数的读取与写入。
  • Logging:通过 logger 将数据记录至 SD 卡,或通过 MAVLink 协议传输,用于飞行数据回溯分析。

二、外部通信层(External Connectivity)

  • MAVLink:通过 UART 或 UDP 接口,实现无人机与外部设备(如地面站)的通信,是主流的无人机通信协议。
  • FastRTPS:借助 micrortps_bridge,通过 UART 或 UDP 实现 CDR 序列化通信,适用于实时性要求高的场景。

三、核心通信枢纽(Message Bus)

  • 以 uORB 为消息总线,作为系统内部数据交互的核心通道,连接存储、外部通信、飞行控制、驱动等模块,实现数据高效传输。

四、硬件驱动层(Drivers)

  • 包含 Camera Control(相机触发控制)、GPSRC Input(支持 PPM/SBUS 等遥控输入协议)、IMU Drivers(通过 SPI、UAVCAN、I²C 接口驱动惯性测量单元)等,负责硬件设备的控制与数据采集。

五、飞行控制核心层(Flight Control)

 

  1. 状态与模式管理
    • State Machine:通过 commander 实现飞行模式切换、解锁 / 上锁(Arming)等功能。
    • Autonomous Flight:利用 navigator 处理自主飞行任务,如航点任务(Missions)、返航(RTL)等。
  2. 控制算法链
    • Position Controller:处理位置控制,输出姿态设定值,包含多旋翼(mc_pos_control)与固定翼(fw_pos_control_l1)控制逻辑。
    • Attitude & Rate Controller:负责姿态与角速度控制,输出推力和扭矩设定值,支持多旋翼、固定翼等不同机型的控制算法。
    • Control Allocation:通过 control_allocator 进行控制分配,将控制指令转换为电机和舵机的设定值。
    • Output Driver:最终通过 PWM、UART、CAN 等接口,驱动电调(ESC)和舵机,实现飞行控制。
  3. 辅助模块
    • RC Handling:处理遥控输入(rc_update),切换手动控制(manual_control)。
    • Sensors Hub:整合传感器数据,处理故障切换,为系统提供惯性测量单元(IMU)、空速等数据。
    • Position & Attitude Estimator:利用 ekf2 等算法,融合 GPS、光流、距离传感器等数据,估计无人机位置与姿态。

 

源代码被划分为独立的模块 / 程序(在图中以等宽字体显示)。通常一个构建模块恰好对应一个模块。

提示

在运行时,你可以在 shell 中使用 top 命令查看正在执行哪些模块,并且每个模块都可以通过 <模块名> start/stop 单独启动 / 停止。虽然 top 命令是 NuttX shell 特有的,但其他命令也可以在软件在环仿真(SITL)的 shell(pxh>)中使用。有关这些模块的更多信息,请参阅《模块与命令参考》。

图中的箭头表示模块之间最重要连接的信息流。实际上,连接数量比图中显示的要多得多,并且某些数据(例如参数相关数据)会被大多数模块访问。

模块之间通过名为 uORB 的发布 - 订阅消息总线进行通信。使用发布 - 订阅机制意味着:

  • 系统具有反应性 —— 它是异步的,在有新数据时会立即更新。
  • 所有操作和通信完全并行化。
  • 系统组件能够以线程安全的方式从任何地方获取数据。

信息

这种架构允许这些模块中的任何一个都能快速且轻松地被替换,甚至在运行时也可以。

2、Flight Stack 飞行栈

飞行栈是一套用于自主无人机的制导、导航和控制算法集合。它包括固定翼、多旋翼和垂直起降飞行器机体的控制器,以及姿态和位置估算器。

下图展示了飞行栈组成部分的概览。它涵盖了从传感器、遥控(RC)输入和自主飞行控制(导航器),到电机或舵机控制(执行器)的完整流程。

PX4 高级飞行栈

估算器获取一个或多个传感器输入,将其整合,并计算飞行器状态(例如,根据惯性测量单元(IMU)传感器数据计算姿态)

控制器是一种组件,它将设定值以及测量值或估算状态(过程变量)作为输入。其目标是调整过程变量的值,使其与设定值匹配。输出是为最终达到该设定值而进行的修正。例如,位置控制器将位置设定值作为输入,过程变量是当前估算的位置,输出则是使飞行器朝着期望位置移动的姿态和推力设定值。

混控器接收力指令(如 “向右转”),并将其转换为各个电机的指令,同时确保不超出某些限制。这种转换因飞行器类型而异,并且取决于多种因素,例如电机相对于重心的布置方式,或飞行器的转动惯量。
 

3、中间件

中间件主要由嵌入式传感器的设备驱动程序、与外部设备(如伴随计算机、地面控制站等)的通信模块,以及 uORB 发布 - 订阅消息总线组成。

此外,中间件还包含一个仿真层,该仿真层使得 PX4 飞行代码能够在桌面操作系统上运行,并在模拟的 “虚拟世界” 中控制一台由计算机模拟的飞行器。

4、更新速率

由于各个模块会等待消息更新,通常情况下是由驱动程序来定义模块的更新速度。

大多数惯性测量单元(IMU)驱动程序以 1 千赫兹(kHz)的频率对数据进行采样,对采样数据进行整合后,再以 250 赫兹(Hz)的频率发布数据。

系统的其他部分,比如导航器,并不需要如此高的更新速率,因此运行速度会慢很多。

可以通过在系统上运行 uorb top 命令来实时查看消息的更新速率。

5、运行时环境

PX4 可在多种提供 POSIX 应用程序编程接口(API)的操作系统上运行,比如 Linux、macOS、NuttX 或 QuRT。并且它还应该具备某种形式的实时调度功能(例如先进先出调度,FIFO)。

模块间的通信(使用 uORB)是基于共享内存实现的。整个 PX4 中间件运行在单一的地址空间中,也就是说,所有模块之间共享内存。

信息

该系统的设计理念是,只需付出最小的努力,就能够让每个模块在独立的地址空间中运行(需要修改的部分包括 uORB、参数接口、数据管理模块(dataman)和性能监测模块(perf))。

模块有两种不同的执行方式:

  1. 任务方式:模块在其自身的任务中运行,拥有自己的堆栈和进程优先级。
  2. 工作队列任务方式:模块运行在一个共享的工作队列中,与该队列上的其他模块共享相同的堆栈以及工作队列线程优先级。
  • 所有任务必须以协作的方式运行,因为它们之间不能相互中断。
  • 多个工作队列任务可以在一个队列上运行,并且可以存在多个队列。
  • 工作队列任务可以通过指定未来的一个固定时间来进行调度,也可以通过 uORB 主题更新回调来调度。

在工作队列上运行模块的优点是它使用的随机存取存储器(RAM)较少,并且有可能减少任务切换的次数。

缺点是工作队列任务不允许进入睡眠状态,或者轮询消息,也不允许进行阻塞式输入输出操作(比如从文件中读取数据)。

长时间运行的任务(进行大量计算的任务)可能也应该在单独的任务中运行,或者至少在单独的工作队列中运行。

信息

在工作队列上运行的任务不会显示在 top 命令的输出中(只能看到工作队列本身,例如显示为 wq:lp_default)。可以使用 work_queue status 命令来显示所有处于活动状态的工作队列项目。

后台任务

px4_task_spawn_cmd() 函数用于启动新的任务(在 NuttX 系统中)或线程(在支持 POSIX 标准的系统如 Linux 或 macOS 中),这些新任务或线程独立于调用它们的(父)任务运行:

以下是 C++ 代码示例:

independent_task = px4_task_spawn_cmd(
    "commander",                    // 进程名称
    SCHED_DEFAULT,                  // 调度类型(循环轮转调度RR或先进先出调度FIFO)
    SCHED_PRIORITY_DEFAULT + 40,    // 调度优先级
    3600,                           // 新任务或线程的堆栈大小
    commander_thread_main,          // 任务(或线程)的主函数
    (char * const *)&argv[0]        // 传递给新任务的空指针
                                    // (此处是命令行参数)。
    );

6、特定操作系统信息

NuttX 操作系统

NuttX 是在飞行控制板上运行 PX4 的主要实时操作系统(RTOS)。它是开源的(遵循 BSD 许可证),具有轻量级、高效且非常稳定的特点。

模块作为任务来执行:它们拥有各自的文件描述符列表,但共享单一的地址空间。一个任务仍然可以启动一个或多个共享该文件描述符列表的线程。

每个任务 / 线程都有一个固定大小的堆栈,并且有一个周期性任务会检查所有堆栈是否剩余足够的可用空间(基于堆栈着色技术来判断)。

Linux/macOS 操作系统

在 Linux 或 macOS 系统上,PX4 在单个进程中运行,并且模块在各自的线程中运行(不像在 NuttX 系统中那样对任务和线程进行区分)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值