首页 / 第 02 篇

PX4 学习记录之概念

梳理坐标系、飞控与机载计算机的分工、顶层软件架构与飞行控制栈,并逐层拆解多旋翼与固定翼控制器(含 TECS、姿态控制、控制分配)。

PX4 前置概念

下面的章节提供了两个 "典型 "PX4 系统的 PX4 硬件和软件堆栈的高级概述:一个系统只有一个飞行控制器,另一个系统则有一个飞行控制器和一个配套计算机(也称为 "任务计算机")。 PX4 结构概述提供了有关飞行堆栈和中间件的信息。ROS 和 MAVSDK 中涵盖了机外 API。

坐标系

PX4的坐标系分为两种,PX4内部使用FRD(Front-Right-Down)右手坐标系作为机体坐标系,外部输入支持ENU(East-North-Up)右手坐标系,坐标系由转换代码(如MAVROS)转为FRD格式通过MAVLINK输入给PX4。 NEU与FRD坐标系

飞行控制器(仅含飞控)

下图提供了一个以飞行控制器为基础的典型 "简单" PX4 系统的高层概览。 PX4方案拓扑图

硬件包括

  • 飞行控制器(运行 PX4 飞行堆栈)。这通常包括内部 IMU、罗盘和气压计。
  • 电机电调连接到 PWM 输出、DroneCAN(DroneCAN 允许双向通信,而不是如图所示的单向)或其他总线。
  • 通过 I2C、SPI、CAN、UART 等连接的传感器(GPS、罗盘、距离传感器、气压计、光流量计、气压计、ADSB 转发器等)。
  • 相机或其他有效载荷。摄像头云台可连接到 PWM 输出端或通过 MAVLink 连接。
  • 用于连接地面站计算机/软件的遥测无线电。
  • 用于手动控制的遥控系统 图的左侧显示的是软件堆栈,与图中的硬件部分水平对齐(大致如此)。

  • 地面站计算机通常运行 QGroundControl(或其他地面站软件)。它还可以运行 MAVSDKROS 等机器人软件。

  • 在飞行控制器上运行的 PX4 飞行堆栈包括驱动程序、通信模块、控制器、估算器以及其他中间件和系统模块。

飞控和计算机

下图显示的 PX4 系统包括一个飞行控制器和一个配套计算机(此处称为 "任务计算机")。 PX4方案拓扑图

飞行控制器运行普通的 PX4 飞行堆栈,而配套计算机则提供利用计算机视觉的高级功能。两个系统通过快速串行或 IP 链路连接,通常使用 MAVLink 协议进行通信。与地面站和云的通信通常通过配套计算机进行(如使用 MAVLink 路由器(英特尔公司提供))。

PX4 系统通常在配套计算机上运行 Linux 操作系统。Linux 是一个比 NuttX 更好的 "通用 "软件开发平台;Linux 开发人员更多,而且已经编写了许多有用的软件(如计算机视觉、通信、云集成、硬件驱动程序)。出于同样的原因,计算机有时也会运行安卓系统。

该图显示了通过 LTE 连接云或地面站的情况,许多基于 PX4 的系统都采用了这种方法。PX4 不提供专门用于 LTE 和/或云集成的软件(这需要定制开发)。

PX4 系统架构概述

PX4 包括两个主要层:飞行堆栈是一个估算和飞行控制系统,中间件是一个通用机器人层,可支持任何类型的自主机器人,提供内部/外部通信和硬件集成。 所有 PX4 机身共享一个代码库(包括其他机器人系统,如船只、漫游车、潜水艇等)。整个系统的设计是被动的,这意味着:

  • 所有的功能都可以被分割成若干可替换、可重复使用的部件。
  • 通过异步消息传递进行通信。
  • 系统可以应对不同的工作负载。

顶层软件架构

下面的架构图对 PX4 的各个积木模块以及各模块之间的联系进行了一个详细的概述。 图的上半部分包括了中间件模块,而下半部分展示的则是飞行控制栈的组件。

PX4方案拓扑图

源代码被分割成独立的模块/程序(如图所示)。通常来说一个图中的积木块对应一个功能模块。 运行时,您可以使用 shell 中的 top 命令检查哪些模块被执行,还可以通过 <module_name> start/stop 命令单独启动/停止每个模块。topcommandNuttX shell 特有的命令,其他命令也可在 SITL shell (pxh>) 中使用。有关这些模块的更多信息,请参阅模块与命令参考

箭头表示模块之间最重要连接的信息流。使用 发布-订阅 消息总线这个方案意味着:

模块之间通过名为 uORB 的发布-订阅消息总线进行通信。它包括了为固定翼、旋翼和 VTOL 无人机设计的控制器,以及相应的姿态、位置估计器。

  • 系统是 “响应式” 的 — 系统异步运行,新数据抵达时系统立即进行更新。
  • 系统所有的活动和通信都是完全并行的。
  • 系统组件在任何地方都可以在保证线程安全的情况下使用数据。 这种架构允许快速、轻松地更换每一个模块,甚至在运行时也是如此。

uorb 消息总线是 PX4 中的一个重要组件。它提供了一个高效、线程安全的机制,用于在系统的不同模块之间传递信息。每个模块都可以发布消息到 uORB 总线,也可以订阅其他模块发布的消息。这种设计使得系统具有高度的灵活性和可扩展性,允许开发者轻松地添加新的功能或修改现有功能,而不需要担心模块之间的紧密耦合。 该消息变量能够在PX4源码的msgs文件夹中找到,消息的定义在.msg文件中,编译后会生成对应的C++类,可以在模块中直接使用。

飞行控制栈

飞行堆栈是自主无人机制导、导航和控制算法的集合。它包括用于固定翼、多旋翼和 VTOL 机身的控制器,以及姿态和位置估算器。 下图显示了飞行堆栈的构建模块概览。它包含从传感器、遥控输入和自主飞行控制(导航仪)到电机或伺服控制(执行器)的整个流程。

PX4方案拓扑图

