You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

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、寄存器驱动或控制算法细节开始。

建议先沿着下面这条主线建立整体认识:

传感器
  -> 状态估计
  -> 飞行模式与设定值
  -> 姿态/位置控制器
  -> 控制分配
  -> 电机和舵机

阅读代码时始终回答三个问题:

  1. 这个模块订阅了哪些 uORB 消息?
  2. 它根据什么状态或参数进行计算?
  3. 它发布了哪些消息,交给哪个下游模块?

实机学习和测试时必须拆下螺旋桨。

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 系统配置

建议在理解上层数据流之后再深入板级驱动,否则容易陷入引脚、总线和寄存器细节。

主要用于 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 showlisteneruorb toptopver all
  • 能看懂启动日志中的模块启动顺序
  • 理解 QGC、MAVLink 和 uORB 的职责

第二阶段:看懂控制数据流

  • 跟踪姿态、位置和执行器消息
  • 理解多旋翼、固定翼和 VTOL 控制链
  • 理解控制分配参数与实际执行器的关系
  • 能从日志判断当前 VTOL 状态

第三阶段:进行低风险修改

  • 新增只读模块
  • 新增参数
  • 增加日志和状态检查
  • 在 SITL 中验证修改

第四阶段:修改飞行行为

  • 调整控制器或过渡逻辑
  • 修改控制分配
  • 增加新的传感器或通信接口
  • 完成 SITL、台架和实机分阶段验证

15. 安全边界

以下修改不适合作为第一次练习:

  • 删除解锁前检查或 failsafe
  • 绕过传感器校准
  • 直接修改 EKF2 融合逻辑
  • 未验证就修改电机混控和旋向
  • 在有桨状态进行执行器测试
  • 将 SITL 参数整套导入实机
  • 未完成悬停验证就尝试 VTOL 过渡

推荐验证顺序:

SITL
  -> 无桨上电检查
  -> 无桨执行器测试
  -> 固定台架测试
  -> 低风险悬停
  -> 固定翼与过渡测试