PX4源码目录分析

来自无人智胜
跳转到导航 跳转到搜索

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_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消息监听工具进行系统调试。