PX4源码目录分析:修订间差异
创建页面,内容为“== PX4自动驾驶系统目录结构分析 == PX4是一款广泛使用的开源飞控项目,其代码结构复杂但组织清晰。以下是对其目录结构的详细分析,采用MediaWiki代码格式展示[1,2,4](@ref)。 === 目录结构总览 === PX4源代码的顶层目录(以v1.13.0为例)包含以下主要文件夹[2](@ref): <pre> Firmware/ ├─ boards ├─ build ├─ cmake ├─ Documentation ├─ integrationtests ├─ launch ├…” |
小 Root移动页面PX4源码根目录分析至PX4源码目录分析,不留重定向:恢复 |
||
(未显示同一用户的3个中间版本) | |||
第1行: | 第1行: | ||
== PX4自动驾驶系统目录结构分析 == | == PX4自动驾驶系统目录结构分析 == | ||
PX4是一款广泛使用的开源飞控项目,其代码结构复杂但组织清晰。 | |||
=== 目录结构总览 === | === 目录结构总览 === | ||
PX4源代码的顶层目录(以v1.13. | PX4源代码的顶层目录(以v1.13.0为例)包含以下主要文件夹: | ||
<pre> | <pre> | ||
Firmware/ | Firmware/ | ||
├─ boards | ├─ boards/ # 硬件板级配置和编译脚本 | ||
├─ build | ├─ build/ # 编译生成目录(编译后自动创建) | ||
├─ cmake | ├─ cmake/ # CMake编译系统配置 | ||
├─ Documentation | ├─ Documentation/ # 项目开发文档 | ||
├─ integrationtests | ├─ integrationtests/# 集成测试相关 | ||
├─ launch | ├─ launch/ # 启动脚本(主要用于仿真) | ||
├─ msg | ├─ msg/ # uORB消息定义文件 | ||
├─ platforms | ├─ platforms/ # 平台相关代码(如NuttX RTOS) | ||
├─ posix-configs | ├─ posix-configs/ # POSIX系统配置 | ||
├─ ROMFS | ├─ ROMFS/ # 内存文件系统(包含启动脚本) | ||
├─ src | ├─ src/ # 核心源代码目录 | ||
├─ test | ├─ test/ # 单元测试 | ||
├─ test_data | ├─ test_data/ # 测试数据 | ||
├─ Tools | ├─ Tools/ # 开发工具集 | ||
└─ validation | └─ validation/ # 验证测试 | ||
</pre> | </pre> | ||
=== 主要目录详解 === | === 主要目录详解 === | ||
==== 1. <code>boards/</code> ==== | ==== 1. <code>boards/</code> ==== | ||
此目录包含了各种品牌和版本的飞控板(如Pixhawk系列)的编译脚本和配置文件。 | |||
例如,<code>px4/fmu-v2/</code>目录下就包含了针对Pixhawk v2.4.8硬件的编译脚本(如<code>default.px4board</code>, <code>fixedwing.px4board</code>)。不同的编译脚本对应不同的编译命令,也会生成不同的固件文件。 | |||
<code>extras/</code>子目录则存放了飞控板芯片的BootLoader文件(如<code>px4_fmu-v2_bootloader.bin</code>)。 | |||
编译脚本用来设置哪些驱动文件、功能模块要被编译进最终固件中,通过增减里面的路径进行配置。'''(中文备注:这是硬件适配的关键目录,如果你要移植PX4到新的飞控硬件平台,就需要在这里添加对应的板级配置)''' | |||
==== 2. <code>build/</code> ==== | ==== 2. <code>build/</code> ==== | ||
这是'''编译目标目录''' | 这是'''编译目标目录''',只有在执行至少一次编译后才会生成。它存放编译过程中产生的中间文件、目标文件以及最终的固件。 | ||
针对不同硬件目标和编译配置(例如<code>make px4_fmu-v2_default</code>用于实体飞控板,<code>make px4_sitl_default</code>用于软件在环仿真),会生成相应的子目录(如<code>build/px4_fmu-v2_default/</code>, <code>build/px4_sitl_default/</code>)。'''(中文备注:通常不需要手动修改这个目录的内容,编译时会自动生成和更新)''' | |||
==== 3. <code>cmake/</code> ==== | ==== 3. <code>cmake/</code> ==== | ||
此目录包含CMake编译系统的配置文件。 | |||
<code>cmake/configs/</code>下的<code>.cmake</code>文件(如<code>nuttx_px4fmu-v2_default.cmake</code>)定义了针对不同硬件平台的特定编译选项和配置。 | |||
该目录下的文件在开发中通常无需修改。'''(中文备注:除非你需要添加新的编译目标或者修改全局编译选项,否则不建议修改这里的文件)''' | |||
==== 4. <code>Documentation/</code> ==== | ==== 4. <code>Documentation/</code> ==== | ||
存放PX4系统的'''开发者文档''' | 存放PX4系统的'''开发者文档''',包括代码说明、开发指南等。'''(中文备注:阅读这里的文档可以帮助你更好地理解PX4的设计理念和API用法)''' | ||
==== 5. <code>launch/</code> ==== | ==== 5. <code>launch/</code> ==== | ||
包含用于'''仿真环境''' | 包含用于'''仿真环境'''(如Gazebo)的启动文件,用于配置ROS节点、生成仿真世界等。'''(中文备注:如果你主要做仿真研究,这个目录下的文件非常重要,可以配置不同的仿真环境和参数)''' | ||
==== 6. <code>mavlink/</code> ==== | ==== 6. <code>mavlink/</code> ==== | ||
存放与'''MAVLink通信协议''' | 存放与'''MAVLink通信协议'''相关的文件。MAVLink是一种轻量级的消息传输协议,用于PX4飞控与地面站(如QGroundControl)或其他外部设备之间的通信。该目录包含了协议的定义和实现。'''(中文备注:MAVLink是飞控与外部通信的"普通话",定义了大量消息类型用于传输状态、控制指令等)''' | ||
==== 7. <code>msg/</code> ==== | ==== 7. <code>msg/</code> ==== | ||
这是'''uORB消息定义目录'''。uORB是PX4内部用于模块间通信的发布- | 这是'''uORB消息定义目录'''。uORB是PX4内部用于模块间通信的发布-订阅机制。 | ||
所有uORB消息主题(Topic)的数据结构都在此目录下的<code>.msg</code>文件中定义(例如<code>sensor_combined.msg</code>)。 | |||
在编译过程中,这些文件会被自动转换为相应的C++头文件(<code>.h</code>)和源文件(<code>.cpp</code>)。'''(中文备注:如果你要添加新的模块间通信消息,就需要在这里定义新的.msg文件。uORB是PX4内部通信的"神经脉络")''' | |||
==== 8. <code>platforms/</code> ==== | ==== 8. <code>platforms/</code> ==== | ||
包含与'''系统平台相关'''的底层代码,特别是PX4所采用的'''NuttX实时操作系统''' | 包含与'''系统平台相关'''的底层代码,特别是PX4所采用的'''NuttX实时操作系统'''的源代码和适配层。该目录实现了工作队列、多进程、多线程调度等系统特性。'''(中文备注:这是PX4系统底层的核心,包含了任务调度、内存管理、设备驱动框架等RTOS核心功能)''' | ||
==== 9. <code>ROMFS/</code> ==== | ==== 9. <code>ROMFS/</code> ==== | ||
'''ROM文件系统''' | '''ROM文件系统'''目录。该目录存放了飞控系统启动时加载的脚本和配置文件,对系统初始化至关重要。 | ||
<code>ROMFS/px4fmu_common/init.d/</code>包含了初始化脚本: | |||
** <code>rcS</code>: 这是'''最先执行的主启动脚本''',负责挂载SD卡、启动uORB、配置系统参数等基础任务。 | |||
** <code>rc.sensors</code>: 负责启动各种传感器驱动。 | |||
** <code>rc.mc_apps</code>: 负责启动上层应用模块,如状态估计器(<code>attitude_estimator</code>)、控制器(<code>attitude_control</code>, <code>position_control</code>)等。 | |||
** <code>rc.logging</code>: 配置并启动日志记录功能。 | |||
该目录还可能包含不同机型(如多旋翼、固定翼)的混控器(Mixer)配置文件。'''(中文备注:这是系统启动过程的"总指挥",控制了所有模块的启动顺序和初始化参数。如果你要添加开机自启动模块,需要修改这里的脚本)''' | |||
==== 10. <code>src/</code> ==== | ==== 10. <code>src/</code> ==== | ||
这是PX4项目最核心的'''源代码目录''' | 这是PX4项目最核心的'''源代码目录''',包含了无人机飞行控制的大部分算法实现。'''(中文备注:这是开发者最常接触的目录,包含了从底层驱动到上层控制算法的所有核心代码)''' | ||
====== 10.1. <code>drivers/</code> ====== | ====== 10.1. <code>drivers/</code> ====== | ||
包含了飞控硬件所使用的'''所有设备驱动代码''' | 包含了飞控硬件所使用的'''所有设备驱动代码''',例如陀螺仪、加速度计、磁力计、气压计、GPS模块、PWM输出等。这些驱动提供了与硬件交互的底层接口。'''(中文备注:这是硬件控制的"驱动程序库",每种传感器和执行器都有对应的驱动实现。如果你要支持新的硬件设备,通常需要在这里添加驱动代码)''' | ||
====== 10.2. <code>examples/</code> ====== | ====== 10.2. <code>examples/</code> ====== | ||
PX4官方提供的一些'''简单示例程序''',例如<code>px4_simple_app</code> | PX4官方提供的一些'''简单示例程序''',例如<code>px4_simple_app</code>,用于帮助开发者学习如何通过uORB进行数据交互和创建新的模块,是二次开发的入门参考。'''(中文备注:新手入门的最佳起点,通过这些示例可以快速学习PX4模块的开发方法和uORB通信机制)''' | ||
====== 10.3. <code>include/</code> ====== | ====== 10.3. <code>include/</code> ====== | ||
包含其他源代码文件可能需要的'''头文件''' | 包含其他源代码文件可能需要的'''头文件'''和库定义。'''(中文备注:集中了全局头文件和API定义,方便不同模块间的引用和协作)''' | ||
====== 10.4. <code>lib/</code> ====== | ====== 10.4. <code>lib/</code> ====== | ||
包含许多'''公共算法函数库和数学工具''' | 包含许多'''公共算法函数库和数学工具''',例如: | ||
<code>matrix</code>: 矩阵运算 | |||
<code>mathlib</code>: 数学函数库 | |||
<code>controllib</code>: 控制算法相关(如PID) | |||
<code>EKF</code>: 扩展卡尔曼滤波实现 | |||
<code>rc</code>: 遥控器协议解析 | |||
<code>conversion</code>: 坐标旋转转换等 | |||
'''(中文备注:这是PX4的"数学与算法工具箱",提供了控制系统所需的各种数学运算和滤波算法)''' | |||
====== 10.5. <code>modules/</code> ====== | ====== 10.5. <code>modules/</code> ====== | ||
这是'''上层应用模块''' | 这是'''上层应用模块'''的主要目录,也是飞行控制算法实现的核心所在。PX4的功能由许多独立的模块(类似于ROS中的节点)构成,每个模块通过订阅和发布uORB消息进行通信。关键模块包括: | ||
<code>commander</code>: 系统状态管理和模式切换(如解锁、上锁、飞行模式切换)、安全检查。'''(中文备注:飞行控制的"指挥官",负责决策和状态管理)''' | |||
<code>attitude_estimator_q</code> 或 <code>ekf2</code>: 姿态估计器(分别使用互补滤波和扩展卡尔曼滤波算法)。'''(中文备注:飞行器的"内耳",负责估计当前姿态和方位)''' | |||
<code>mc_att_control</code>: 多旋翼姿态控制(通常采用内外环PID结构,外环控制角度,内环控制角速率)。'''(中文备注:多旋翼的"平衡大师",负责保持飞行器稳定)''' | |||
<code>mc_pos_control</code>: 多旋翼位置控制(同样采用内外环PID结构,外环控制速度,内环控制加速度)。'''(中文备注:多旋翼的"导航员",负责精确位置控制)''' | |||
<code>fw_att_control</code> / <code>fw_pos_control_l1</code>: 固定翼姿态和位置控制。'''(中文备注:固定翼飞行器的控制专家)''' | |||
<code>local_position_estimator</code> (LPE): 基于光学flow、GPS等信息的位置估算。'''(中文备注:本地位置估计,提供高精度的局部定位信息)''' | |||
<code>navigator</code>: 任务执行、失效保护和返航(RTL)导航。'''(中文备注:飞行任务的"导航系统",负责路径规划和任务执行)''' | |||
<code>land_detector</code>: 着陆状态检测。'''(中文备注:降落状态的"监测员",判断飞行器是否已着陆)''' | |||
<code>logger</code>: 飞行日志记录。'''(中文备注:飞行数据的"记录员",负责记录所有重要数据供后续分析)''' | |||
<code>sensors</code>: 传感器数据处理模块。'''(中文备注:传感器数据的"预处理中心",负责原始数据的校准和融合)''' | |||
'''(中文备注:这是飞行控制算法的"大脑",包含了从状态估计到控制决策的所有核心算法模块。大多数算法改进和功能添加都在这里进行)''' | |||
====== 10.6. <code>systemcmds/</code> ====== | ====== 10.6. <code>systemcmds/</code> ====== | ||
包含一系列'''系统命令'''的源码,这些命令可以在PX4的NuttX Shell中使用,例如<code>reboot</code>(重启)、<code>top</code>(查看任务状态)、<code>param</code> | 包含一系列'''系统命令'''的源码,这些命令可以在PX4的NuttX Shell中使用,例如<code>reboot</code>(重启)、<code>top</code>(查看任务状态)、<code>param</code>(参数管理)等。'''(中文备注:这些是飞控系统的"管理命令",可以通过串口工具调用进行系统调试和状态查询)''' | ||
=== 核心架构总结 === | === 核心架构总结 === | ||
PX4固件从架构上可以分为三大层次: | |||
'''实时操作系统层''': 主要由<code>platforms/</code>目录下的NuttX RTOS及相关底层代码构成,提供多任务、调度等核心系统服务。'''(中文备注:提供基础的系统服务,如任务调度、内存管理和设备驱动框架)''' | |||
'''中间件层''': 包括<code>src/drivers/</code>中的设备驱动和<code>msg/</code>定义的uORB消息机制,为上层应用提供硬件抽象和高效的进程间通信。'''(中文备注:承上启下的关键层,提供硬件抽象和模块间通信能力)''' | |||
'''飞行控制栈层''': 主要集中在<code>src/modules/</code>目录,实现了姿态估计、姿态控制、位置估计、位置控制、导航、命令处理等所有飞行相关的高级算法和应用。'''(中文备注:实现具体飞行控制功能的应用层,包含所有核心算法)''' | |||
=== 如何获取代码 === | === 如何获取代码 === | ||
PX4项目包含许多子模块(Git | PX4项目包含许多子模块(Git Submodules),推荐使用以下命令克隆代码以确保完整获取: | ||
<pre> | <pre> | ||
git clone --recursive https://github.com/PX4/PX4-Autopilot.git | git clone --recursive https://github.com/PX4/PX4-Autopilot.git | ||
第120行: | 第102行: | ||
git submodule update --init --recursive | git submodule update --init --recursive | ||
</pre> | </pre> | ||
'''(中文备注:由于PX4依赖较多子模块,一定要使用<code>--recursive</code>参数或者手动更新子模块,否则会缺少重要组件)''' | |||
=== 编译示例 === | === 编译示例 === | ||
针对不同的硬件目标和仿真环境,编译命令也不同: | |||
<pre> | <pre> | ||
编译用于 Pixhawk FMU-v3 的固件 | |||
make px4_fmu-v3_default | make px4_fmu-v3_default | ||
编译用于 Gazebo 软件在环仿真 (SITL) 的固件 | |||
make px4_sitl_default gazebo | make px4_sitl_default gazebo | ||
</pre> | </pre> | ||
'''(中文备注:编译前需要安装相关工具链,仿真编译通常需要更复杂的依赖环境,建议参考官方文档配置)''' | |||
=== 开发建议 === | |||
'''新手入门''': 建议从<code>src/examples/</code>中的示例代码开始,了解uORB通信机制和模块开发模式。 | |||
'''算法研究''': 重点关注<code>src/modules/</code>目录下的各种估计器和控制器。 | |||
'''硬件适配''': 如果需要支持新硬件,需要修改<code>boards/</code>目录中的配置和<code>src/drivers/</code>中的驱动代码。 | |||
'''参数调整''': 大多数算法参数可以通过QGC地面站调整,无需修改代码重新编译。 | |||
'''调试技巧''': 使用<code>systemcmds/</code>中的调试命令和uORB消息监听工具进行系统调试。 |
2025年9月26日 (五) 00:12的最新版本
PX4自动驾驶系统目录结构分析
PX4是一款广泛使用的开源飞控项目,其代码结构复杂但组织清晰。
目录结构总览
PX4源代码的顶层目录(以v1.13.0为例)包含以下主要文件夹:
Firmware/ ├─ boards/ # 硬件板级配置和编译脚本 ├─ build/ # 编译生成目录(编译后自动创建) ├─ cmake/ # CMake编译系统配置 ├─ Documentation/ # 项目开发文档 ├─ integrationtests/# 集成测试相关 ├─ launch/ # 启动脚本(主要用于仿真) ├─ msg/ # uORB消息定义文件 ├─ platforms/ # 平台相关代码(如NuttX RTOS) ├─ posix-configs/ # POSIX系统配置 ├─ ROMFS/ # 内存文件系统(包含启动脚本) ├─ src/ # 核心源代码目录 ├─ test/ # 单元测试 ├─ test_data/ # 测试数据 ├─ Tools/ # 开发工具集 └─ validation/ # 验证测试
主要目录详解
1. boards/
此目录包含了各种品牌和版本的飞控板(如Pixhawk系列)的编译脚本和配置文件。
例如,px4/fmu-v2/
目录下就包含了针对Pixhawk v2.4.8硬件的编译脚本(如default.px4board
, fixedwing.px4board
)。不同的编译脚本对应不同的编译命令,也会生成不同的固件文件。
extras/
子目录则存放了飞控板芯片的BootLoader文件(如px4_fmu-v2_bootloader.bin
)。
编译脚本用来设置哪些驱动文件、功能模块要被编译进最终固件中,通过增减里面的路径进行配置。(中文备注:这是硬件适配的关键目录,如果你要移植PX4到新的飞控硬件平台,就需要在这里添加对应的板级配置)
2. build/
这是编译目标目录,只有在执行至少一次编译后才会生成。它存放编译过程中产生的中间文件、目标文件以及最终的固件。
针对不同硬件目标和编译配置(例如make px4_fmu-v2_default
用于实体飞控板,make px4_sitl_default
用于软件在环仿真),会生成相应的子目录(如build/px4_fmu-v2_default/
, build/px4_sitl_default/
)。(中文备注:通常不需要手动修改这个目录的内容,编译时会自动生成和更新)
3. cmake/
此目录包含CMake编译系统的配置文件。
cmake/configs/
下的.cmake
文件(如nuttx_px4fmu-v2_default.cmake
)定义了针对不同硬件平台的特定编译选项和配置。
该目录下的文件在开发中通常无需修改。(中文备注:除非你需要添加新的编译目标或者修改全局编译选项,否则不建议修改这里的文件)
4. Documentation/
存放PX4系统的开发者文档,包括代码说明、开发指南等。(中文备注:阅读这里的文档可以帮助你更好地理解PX4的设计理念和API用法)
5. launch/
包含用于仿真环境(如Gazebo)的启动文件,用于配置ROS节点、生成仿真世界等。(中文备注:如果你主要做仿真研究,这个目录下的文件非常重要,可以配置不同的仿真环境和参数)
6. mavlink/
存放与MAVLink通信协议相关的文件。MAVLink是一种轻量级的消息传输协议,用于PX4飞控与地面站(如QGroundControl)或其他外部设备之间的通信。该目录包含了协议的定义和实现。(中文备注:MAVLink是飞控与外部通信的"普通话",定义了大量消息类型用于传输状态、控制指令等)
7. msg/
这是uORB消息定义目录。uORB是PX4内部用于模块间通信的发布-订阅机制。
所有uORB消息主题(Topic)的数据结构都在此目录下的.msg
文件中定义(例如sensor_combined.msg
)。
在编译过程中,这些文件会被自动转换为相应的C++头文件(.h
)和源文件(.cpp
)。(中文备注:如果你要添加新的模块间通信消息,就需要在这里定义新的.msg文件。uORB是PX4内部通信的"神经脉络")
8. platforms/
包含与系统平台相关的底层代码,特别是PX4所采用的NuttX实时操作系统的源代码和适配层。该目录实现了工作队列、多进程、多线程调度等系统特性。(中文备注:这是PX4系统底层的核心,包含了任务调度、内存管理、设备驱动框架等RTOS核心功能)
9. ROMFS/
ROM文件系统目录。该目录存放了飞控系统启动时加载的脚本和配置文件,对系统初始化至关重要。
ROMFS/px4fmu_common/init.d/
包含了初始化脚本:
** rcS
: 这是最先执行的主启动脚本,负责挂载SD卡、启动uORB、配置系统参数等基础任务。
** rc.sensors
: 负责启动各种传感器驱动。
** rc.mc_apps
: 负责启动上层应用模块,如状态估计器(attitude_estimator
)、控制器(attitude_control
, position_control
)等。
** rc.logging
: 配置并启动日志记录功能。
该目录还可能包含不同机型(如多旋翼、固定翼)的混控器(Mixer)配置文件。(中文备注:这是系统启动过程的"总指挥",控制了所有模块的启动顺序和初始化参数。如果你要添加开机自启动模块,需要修改这里的脚本)
10. src/
这是PX4项目最核心的源代码目录,包含了无人机飞行控制的大部分算法实现。(中文备注:这是开发者最常接触的目录,包含了从底层驱动到上层控制算法的所有核心代码)
10.1. drivers/
包含了飞控硬件所使用的所有设备驱动代码,例如陀螺仪、加速度计、磁力计、气压计、GPS模块、PWM输出等。这些驱动提供了与硬件交互的底层接口。(中文备注:这是硬件控制的"驱动程序库",每种传感器和执行器都有对应的驱动实现。如果你要支持新的硬件设备,通常需要在这里添加驱动代码)
10.2. examples/
PX4官方提供的一些简单示例程序,例如px4_simple_app
,用于帮助开发者学习如何通过uORB进行数据交互和创建新的模块,是二次开发的入门参考。(中文备注:新手入门的最佳起点,通过这些示例可以快速学习PX4模块的开发方法和uORB通信机制)
10.3. include/
包含其他源代码文件可能需要的头文件和库定义。(中文备注:集中了全局头文件和API定义,方便不同模块间的引用和协作)
10.4. lib/
包含许多公共算法函数库和数学工具,例如:
matrix
: 矩阵运算
mathlib
: 数学函数库
controllib
: 控制算法相关(如PID)
EKF
: 扩展卡尔曼滤波实现
rc
: 遥控器协议解析
conversion
: 坐标旋转转换等
(中文备注:这是PX4的"数学与算法工具箱",提供了控制系统所需的各种数学运算和滤波算法)
10.5. modules/
这是上层应用模块的主要目录,也是飞行控制算法实现的核心所在。PX4的功能由许多独立的模块(类似于ROS中的节点)构成,每个模块通过订阅和发布uORB消息进行通信。关键模块包括:
commander
: 系统状态管理和模式切换(如解锁、上锁、飞行模式切换)、安全检查。(中文备注:飞行控制的"指挥官",负责决策和状态管理)
attitude_estimator_q
或 ekf2
: 姿态估计器(分别使用互补滤波和扩展卡尔曼滤波算法)。(中文备注:飞行器的"内耳",负责估计当前姿态和方位)
mc_att_control
: 多旋翼姿态控制(通常采用内外环PID结构,外环控制角度,内环控制角速率)。(中文备注:多旋翼的"平衡大师",负责保持飞行器稳定)
mc_pos_control
: 多旋翼位置控制(同样采用内外环PID结构,外环控制速度,内环控制加速度)。(中文备注:多旋翼的"导航员",负责精确位置控制)
fw_att_control
/ fw_pos_control_l1
: 固定翼姿态和位置控制。(中文备注:固定翼飞行器的控制专家)
local_position_estimator
(LPE): 基于光学flow、GPS等信息的位置估算。(中文备注:本地位置估计,提供高精度的局部定位信息)
navigator
: 任务执行、失效保护和返航(RTL)导航。(中文备注:飞行任务的"导航系统",负责路径规划和任务执行)
land_detector
: 着陆状态检测。(中文备注:降落状态的"监测员",判断飞行器是否已着陆)
logger
: 飞行日志记录。(中文备注:飞行数据的"记录员",负责记录所有重要数据供后续分析)
sensors
: 传感器数据处理模块。(中文备注:传感器数据的"预处理中心",负责原始数据的校准和融合)
(中文备注:这是飞行控制算法的"大脑",包含了从状态估计到控制决策的所有核心算法模块。大多数算法改进和功能添加都在这里进行)
10.6. systemcmds/
包含一系列系统命令的源码,这些命令可以在PX4的NuttX Shell中使用,例如reboot
(重启)、top
(查看任务状态)、param
(参数管理)等。(中文备注:这些是飞控系统的"管理命令",可以通过串口工具调用进行系统调试和状态查询)
核心架构总结
PX4固件从架构上可以分为三大层次:
实时操作系统层: 主要由platforms/
目录下的NuttX RTOS及相关底层代码构成,提供多任务、调度等核心系统服务。(中文备注:提供基础的系统服务,如任务调度、内存管理和设备驱动框架)
中间件层: 包括src/drivers/
中的设备驱动和msg/
定义的uORB消息机制,为上层应用提供硬件抽象和高效的进程间通信。(中文备注:承上启下的关键层,提供硬件抽象和模块间通信能力)
飞行控制栈层: 主要集中在src/modules/
目录,实现了姿态估计、姿态控制、位置估计、位置控制、导航、命令处理等所有飞行相关的高级算法和应用。(中文备注:实现具体飞行控制功能的应用层,包含所有核心算法)
如何获取代码
PX4项目包含许多子模块(Git Submodules),推荐使用以下命令克隆代码以确保完整获取:
git clone --recursive https://github.com/PX4/PX4-Autopilot.git
或者分步执行:
git clone https://github.com/PX4/PX4-Autopilot cd PX4-Autopilot git submodule update --init --recursive
(中文备注:由于PX4依赖较多子模块,一定要使用--recursive
参数或者手动更新子模块,否则会缺少重要组件)
编译示例
针对不同的硬件目标和仿真环境,编译命令也不同:
编译用于 Pixhawk FMU-v3 的固件 make px4_fmu-v3_default 编译用于 Gazebo 软件在环仿真 (SITL) 的固件 make px4_sitl_default gazebo
(中文备注:编译前需要安装相关工具链,仿真编译通常需要更复杂的依赖环境,建议参考官方文档配置)
开发建议
新手入门: 建议从src/examples/
中的示例代码开始,了解uORB通信机制和模块开发模式。
算法研究: 重点关注src/modules/
目录下的各种估计器和控制器。
硬件适配: 如果需要支持新硬件,需要修改boards/
目录中的配置和src/drivers/
中的驱动代码。
参数调整: 大多数算法参数可以通过QGC地面站调整,无需修改代码重新编译。
调试技巧: 使用systemcmds/
中的调试命令和uORB消息监听工具进行系统调试。