【无人机】无人机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(相机触发控制)、GPS、RC Input(支持 PPM/SBUS 等遥控输入协议)、IMU Drivers(通过 SPI、UAVCAN、I²C 接口驱动惯性测量单元)等,负责硬件设备的控制与数据采集。
五、飞行控制核心层(Flight Control)
- 状态与模式管理:
- State Machine:通过
commander实现飞行模式切换、解锁 / 上锁(Arming)等功能。 - Autonomous Flight:利用
navigator处理自主飞行任务,如航点任务(Missions)、返航(RTL)等。
- State Machine:通过
- 控制算法链:
- Position Controller:处理位置控制,输出姿态设定值,包含多旋翼(
mc_pos_control)与固定翼(fw_pos_control_l1)控制逻辑。 - Attitude & Rate Controller:负责姿态与角速度控制,输出推力和扭矩设定值,支持多旋翼、固定翼等不同机型的控制算法。
- Control Allocation:通过
control_allocator进行控制分配,将控制指令转换为电机和舵机的设定值。 - Output Driver:最终通过 PWM、UART、CAN 等接口,驱动电调(ESC)和舵机,实现飞行控制。
- Position Controller:处理位置控制,输出姿态设定值,包含多旋翼(
- 辅助模块:
- RC Handling:处理遥控输入(
rc_update),切换手动控制(manual_control)。 - Sensors Hub:整合传感器数据,处理故障切换,为系统提供惯性测量单元(IMU)、空速等数据。
- Position & Attitude Estimator:利用
ekf2等算法,融合 GPS、光流、距离传感器等数据,估计无人机位置与姿态。
- RC Handling:处理遥控输入(
源代码被划分为独立的模块 / 程序(在图中以等宽字体显示)。通常一个构建模块恰好对应一个模块。
提示
在运行时,你可以在 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))。
模块有两种不同的执行方式:
- 任务方式:模块在其自身的任务中运行,拥有自己的堆栈和进程优先级。
- 工作队列任务方式:模块运行在一个共享的工作队列中,与该队列上的其他模块共享相同的堆栈以及工作队列线程优先级。
- 所有任务必须以协作的方式运行,因为它们之间不能相互中断。
- 多个工作队列任务可以在一个队列上运行,并且可以存在多个队列。
- 工作队列任务可以通过指定未来的一个固定时间来进行调度,也可以通过 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 系统中那样对任务和线程进行区分)。
相关文章:
【无人机】无人机PX4飞控系统高级软件架构
目录 1、概述(图解) 一、数据存储层(Storage) 二、外部通信层(External Connectivity) 三、核心通信枢纽(Message Bus) 四、硬件驱动层(Drivers) 五、飞…...
启动arthas-boot.jar端口占用
问题 [rootlocalhost arthas-4.0.4]# java -jar arthas-boot.jar [ERROR] The telnet port 3658 is used by process 7066 instead of target process 6155, you will connect to an unexpected process. [ERROR] 1. Try to restart arthas-boot, select process 7066, shutdow…...
JSVMP逆向实战:原理分析与破解思路详解
引言 在当今Web安全领域,JavaScript虚拟机保护(JSVMP)技术被广泛应用于前端代码的保护和反爬机制中。作为前端逆向工程师,掌握JSVMP逆向技术已成为必备技能。本文将深入剖析JSVMP的工作原理,并分享实用的逆向破解思路…...
【SPP】蓝牙链路控制(LC)在SPP中互操作性深度解析
在蓝牙协议栈的精密分层体系中,其链路控制(Link Control, LC)层作为基带层的核心组件,承载着物理信道管理、连接建立与维护等关键任务。其互操作性要求直接决定了不同厂商设备能否实现无缝通信。本文将以蓝牙技术规范中的LC互操作…...
单片机学习之定时器
定时器是用来定时的机器,是存在于STM32单片机中的一个外设。STM32一般总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TI…...
供应链管理:计算题 / 倒扣法
一、理解倒扣法 在供应链管理中,倒扣法是一种常用的成本计算方法,主要用于确定商品的成本和销售价格,以确保特定的毛利率。倒扣法的基本原理是在已知售价和期望毛利率的情况下,逆推计算出供货价或成本价。 二、倒扣法的计算公式…...
算法每日一练 (25)
💢欢迎来到张翊尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 算法每日一练 (25)四数之和题目描述解题思路解题代码c…...
【大模型基础_毛玉仁】6.4 生成增强
目录 6.4 生成增强6.4.1 何时增强1)外部观测法2)内部观测法 6.4.2 何处增强6.4.3 多次增强6.4.4 降本增效1)去除冗余文本2)复用计算结果 6.4 生成增强 检索器得到相关信息后,将其传递给大语言模型以期增强模型的生成能…...
Zephyr实时操作系统初步介绍
一、概述 Zephyr是由Linux基金会托管的开源实时操作系统(RTOS),专为资源受限的物联网设备设计。其核心特性包括模块化架构、跨平台兼容性、安全性优先以及丰富的连接协议支持。基于Apache 2.0协议,Zephyr允许商业和非商业用途的自…...
【GCC警告报错4】warning: format not a string literal and no format arguments
文章主本文根据笔者个人工作/学习经验整理而成,如有错误请留言。 文章为付费内容,已加入原创保护,禁止私自转载。 文章发布于:《C语言编译报错&警告合集》 如图所示: 原因: snprintf的函数原型&#x…...
【落羽的落羽 C++】模板简介
文章目录 一、模板的引入二、函数模板1. 函数模板的使用2. 函数模板的原理3. 函数模板的实例化4. 函数模板的匹配 三、类模板 一、模板的引入 假如我们想写一个Swap函数,针对每一种类型,都要函数重载写一次,但它们的实现原理是几乎一样的。在…...
USB(通用串行总线)数据传输机制和包结构简介
目录 1. USB的物理连接电缆结构时钟恢复技术 2. USB的数据传输方式包(Packet) 3. 包的传输规则帧和微帧 4. 包的结构1. 同步字段(Sync)2. 包标识符字段(PID)3. 数据字段4. 循环冗余校验字段(CRC…...
【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解前言YOLOV3的模型结构YOLOV3模型的基本执行流程YOLOV3模型的网络参数 YOLOV3的核心思想前向传播阶段反向传播阶段 总结 前言 YOLOV3是由华盛顿…...
【前端扫盲】postman介绍及使用
Postman 是一款专为 API 开发与测试设计的 全流程协作工具,程序员可通过它高效完成接口调试、自动化测试、文档管理等工作。以下是针对程序员的核心功能介绍和应用场景说明: 一、核心功能亮点 接口请求构建与调试 支持所有 HTTP 方法(GET/POS…...
每日c/c++题 备战蓝桥杯(全排列问题)
题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留 5 个场…...
IdeaVim-AceJump
AceJump 是一款专为IntelliJ IDEA平台打造的开源插件,旨在通过简单的快捷键操作帮助用户快速跳转到编辑器中的任何符号位置,如变量名、方法调用或特定的字符串。无论是大型项目还是日常编程,AceJump 都能显著提升你的代码导航速度和效率。…...
BMS电池关键参数及其含义
BMS概述 BMS的定义与功能 BMS,即电池管理系统,是电池系统的核心控制设备,充当着电池的“状态观测器”。它通过传感器采集电池的单体电压、温度、电流等关键参数,并利用电子控制单元(ECU)进行数据处理和分…...
DataFrame行索引操作以及重置索引
一.DataFrame行索引操作 1.1 获取数据 1.1.1 loc 选取数据 df.loc[ ] 只能使用标签索引,不能使用整数索引。 当通过标签索引的切片方式来筛选数据时,它的取值前闭后闭。 传参: 1.如果选择单行或单列,返回的数据类型为 Series…...
DayDreamer: World Models forPhysical Robot Learning
DayDreamer:用于物理机器人学习的世界模型 Philipp Wu* Alejandro Escontrela* Danijar Hafner* Ken Goldberg Pieter Abbeel 加州大学伯克利分校 *贡献相同 摘要:为了在复杂环境中完成任务,机器人需要从经验中学习。深度强化学习是机器人学…...
线性欧拉筛
线性筛:高效求解素数 在数论中,素数的筛选是一个经典的问题。最常见的素数筛选方法是埃拉托斯特尼筛法,其时间复杂度为 O ( n log log n ) O(n\log \log n) O(nloglogn),非常适合求解小范围内的素数。随着问题规模的增大&…...
Flutter vs React Native:跨平台移动开发框架对比
文章目录 前言1. 框架概述什么是 Flutter?什么是 React Native? 2. 性能对比Flutter 的性能表现React Native 的性能表现总结: 3. 开发体验对比3.1 开发效率3.2 UI 组件库 4. 生态系统对比5. 适用场景分析6. 结论:如何选择&#x…...
用matlab搭建一个简单的图像分类网络
文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData,每个数字文件夹里包含1000张对应这个数字的图片,图片的尺寸都是 28281 像素的,如下图所示…...
AI辅助开发插件
适合Java程序员的AI辅助开发插件,按功能和适用场景分类: 1. 飞算JavaAI • 特点:从需求分析到代码生成的全流程智能引导,支持Maven、Gradle等主流工具,一键生成完整工程代码,包括配置文件、源代码和测试资…...
【AI4CODE】5 Trae 锤一个基于百度Amis的Crud应用
【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 【AI4CODE】3 Trae 锤一个贪吃蛇的小游戏 【AI4CODE】4 Trae 锤一个数据搬运工的小应用 1 百度 Amis 简介 百度 Amis 是一个低代码前端框架,由百度开源。它通过 J…...
npm webpack打包缓存 导致css引用地址未更新
问题如下: 测试环境配置: publicPath: /chat/,生产环境配置: publicPath: /,css中引用背景图片 background-image: url(/assets/images/calendar/arrow-left.png);先打包测试环境,观察打包后的css文件引用的背景图片地址 可以全…...
ollama导入huggingface下载的大模型并量化
1. 导入GGUF 类型的模型 1.1 先在huggingface 下载需要ollama部署的大模型 1.2 编写modelfile 在ollama 里面输入 ollama show --modelfile <你有的模型名称> eg: ollama show --modelfile qwen2.5:latest修改其中的from 路径为自己的模型下载路径 FROM /Users/lzx/A…...
Java 集合 Map Stream流
目录 集合遍历for each map案例 编辑 这种数组的遍历是【index】编辑map排序【对象里重写compareTo编辑map排序【匿名内部类lambda编辑 stream流编辑 编辑获取: map的键是set集合,获取方法map.keySet() map的值是collection 集合&…...
记录一下零零散散的的东西-ImageNet
ImageNet 是一个非常著名的大型图像识别数据集, 数据集基本信息 内容说明📸 图像数量超过 1400万张图片(包含各类子集)🏷️ 类别数量常用的是 ImageNet-1K(1000类)🧑Ἶ…...
【网络安全实验】PKI(证书服务)配置实验
目录 一、PKI相关概念 1.1 定义与核心功能 1.2 PKI 系统的组成 1.证书颁发机构(CA, Certificate Authority) 2.注册机构(RA, Registration Authority) 3.数字证书 1.3 PKI 的功能 1.4 PKI认证体系: 工作流程 …...
【数据集】多视图文本数据集
多视图文本数据集指的是包含多个不同类型或来源的信息的文本数据集。不同视图可以来源于不同的数据模式(如原始文本、元数据、网络结构等),或者不同的文本表示方法(如 TF-IDF、词嵌入、主题分布等)。这些数据集常用于多…...