估算器接收一个或多个传感器输入,将其组合后计算出载具状态(例如,根据 IMU 传感器数据计算出车辆姿态)。 控制器是将设定点和测量值或估计状态(过程变量)作为输入的组件。其目标是调整过程变量的值,使其与设定点相匹配。输出是最终达到设定点的修正值。例如,位置控制器将位置设定点作为输入,过程变量是当前估计的位置,输出则是姿态和推力设定点,使飞行器向理想位置移动。 混控器接收力指令(如 "向右转弯")并将其转换为单个电机指令,同时确保不超过某些限制。这种转换针对具体的车辆类型,并取决于各种因素,例如相对于重心的电机布置或车辆的转动惯量。

中间件

中间件主要包括用于嵌入式传感器的设备驱动程序、与外部世界(配套计算机、GCS 等)的通信以及 uORB 发布-订阅信息总线。 此外,中间件还包括一个仿真层,允许 PX4 飞行代码在桌面操作系统上运行,并在仿真 "世界 "中控制计算机模型飞行器。

更新速率

由于模块需要等待信息更新,因此通常由驱动程序定义模块的更新速度。大多数 IMU 驱动程序以 1kHz 的频率对数据进行采样,然后以 250Hz 的频率进行整合和发布。系统的其他部分,如导航仪,不需要这么高的更新速度,因此运行速度要慢得多。

通过运行 uorb top,可以在系统上实时检查报文更新率。

运行时的环境

PX4 可在提供 POSIX-API 的各种操作系统(如 Linux、macOS、NuttX 或 QuRT)上运行。它还应具有某种形式的实时调度功能(如先进先出)。 模块间通信(使用 uORB)基于共享内存。整个 PX4 中间件在一个地址空间内运行,即所有模块共享内存。 根据系统的设计,只需极少的努力,就可以在单独的地址空间中运行每个模块(需要更改的部分包括 uORB、参数接口、dataman 和 perf)。 模块有两种不同的执行方式:

  • 任务:模块在自己的任务中运行,有自己的堆栈和进程优先级。
  • 工作队列任务:模块在共享工作队列上运行,与队列上的其他模块共享相同的堆栈和工作队列线程优先级。
  • 所有任务都必须相互合作,不能相互干扰。
  • 一个队列上可以运行多个工作队列任务,也可以有多个队列。
  • 工作队列任务是通过指定未来某个固定时间或通过 uORB 主题更新回调来安排的。

在工作队列上运行模块的优点是占用内存少,可能导致任务切换次数减少。缺点是工作队列任务不能休眠或对消息进行轮询,也不能进行阻塞性 IO(如从文件中读取)。运行时间长的任务(计算量大)可能也应在单独的任务或至少是单独的工作队列中运行。

在工作队列中运行的任务不会显示在顶部(只能看到工作队列本身,例如 wq:lp_default)。使用 work_queue status 可以显示所有活动的工作队列项目。

后台任务

px4_task_spawn_cmd() 用于启动新任务(NuttX)或线程(POSIX - Linux/macOS),这些任务独立于调用(父)任务运行:

independent_task = px4_task_spawn_cmd(
    "commander",                    // Process name
    SCHED_DEFAULT,                  // Scheduling type (RR or FIFO)
    SCHED_PRIORITY_DEFAULT + 40,    // Scheduling priority
    3600,                           // Stack size of the new task or thread
    commander_thread_main,          // Task (or thread) main function
    (char * const *)&argv[0]        // Void pointer to pass to the new task
                                    // (here the commandline arguments).
    );

操作系统相关的信息

NuttX NuttX 是在飞行控制板上运行 PX4 的主要 RTOS。它开源(BSD 许可)、轻量级、高效且非常稳定。

模块作为任务执行:它们有自己的文件描述符列表,但共享一个地址空间。一个任务仍然可以启动一个或多个共享文件描述符列表的线程。

每个任务/线程都有一个固定大小的堆栈,并有一个定期任务来检查所有堆栈是否有足够的剩余空间(基于堆栈着色)。

Linux/MacOS 在 Linux 或 macOS 上,PX4 在单个进程中运行,模块在各自的线程中运行(与 NuttX 没有任务和线程之分)。

PX4 控制器详解

除去执行器驱动与传感器算法,控制是PX4的核心。在开始讲解前,向各位安利一位控制方向讲解非常棒的up:DR_CAN 注:这些图表使用标准 PX4 术语(每个图表都有注释图例)。

多旋翼的控制架构

PX4方案拓扑图

  • 这是一个标准的级联控制架构。
  • 控制器采用P和PID控制的组合方式。
  • 估计值来自 EKF2。
  • 在某些模式下,外环(位置回路)可能会被绕过 (在图中表示为外环之后增加一个多路开关)。 只有在位置保持模式或某轴无速度请求时,位置回路才会发挥作用。

多旋翼姿态控制器

PX4方案拓扑图

  • 姿态控制器使用四元数。
  • 控制器就是根据这篇文章实现的。
  • 当你调整这个控制器时,唯一需要考虑的参数是增益 P。
  • 输出的角速率命令是饱和的。也就是说,姿态误差经 P 增益换算得到的期望角速率会被限制在预设的最大值内,避免误差过大时要求飞行器以超过其能力的速度旋转。

多旋翼角速率控制器

PX4方案拓扑图

  • 采用K-PID控制器。更多信息,请参见速率控制器
  • 为了防止积分饱和,积分环节的权重是受限的。
  • 输出受到限制(在控制分配模块中),通常为-1 和 1。
  • 在导数路径上使用低通滤波器 (LPF) 来降低噪声(陀螺仪驱动器为控制器提供滤波导数)。

IMU 流程为:陀螺仪数据 > 应用校准参数 > 消除估计偏差 > 陷波滤波器(IMU_GYRO_NF0_BW 和 IMU_GYRO_NF0_FRQ) > 低通滤波器(IMU_GYRO_CUTOFF) > 载具角速度(P 和 I 控制器使用的滤波角速度) > 导数 -> 低通滤波器(IMU_DGYRO_CUTOFF) > 载具角加速度(D 控制器使用的滤波角加速度)。 PX4方案拓扑图

多旋翼飞行器加速度到推力和姿态设定点的转换

  • 速度控制器生成的加速度设定点将转换为推力和姿态设定点。
  • 转换后的加速度设定点将达到饱和,并在垂直和水平推力中优先使用。
  • 推力饱和是在计算出相应推力后进行的: 1. 计算所需的垂直推力 (thrust_z) 2. 用 MPC_THR_MAX 使推力_z 饱和 3. 用 (MPC_THR_MAX^2 - thrust_z^2)^0.5 填充 thrust_xy

