【无人机】无人机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 的各个组成部分,图的上半部分是中央件模块,下半部分则展示了飞行栈的各个组件。
https://i-blog.csdnimg.cn/direct/10372b32e53d4b18b984f11575c745f9.png
上图中展示了系统各模块的功能及交互关系,具体分析如下:
一、数据存储层(Storage)
[*]Database:通过 dataman 存储任务(Missions)、地理围栏(Geofence)等数据,可写入 SD 卡或内存(RAM)。
[*]Parameters:借助 param 存储参数,支持 EEPROM、SD 卡、FLASH 等存储介质,实现参数的读取与写入。
[*]Logging:通过 logger 将数据记载至 SD 卡,或通过 MAVLink 协议传输,用于飞行数据回溯分析。
[*]https://i-blog.csdnimg.cn/direct/aae81bbca15c4477bf461b983cf4e899.png
二、外部通信层(External Connectivity)
[*]MAVLink:通过 UART 或 UDP 接口,实现无人机与外部装备(如地面站)的通信,是主流的无人机通信协议。
[*]FastRTPS:借助 micrortps_bridge,通过 UART 或 UDP 实现 CDR 序列化通信,实用于实时性要求高的场景。
https://i-blog.csdnimg.cn/direct/24054043d6444de4840a29c17251f3c2.png
三、焦点通信枢纽(Message Bus)
[*]以 uORB 为消息总线,作为系统内部数据交互的焦点通道,毗连存储、外部通信、飞行控制、驱动等模块,实现数据高效传输。
四、硬件驱动层(Drivers)
[*]包罗 Camera Control(相机触发控制)、GPS、RC Input(支持 PPM/SBUS 等遥控输入协议)、IMU Drivers(通过 SPI、UAVCAN、I²C 接口驱动惯性测量单位)等,负责硬件装备的控制与数据采集。
五、飞行控制焦点层(Flight Control)
https://i-blog.csdnimg.cn/direct/96a3b9b842ac439994221aab9d6b2733.png
[*]状态与模式管理:
[*]State Machine:通过 commander 实现飞行模式切换、解锁 / 上锁(Arming)等功能。
[*]Autonomous Flight:利用 navigator 处理自主飞行任务,如航点任务(Missions)、返航(RTL)等。
[*]
[*]控制算法链:
[*]Position Controller:处理位置控制,输出姿态设定值,包罗多旋翼(mc_pos_control)与固定翼(fw_pos_control_l1)控制逻辑。
[*]Attitude & Rate Controller:负责姿态与角速度控制,输出推力和扭矩设定值,支持多旋翼、固定翼等不同机型的控制算法。
[*]Control Allocation:通过 control_allocator 进行控制分配,将控制指令转换为电机和舵机的设定值。
[*]Output Driver:终极通过 PWM、UART、CAN 等接口,驱动电调(ESC)和舵机,实现飞行控制。
[*]辅助模块:
[*]RC Handling:处理遥控输入(rc_update),切换手动控制(manual_control)。
[*]Sensors Hub:整合传感器数据,处理故障切换,为系统提供惯性测量单位(IMU)、空速等数据。
[*]Position & Attitude Estimator:利用 ekf2 等算法,融合 GPS、光流、间隔传感器等数据,估计无人机位置与姿态。
https://i-blog.csdnimg.cn/direct/040afc0a3b1543a7ab593660ae77a800.png
源代码被划分为独立的模块 / 程序(在图中以等宽字体表现)。通常一个构建模块恰恰对应一个模块。
提示
在运行时,你可以在 shell 中利用 top 命令查看正在实验哪些模块,并且每个模块都可以通过 <模块名> start/stop 单独启动 / 停止。虽然 top 命令是 NuttX shell 特有的,但其他命令也可以在软件在环仿真(SITL)的 shell(pxh>)中利用。有关这些模块的更多信息,请参阅《模块与命令参考》。
图中的箭头表现模块之间最重要毗连的信息流。实际上,毗连数量比图中表现的要多得多,并且某些数据(比方参数相关数据)会被大多数模块访问。
模块之间通过名为 uORB 的发布 - 订阅消息总线进行通信。利用发布 - 订阅机制意味着:
[*]系统具有反应性 —— 它是异步的,在有新数据时会立即更新。
[*]所有操纵和通信完全并行化。
[*]系统组件能够以线程安全的方式从任何地方获取数据。
信息
这种架构答应这些模块中的任何一个都能快速且轻松地被替换,以致在运行时也可以。
2、Flight Stack 飞行栈
飞行栈是一套用于自主无人机的制导、导航和控制算法集合。它包括固定翼、多旋翼和垂直起降飞行器机体的控制器,以及姿态和位置估算器。
下图展示了飞行栈组成部分的概览。它涵盖了从传感器、遥控(RC)输入和自主飞行控制(导航器),到电机或舵机控制(实验器)的完整流程。
https://i-blog.csdnimg.cn/direct/c4389781d40146a1951c653f09257287.png
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 // 传递给新任务的空指针
// (此处是命令行参数)。
);
6、特定操纵系统信息
NuttX 操纵系统
NuttX 是在飞行控制板上运行 PX4 的主要实时操纵系统(RTOS)。它是开源的(遵循 BSD 允许证),具有轻量级、高效且非常稳定的特点。
模块作为任务来实验:它们拥有各自的文件形貌符列表,但共享单一的地点空间。一个任务仍旧可以启动一个或多个共享该文件形貌符列表的线程。
每个任务 / 线程都有一个固定大小的堆栈,并且有一个周期性任务会查抄所有堆栈是否剩余足够的可用空间(基于堆栈着色技能来判断)。
Linux/macOS 操纵系统
在 Linux 或 macOS 系统上,PX4 在单个进程中运行,并且模块在各自的线程中运行(不像在 NuttX 系统中那样对任务和线程进行区分)。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]