
嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载PX4 是一个面向无人驾驶飞行器与自主机器人系统的开源飞控软件。本文基于 docs/en/concept/architecture.md 展开系统讲解 PX4 的两层式软件架构负责估计与控制的飞行栈Flight Stack以及承担通信与硬件集成的中间件Middleware。读完本文你将掌握 PX4 的模块划分方式、uORB 消息总线的运行机制、模块更新速率的确定方法以及任务Task与工作队列Work Queue两种模块执行模型的取舍并能在 Shell 中通过top、uorb top、listener等命令实际验证这套架构。整体设计响应式、可复用、可替换的两层体系PX4 的软件体系由两个主要层次构成飞行栈Flight Stack面向无人机以及船、车、潜艇等其他机器人形态的状态估计与飞行控制系统负责制导、导航与控制。中间件Middleware一个通用的机器人软件层支持任意类型的自主机器人提供内部/外部通信与硬件集成能力。所有 PX4 机架类型包括多旋翼、固定翼、垂直起降 VTOL乃至船只、地面车辆、潜艇等机器人系统共享同一套代码库。整个系统被设计为**响应式Reactive**系统其设计原则体现在三个方面所有功能都被拆分为可交换、可复用的组件组件间通过异步消息传递进行通信系统能够应对变化的工作负载。这种响应式设计直接决定了 PX4 的模块化形态与 uORB 通信模型是理解后续所有内容的基础。高层软件架构图解读下图给出了 PX4 全部构建模块的详细总览图的上半部分是中间件模块下半部分是飞行栈组件。PX4 高层架构图来源docs/assets/diagrams/PX4_Architecture.svg图中以等宽字体标注的即为独立源码模块。从这张图可以提炼出 PX4 架构的几个关键特征源码按模块Module划分源码被拆分为一个个自包含的模块/程序图中以等宽字体显示。通常情况下一个构建块building block恰好对应一个模块。模块可独立启停在运行时你可以通过 Shell 中的top命令查看当前正在执行的模块该命令为 NuttX Shell 专用而module_name start/stop可以单独启动/停止任意模块该命令在 SITL 的pxhShell 中同样可用。每个模块的详细说明参见 Modules Commands Reference。箭头仅表示最重要的信息流图中箭头展示了模块之间最重要的连接关系实际运行时连接远多于图中所绘且参数parameter这类数据几乎会被绝大多数模块访问。uORB 是模块间通信的基石模块通过名为 uORB 的发布-订阅消息总线通信。发布-订阅机制带来了三点收益系统具有响应性——异步工作新数据一旦可用便立即更新所有操作与通信完全并行化任一系统组件都可以以线程安全的方式从任何位置消费数据。值得强调的是这一架构使得图中每一个构建块都可以被快速、轻易地替换甚至可以在运行时热替换。飞行栈Flight Stack飞行栈是面向自主无人机的制导、导航与控制算法集合包含固定翼、多旋翼和 VTOL 机型的控制器以及姿态与位置估计器。下图展示了飞行栈构建块的完整流水线从**传感器、遥控器输入和自主飞行控制Navigator开始一直到电机或舵机控制Actuators**结束。飞行栈全链路框图来源docs/assets/diagrams/PX4_High-Level_Flight-Stack.svg。飞行栈中的核心概念可以归纳为三类角色估计器Estimator估计器接收一个或多个传感器输入对其进行融合并计算出车辆状态。例如根据 IMU 传感器数据计算姿态。在 PX4 中姿态与位置估计的核心实现是 EKF2 模块ekf2它订阅sensor_combined等融合后的传感器话题输出estimator_*系列状态话题是整个控制链路的状态来源。典型的多传感器融合输入包括 IMU、气压计、GPS、磁力计与光流传感器。控制器Controller控制器的输入是一个设定值setpoint与一个测量值或估计状态过程变量其目标是把过程变量调节到与设定值一致输出则是趋向设定值的修正量。文档中给出的经典例子是位置控制器输入位置设定点过程变量是当前估计位置输出是一个姿态与推力设定点驱动飞行器朝目标位置移动。这条链路在 PX4 中表现为navigator产生位置设定点→ 位置控制器mc_pos_control/fw_pos_control_l1→ 姿态/速率控制器mc_att_control/fw_att_control的级联结构。混控器Mixer混控器接收力/力矩类指令例如向右转并将其翻译为具体的电机指令同时确保不超出某些限制。这种翻译与机型强相关取决于电机相对重心的布局、飞行器的转动惯量等因素。混控逻辑在源码层面由 mixer 模块 实现实际运行时通过mixer_name load加载对应的混控文件位于 ROMFS/px4fmu_common/mixers把actuator_controls_0等归一化控制指令映射为各电机的actuator_outputs输出。中间件Middleware中间件 主要由三部分构成嵌入式传感器的设备驱动与外部世界伴机电脑 companion computer、地面站 GCS 等的通信uORB 发布-订阅消息总线。此外中间件还包含一个仿真层Simulation它允许 PX4 飞行代码在桌面操作系统上运行并控制仿真世界中由计算机建模的飞行器。uORB模块间的发布-订阅总线由于 uORB 是理解 PX4 架构的关键这里结合 uORB 消息机制文档 做进一步展开实现与启动uORB 由uorb模块实现在 PX4 启动序列早期通过uorb start自动启动许多应用依赖它单元测试可用uorb_tests启动。消息定义新话题通过在 msg/ 目录若需版本化则放入 msg/versioned添加遵循 CamelCase 命名约定的.msg文件定义并在 msg/CMakeLists.txt 中登记所需的 C/C 代码由构建系统自动生成。所有消息定义必须包含uint64_t timestamp字段这是日志系统记录 uORB 话题的前提。多话题与多实例一条消息定义默认生成一个同名snake_case话题也可以使用# TOPICS前缀一行声明多个话题例如 ActuatorOutputs.msg 定义了actuator_outputs、actuator_outputs_sim、actuator_outputs_debug。当系统存在多个同类型传感器时可通过orb_advertise_multi/orb_subscribe_multi使用话题的多实例能力。队列缓冲默认 uORB 消息只有单条缓冲高频发布可能被覆盖对车辆指令等不容丢失的话题可通过在消息定义中加入uint8 ORB_QUEUE_LENGTH 4创建指定长度的队列长度必须为 2 的幂。运行时观测在 Shell 中执行ls /obj可列出全部话题文件句柄listener sensor_accel 5可监听某话题最新 5 条消息内容FMUv4 之后的大多数板卡可用uorb top可实时查看每个话题的发布频率。从源码看 uORB 的落地从源码结构看uORB 的实现在 platforms/common/uORB/ 目录下其单元测试位于 platforms/common/uORB/uORB_tests/uORBTest_UnitTest.cpp验证了发布/订阅/多实例等核心语义。构建期代码生成逻辑由 Tools/msg/px_generate_uorb_topic_files.py 完成从.msg定义生成各平台可用的头文件。更新速率Update Rates由于模块通常处于等待消息更新的状态因此驱动driver决定了模块的更新速率。文档给出的典型数据是大多数IMU 驱动以 1kHz 采样积分后在内部以250Hz 发布其他部件例如navigator不需要如此高的更新率因此运行得明显更慢。这条采样 1kHz、发布 250Hz的流水线可以从 px4_imu_pipeline.pngIMU 数据管线图直观看到其对应话题为sensor_accel/sensor_gyro的原始数据话题与sensor_combined融合话题。消息的实时更新速率可以在系统上通过uorb top命令检查其输出示例列含义话题名、多实例索引、订阅者数、发布频率 Hz、每秒丢失消息数、队列长度如下update: 1s, num topics: 77 TOPIC NAME INST #SUB #MSG #LOST #QSIZE actuator_armed 0 6 4 0 1 actuator_controls_0 0 7 242 1044 1 battery_status 0 6 500 2694 1 commander_state 0 1 98 89 1 control_state 0 4 242 433 1 ekf2_innovations 0 1 242 223 1 ekf2_timestamps 0 1 242 23 1 estimator_status 0 3 242 488 1 mc_att_ctrl_status 0 0 242 0 1 sensor_accel 0 1 242 0 1 sensor_accel 1 1 249 43 1 sensor_baro 0 1 42 0 1 sensor_combined 0 6 242 636 1运行时环境Runtime EnvironmentPX4 可运行在多种提供POSIX API的操作系统上如 Linux、macOS、NuttX、QuRT并需要具备某种形式的实时调度能力如 FIFO 调度。在内存模型上模块间通信基于 uORB使用共享内存整个 PX4 中间件运行在单一地址空间内即所有模块共享内存。从源码结构看系统被设计为以最小代价即可让每个模块运行在独立地址空间——若要拆分需要改动的主要部分包括uORB、parameter interface、dataman和perf。模块的两种执行方式模块在运行时有两种执行方式任务Task模块运行在自己的任务中拥有独立的栈与进程优先级。工作队列任务Work Queue Task模块运行在共享的工作队列上与同队列的其他模块共享同一栈和工作队列线程优先级。队列上的所有任务必须协作式地行为因为它们无法相互打断一个队列上可以运行多个_工作队列任务_系统中也可以存在多个队列工作队列任务通过指定未来的固定时刻或uORB 话题更新回调被调度。工作队列的优势是占用更少 RAM并可能减少任务切换次数劣势是工作队列任务不允许睡眠、不允许在消息上轮询、不允许进行阻塞式 I/O例如从文件读取。执行重计算的长任务应尽量放入独立任务或至少放入独立的工作队列。排查提示运行在工作队列上的任务不会出现在top输出中只能看到队列本身例如wq:lp_default。此时应使用work_queue status命令显示所有活跃的工作队列条目参见 modules_system.md。工作队列的实现在源码中位于 platforms/common/px4_work_queue/例如 WorkQueueManager.cpp并带有 wqueue_start.cpp 等测试程序。后台任务Background Taskspx4_task_spawn_cmd()用于启动独立于调用父任务运行的新任务NuttX 下为任务POSIX/Linux/macOS 下为线程。文档给出的调用示例及参数含义如下independent_task px4_task_spawn_cmd( commander, // 进程名 SCHED_DEFAULT, // 调度类型RR 或 FIFO SCHED_PRIORITY_DEFAULT 40, // 调度优先级 3600, // 新任务/线程的栈大小 commander_thread_main, // 任务或线程主函数 (char * const *)argv[0] // 传给新任务的 void 指针 // 这里是命令行参数。 );源码级佐证接口声明与优先级体系px4_task_spawn_cmd的声明及一整套调度优先级宏定义在 platforms/common/include/px4_platform_common/tasks.h。该文件集中体现了 PX4 的优先级设计思想例如SCHED_PRIORITY_FAST_DRIVER快驱动需最小化控制延迟、SCHED_PRIORITY_ACTUATOR_OUTPUTS执行机构输出紧跟速率控制器发布、SCHED_PRIORITY_ATTITUDE_CONTROL姿态控制器优先于位置控制器运行、SCHED_PRIORITY_ESTIMATOR估计器在传感器数据可用时优先运行等这些宏在 tasks.h 的 L103-L152 区间内按层级排列。NuttX 实现在 platforms/nuttx/src/px4/common/tasks.cpp 中px4_task_spawn_cmd会先clearenv()释放环境变量占用的 RAMNuttX 会自动向子任务导出环境变量而 PX4 模块并不访问它们随后调用task_create()内核模式下为kthread_create()创建任务最后通过sched_setscheduler()配置调度器对应源码位置约在 tasks.cpp 的 L59-L88。POSIX 实现在 Linux/macOS 上对应实现位于 platforms/posix/src/px4/common/tasks.cpp将任务映射为 pthread 线程。操作系统相关信息NuttXNuttX 是在飞控板上运行 PX4 的主要 RTOS开源BSD 许可、轻量、高效且非常稳定。模块以任务方式执行它们拥有各自的文件描述符列表但共享单一地址空间一个任务仍可启动一个或多个共享文件描述符列表的线程。每个任务/线程拥有固定大小的栈系统中存在一个周期性任务基于栈着色stack coloring检查所有栈是否留有足够的空闲空间。Linux/macOS在 Linux 或 macOS 上PX4 运行在单一进程中模块运行在各自的线程中与 NuttX 不同这里不再区分任务与线程。这也是 SITLSoftware-In-The-Loop仿真的运行形态通过 posix-configs/SITL 下的配置文件与 Tools/px4.py 启动脚本PX4 飞行代码可以直接在桌面系统上以原生进程方式运行。延伸两种典型系统部署形态在上述软件架构之上PX4 硬件系统通常有两种典型形态详见 PX4 系统架构仅飞控板Flight Controller only飞控板运行整个 PX4 飞行栈通常内置 IMU、罗盘与气压计通过 PWM/DroneCAN 连接电机电调通过 I2C/SPI/CAN/UART 挂接 GPS、测距仪、光流等传感器经数传电台连接地面站并接收 RC 遥控输入。飞控板 伴机电脑FC Companion Computer飞控板运行正常 PX4 飞行栈伴机电脑提供依赖计算机视觉的高级功能两者通过高速串口或 IP 链路连接通常使用MAVLink 协议通信与地面站及云端的通信一般经伴机电脑转发。伴机电脑通常运行 Linux或 Android因为相比 NuttXLinux 在通用软件开发计算机视觉、通信、云集成、硬件驱动方面生态更成熟。小结PX4 的架构可以用三句话概括飞行栈负责怎么飞中间件负责怎么连两者通过uORB 发布-订阅总线解耦使每个模块都可独立启停、热替换在运行时模块既可以作为独立任务运行也可以作为工作队列任务共享资源以适应不同 RAM 与延迟需求。无论你是在移植新板卡、编写新驱动还是调试控制链路都可以从 architecture.md、uORB 消息机制 与 Modules Commands Reference 出发再结合本文引用的 tasks.h、uORB 实现目录 与 msg 消息定义目录 继续深入。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4-Autopilot参数系统深度剖析从配置文件到飞行性能调优PX4 Autopilot参数系统深度剖析从配置文件到飞行性能调优 PX4 Autopilot参数系统是无人机飞行控制系统的核心组成部分它允许用户通过调整各嵌入式物联网机器人自动驾驶智能硬件从源码到部署Network-Reinstall-System-Modify工作原理全解析从源码到部署Network Reinstall System Modify工作原理全解析 Network Reinstall System Modify是一款PX4-Autopilot深度解析无人机飞控系统的革命性架构与核心技术PX4 Autopilot深度解析无人机飞控系统的革命性架构与核心技术 PX4 Autopilot作为开源无人机飞控软件的领军者正在彻底改变无人机自主飞行的嵌入式物联网机器人自动驾驶智能硬件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考