实现细节请参见 PositionControl.cppControlMath.cpp

多旋翼速度控制器

PX4方案拓扑图

  • 采用PID控制器来稳定速度。 该控制器输出的命令是加速度。
  • 积分器包括了一个采用钳制方法的反复位饱和措施。
  • 指令加速度不饱和 - 将对转换后的推力设定点和最大倾斜角应用饱和度。
  • 通过参数 MPC_XY_VEL_P_ACC、MPC_XY_VEL_I_ACC 和 MPC_XY_VEL_D_ACC 设置水平增益。
  • 通过参数 MPC_Z_VEL_P_ACC、MPC_Z_VEL_I_ACC 和 MPC_Z_VEL_D_ACC 设置垂直增益。

多旋翼位置控制器

PX4方案拓扑图

  • 采用简单的P控制器来控制速度。
  • 输出的速度命令是饱和的,目的是保持一定的速度限制。参见参数 MPC_XY_VEL_MAX。该参数设置可能的最大水平速度。它不同于最大期望速度 MPC_XY_CRUISE(自主模式)和 MPC_VEL_MANUAL(手动位置控制模式)。
  • 通过参数 MPC_XY_P 设置水平 P 增益。
  • 通过参数 MPC_Z_P 设置垂直 P 增益。

静态力矩 (PI) 缩放补偿 PX4方案拓扑图

  • 与模式相关的前馈(ff)--例如,任务模式轨迹生成器(颠簸限制轨迹)计算位置、速度和加速度设定点。
  • 加速度设定点(惯性框架)将(与偏航设定点一起)转换为姿态设定点(四元数)和集体推力设定点。

固定翼的控制架构

总能量控制系统(TECS)

总能量控制系统(TECS)的 PX4 实现可同时控制固定翼飞机的真实空速和高度。代码以库的形式实现,用于固定翼飞机位置控制模块。

PX4

从上面的图表可以看出,TECS 接收空速和高度设定值,并据此生成油门和俯仰角设定值。

这两个设定值随后进入固定翼控制链路:俯仰角设定值由固定翼姿态控制器负责跟踪;当油门设定值为有效的有限数值,且未检测到发动机故障时,该设定值会继续向后传递到执行器。也就是说,TECS 负责计算控制目标,而姿态控制器负责让飞机实际跟踪俯仰角。因此,空速和高度能否得到良好控制,很大程度上取决于俯仰控制环路的跟踪性能。如果俯仰角跟踪存在较大误差或响应不稳定,TECS 的能量调节指令就无法准确执行,最终会表现为空速和高度跟踪不佳。因此,在调整 TECS 之前,应先完成固定翼姿态控制器的调参。

同时控制飞机的空速和高度并不容易,因为俯仰角和油门都会同时影响这两个状态量。增大俯仰角通常会使飞机爬升、势能增加,但也会消耗动能,使空速下降;增加油门则会提高飞机的总能量,并同时影响爬升和空速。因此,空速和高度之间存在明显耦合,不能简单地让一个输入只负责控制一个输出。

TECS 的解决思路是把空速和高度统一转换为能量变量进行控制。飞机的总能量由动能和势能组成。油门主要用于改变飞机的总能量,俯仰角则主要用于在势能(高度)和动能(空速)之间重新分配能量。总能量一定时,抬高机头会将动能转换为势能,飞机上升而空速下降;压低机头则会将势能转换回动能,飞机下降而空速增加。这样,TECS 就可以利用油门调节总能量,利用俯仰角调节能量在高度和空速之间的分配,从而协调控制高度和空速,减弱两者的耦合。

总能量控制回路

PX4

比能量平衡控制回路

PX4

下面采用简化的纵向点质量模型,说明为什么 TECS 用油门调节总能量、用俯仰角调节能量分配。为突出基本关系,假设分析时段内飞机质量不变,升力近似垂直于飞行路径,暂不考虑侧滑和风的垂直分量。符号上方的点表示对时间求导,例如 $\dot{V}_T$ 表示真实空速的变化率(加速度)。实际飞行还会受到风、气动特性变化、发动机动态和执行器限幅等因素影响,因此以下公式用于解释控制原理,而不是完整的气动模型。

式中,$m$ 为飞机质量,$V_T$ 为真实空速,$h$ 为高度,$g$ 为重力加速度,$\gamma$ 为飞行路径角(爬升为正),$T$ 为推力,$D$ 为阻力。

  1. 将空速和高度表示为能量

飞机的总机械能由动能和势能组成:

$$ E_T=E_K+E_P=\frac{1}{2}mV_T^2+mgh $$

其中,$\frac{1}{2}mV_T^2$ 是动能:空速越大,动能越高;$mgh$ 是势能:高度越高,势能越高。仅从总能量的角度看,高度较高、空速较低与高度较低、空速较高的飞行状态可能是等价的。

  1. 求总能量变化率

对上式求时间导数可得:

$$ \dot{E}_T=mV_T\dot{V}_T+mg\dot{h} $$

第一项 $mV_T\dot{V}_T$ 是动能变化率:飞机加速时为正,减速时为负;第二项 $mg\dot{h}$ 是势能变化率:飞机爬升时为正,下降时为负。按质量归一化后,可得到 PX4 控制中常用的比总能量变化率

$$ e_T\triangleq\frac{E_T}{m}=\frac{1}{2}V_T^2+gh, \qquad \dot{e}_T=V_T\dot{V}_T+g\dot{h} $$

这里的 $\dot{e}_T$ 单位为 $\mathrm{m^2/s^3}$,表示单位质量飞机的总能量增加或减少得有多快。飞行路径的竖直速度满足:

$$ \dot{h}=V_T\sin(\gamma) $$

将其代入比总能量变化率,可得:

$$ \dot{e}_T =gV_T\left(\frac{\dot{V}_T}{g}+\sin(\gamma)\right) $$

为便于比较“加速”和“爬升”两项,还可以进一步按 $gV_T$ 归一化,记为 $r_E$:

