9.5 KiB
PX4 源码学习路线
本文面向第一次接触飞控和 PX4 的开发者,结合当前项目使用的 CUAV 7-Nano、PX4 v1.17.0 和尾座式 VTOL,给出一条从基本概念到源码调试的学习路线。
当前 PX4 源码目录:
/home/jiagu/seeker_debug_tool1/simulation_ws/deps/PX4-Autopilot
1. 学习原则
PX4 包含硬件驱动、状态估计、飞行模式、控制器、通信和安全机制。第一次学习时,不建议直接从 EKF2、寄存器驱动或控制算法细节开始。
建议先沿着下面这条主线建立整体认识:
传感器
-> 状态估计
-> 飞行模式与设定值
-> 姿态/位置控制器
-> 控制分配
-> 电机和舵机
阅读代码时始终回答三个问题:
- 这个模块订阅了哪些 uORB 消息?
- 它根据什么状态或参数进行计算?
- 它发布了哪些消息,交给哪个下游模块?
实机学习和测试时必须拆下螺旋桨。
2. 先掌握 QGroundControl 和飞控基本概念
在深入源码前,先通过 QGroundControl 熟悉:
- 机型和
SYS_AUTOSTART - 参数保存、恢复和重启生效
- 传感器及遥控器校准
- 解锁前检查
- 手动、定高、定点和任务模式
- 多旋翼、固定翼及 VTOL 状态
- failsafe(失效保护)
- 执行器、电机和舵机功能映射
- MAVLink 与地面站通信
当前尾座式 VTOL 的通用实机机型 ID 是:
SYS_AUTOSTART=13200
不要选择 1002。它是 HIL Standard VTOL QuadPlane,只用于硬件在环仿真。
3. 阅读 PX4 启动流程
首先阅读主启动脚本:
ROMFS/px4fmu_common/init.d/rcS
重点了解下面的启动顺序:
加载参数
-> 读取 SYS_AUTOSTART
-> 加载机型脚本
-> 启动板载传感器
-> 启动状态估计器
-> 启动控制器
-> 启动 MAVLink 和日志
当前尾座式 VTOL 的机型脚本:
ROMFS/px4fmu_common/init.d/airframes/13200_generic_vtol_tailsitter
阅读时重点关注:
CA_AIRFRAME:控制分配机型类型CA_ROTOR_COUNT:电机数量CA_SV_CS_COUNT:舵面数量MAV_TYPE:MAVLink 飞行器类型VT_TYPE:VTOL 类型VT_B_TRANS_DUR:回到多旋翼模式的过渡时间
通用 13200 默认是两电机、两舵面配置。如果实际飞机是四电机、三舵机或四舵面,需要按真实结构重新配置控制分配,不能直接照搬默认值。
4. 理解 uORB 消息总线
uORB 是 PX4 内部模块间的消息总线。模块通常通过发布和订阅消息交换数据,而不是直接互相调用。
典型数据流:
传感器驱动
-> sensor_* 消息
-> EKF2
-> vehicle_attitude / vehicle_local_position
-> 飞行模式和控制器
-> vehicle_torque_setpoint / vehicle_thrust_setpoint
-> control_allocator
-> actuator_motors / actuator_servos
消息定义目录:
msg/
建议优先了解这些消息:
sensor_combined
vehicle_attitude
vehicle_local_position
vehicle_global_position
vehicle_status
vehicle_control_mode
vehicle_attitude_setpoint
vehicle_rates_setpoint
vehicle_torque_setpoint
vehicle_thrust_setpoint
actuator_motors
actuator_servos
可以在 PX4 Shell 中观察消息:
listener vehicle_attitude
listener vehicle_status
listener actuator_motors
uorb top
5. 学习 Commander 和飞行模式
5.1 Commander
目录:
src/modules/commander
Commander 主要负责:
- 解锁和上锁
- 飞行器状态管理
- 健康与解锁前检查
- 飞行模式切换
- failsafe 决策
- 电池、遥控和导航状态处理
遇到“无法解锁”“模式切换失败”或“进入 failsafe”时,优先沿 Commander 和健康检查代码排查。
5.2 Flight Mode Manager
目录:
src/modules/flight_mode_manager
它根据当前飞行模式生成位置、速度或轨迹设定值。建议先区分:
- 飞行模式负责决定“飞机应该去哪里、以什么状态运动”
- 姿态和位置控制器负责决定“怎样产生对应的力和力矩”
6. 沿多旋翼控制链阅读
多旋翼控制链:
mc_pos_control
-> mc_att_control
-> mc_rate_control
-> control_allocator
对应目录:
src/modules/mc_pos_control
src/modules/mc_att_control
src/modules/mc_rate_control
src/modules/control_allocator
各模块作用:
mc_pos_control:位置和速度控制,输出姿态与推力设定值mc_att_control:姿态控制,输出角速度设定值mc_rate_control:角速度控制,输出机体力矩和推力control_allocator:将期望力和力矩分配给各电机与舵面
尾座式 VTOL 在起飞、悬停和垂直降落阶段主要使用这条控制链。
7. 沿固定翼控制链阅读
对应目录:
src/modules/fw_mode_manager
src/modules/fw_lateral_longitudinal_control
src/modules/fw_att_control
src/modules/fw_rate_control
各模块主要作用:
fw_mode_manager:固定翼飞行模式与设定值管理fw_lateral_longitudinal_control:横向和纵向制导/控制fw_att_control:固定翼姿态控制fw_rate_control:固定翼角速度控制
尾座式 VTOL 完成前向过渡后,主要使用固定翼控制链。
8. 重点学习 VTOL 状态与过渡
目录:
src/modules/vtol_att_control
对尾座式飞机,这是最需要重点阅读的模块。建议关注:
- 当前处于多旋翼、前向过渡、固定翼还是反向过渡状态
- 多旋翼和固定翼控制输出如何混合
- 过渡完成条件
- 过渡超时和失败处理
- 空速是否参与过渡判断
VT_*参数如何影响状态机
先理解状态机,再调整过渡参数。不要在不清楚状态转换条件时直接修改控制输出。
9. 学习控制分配与执行器
目录:
src/modules/control_allocator
控制器输出的是期望力和力矩,控制分配器将其转换成具体电机和舵机命令。
需要结合实际飞机确认:
- 电机数量和物理位置
- 每个电机的推力方向
- 电机旋转方向和反扭矩符号
- 舵面类型、方向和力矩作用
- 输出通道对应关系
- 多旋翼和固定翼模式下哪些执行器参与控制
控制分配错误可能导致飞机一解锁就翻转。执行器检查必须无桨进行。
10. 最后学习 EKF2
目录:
src/modules/ekf2
EKF2 融合以下数据并估计姿态、位置、速度和传感器偏差:
- IMU(加速度计和陀螺仪)
- GPS/GNSS
- 磁罗盘
- 气压计
- 空速计
- 光流或视觉里程计(如果使用)
- 测距传感器(如果使用)
初学阶段先理解 EKF2 的输入、输出和健康状态,不需要立刻深入协方差矩阵及融合数学。
可先观察:
listener estimator_status
listener estimator_status_flags
listener vehicle_attitude
listener vehicle_local_position
11. 学习 CUAV 7-Nano 板级代码
板级目录:
boards/cuav/7-nano
主要内容包括:
default.px4board:默认启用的驱动和模块minimal_vtol.px4board:当前项目的精简 VTOL 配置init/rc.board_sensors:板载传感器启动src/board_config.h:GPIO、总线和板级定义src/spi.cpp:SPI 设备和片选配置src/i2c.cpp:I2C 总线配置src/can.c:CAN 板级初始化nuttx-config:NuttX 系统配置
建议在理解上层数据流之后再深入板级驱动,否则容易陷入引脚、总线和寄存器细节。
12. MAVLink、DroneCAN 和 ROS 2 的区别
MAVLink
主要用于 PX4 与 QGroundControl、数传和伴随计算机通信。当前实机需要保留 MAVLink。
DroneCAN/UAVCAN
用于连接 CAN GPS、CAN 空速计、CAN 电调等设备。当前固件保留了 DroneCAN 支持。
Micro XRCE-DDS
用于 PX4 与 ROS 2 交换 uORB/px4_msgs 数据。如果实机不使用 ROS 2,可以在精简固件中关闭。
13. 推荐的第一个源码练习
第一个练习建议新增一个只读模块:
订阅 vehicle_attitude
-> 每隔一段时间输出滚转、俯仰和偏航
-> 不发布控制指令
这个练习可以学习:
- PX4 模块基本结构
- CMake/Kconfig 配置
- 编译和刷写
- uORB 订阅
- PX4 Shell 命令
- 日志和调试
它不会直接改变控制器或执行器输出,风险明显低于一开始修改姿态控制、VTOL 状态机或 EKF2。
14. 推荐学习阶段
第一阶段:会使用和观察
- 完成机型选择和传感器校准
- 会使用
param show、listener、uorb top、top和ver all - 能看懂启动日志中的模块启动顺序
- 理解 QGC、MAVLink 和 uORB 的职责
第二阶段:看懂控制数据流
- 跟踪姿态、位置和执行器消息
- 理解多旋翼、固定翼和 VTOL 控制链
- 理解控制分配参数与实际执行器的关系
- 能从日志判断当前 VTOL 状态
第三阶段:进行低风险修改
- 新增只读模块
- 新增参数
- 增加日志和状态检查
- 在 SITL 中验证修改
第四阶段:修改飞行行为
- 调整控制器或过渡逻辑
- 修改控制分配
- 增加新的传感器或通信接口
- 完成 SITL、台架和实机分阶段验证
15. 安全边界
以下修改不适合作为第一次练习:
- 删除解锁前检查或 failsafe
- 绕过传感器校准
- 直接修改 EKF2 融合逻辑
- 未验证就修改电机混控和旋向
- 在有桨状态进行执行器测试
- 将 SITL 参数整套导入实机
- 未完成悬停验证就尝试 VTOL 过渡
推荐验证顺序:
SITL
-> 无桨上电检查
-> 无桨执行器测试
-> 固定台架测试
-> 低风险悬停
-> 固定翼与过渡测试