PX4源码目录分析
PX4自动驾驶系统目录结构分析
PX4是一款广泛使用的开源飞控项目,其代码结构复杂但组织清晰。以下是对其目录结构的详细分析,采用MediaWiki代码格式展示[1,2,4](@ref)。
目录结构总览
PX4源代码的顶层目录(以v1.13.0为例)包含以下主要文件夹[2](@ref):
Firmware/ ├─ boards ├─ build ├─ cmake ├─ Documentation ├─ integrationtests ├─ launch ├─ msg ├─ platforms ├─ posix-configs ├─ ROMFS ├─ src ├─ test ├─ test_data ├─ Tools └─ validation
主要目录详解
1. boards/
此目录包含了各种品牌和版本的飞控板(如Pixhawk系列)的编译脚本和配置文件[2](@ref)。
- 例如,
px4/fmu-v2/
目录下就包含了针对Pixhawk v2.4.8硬件的编译脚本(如default.px4board
,fixedwing.px4board
)。 extras/
子目录则存放了飞控板芯片的BootLoader文件(如px4_fmu-v2_bootloader.bin
)[2](@ref)。- 编译脚本用于设置哪些驱动和功能模块会被编译进最终固件中[2](@ref)。
2. build/
这是编译目标目录,只有在执行至少一次编译后才会生成。它存放编译过程中产生的中间文件、目标文件以及最终的固件[2,3](@ref)。
- 针对不同硬件目标和编译配置(例如
make px4_fmu-v2_default
用于实体飞控板,make px4_sitl_default
用于软件在环仿真),会生成相应的子目录(如build/px4_fmu-v2_default/
,build/px4_sitl_default/
)[2](@ref)。
3. cmake/
此目录包含CMake编译系统的配置文件[2](@ref)。
cmake/configs/
下的.cmake
文件(如nuttx_px4fmu-v2_default.cmake
)定义了针对不同硬件平台的特定编译选项和配置[2,4](@ref)。- 该目录下的文件在开发中通常无需修改[2](@ref)。
4. Documentation/
存放PX4系统的开发者文档,包括代码说明、开发指南等[1,2,4](@ref)。
5. launch/
包含用于仿真环境(如Gazebo)的启动文件,用于配置ROS节点、生成仿真世界等[1,2,4](@ref)。
6. mavlink/
存放与MAVLink通信协议相关的文件。MAVLink是一种轻量级的消息传输协议,用于PX4飞控与地面站(如QGroundControl)或其他外部设备之间的通信。该目录包含了协议的定义和实现[1,4](@ref)。
7. msg/
这是uORB消息定义目录。uORB是PX4内部用于模块间通信的发布-订阅机制[1,4](@ref)。
- 所有uORB消息主题(Topic)的数据结构都在此目录下的
.msg
文件中定义(例如sensor_combined.msg
)[1,3](@ref)。 - 在编译过程中,这些文件会被自动转换为相应的C++头文件(
.h
)和源文件(.cpp
)[3](@ref)。
8. platforms/
包含与系统平台相关的底层代码,特别是PX4所采用的NuttX实时操作系统的源代码和适配层。该目录实现了工作队列、多进程、多线程调度等系统特性[1,4,5](@ref)。
9. ROMFS/
ROM文件系统目录。该目录存放了飞控系统启动时加载的脚本和配置文件,对系统初始化至关重要[1,2,4](@ref)。
ROMFS/px4fmu_common/init.d/
包含了初始化脚本[1,2](@ref):
**rcS
: 这是最先执行的主启动脚本,负责挂载SD卡、启动uORB、配置系统参数等基础任务[1,2](@ref)。 **rc.sensors
: 负责启动各种传感器驱动[1,2](@ref)。 **rc.mc_apps
: 负责启动上层应用模块,如状态估计器(attitude_estimator
)、控制器(attitude_control
,position_control
)等[1,2](@ref)。 **rc.logging
: 配置并启动日志记录功能[2](@ref)。
- 该目录还可能包含不同机型(如多旋翼、固定翼)的混控器(Mixer)配置文件[3](@ref)。
10. src/
这是PX4项目最核心的源代码目录,包含了无人机飞行控制的大部分算法实现[1,2,5](@ref)。
10.1. drivers/
包含了飞控硬件所使用的所有设备驱动代码,例如陀螺仪、加速度计、磁力计、气压计、GPS模块、PWM输出等。这些驱动提供了与硬件交互的底层接口[1,2,4](@ref)。
10.2. examples/
PX4官方提供的一些简单示例程序,例如px4_simple_app
,用于帮助开发者学习如何通过uORB进行数据交互和创建新的模块,是二次开发的入门参考[1,2,4](@ref)。
10.3. include/
包含其他源代码文件可能需要的头文件和库定义[2,5](@ref)。
10.4. lib/
包含许多公共算法函数库和数学工具,例如[1,2,5](@ref):
matrix
: 矩阵运算mathlib
: 数学函数库controllib
: 控制算法相关(如PID)EKF
: 扩展卡尔曼滤波实现rc
: 遥控器协议解析conversion
: 坐标旋转转换等
10.5. modules/
这是上层应用模块的主要目录,也是飞行控制算法实现的核心所在。PX4的功能由许多独立的模块(类似于ROS中的节点)构成,每个模块通过订阅和发布uORB消息进行通信。关键模块包括[1,2,4](@ref):
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
(参数管理)等[1,2,5](@ref)。
核心架构总结
PX4固件从架构上可以分为三大层次[4](@ref):
- 实时操作系统层: 主要由
platforms/
目录下的NuttX RTOS及相关底层代码构成,提供多任务、调度等核心系统服务。 - 中间件层: 包括
src/drivers/
中的设备驱动和msg/
定义的uORB消息机制,为上层应用提供硬件抽象和高效的进程间通信。 - 飞行控制栈层: 主要集中在
src/modules/
目录,实现了姿态估计、姿态控制、位置估计、位置控制、导航、命令处理等所有飞行相关的高级算法和应用。
如何获取代码
PX4项目包含许多子模块(Git Submodules),推荐使用以下命令克隆代码以确保完整获取[1](@ref):
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
编译示例
针对不同的硬件目标和仿真环境,编译命令也不同[1,2](@ref):
# 编译用于 Pixhawk FMU-v3 的固件 make px4_fmu-v3_default # 编译用于 Gazebo 软件在环仿真 (SITL) 的固件 make px4_sitl_default gazebo