$$ r_E\triangleq\frac{\dot{e}_T}{gV_T} =\frac{\dot{E}_T}{mgV_T} =\frac{\dot{V}_T}{g}+\frac{\dot{h}}{V_T} =\frac{\dot{V}_T}{g}+\sin(\gamma) $$

$r_E$ 是归一化后的总能量变化率,不是总能量 $E_T$ 本身。下文使用 $r_E$ 来避免与 $E_T$ 混淆。当飞行路径角较小且以弧度表示时,$\sin(\gamma)\approx\gamma$,因此:

$$ r_E\approx\frac{\dot{V}_T}{g}+\gamma $$
  1. 为什么油门主要控制总能量

沿飞行路径方向列写动力学方程:

$$ m\dot{V}_T=T-D-mg\sin(\gamma) $$

将重力沿飞行路径方向的分量移到等式左侧,并代入上面的 $r_E$,得到:

$$ T-D =m\dot{V}_T+mg\sin(\gamma) =mg\,r_E =\frac{\dot{E}_T}{V_T} $$

$T-D$ 称为过剩推力:它为正时,飞机的总能量增加;它为负时,飞机的总能量减少。由于油门会直接改变发动机或电机可提供的推力,油门自然是调节总能量的主要通道。

在稳态、直线、水平的配平飞行点,有 $T_0=D_0$、$\dot{V}_T=0$ 和 $\gamma=0$。在该工作点附近考察小扰动,有:

$$ \Delta T-\Delta D =mg\left(\frac{\dot{V}_T}{g}+\sin(\gamma)\right) $$

若进一步忽略小范围内的阻力变化($\Delta D\approx0$),并采用小角度近似,则可写成:

$$ \Delta T\approx mg\left(\frac{\dot{V}_T}{g}+\gamma\right)=mg\,r_E $$

这说明增加推力会产生正的过剩推力,从而增加总能量。该近似式用于说明控制方向,并不表示 TECS 直接按公式把推力换算成油门开度;实际控制器会结合飞机性能参数、状态反馈和油门限幅计算最终油门设定值。

  1. 为什么俯仰角主要控制能量平衡

将比势能和比动能的变化率分别写为:

$$ \dot{e}_P=g\dot{h}, \qquad \dot{e}_K=V_T\dot{V}_T $$

总能量变化率取两者之和,而能量平衡变化率取两者之差:

$$ \dot{e}_T=\dot{e}_P+\dot{e}_K, \qquad \dot{e}_{\mathrm{bal}}\triangleq\dot{e}_P-\dot{e}_K $$

同样按 $gV_T$ 归一化后,可定义能量平衡变化率:

$$ \dot{B}\triangleq\frac{\dot{e}_{\mathrm{bal}}}{gV_T} =\frac{g\dot{h}-V_T\dot{V}_T}{gV_T} =\sin(\gamma)-\frac{\dot{V}_T}{g} \approx\gamma-\frac{\dot{V}_T}{g} $$

当 $\dot{B}>0$ 时,势能的增加相对于动能的增加更占优势,通常对应抬头、爬升或减速;当 $\dot{B}<0$ 时,动能的增加更占优势,通常对应低头、下降或加速。俯仰角改变会直接改变飞行路径角 $\gamma$,因此适合用来调节这个“势能与动能之间的偏向”。

在油门短时间内基本不变、且忽略由升降舵偏转带来的阻力变化时,抬头会使一部分动能转换为势能,低头则使一部分势能转换为动能。这正是俯仰通道主要负责能量分配的原因。需要注意的是,升降舵并非严格“能量守恒”:它会改变升力、阻力和飞行轨迹,因此也会对总能量产生次要影响;TECS 只是将油门视为总能量的主要调节通道,将俯仰视为能量平衡的主要调节通道。

例如,若飞机抬头爬升时满足 $g\dot{h}\approx-V_T\dot{V}_T$,则 $\dot{e}_T\approx0$,说明主要是在用空速交换高度;但 $\dot{e}_{\mathrm{bal}}>0$,说明能量分配已明显偏向势能。此时,维持配平所需的油门仍用于克服阻力,而俯仰通道是完成这次“以空速换高度”的主要手段。

综上,TECS 将原本相互耦合的高度和空速问题转换为两个互补的控制目标:油门主要跟踪 $\dot{e}_T=\dot{e}_P+\dot{e}_K$,以增减总能量;俯仰角主要跟踪 $\dot{e}_{\mathrm{bal}}=\dot{e}_P-\dot{e}_K$,以调整势能和动能的分配。这样便能在同时满足高度和空速需求时,降低两个控制通道之间的相互干扰。

固定翼姿态控制器

PX4

固定翼姿态控制器采用级联结构,由姿态外环和角速率内环组成。外环比较姿态设定值与估计姿态之间的误差,并通过比例控制器将姿态误差转换为角速率设定值;内环再比较角速率设定值与实际角速率之间的误差,并通过比例-积分(PI)控制器生成期望的角加速度设定值。简而言之,外环决定飞机应以多快的速度改变姿态,内环负责让飞机的实际角速率跟随这一要求。

随后,控制分配器(传统上也称为混控器)根据期望的角加速度以及机体和执行器的模型,计算副翼、升降舵、方向舵等控制面的偏转角,并将控制指令发送给执行器。控制面产生的力矩与空速和空气密度密切相关:空速较高时,控制面更有效;空速较低时,控制面产生的力矩会减弱。因此,姿态控制器通常以配平或巡航空速为基准进行调参,并在启用空速传感器时,根据实时空速对控制器输出进行缩放,以保持不同空速下相近的控制性能。

如果没有空速传感器,固定翼姿态控制器就无法根据实时空速进行增益调度,只能采用开环的空速缩放方式;同时,TECS 也无法利用实测空速反馈对控制结果进行修正。因此,在没有空速传感器的情况下,飞行器在不同空速下的姿态和空速控制性能可能会有所变化。

前馈增益用于补偿气动阻尼。飞机绕机体轴的力矩主要由两部分组成:控制面产生的力矩用于驱动飞机转动,而气动阻尼力矩与角速率有关,用于抵抗这种转动。若完全依靠 PI 控制器,必须先等到出现角速率误差,控制器才会增加控制面偏转;加入前馈后,控制器可以根据期望角速率预先提供一部分控制量,用来抵消气动阻尼。因此,在保持恒定角速率时,前馈能够减小内环的跟踪误差,并改善姿态响应。

