PX4源码目录分析:修订间差异

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

PX4自动驾驶系统目录结构分析

PX4是一款广泛使用的开源飞控项目,其代码结构复杂但组织清晰。以下是对其目录结构的详细分析,采用MediaWiki代码格式展示,并添加了更多中文备注和解释。

目录结构总览

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_qekf2: 姿态估计器(分别使用互补滤波和扩展卡尔曼滤波算法)。(中文备注:飞行器的"内耳",负责估计当前姿态和方位) 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消息监听工具进行系统调试。