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