转弯协调

滚转和俯仰控制器具有相同的结构,并且假设纵向和横向动力学足够解耦,可以独立工作。 但是,为了将飞机侧滑产生的侧向加速度最小化,偏航控制器利用转向协调约束产生偏航速率设定值。转弯协调算法完全基于协调转弯几何计算。

$\dot{\Psi}_{sp}=\frac{g}{V_T}\tan\phi_{sp}\cos\theta_{sp}$

偏航率控制器还有助于抵消偏航的不利影响,并通过提供额外的方向阻尼来抑制荷兰滚模式。

空速缩放

本节的目的是借助方程式解释为什么以及如何使速率 PI 和前馈 (FF) 控制器的输出随空速变化以改善控制性能。我们将首先介绍滚转轴上的简化线性力矩方程,然后说明空速对直接力矩产生的影响,最后说明匀速滚转时空速的影响。

如上文固定翼姿态控制器所示,速率控制器为控制分配器(此处命名为 "混控器")产生角加速度设定点。为了产生这些所需的角加速度,混控器利用可用的空气动力控制面(例如:标准飞机通常有两个副翼、一个升降舵和一个方向舵)产生扭矩。这些控制面产生的扭矩受相对空速和空气密度的影响很大,或者更准确地说,受动态压力的影响很大。如果不对空速进行缩放,针对特定巡航空速进行严格调整的控制器会使飞机在较高空速下产生振荡,或在低空速下产生不良的跟踪性能。

读者应注意真实空速(TAS)指示空速(IAS)之间的区别,因为在非海平面飞行时,两者的数值有很大不同。

动(态)压(力)的定义是:

$\bar{q}=\frac{1}{2}\rho V_T^2$

其中$\rho$是空气密度,而$V_T$为真实空速(TAS)。 以本节其余部分的滚转轴为例,滚转力矩的维数可写成:

$\ell=\frac{1}{2}\rho V_T^2SbC_\ell=\bar{q}SbC_\ell$

其中,$\ell$ 是实际滚转力矩(单位为 $\mathrm{N\cdot m}$),$b$ 是翼展,$S$ 是参考面积。这里的 $C_\ell$ 不是“滚转力矩导数”,而是无量纲滚转力矩系数,定义为:

$$ C_\ell=\frac{\ell}{\bar{q}Sb} $$

也就是说,$C_\ell$ 来自将实际滚转力矩按动压 $\bar{q}$、参考面积 $S$ 和参考长度 $b$ 无量纲化。对于某一具体机型,实际的滚转力矩由机翼、尾翼和机身表面的气动力分布共同产生;其 $C_\ell$ 数值或气动模型参数通常由风洞试验、CFD 分析、飞行试验辨识或经验气动数据库获得,而不是由 PX4 控制器本身计算出来。

在某个配平工作点附近,可将 $C_\ell$ 对侧滑、滚转角速度和副翼偏转作一阶泰勒展开:

$$ C_\ell\approx C_{\ell_0}+C_{\ell_\beta}\beta+C_{\ell_p}\frac{b}{2V_T}p+C_{\ell_{\delta_a}}\delta_a $$

其中,$C_{\ell_0}$ 是配平点的基准滚转力矩系数;$C_{\ell_\beta}$ 是侧滑滚转稳定导数(也常称为上反角效应导数);$C_{\ell_p}$ 是滚转阻尼导数;$C_{\ell_{\delta_a}}$ 是副翼操纵效能导数。它们分别表示 $C_\ell$ 对相应变量的局部变化率:

$$ C_{\ell_\beta}=\left.\frac{\partial C_\ell}{\partial\beta}\right|_0, \qquad C_{\ell_p}=\left.\frac{\partial C_\ell}{\partial\left(bp/(2V_T)\right)}\right|_0, \qquad C_{\ell_{\delta_a}}=\left.\frac{\partial C_\ell}{\partial\delta_a}\right|_0 $$

其中,$\beta$ 是侧滑角,$p$ 是机体系滚转角速度,$\delta_a$ 是副翼偏转角。注意原式中的 $C_{\ell_{\delta_\alpha}}$ 应为 $C_{\ell_{\delta_a}}$:下标 $a$ 表示 aileron(副翼),而 $\alpha$ 通常表示迎角。

若以无副翼偏置的对称配平状态作为线性化基准,则 $C_{\ell_0}\approx0$;若再假设协调飞行,则 $\beta\approx0$。此时只保留滚转阻尼和副翼产生的滚转力矩,可将方程简化为:

$\ell=\frac{1}{2}\rho V_T^2Sb\left[C_{\ell_{\delta_a}}\delta_a+C_{\ell_p}\frac{b}{2V_T}p\right]$

接下来的两个小节将以这一最终方程为基准,确定 PI 和前馈控制器所需的空速比例表达式。

静态力矩 (PI) 缩放补偿

在零速率条件下($p = 0$)时,阻尼项消失,并可通过以下方式产生恒定的瞬时扭矩:

$\ell=\frac{1}{2}\rho V_T^2SbC_{\ell_{\delta_a}}\delta_a=\bar{q}SbC_{\ell_{\delta_a}}\delta_a$

其中$\delta_a$为

$\delta_a=\frac{2}{\rho V_T^2SbC_{\ell_{\delta_a}}}\ell=\frac{1}{\bar{q}SbC_{\ell_{\delta_a}}}\ell$

其中第一个分数是常数,第二个分数取决于空气密度和真实空速的平方。

此外,指示空速(IAS,$V_I$)本质上是由空气密度调整的,因为在低高度和低速度下,IAS 可以通过简单的密度误差系数转换为 TAS

$V_T=V_I\sqrt{\frac{\rho_0}{\rho}}$

其中$\rho_o$是 15°C 时海平面的空气密度。

将两边平方、重新排列并加上 1/2 因子,就得到了动态压力$\bar q$表达式

$\bar{q}=\frac{1}{2}\rho V_T^2=\frac{1}{2}V_I^2\rho_0$

现在我们不难看出,动压与 IAS 平方成正比:

