【无人机】无人机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 系统中那样对任务和线程进行区分)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目日记】高并发服务器项目总结

生活总是让我们遍体鳞伤&#xff0c; 但到后来&#xff0c; 那些受伤的地方一定会变成我们最强壮的地方。 -- 《老人与海》-- 高并发服务器项目总结 模块关系图项目工具模块缓冲区模块通用类型模块套接字socket模块信道Channel模块多路转接Poller模块 Reactor模块时间轮Tim…

Vue项目 bug 解决

Vue2项目部署失败 从gitee 上拉下一个前端项目&#xff0c;然后npm install&#xff0c;报错如下&#xff1a; 解决办法&#xff1a; 从 npm切换到cnpm&#xff1a;npm install -g cnpm执行命令export NODE_OPTIONS--openssl-legacy-provider下载依赖&#xff1a;cnpm instal…

接口自动化入门(四)

1. JMeter 的多组数据测试 1.1 使用 CSV 数据文件 JMeter 支持通过 CSV 文件提供多组测试数据&#xff0c;适用于参数化测试场景。具体步骤如下&#xff1a; 创建一个 CSV 文件&#xff0c;将测试数据以逗号分隔的形式存储。例如&#xff1a; username,passworduser1,pass1u…

企业数据分析何时该放弃Excel?

在企业数据分析中,Excel 的适用数据量范围取决于 数据复杂度、计算需求 和 硬件性能: 一、Excel 适合处理的数据量范围 数据规模适用场景限制与风险≤10万行- 日常报表 - 简单数据透视表 - 基础公式计算(如SUMIFS、VLOOKUP)处理流畅,无明显性能问题10万~50万行- 较复杂分析…

群晖NAS的最好的下载方式(虚拟机安装win系统安装下载软件)

一、背景 买NAS的其中一个用途就是下载&#xff0c;尤其是那种BT、磁力下载这种需要耗时较久的&#xff0c;开着电脑就是为了下载这种非常耗电和耗硬盘。 二、应对策略 既然有上面 “背景” 提到的痛点&#xff0c;有什么解决方式&#xff1f; NAS 上用docker安装迅雷&…

Spring AI与阿里云开发实践——生成式Java AI应用架构全解析

本文深度解析基于Spring框架与阿里云服务构建生成式AI应用的技术路径&#xff0c;涵盖架构设计、模型集成、性能优化三大维度。通过某金融企业智能客服系统实战案例&#xff0c;揭示Java生态下AI应用开发的7个关键实践要点&#xff0c;结合Gartner最新技术成熟度曲线&#xff0…

基于springboot体育俱乐部预约管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;在科…

找不到导入的项目“xxx\QtMsBuild\Qt.props”。请确认 Import 声明“$(QtMsBuild)\Qt.props”中计算结果为

系列文章目录 文章目录 系列文章目录前言一、问题原因 前言 新建的项目visual studio2022 使用Qt vs tools 找不到导入的项目“E:\osgEarth\DigitalSimulationPlatform\DigitalSimulationPlatform\QtMsBuild\Qt.props”。 请确认 Import 声明“$(QtMsBuild)\Qt.props”中计算结…

WPF设计标准学习记录17

在控件中的ControlTemplate的触发器 <Button Content="将ControlTemplate定义在在控件中" Width="280" Height="40" Margin="10" Foreground="#747787"><Button.Template><ControlTemplate TargetType=&quo…

【DeepSeek原理学习2】MLA 多头隐变量注意力

解决的问题 Multi-Head Latent Attention&#xff0c;MLA——解决的问题&#xff1a;KV cache带来的计算效率低和内存需求大以及上下文长度扩展问题。 MLA原理 MLA原理&#xff1a;其核心思想是将键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;矩阵压缩到…

LabVIEW 开发如何降本增效

在 LabVIEW 开发领域&#xff0c;如何在确保项目质量的同时降低开发成本&#xff0c;是众多企业和开发者共同关注的焦点。这不仅关乎资源的高效利用&#xff0c;更影响项目的投资回报率和市场竞争力。下面&#xff0c;我们将从多个维度深入剖析降本策略&#xff0c;并结合具体案…

原理图输出网表及调入

一、输出网表操作步骤 &#xff08;1&#xff09;选中.dsn文件&#xff0c;选者N或进入tools下拉列表选择Creat Netlists &#xff08;2&#xff09;导出网表后的文件 二、网表的导入 &#xff08;1&#xff09;执行菜单命令“File-Import-Logic/netlist”&#xff0c;将原理…

MyBatis 分页插件使用教程

MyBatis 分页插件使用教程 MyBatis 是一款优秀的持久层框架&#xff0c;但原生的 MyBatis 并不支持分页查询。为了简化分页操作&#xff0c;MyBatis 官方和第三方提供了多种分页插件&#xff0c;最常用的就是 MyBatis-Plus 的分页插件。本文详细介绍 MyBatis-Plus 分页插件的使…

目录穿越 + pickle反序列化 -- xyctf Signin WP

源代码 # -*- encoding: utf-8 -*-File : main.py Time : 2025/03/28 22:20:49 Author : LamentXUflag in /flag_{uuid4}from bottle import Bottle, request, response, redirect, static_file, run, route secret aapp Bottle() route(/) def index():return…

区块链技术:重塑供应链管理的未来

在当今全球化的商业环境中&#xff0c;供应链管理的复杂性和重要性日益凸显。从原材料采购到产品交付&#xff0c;供应链的每一个环节都可能影响企业的运营效率和客户满意度。随着区块链技术的兴起&#xff0c;供应链管理迎来了新的变革机遇。本文将深入探讨区块链技术在供应链…

ragflow本地部署(WSL下Ubuntu)

本地docker及 docker-compose版本 安装参考&#xff1a; 实践笔记-docker安装及配置镜像源实践笔记-docker-compose安装 1.下载源码 git clone https://github.com/infiniflow/ragflow.git2.运行docker-compose拉取镜像 cd ragflow/docker docker-compose up -d3.启动报错…

LTSPICE仿真电路:(二十六)跨阻放大器简单仿真

1.前言 由于有个机会刚好了解了下跨阻&#xff0c;简单做个这个仿真&#xff0c;实际上跨阻放大器应该要复杂的多&#xff0c;由于跨阻放大器实际上是将电流转换为电压&#xff0c;最需要注意的参数肯定是运放的偏置电流 2.跨阻放大器仿真 这篇是纯记录 这是一个将0-50uA电流…

androd的XML页面 跳转 Compose Activity 卡顿问题

解决 XML 点击跳转到 Compose Activity 卡顿问题 当从 XML 布局的 Activity 跳转到 Compose Activity 时出现卡顿现象&#xff0c;这通常是由以下几个原因导致的&#xff1a; 可能的原因及解决方案 1. Compose 首次初始化开销 问题&#xff1a;Compose 框架首次初始化需要时…

基于Python的二手房数据挖掘与可视化深度分析

一、技术框架与数据概况 1.1 技术栈构成 import pandas as pd # 数据操作(v1.3.5) import numpy as np # 数值计算(v1.21.6) from pyecharts.charts import * # 交互式可视化(v1.9.1) from sklearn.preprocessing import StandardScaler # 数据标准化(可选扩展) …

从数据到成果:R 语言在气象水文全流程中的关键技术应用

R语言在气象、水文中数据处理及结果分析、绘图实践技术应用 R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R …