深入理解多旋翼飞行器姿态控制中的倾转分离
深入理解多旋翼飞行器姿态控制中的倾转分离(Tilt-Prioritized Control)
摘要:倾转分离(Tilt-Torsion Decomposition / Tilt-Prioritized Control)是现代多旋翼飞行器姿态控制中的核心技术之一。本文从物理原理、数学推导和工程实现三个维度,系统阐述为什么要将飞行器的姿态运动分解为"倾斜"和"旋转"两个独立分量,以及PX4飞控是如何实现这一控制策略的。
一、什么是倾转分离?
1.1 基本概念
在多旋翼飞行器的姿态控制中,我们通常使用欧拉角(Roll、Pitch、Yaw)或四元数来描述飞行器的姿态。然而,从控制的角度来看,这三个自由度并不是同等重要的。
倾转分离的核心思想是将飞行器的姿态运动分解为两个相互独立的部分:
| 运动类型 | 英文术语 | 物理含义 | 对应轴 |
|---|---|---|---|
| 倾斜(Tilt) | Reduced Attitude | 机体Z轴方向的改变,即推力矢量方向 | Roll + Pitch |
| 旋转(Torsion) | Yaw | 绕机体Z轴的旋转运动,即航向角 | Yaw |
用更直观的方式理解:
- 倾斜决定了飞行器"往哪个方向加速"
- 旋转决定了飞行器"机头朝向哪里"
1.2 几何表示
从几何角度,倾斜运动可以用二维单位球面 S² 上的一个点来表示——这个点就是飞行器推力矢量在惯性坐标系中的指向。苏黎世联邦理工学院(ETH Zurich)的Brescianini等人在其开创性论文中提出了"Reduced Attitude"(简化姿态)的概念:
“To achieve position regulation or trajectory tracking in the Cartesian space, it is only needed to control the thrust direction of the vehicle; this is possible since any rotation about the thrust axis does not affect the quadrotor’s motion in the Cartesian space.”
——《Tilt-Prioritized Quadrocopter Attitude Control》, IEEE TCST, 2018
这意味着,对于位置控制任务,我们只需要控制推力方向(2个自由度),而不需要完整的姿态控制(3个自由度)。
二、为什么要进行倾转分离?
2.1 力矩产生机理的本质差异
多旋翼飞行器产生横滚/俯仰力矩与偏航力矩的物理机制完全不同:
横滚/俯仰力矩(倾斜运动)
通过升力差产生。当对角电机差速运转时,一侧升力大于另一侧,形成绕X或Y轴的力矩:
τroll=L⋅(F2+F3−F1−F4)\tau_{roll} = L \cdot (F_2 + F_3 - F_1 - F_4)τroll=L⋅(F2+F3−F1−F4)
τpitch=L⋅(F1+F2−F3−F4)\tau_{pitch} = L \cdot (F_1 + F_2 - F_3 - F_4)τpitch=L⋅(F1+F2−F3−F4)
其中 LLL 是电机到机体中心的力臂,FiF_iFi 是各电机推力。
偏航力矩(旋转运动)
通过反扭矩产生。螺旋桨旋转时对空气施加扭矩,根据牛顿第三定律,空气对螺旋桨施加反作用扭矩。相邻电机反向旋转,当顺时针与逆时针电机组的转速不平衡时,产生净偏航力矩:
τyaw=kτ⋅(ω12−ω22+ω32−ω42)\tau_{yaw} = k_\tau \cdot (\omega_1^2 - \omega_2^2 + \omega_3^2 - \omega_4^2)τyaw=kτ⋅(ω12−ω22+ω32−ω42)
其中 kτk_\taukτ 是扭矩系数,ωi\omega_iωi 是电机转速。
关键区别:
- 升力差力矩直接与推力成正比,力臂为电机到中心距离(通常15-25cm)
- 反扭矩与转速平方成正比,但系数 kτk_\taukτ 远小于推力系数 kTk_TkT
根据典型参数,产生相同角加速度所需的偏航力矩控制量,是横滚/俯仰的5-10倍。
2.2 转动惯量的显著差异
多旋翼飞行器的转动惯量矩阵通常为对角阵:
J=[Ixx000Iyy000Izz]\mathbf{J} = \begin{bmatrix} I_{xx} & 0 & 0 \\ 0 & I_{yy} & 0 \\ 0 & 0 & I_{zz} \end{bmatrix}J=Ixx000Iyy000Izz
对于典型的X型四旋翼:
- Ixx≈IyyI_{xx} \approx I_{yy}Ixx≈Iyy(横滚/俯仰转动惯量相近)
- Izz≈1.5∼2×IxxI_{zz} \approx 1.5 \sim 2 \times I_{xx}Izz≈1.5∼2×Ixx(偏航转动惯量显著更大)
这是因为电机、电池等质量主要分布在水平面内。根据牛顿-欧拉方程:
τ=I⋅ω˙\tau = I \cdot \dot{\omega}τ=I⋅ω˙
相同力矩下,偏航方向的角加速度更小,响应更慢。
| 参数 | 典型值 | 单位 |
|---|---|---|
| IxxI_{xx}Ixx | 0.0083 | kg·m² |
| IyyI_{yy}Iyy | 0.0083 | kg·m² |
| IzzI_{zz}Izz | 0.0155 | kg·m² |
2.3 位置控制的解耦特性
这是倾转分离最重要的理论基础。考虑四旋翼的位置动力学方程:
mp¨=mg+R⋅[00−T]m\ddot{\mathbf{p}} = m\mathbf{g} + \mathbf{R} \cdot \begin{bmatrix} 0 \\ 0 \\ -T \end{bmatrix}mp¨=mg+R⋅00−T
其中 R\mathbf{R}R 是姿态旋转矩阵,TTT 是总推力。
关键洞察:位置动力学仅与推力方向(即 R\mathbf{R}R 的第三列 Re3\mathbf{R}e_3Re3)相关,与偏航角完全无关。
换言之:
- 改变横滚/俯仰 → 改变推力方向 → 改变位置加速度
- 改变偏航 → 只改变机头朝向 → 不影响位置
ETH Zurich的研究团队在2013年的技术报告中正式证明了这一解耦特性,并在IEEE TCST 2018的论文中给出了完整的稳定性分析。
2.4 控制资源的合理分配
当飞行器执行激进机动(如翻滚、快速避障)或从大误差中恢复时,电机推力可能接近饱和。此时,控制分配算法需要决定如何分配有限的控制资源。
倾转优先策略的优先级排序:
- 最高优先级:横滚/俯仰力矩(保证推力方向正确)
- 次高优先级:总推力(保证不坠机)
- 最低优先级:偏航力矩(航向可以稍后纠正)
“The highest priority is given to achieving the desired roll and pitch torque. Since both the position and the reduced attitude error dynamics are independent of the vehicle’s yaw orientation, the second highest priority is given to achieving the desired collective thrust and the least priority is given to the yaw torque.”
——Brescianini & D’Andrea, 2018
2.5 对称性与航向无关性
多旋翼飞行器通常具有X或Y轴对称性。对于自主飞行任务(如航点飞行、悬停、轨迹跟踪):
- 机头朝向"东"或"北"对任务执行没有本质区别
- 保持推力方向正确才是安全飞行的关键
因此,PX4等飞控软件提供了"航向锁定"模式,在航线飞行时保持航向不变,将控制资源集中于位置和姿态稳定。
三、数学原理与四元数表示
3.1 姿态误差的分解
设当前姿态四元数为 q\mathbf{q}q,期望姿态四元数为 qd\mathbf{q}_dqd。传统方法计算姿态误差:
qe=q−1⊗qd\mathbf{q}_e = \mathbf{q}^{-1} \otimes \mathbf{q}_dqe=q−1⊗qd
倾转分离方法将期望姿态分解为:
qd=qd,red⊗qd,yaw\mathbf{q}_d = \mathbf{q}_{d,red} \otimes \mathbf{q}_{d,yaw}qd=qd,red⊗qd,yaw
其中:
- qd,red\mathbf{q}_{d,red}qd,red:简化姿态(Reduced Attitude),描述从当前推力方向到期望推力方向的旋转
- qd,yaw\mathbf{q}_{d,yaw}qd,yaw:绕推力方向的偏航旋转
3.2 简化姿态的计算
设当前机体Z轴方向(推力方向)在惯性系中的表示为:
ez=R⋅[001]\mathbf{e}_z = \mathbf{R} \cdot \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}ez=R⋅001
期望推力方向为:
ez,d=Rd⋅[001]\mathbf{e}_{z,d} = \mathbf{R}_d \cdot \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}ez,d=Rd⋅001
简化姿态误差四元数可以通过两个向量的叉积和点积构造:
qred=[1+ez⋅ez,dez×ez,d]\mathbf{q}_{red} = \begin{bmatrix} 1 + \mathbf{e}_z \cdot \mathbf{e}_{z,d} \\ \mathbf{e}_z \times \mathbf{e}_{z,d} \end{bmatrix}qred=[1+ez⋅ez,dez×ez,d]
然后归一化。
3.3 偏航权重调节
PX4实现中引入了偏航权重 wyaw∈[0,1]w_{yaw} \in [0, 1]wyaw∈[0,1]:
qd,mixed=qd,red⊗qyaw(wyaw⋅θyaw)\mathbf{q}_{d,mixed} = \mathbf{q}_{d,red} \otimes \mathbf{q}_{yaw}(w_{yaw} \cdot \theta_{yaw})qd,mixed=qd,red⊗qyaw(wyaw⋅θyaw)
- wyaw=1w_{yaw} = 1wyaw=1:完整姿态控制
- wyaw=0w_{yaw} = 0wyaw=0:纯简化姿态控制(忽略偏航)
- 0<wyaw<10 < w_{yaw} < 10<wyaw<1:折中策略
四、分离Yaw控制的完整公式推导
本节将详细推导倾转分离姿态控制器的每一个公式,帮助读者建立从数学到代码的完整理解。
4.1 整体控制流程
分离Yaw控制的核心思想可以用以下流程概括:
期望姿态 → 分离处理 →
├─ Roll/Pitch (高优先级,快速响应)
└─ Yaw (低优先级,加饱和限制,慢速调整)
→ 合成最终期望 → 计算角速度指令
4.2 公式 (1) - 简化姿态的构造
qred=qc,red⊗q\boldsymbol{q}_{red} = \boldsymbol{q}_{c,red} \otimes \boldsymbol{q}qred=qc,red⊗q
物理含义:
qred\boldsymbol{q}_{red}qred 是"简化姿态"(Reduced Attitude),包含:
- 期望的Roll/Pitch:从期望推力方向得到
- 当前的Yaw:保持不变
这代表"只调整倾斜,不改变朝向"的姿态,是位置控制的核心需求——推力方向正确即可,航向无所谓。
实现方式:
// 从期望推力方向和当前Yaw直接构造
Vector3f e_z = q.dcm_z(); // 当前推力方向
Vector3f e_z_d = qd.dcm_z(); // 期望推力方向
Quatf qd_red(e_z, e_z_d); // 构造从当前到期望的最短旋转
qd_red *= q; // 转换到世界坐标系
4.3 公式 (2) - 提取纯Yaw误差
qe,yaw=qred−1⊗qd\boldsymbol{q}_{e,yaw} = \boldsymbol{q}_{red}^{-1} \otimes \boldsymbol{q}_{d}qe,yaw=qred−1⊗qd
符号说明:
| 符号 | 含义 | 包含内容 |
|---|---|---|
| qd\boldsymbol{q}_{d}qd | 完整期望姿态 | 期望Roll/Pitch + 期望Yaw |
| qred\boldsymbol{q}_{red}qred | 简化姿态 | 期望Roll/Pitch + 当前Yaw |
| qe,yaw\boldsymbol{q}_{e,yaw}qe,yaw | Yaw误差四元数 | 纯Yaw旋转 |
几何意义:
从 qred\boldsymbol{q}_{red}qred 旋转到 qd\boldsymbol{q}_{d}qd 需要转多少?
qe,yaw=qred−1⊗qd="去掉qred的旋转"⊗"应用qd的旋转"\boldsymbol{q}_{e,yaw} = \boldsymbol{q}_{red}^{-1} \otimes \boldsymbol{q}_{d} = \text{"去掉} \boldsymbol{q}_{red} \text{的旋转"} \otimes \text{"应用} \boldsymbol{q}_{d} \text{的旋转"}qe,yaw=qred−1⊗qd="去掉qred的旋转"⊗"应用qd的旋转"
关键洞察:
由于 qred\boldsymbol{q}_{red}qred 和 qd\boldsymbol{q}_{d}qd 的Roll/Pitch部分完全相同(都是期望倾斜),它们只在Yaw上存在差异,所以:
qe,yaw≈纯绕Z轴的旋转\boldsymbol{q}_{e,yaw} \approx \text{纯绕Z轴的旋转}qe,yaw≈纯绕Z轴的旋转
数值示例:
# 假设
q_red = quaternion(roll=10°, pitch=20°, yaw=30°) # 当前Yaw
q_d = quaternion(roll=10°, pitch=20°, yaw=80°) # 期望Yaw
# 计算Yaw误差
q_e_yaw = q_red.inverse() * q_d
# 结果:q_e_yaw ≈ quaternion(roll≈0°, pitch≈0°, yaw=50°)
# 得到纯Yaw差值!
4.4 公式 (3) - Yaw饱和限制
qyaw,limited=[cos[w⋅arccos(qe,yaw[0])]00sin[w⋅arcsin(qe,yaw[3])]]\boldsymbol{q}_{yaw,limited} = \begin{bmatrix} \cos[w \cdot \arccos(q_{e,yaw[0]})] \\ 0 \\ 0 \\ \sin[w \cdot \arcsin(q_{e,yaw[3]})] \end{bmatrix}qyaw,limited=cos[w⋅arccos(qe,yaw[0])]00sin[w⋅arcsin(qe,yaw[3])]
这个公式实现了对Yaw误差的饱和限制,防止航向突变。
步骤1:从四元数提取Yaw误差角度
四元数的标量部分(w分量)与旋转角度的关系:
qw=cos(θ/2)q_w = \cos(\theta/2)qw=cos(θ/2)
所以Yaw误差角度为:
θyaw=2⋅arccos(qe,yaw[0])\theta_{yaw} = 2 \cdot \arccos(q_{e,yaw[0]})θyaw=2⋅arccos(qe,yaw[0])
步骤2:应用饱和系数
w={1if ∣θyaw∣≤θmaxθmax∣θyaw∣if ∣θyaw∣>θmaxw = \begin{cases} 1 & \text{if } |\theta_{yaw}| \leq \theta_{max} \\ \frac{\theta_{max}}{|\theta_{yaw}|} & \text{if } |\theta_{yaw}| > \theta_{max} \end{cases}w={1∣θyaw∣θmaxif ∣θyaw∣≤θmaxif ∣θyaw∣>θmax
其中 θmax\theta_{max}θmax 是允许的最大Yaw误差(如20°)。
作用:将大的Yaw误差限制在安全范围内,避免:
- 视觉SLAM因快速旋转而失效
- 控制系统振荡或失稳
- 用户体验突兀
步骤3:构造限制后的纯Yaw四元数
限制后的四元数形式为 [w,0,0,z][w, 0, 0, z][w,0,0,z],这是纯绕Z轴旋转:
- qw=cos(θlimited/2)q_w = \cos(\theta_{limited}/2)qw=cos(θlimited/2)
- qx=0q_x = 0qx=0(不绕X轴转)
- qy=0q_y = 0qy=0(不绕Y轴转)
- qz=sin(θlimited/2)q_z = \sin(\theta_{limited}/2)qz=sin(θlimited/2)(绕Z轴转)
数值示例:
# Yaw误差50°,最大允许20°
theta_yaw = 50°
theta_max = 20°
w = 20° / 50° = 0.4
# 限制后的Yaw调整
theta_limited = 0.4 × 50° = 20°
# 构造纯Yaw四元数
q_yaw_limited = [cos(10°), 0, 0, sin(10°)] # 半角表示
4.5 公式 (4) - 合成最终期望姿态
qmix=qred⊗qyaw,limited\boldsymbol{q}_{mix} = \boldsymbol{q}_{red} \otimes \boldsymbol{q}_{yaw,limited}qmix=qred⊗qyaw,limited
物理意义:
q_red (期望倾斜 + 当前Yaw)
↓ 叠加限制后的Yaw修正
q_mix (期望倾斜 + 部分修正后的Yaw)
这样设计的好处:
- Roll/Pitch立即响应:qred\boldsymbol{q}_{red}qred 已包含完整的倾斜期望
- Yaw渐进调整:通过 qyaw,limited\boldsymbol{q}_{yaw,limited}qyaw,limited 缓慢修正航向
数值示例:
q_red = quaternion(roll=15°, pitch=25°, yaw=30°)
q_yaw_limited = quaternion(roll=0°, pitch=0°, yaw=20°)
q_mix = q_red * q_yaw_limited
= quaternion(roll=15°, pitch=25°, yaw=50°)
# Yaw从30°向80°移动了20°(而非一步到位的50°)
4.6 公式 (5) - 计算姿态误差
qe=q−1⊗qmix\boldsymbol{q}_e = \boldsymbol{q}^{-1} \otimes \boldsymbol{q}_{mix}qe=q−1⊗qmix
含义:
| 符号 | 含义 |
|---|---|
| q\boldsymbol{q}q | 当前实际姿态 |
| qmix\boldsymbol{q}_{mix}qmix | 处理后的期望姿态 |
| qe\boldsymbol{q}_eqe | 最终姿态误差 |
这是标准的姿态误差计算——从当前姿态到期望姿态需要旋转多少。
4.7 公式 (6) - 生成角速度指令
ωd=Kp⋅qe,[1:3]\boldsymbol{\omega}_d = \boldsymbol{K}_p \cdot \boldsymbol{q}_{e,[1:3]}ωd=Kp⋅qe,[1:3]
为什么只用四元数虚部?
四元数可以表示为轴角形式:
qe=[cos(θ2), nxsin(θ2), nysin(θ2), nzsin(θ2)]\boldsymbol{q}_e = \left[\cos\left(\frac{\theta}{2}\right), \ n_x \sin\left(\frac{\theta}{2}\right), \ n_y \sin\left(\frac{\theta}{2}\right), \ n_z \sin\left(\frac{\theta}{2}\right)\right]qe=[cos(2θ), nxsin(2θ), nysin(2θ), nzsin(2θ)]
当误差角度较小时(小角度近似):
sin(θ/2)≈θ/2\sin(\theta/2) \approx \theta/2sin(θ/2)≈θ/2
所以虚部近似为:
qe,[1:3]≈θ2⋅n⃗=12θ⃗\boldsymbol{q}_{e,[1:3]} \approx \frac{\theta}{2} \cdot \vec{n} = \frac{1}{2} \vec{\theta}qe,[1:3]≈2θ⋅n=21θ
这正是旋转矢量的一半,与角速度方向一致!
比例控制展开:
[ωd,xωd,yωd,z]=[Kroll000Kpitch000Kyaw][qe,xqe,yqe,z]\begin{bmatrix} \omega_{d,x} \\ \omega_{d,y} \\ \omega_{d,z} \end{bmatrix} = \begin{bmatrix} K_{roll} & 0 & 0 \\ 0 & K_{pitch} & 0 \\ 0 & 0 & K_{yaw} \end{bmatrix} \begin{bmatrix} q_{e,x} \\ q_{e,y} \\ q_{e,z} \end{bmatrix}ωd,xωd,yωd,z=Kroll000Kpitch000Kyawqe,xqe,yqe,z
工程实践:
- KrollK_{roll}Kroll, KpitchK_{pitch}Kpitch 设置较大(如6-8):快速响应倾斜误差
- KyawK_{yaw}Kyaw 设置较小(如2-4):平滑调整航向
4.8 完整流程图
┌─────────────────────────────────────────────────────────────────┐
│ 位置控制器输出期望推力 │
└─────────────────────────┬───────────────────────────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ thrustToAttitude │ │ thrustToAttitude │
│ with 当前Yaw │ │ with 期望Yaw │
└─────────┬───────────┘ └─────────┬───────────┘
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ q_red: │ │ q_d: │
│ 期望倾斜+当前Yaw │ │ 期望倾斜+期望Yaw │
└─────────┬───────────┘ └─────────┬───────────┘
│ │
└───────────┬───────────────────┘
▼
┌─────────────────────┐
│ q_e_yaw = q_red⁻¹⊗q_d│ ← 公式(2): 提取Yaw误差
└─────────┬───────────┘
▼
┌─────────────────────┐
│ 应用饱和限制 w │ ← 公式(3): Yaw限幅
└─────────┬───────────┘
▼
┌─────────────────────┐
│ q_yaw_limited │
└─────────┬───────────┘
│
┌───────────────────┴───────────────────┐
│ q_mix = q_red ⊗ q_yaw_limited │ ← 公式(4): 合成期望
└───────────────────┬───────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 当前姿态 q │
└─────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ q_e = q⁻¹ ⊗ q_mix │ ← 公式(5): 姿态误差
└─────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ ω_d = Kp · q_e[1:3] │ ← 公式(6): 角速度指令
└─────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 输出到角速度控制器 │
└─────────────────────────────────────────┘
4.9 数值仿真示例
以下Python代码演示完整的倾转分离控制流程:
import numpy as np
from scipy.spatial.transform import Rotation as R
def euler_to_quat(roll, pitch, yaw):
"""欧拉角(度)转四元数 [w,x,y,z]"""
rot = R.from_euler('ZYX', [yaw, pitch, roll], degrees=True)
q = rot.as_quat() # [x,y,z,w]
return np.array([q[3], q[0], q[1], q[2]]) # [w,x,y,z]
def quat_multiply(q1, q2):
"""四元数乘法"""
w1, x1, y1, z1 = q1
w2, x2, y2, z2 = q2
return np.array([
w1*w2 - x1*x2 - y1*y2 - z1*z2,
w1*x2 + x1*w2 + y1*z2 - z1*y2,
w1*y2 - x1*z2 + y1*w2 + z1*x2,
w1*z2 + x1*y2 - y1*x2 + z1*w2
])
def quat_inverse(q):
"""四元数的逆"""
return np.array([q[0], -q[1], -q[2], -q[3]])
# ========== 仿真参数 ==========
# 当前姿态: Roll=5°, Pitch=10°, Yaw=30°
q_current = euler_to_quat(5, 10, 30)
# 完整期望姿态: Roll=15°, Pitch=25°, Yaw=80°
q_d = euler_to_quat(15, 25, 80)
# ========== 公式(1): 构造q_red ==========
# 期望倾斜 + 当前Yaw
q_red = euler_to_quat(15, 25, 30) # 注意Yaw用当前值30°
# ========== 公式(2): 计算Yaw误差 ==========
q_e_yaw = quat_multiply(quat_inverse(q_red), q_d)
# 结果应接近纯Yaw旋转50°
# ========== 公式(3): Yaw饱和 ==========
theta_half = np.arccos(np.clip(q_e_yaw[0], -1, 1))
theta_yaw = 2 * theta_half * 180 / np.pi # 转为度
max_yaw_error = 20 # 最大允许20°
if abs(theta_yaw) > max_yaw_error:
w = max_yaw_error / abs(theta_yaw)
else:
w = 1.0
print(f"Yaw误差: {theta_yaw:.1f}°, 饱和系数: {w:.2f}")
# 构造限制后的Yaw四元数
theta_limited = w * theta_half
q_yaw_limited = np.array([
np.cos(theta_limited),
0, 0,
np.sin(theta_limited) * np.sign(q_e_yaw[3])
])
# ========== 公式(4): 合成期望姿态 ==========
q_mix = quat_multiply(q_red, q_yaw_limited)
# ========== 公式(5): 计算姿态误差 ==========
q_e = quat_multiply(quat_inverse(q_current), q_mix)
# ========== 公式(6): 计算角速度 ==========
Kp = np.array([6.0, 6.0, 2.5]) # Roll, Pitch, Yaw增益
omega_d = 2.0 * Kp * q_e[1:4] # 乘2补偿半角
print(f"\n期望角速度:")
print(f" ω_roll = {np.degrees(omega_d[0]):.1f} °/s")
print(f" ω_pitch = {np.degrees(omega_d[1]):.1f} °/s")
print(f" ω_yaw = {np.degrees(omega_d[2]):.1f} °/s")
典型输出:
Yaw误差: 50.0°, 饱和系数: 0.40
期望角速度:
ω_roll = 60.0 °/s ← Roll快速响应
ω_pitch = 90.0 °/s ← Pitch快速响应
ω_yaw = 25.0 °/s ← Yaw被限制,缓慢调整
4.10 设计思想总结
| 步骤 | 公式 | 目的 | 效果 |
|---|---|---|---|
| 1 | 构造 qredq_{red}qred | 分离Roll/Pitch和Yaw | 只关心倾斜,不管朝向 |
| 2 | 计算 qe,yawq_{e,yaw}qe,yaw | 提取纯Yaw误差 | 单独处理航向控制 |
| 3 | Yaw饱和限制 | 限制最大Yaw调整量 | 防止突变,保护SLAM |
| 4 | 合成 qmixq_{mix}qmix | 组合倾斜和限制后的Yaw | 生成可执行的期望姿态 |
| 5 | 计算 qeq_eqe | 得到最终姿态误差 | 准备送入P控制器 |
| 6 | 生成 ωd\omega_dωd | 比例控制生成角速度 | 输出给角速度内环 |
核心优势:
- ✅ 分层控制:Roll/Pitch快速响应(保证位置安全),Yaw慢速调整(保证视觉稳定)
- ✅ 饱和保护:防止视觉SLAM因快速旋转而跟踪失败
- ✅ 优先级明确:位置控制优先,朝向控制其次
- ✅ 数学优雅:基于四元数的全局表示,避免欧拉角奇异性
五、PX4中的实现
5.1 核心代码解析
PX4的姿态控制器位于 src/modules/mc_att_control/AttitudeControl/AttitudeControl.cpp。关键代码如下:
// 计算简化期望姿态,忽略偏航以优先保证横滚和俯仰
const Vector3f e_z = q.dcm_z(); // 当前推力方向
const Vector3f e_z_d = qd.dcm_z(); // 期望推力方向
Quatf qd_red(e_z, e_z_d); // 从当前到期望的最短旋转
// 处理推力方向完全相反的极端情况
if (fabsf(qd_red(1)) > (1.f - 1e-5f) || fabsf(qd_red(2)) > (1.f - 1e-5f)) {
qd_red = qd;
} else {
// 转换到世界坐标系的简化期望姿态
qd_red *= q;
}
// 提取偏航分量
Quatf q_mix = qd_red.inversed() * qd;
q_mix *= math::signNoZero(q_mix(0));
// 应用偏航权重,混合完整和简化姿态
qd = qd_red * Quatf(cosf(_yaw_w * acosf(q_mix(0))), 0, 0,
sinf(_yaw_w * asinf(q_mix(3))));
// 计算最终姿态误差
const Quatf qe = q.inversed() * qd;
// 转换为角速度设定值
const Vector3f eq = 2.f * math::signNoZero(qe(0)) * qe.imag();
rate_setpoint = eq.emult(_proportional_gain);
5.2 实现要点
- dcm_z()方法:提取旋转矩阵的第三列,即机体Z轴在惯性系中的方向
- Quatf(v1, v2)构造函数:计算从向量v1旋转到v2的最短路径四元数
- 偏航权重_yaw_w:通过参数
MC_YAW_WEIGHT配置,默认0.4 - eq = 2 * sign(qe(0)) * qe.imag():使用四元数虚部作为姿态误差的近似表示
5.3 控制分配策略
在电机饱和时,PX4采用以下优先级分配推力:
1. Roll/Pitch力矩(最高)
2. 总推力
3. Yaw力矩(最低)
这确保了即使在激进机动中,飞行器也能保持推力方向的正确性。
六、实验验证与工程意义
6.1 ETH Zurich的实验结果
在ETH Zurich Flying Machine Arena的实验中,研究人员对比了传统姿态控制器与倾转优先控制器的性能:
测试场景:执行2m位移 + 135°偏航变化
| 控制器类型 | 位置误差 | 恢复时间 |
|---|---|---|
| 传统PD控制 | 显著Y向偏移 | 较慢 |
| 倾转优先控制 | 几乎无偏移 | 更快 |
实验表明,倾转优先控制器在大偏航误差条件下,位置跟踪性能显著优于传统控制器。
6.2 翻滚机动测试
在执行空翻(flip)机动时,传统控制器因电机饱和导致位置漂移,而倾转优先控制器通过牺牲偏航跟踪性能,保持了位置的稳定。
6.3 工程实践建议
-
参数调优:根据任务类型调整偏航权重
- 航拍任务:较高偏航权重(需要稳定机头朝向)
- 竞速/避障:较低偏航权重(优先位置响应)
-
故障处理:当单个电机失效时,倾转分离策略允许飞行器通过高速旋转保持推力方向,实现安全降落
-
航线规划:利用航向无关性,可以设计更高效的航线,减少不必要的偏航机动
七、总结
倾转分离是多旋翼姿态控制领域的一项重要技术进展。其核心价值在于:
- 物理本质:认识到倾斜和旋转运动的力矩产生机理不同,合理分配控制资源
- 数学简化:通过解耦位置动力学与偏航运动,简化控制器设计
- 鲁棒性提升:在电机饱和或故障情况下,优先保证飞行安全
- 工程实用:已在PX4等主流开源飞控中得到广泛应用
随着多旋翼飞行器在物流、巡检、农业等领域的深入应用,倾转分离策略将继续发挥其重要作用,为更安全、更敏捷的自主飞行提供理论和技术支撑。
参考文献
-
Brescianini, D., & D’Andrea, R. (2018). Tilt-prioritized quadrocopter attitude control. IEEE Transactions on Control Systems Technology, 28(2), 376-387.
-
Brescianini, D., Hehn, M., & D’Andrea, R. (2013). Nonlinear quadrocopter attitude control. ETH Zurich Technical Report.
-
Gamagedara, K., Bisheban, M., Kaufman, E., & Lee, T. (2019). Geometric controls of a quadrotor UAV with decoupled yaw control. American Control Conference.
-
PX4 Autopilot Source Code. https://github.com/PX4/PX4-Autopilot
-
Coates, E. M., & Fossen, T. I. (2021). Geometric reduced-attitude control of fixed-wing UAVs. Applied Sciences, 11(7), 3147.
作者注:本文内容基于学术文献和开源代码分析,如有疏漏欢迎指正。欢迎关注更多飞控技术文章!
更多推荐
所有评论(0)