$\bar{q}\propto V_I^2$

之前包含 TAS 和空气密度的标度器最终只需使用 IAS 即可写出

$\delta_a=\frac{2}{\rho_0SbC_{\ell_{\delta_a}}}\frac{1}{V_I^2}\ell$

角速率回路 (前馈) 缩放补偿

速率控制器前馈的主要用途是补偿自然速率阻尼。再次从基线尺寸方程出发,但这次是在匀速滚转时,副翼产生的扭矩应完全补偿阻尼,例如

$-C_{\ell_{\delta_a}}\delta_a=C_{\ell_p}\frac{b}{2V_T}p$

重排后得出理想的副翼舵偏

$\delta_a=-\frac{bC_{\ell_p}}{2C_{\ell_{\delta_a}}}\frac{1}{V_T}p$

第一个分数给出了理想前馈的值,我们可以看到其缩放与 TAS 呈线性关系。请注意,负号会被同样为负的滚转阻尼导数吸收。

总结

速率 PI 控制器的输出必须与指示空速 (IAS) 的平方成比例,而速率前馈 (FF) 的输出必须与真实空速 (TAS) 成比例。

$\delta_a=\frac{V_{I_0}^2}{V_I^2}\delta_{a_{PI}}+\frac{V_{T_0}}{V_T}\delta_{a_{FF}}$

其中$V_{I_0}$和$V_{T_0}$分别为微调条件下的 IAS 和 TAS。

最后,由于执行器输出已归一化,且混控器和伺服模块被假定为线性,我们可以将最后一个等式重写如下:

$\dot{\omega}_{sp}^b=\frac{V_{I_0}^2}{V_I^2}\dot{\omega}_{sp_{PI}}^b+\frac{V_{T_0}}{V_T}\dot{\omega}_{sp_{FF}}^b$

并直接在滚转率、俯仰率和偏航率控制器中实现。

如果机身的控制性能不直接取决于空速,例如自动旋翼机。可以通过FW_ARSP_SCALE_EN参数禁用空速缩放功能。

优化建议

这种空速缩放算法的优点是不需要任何特定的调整。不过,空速测量的质量会直接影响其性能。

此外,为了获得最大的稳定飞行包络线,应该在失速速度和飞行器最大空速之间的中心空速值上调整姿态控制 器(例如:可在 15 至 25 米/秒之间飞行的飞机应调整为 20 米/秒)。该 "调整 "空速应在FW_AIRSPD_TRIM参数中设置。

VTOL 飞行控制器

PX4

本节简要介绍垂直起降(VTOL)飞机的控制结构。VTOL 将多旋翼的垂直起降与悬停能力、固定翼的高速巡航与较高航程效率结合在同一机体上。因此,PX4 同时具备多旋翼和固定翼两套控制链路:在多旋翼模式下主要使用多旋翼控制器,在固定翼模式下主要使用固定翼控制器,而在前向或后向转换阶段则按机型和转换进度对两套控制指令进行选择、混合或切换。

上图是简化的控制框图。其中,VTOL 姿态控制器并不重新实现一套独立的姿态控制算法;它更像位于两套控制器与执行器之间的“模式管理器”。该模块依据当前状态(多旋翼、固定翼、向前转换或后向转换)选择或混合两套控制器的姿态、扭矩和推力设定值,并执行机型相关的转换逻辑。例如,标准 VTOL 在向前转换时会逐步提高推拉电机的油门以建立前向速度;倾转旋翼机还需协调倾转机构和升力电机;尾座式则需要处理机体姿态旋转带来的控制切换。

图中的多旋翼和固定翼输入被称为“虚拟输入”,是因为它们首先发布到仅供 VTOL 模块内部选择和处理的独立主题,而不会直接发送给最终执行器。处于纯多旋翼模式时,VTOL 模块主要采用多旋翼侧的虚拟输入,固定翼侧输入通常不参与输出;处于纯固定翼模式时则相反;进入转换阶段后,模块会根据机型和转换进度同时使用、逐步混合,或在特定阶段切换这些输入。这样可以让两套控制器并行提供所需信息,同时避免不适用的控制指令直接作用于执行器。

对于标准和倾转旋翼 VTOL,在过渡期间,固定翼姿态控制器会产生速率设定点,然后将其输入单独的速率控制器,从而为多旋翼和固定翼作动器发出扭矩指令。对于尾翼飞行器,在过渡期间多旋翼飞行器姿态控制器处于运行状态。

VTOL 姿态块的输出是多旋翼飞行器和固定翼飞行器作动器的单独扭矩和力指令(vehicle_torque_setpoint 和 vehicle_thrust_setpoint 两个实例)。这些指令由机身专用的控制分配类处理。

有关调整 VTOL 程序块内部转换逻辑的更多信息,请参阅VTOL 配置

效能矩阵

上一节中,姿态和速率控制器已经给出了机体期望的扭矩、推力指令,但这些指令只说明“飞机需要产生什么作用”,还没有说明“每台电机或每个舵面应如何动作”。控制分配器正是利用控制效能矩阵(control effectiveness matrix)完成这一步转换。这里的“效能”指执行器对各控制轴产生力或力矩的相对作用能力,不是电机的能源效率或推进效率。

1. 控制目标与执行器命令的增量关系

从物理意义上,可将待分配的六维控制量写为:

$$ \mathbf c= \begin{bmatrix} M_x\\M_y\\M_z\\F_x\\F_y\\F_z \end{bmatrix} $$

其中,$M_x$、$M_y$、$M_z$ 分别表示滚转、俯仰、偏航力矩,$F_x$、$F_y$、$F_z$ 表示机体系三个方向的力或推力分量。PX4 的控制分配接口也按“滚转、俯仰、偏航、$x$/$y$/$z$ 推力”这一顺序组织控制轴。实际主题中的数值还会经过归一化和机型相关缩放,因此本节重点讨论它们的方向和相对作用,而不将其直接等同于某个固定单位下的力矩值。

设一架飞行器有 $m$ 个可分配执行器,其命令为:

$$ \mathbf u= \begin{bmatrix} u_1\\u_2\\\vdots\\u_m \end{bmatrix} $$

在某个配平或线性化工作点附近,执行器命令的小变化与控制量的小变化可近似写成:

