飞控学习(二)

106 阅读5分钟

PX4的控制模块是其最核心的部分,采用了清晰的分层结构。下图展示了其核心数据流和模块间关系:

image.png

下面我们自顶向下详细解析这个控制流中的关键模块:


1. 位置控制层

这是控制的最高层,负责将用户意图自主任务转换为具体的位置、速度、航向设定值。

  • 核心模块:FlightTask及其派生类 (位于 src/modules/flight_mode_manager/tasks/)

    • 作用:一个优秀的抽象层。每个 FlightTask代表一种具体的飞行行为模式,负责生成平滑、可行、符合该模式要求的设定值。

    • 示例

      • FlightTaskOrbit: 环绕飞行。
      • FlightTaskManualPosition: 手动位置控制(遥控器)。
      • FlightTaskAutoLineSmooth: 自动平滑航线飞行。
    • 数据流:接收来自遥控器、地面站指令或自主逻辑的“原始”期望,输出经过处理的期望位置、速度、加速度和偏航角。

  • 核心模块:PositionControl类 (位于 src/lib/position_control/)

    • 作用:接收 FlightTask输出的期望状态和 EKF2估计的当前状态,通过P-PID控制器(比例-比例积分微分)计算所需的3D推力向量偏航设定值
    • 关键输出:一个三维推力矢量(在惯性系下)和期望偏航角。这个推力矢量会被传递给下一层(姿态控制),作为“你必须让飞机产生这个推力方向”的指令。
  • 协调者:FlightModeManager(位于 src/modules/flight_mode_manager/)

    • 作用:管理 FlightTask的生命周期和切换。当用户在 QGroundControl中切换飞行模式(如 PositionHold)时,它负责销毁旧的 FlightTask,创建新的,并确保切换过程的平滑。

2. 姿态控制层

这一层负责将位置控制器给出的“推力方向”和“偏航角”指令,转化为机体的期望姿态(滚转、俯仰、偏航角)。

  • 核心模块:ControlAllocatorAttitudeControl(交互密切)

    • AttitudeControl:其核心函数 update接收来自 PositionControl推力矢量​ 和 偏航设定值

    • 关键计算

      1. 根据推力矢量偏航角,利用几何关系反解出所需的机体期望姿态(一个目标四元数 q_d)。
      2. 将当前姿态(来自EKF)与目标姿态进行比较,通过一个姿态误差PID控制器,计算出需要机体产生的期望角速率roll_rate_sp, pitch_rate_sp, yaw_rate_sp)。
    • ControlAllocator:负责将姿态控制器输出的 期望角速率​ 和 剩余推力​ 进行整合与分配,为下一级速率控制器生成清晰的力矩和推力指令。


3. 底层控制层

这是最底层的控制回路,直接控制电机的旋转速度。

  • 核心模块:RateControl

    • 作用:接收来自 ControlAllocator期望角速率(roll, pitch, yaw)和当前角速率(来自EKF),通过三个独立的PID控制器(滚转、俯仰、偏航速率环),计算出需要施加在机体上的控制力矩torque_setpoint)。
    • 特点:这个回路带宽最高,响应最快,直接对抗机体的转动惯性和外界扰动。

4. 执行层

将控制器计算的“抽象力”转化为真实的电机指令。

  • 核心模块:Mixer(混控器)

    • 作用:将顶层最终计算出的 推力标量​ 和 三个力矩标量,根据无人机的构型(四旋翼、六旋翼、V尾固定翼等),通过一个 混控矩阵,分配到每个电机(或舵机)的推力指令上。
    • 配置文件:混控逻辑由 ROMFS/px4fmu_common/mixers/目录下的 .mix文件定义。
  • 最终输出:混控器输出的每个电机的归一化推力指令(0~1),经PWM或Dshot等驱动协议,最终控制电调(ESC)和电机。


5. 其他关键相关模块

  • mc_att_control/ mc_rate_control模块:这些是应用层模块,它们将上述的 AttitudeControlRateControlControlAllocator等库类“粘合”起来,组织成一个完整的、可被PX4任务调度器管理的应用。它们是控制逻辑运行的宿主容器
  • ekf2模块:如前图所示,它为所有控制层提供最关键的状态反馈:位置、速度、姿态、角速率。没有准确的状态估计,再好的控制器也无用武之地。

学习与实践建议

  1. 从仿真和数据流开始

    • 在Gazebo中运行 make px4_sitl gazebo
    • 使用 QGroundControlMAVLink Inspector​ 工具,订阅 vehicle_attitude_setpointvehicle_rates_setpointactuator_outputs等关键消息。手动飞行或切模式,观察数据如何变化。
  2. 阅读代码的切入点

    • 对于姿态控制,先看 src/modules/mc_att_control/模块的 control_attitude函数,它会调用 AttitudeControl::update
    • 对于位置控制,看 src/modules/flight_mode_manager/tasks/下的某个简单任务,如 FlightTaskManualPosition,看它如何生成设定点并调用 PositionControl::update
  3. 动手调试PID

    • 修改 ROMFS/px4fmu_common/config/multicopter/下的 .params文件中的PID参数(或在QGC中动态调整)。
    • 重点调参对象MC_ROLLRATE_PMC_ROLLRATE_D(速率环), MC_ROLL_P(姿态环)。每次只调一个,观察仿真中飞机的响应(超调、振荡、响应速度)。
  4. 理解一个完整流程

    • 以“向前飞”为例,在脑海中或通过调试工具,追踪指令流:遥控器杆量 → FlightTaskManualPositionPositionControl(计算需要前倾的推力)→ AttitudeControl(解算为俯仰角)→ RateControl(计算俯仰力矩)→ Mixer(分配电机差速)→ 电机转速改变。

通过这种分层、分模块的理解方式,您就能将PX4庞大而复杂的控制系统分解消化,并逐步掌握其精髓。