$$ \Delta\mathbf c\approx\mathbf B\Delta\mathbf u $$

其中,$\mathbf B\in\mathbb R^{6\times m}$ 就是控制效能矩阵:

$$ \mathbf B= \begin{bmatrix} b_{11} & b_{12} & \cdots & b_{1m}\\ b_{21} & b_{22} & \cdots & b_{2m}\\ \vdots & \vdots & \ddots & \vdots\\ b_{61} & b_{62} & \cdots & b_{6m} \end{bmatrix} $$

矩阵的每一行对应一个控制轴,每一列对应一个执行器。第 $i$ 列描述“只增大第 $i$ 个执行器时,六个控制轴分别会怎样变化”,即:

$$ \mathbf b_i= \left.\frac{\partial\mathbf c}{\partial u_i}\right|_{\mathbf u_0} $$

因此,某个元素 $b_{ji}$ 的正负表示作用方向,绝对值表示相对作用强弱。它不是万能常数,而是工作点附近的局部模型;执行器安装位置、方向、气流状态和可用性改变后,其实际效能也会改变。

2. 电机和舵面条目从哪里来

以旋翼 $i$ 为例,PX4 的几何模型会使用它相对重心的位置 $\mathbf r_i$、推力轴方向 $\mathbf a_i$、推力效能系数 $c_{T,i}$ 以及反扭矩比 $k_{m,i}$。若在当前工作点附近把推力响应线性化,则可以用下式理解该旋翼对机体的作用:

$$ \begin{aligned} \Delta\mathbf f_i&=c_{T,i}\mathbf a_i\Delta u_i\\ \Delta\boldsymbol{\tau}_i&=\mathbf r_i\times\Delta\mathbf f_i-c_{T,i}k_{m,i}\mathbf a_i\Delta u_i \end{aligned} $$

第一项 $\mathbf r_i\times\Delta\mathbf f_i$ 是推力作用点偏离重心产生的力臂力矩,主要决定滚转和俯仰条目;第二项表示螺旋桨反扭矩,其符号约定已包含在旋转方向和 $k_{m,i}$ 中,主要影响偏航条目。力向量本身则填入 $F_x$、$F_y$、$F_z$ 三行。也就是说,一列矩阵数据本质上就是该旋翼“位置 + 推力方向 + 转向”共同决定的结果。

例如,对常见四旋翼而言,四台电机同时增速主要改变总垂向推力;左右或前后电机的差动推力会通过力臂产生滚转或俯仰力矩;按相反旋向成对增减转速则会产生偏航力矩。具体哪台电机取正、哪台取负,取决于机体坐标系、编号、旋转方向和安装方式,不能脱离实际配置死记符号。

固定翼舵面的列通常会更加耦合:副翼主要产生滚转力矩,升降舵主要产生俯仰力矩,方向舵主要产生偏航力矩;而升降副翼(elevon)的一列可同时在滚转和俯仰两行中具有非零值。舵面效能还随动压变化,因此配置中的 Roll scale、Pitch scale、Yaw scale 描述的是相对控制效能,而不是姿态或速率控制器的 PID 增益。前文的气动系数 $C_\ell$ 则用于描述飞机的滚转气动力矩;$\mathbf B$ 用于描述“执行器命令如何被分配到控制轴”,两者不能混为一谈。

3. 如何由控制目标反求执行器命令

控制器给出的是 $\Delta\mathbf c$,而分配器需要求的是 $\Delta\mathbf u$,因此这是一个反问题。在没有饱和且模型有效的理想情况下,若采用伪逆分配(伪逆法是PX4内进行控制分配的方法),可将其概括为:

$$ \Delta\mathbf u=\mathbf B^+\Delta\mathbf c $$

其中,$\mathbf B^+$ 是 $\mathbf B$ 的伪逆。若 $\mathbf B$ 恰好是可逆的方阵,伪逆退化为普通逆矩阵;但实际飞行器通常不是这种情况:四旋翼有四个执行器却只需主要控制四个独立目标,六旋翼、八旋翼则有冗余执行器,固定翼和 VTOL 又常有不同数量、不同类型的执行器。伪逆可以在多个可行分配方案中给出一个标称解,并在控制量无法完全满足时给出最小二乘意义下的近似解。

实际分配不能简单地从全零命令开始。舵机可能有中位偏置,旋翼也可能需要一个配平或线性化工作点。因此,PX4 中使用伪逆时可将主要计算理解为:

$$ \mathbf u_{sp}=\mathbf u_{trim}+\mathbf B^+\left(\mathbf c_{sp}-\mathbf c_{trim}\right) $$

$\mathbf u_{trim}$ 是执行器的配平命令,$\mathbf c_{trim}$ 是与线性化点相对应的控制量。这样做的含义是:分配器在已有的工作点周围叠加增量,而不是把每次控制需求都当成从零开始的新问题。

PX4 并不对所有机型固定使用同一种求解方式。其控制分配器提供伪逆分配和顺序去饱和等方法,具体选择由机型和参数决定。伪逆便于理解理想反算;顺序去饱和则从初始分配结果出发,根据控制轴优先级调整输出,以尽量减少执行器超限。在多旋翼的某些空中模式策略中,系统可以适当改变集体推力来保留滚转、俯仰控制能力,而偏航需求可能被优先削减。

4. 饱和、失效与未分配控制量

所有执行器都受到行程、转速和响应速率限制:

$$ u_{\min,i}\leq u_{sp,i}\leq u_{\max,i} $$

一旦某台电机已到最大转速,或舵面已到最大偏角,即使矩阵反算出了更大的命令也无法真正执行。此时实际产生的控制量为:

$$ \Delta\mathbf c_{alloc}=\mathbf B\Delta\mathbf u_{actual} $$

它可能小于或不同于期望的 $\Delta\mathbf c$。两者之差就是未能分配的控制需求。PX4 会在控制分配状态中发布相应的分配结果和未分配控制量,因而调试时不能只看控制器输出,还应检查是否存在长期饱和、某一轴持续无法满足,或执行器方向配置错误。

执行器失效时同样如此:分配器可以根据已知失效状态将故障执行器排除或调整剩余执行器的任务分配,但无法凭空创造原本不存在的控制自由度。例如,剩余电机的几何布局若不能形成足够的偏航力矩,就只能接受偏航控制能力下降。效能矩阵的秩和各列的几何分布,决定了飞行器在冗余和故障条件下究竟还能控制哪些轴。

5. VTOL 中的动态效能

对 VTOL 而言,效能矩阵尤其不能被理解为一张永久不变的表。可将其概念化为:

$$ \mathbf B=\mathbf B\left(\lambda,\;\text{flight phase},\;\text{actuator availability}\right) $$

其中,$\lambda$ 可表示倾转角,但它在不同 VTOL 构型中的含义并不相同。下面将常说的复合翼和倾转旋翼分开讨论。这里的“复合翼”特指 PX4 的标准 VTOL(常称 QuadPlane):悬停旋翼与固定翼推进、舵面属于相对独立的执行器组,而不是所有旋翼都能连续倾转。

5.1 复合翼(标准 VTOL / QuadPlane):以执行器组切换为主

概念上,可将标准 VTOL 的执行器命令分为升力旋翼、前推电机(若有)和固定翼舵面三组:

$$ \mathbf u= \begin{bmatrix} \mathbf u_{\mathrm{lift}}\\ \mathbf u_{\mathrm{pusher}}\\ \mathbf u_{\mathrm{surface}} \end{bmatrix}, \qquad \mathbf B_{\mathrm{std}}= \begin{bmatrix} \mathbf B_{\mathrm{lift}} & \mathbf B_{\mathrm{pusher}} & \mathbf B_{\mathrm{surface}} \end{bmatrix} $$

若仅从执行器可用性的角度抽象,当前飞行阶段的有效模型可写为:

$$ \mathbf B_{\mathrm{active}}=\mathbf B_{\mathrm{std}}\mathbf D_{\mathrm{phase}} $$

其中,$\mathbf D_{\mathrm{phase}}$ 是表示执行器是否参与分配的对角矩阵;某个执行器被停止或禁止参与时,对应的对角元为零。悬停时,升力旋翼主要提供 $F_z$ 以及滚转、俯仰、偏航力矩;前飞时,垂直升力旋翼可被标记为停止,前推电机和舵面成为主要执行器;转换阶段则体现为这些执行器组的可用性和上游控制指令来源逐步改变。

在 PX4 的专用标准 VTOL 效能模型中,电机和固定翼舵面分别维护在不同的分配矩阵中。这样做强调的是“不同执行器组在不同阶段承担不同任务”,而不是让一台固定安装的升力电机在矩阵中连续改变推力轴。标准 VTOL 的动态性主要来自飞行阶段、执行器启停和控制链路切换;至于何时选用或过渡多旋翼侧与固定翼侧的控制指令,仍由上游 VTOL 模式管理和姿态控制逻辑决定,不能把它全部归结为控制分配。

5.2 倾转旋翼:以推力轴随倾角连续变化为主

倾转旋翼的关键差异是:同一台旋翼既服务于悬停,也服务于前飞,其推力方向会随倾转角连续改变。以机体系 FRD、旋翼在 $\lambda=0$ 时向上产生推力、并向机头方向倾转为例,可示意为:

$$ \mathbf a_i(\lambda)= \begin{bmatrix} \sin\lambda\\ 0\\ -\cos\lambda \end{bmatrix} $$

这只是朝前倾转时的简化表达;实际方向还取决于倾转平面、安装位置和各倾转机构的几何参数。将 $\mathbf a_i(\lambda)$ 代入上一节的旋翼力、力矩关系后,第 $i$ 个旋翼对应的矩阵列可概念化为:

$$ \mathbf b_i(\lambda)= \begin{bmatrix} c_{T,i}\mathbf r_i\times\mathbf a_i(\lambda)-c_{T,i}k_{m,i}\mathbf a_i(\lambda)\\ c_{T,i}\mathbf a_i(\lambda) \end{bmatrix} $$

因此,当旋翼由竖直方向逐渐转向前方时,$F_x$ 项逐步增强、向上推力对应的 $F_z$ 项逐步减弱;由于力臂叉乘项也随推力方向改变,滚转、俯仰和偏航力矩项同样可能变化。这才是倾转旋翼中 $\mathbf B(\lambda)$ 的核心含义:同一执行器对应的列会随 $\lambda$ 连续变化,而不只是被简单地启用或停用。

在 PX4 的专用倾转旋翼效能模型中,电机推力轴会根据集体倾转状态更新;电机与倾转机构归入一组分配模型,固定翼舵面归入另一组。倾转舵机若被配置为参与偏航或俯仰控制,其自身也会在相应力矩行中产生效能;偏航究竟主要依赖差动推力还是差动倾转,取决于具体构型和配置。进入固定翼飞行后,具有倾转机构的旋翼通常仍用于前向推进;被停止的是没有关联倾转机构、仅用于垂直升力的电机,而不是所有电机。

上述说明并不表示 PX4 会在每个周期都通过完整气动模型精确辨识整架飞机。效能矩阵主要提供可用于实时分配的结构化局部模型;舵面随动压变化的实际效能还会受到空速、配平和控制器空速缩放等因素影响,专用 VTOL 逻辑与执行器限幅则共同处理其余的非线性和工况变化。

6. 配置与验证要点

效能矩阵是否正确,首先取决于机体配置是否忠实反映真实硬件。电机位置应以重心为原点,并遵循机体系 FRD(前、右、下)坐标约定;推力轴、旋转方向、反扭矩比、舵面类型、舵面配平和输出映射也必须与实际安装一致。逻辑执行器编号正确并不代表物理接线正确,仍需要通过执行器测试确认每一路输出驱动的是预期电机或舵机,且运动方向正确;进行电机测试时应遵循平台安全流程并拆除螺旋桨。

若飞机出现“给滚转指令却明显带来俯仰或偏航”“某一舵面方向相反”“满油门时姿态无法保持”等现象,应优先检查几何、输出映射和效能配置,再调整 PID 参数。控制器决定需要多大的扭矩和推力,效能矩阵决定这些需求能否被正确地交给真实执行器;二者共同决定最终的飞行控制效果。

← 返回文章列表 回到顶部
文章目录16 节

目录