2. 无人机基础

多旋翼无人机的强化学习控制,本质上是在一个强耦合、欠驱动、非线性且带有时变扰动的动力学系统上寻找控制策略。若不了解机体受力、坐标系转换、姿态表示与传感器执行器的物理边界,策略网络很容易学到“仿真里能飞、真机上失控”的虚假规律。本章从建模、坐标、姿态、动力到传感执行链路,建立后续 Sim2Real 所需的物理直觉。

一、多旋翼动力学模型:从受力到运动

四旋翼的六个自由度(位置 x、y、z 与姿态 φ、θ、ψ)只由四个电机推力控制,因此是典型的欠驱动系统:平移运动必须通过改变姿态、倾斜推力矢量来间接实现。其核心动力学可概括为“总推力决定升降,推力差决定姿态,姿态决定水平加速度”。

  • 平动方程:合外力 = 重力 + 机体坐标系下的总推力旋转到世界系 + 空气阻力。
  • 转动方程:角加速度由三轴力矩(滚转、俯仰、偏航)与转动惯量决定,力矩来自各螺旋桨推力差与反扭矩差。
  • 耦合特性:姿态变化会立即改变推力方向,进而影响位置;位置误差又常通过姿态指令修正,形成内外环耦合。

在仿真中常用简化模型:忽略桨叶挥舞、电机瞬态与复杂气动,仅保留刚体动力学加一阶电机响应。这种简化对训练初期足够,但 Sim2Real 时必须通过域随机化补偿未建模动态。

典型四旋翼状态量:位置 p∈R³、速度 v∈R³、姿态四元数 q、角速度 ω∈R³;控制输入为四个电机转速或四个推力。强化学习观测通常包含 p、v、q、ω 及目标点误差。

二、坐标系定义与姿态表示

多旋翼控制至少涉及三个坐标系:世界系(惯性系)、机体系、传感器系。世界系通常取东北天或北东地,机体系原点在质心,x 轴指向前、y 轴指向右、z 轴指向下(或上,取决于约定)。所有控制指令最终都要在机体系下分配电机推力。

姿态表示有三种主流方式:欧拉角直观但有万向节死锁;旋转矩阵无死锁但冗余且需正交化;四元数紧凑、无死锁、插值平滑,是飞控与强化学习中最常用的内部表示。策略网络输出若为欧拉角,需在接近 ±90° 俯仰时特别小心。

多旋翼坐标系、姿态与动力/传感链路 世界系(惯性系) X 北 Z 天 Y 东 位置 p、速度 v 机体系(机体坐标) x 前 z 下 y 右 姿态 q、角速度 ω 姿态表示 欧拉角:直观,有死锁 旋转矩阵:无死锁,冗余 四元数:紧凑,推荐 RL 内部多用四元数 旋转 映射 电机与螺旋桨特性 推力 T = k_T · ω²,反扭矩 Q = k_Q · ω² 升力随转速平方增长,响应近似一阶惯性 桨径、桨距、KV 值决定效率与动态上限 电机饱和、电压跌落是 Sim2Real 关键扰动 常见传感器与执行器 IMU:加速度计 + 陀螺仪,高频姿态估计 磁力计 / 气压计 / GPS:偏航、高度、位置 执行器:无刷电机 + 电调 + 螺旋桨 观测延迟、噪声、量化误差需建模 反馈

三、电机与螺旋桨特性:控制输入的物理边界

螺旋桨推力与转速平方成正比,反扭矩同样与转速平方成正比。四旋翼通过四个转速的组合产生总推力与三轴力矩:对角电机同向旋转抵消反扭矩,转速差产生滚转与俯仰,两组对角转速差产生偏航。电机从指令到实际转速存在一阶滞后,电调响应、电池电压跌落、桨叶形变都会改变有效推力系数。

对象关键参数对控制的影响Sim2Real 注意点
无刷电机KV 值、内阻、最大电流决定转速上限与响应速度饱和与温升导致推力下降
电调PWM 频率、死区、延迟指令到转速的滞后延迟随机化,避免策略过拟合
螺旋桨桨径、桨距、k_T、k_Q推力效率与反扭矩比例桨损、气流干扰改变系数
电池电压、内阻、放电曲线电压跌落降低最大推力按电量随机化推力上限

四、传感器与执行器:观测与动作的真实链路

飞控常用 IMU 提供三轴加速度与角速度,磁力计提供偏航参考,气压计提供高度,GPS 提供室外位置。视觉、激光雷达、光流等则用于定位与避障。强化学习策略的观测通常由这些传感器融合后的状态估计构成,而非原始测量值。

执行器链路为:策略输出 → 姿态/推力指令 → 混控分配 → 电调 PWM → 电机转速 → 螺旋桨推力。任何一环的延迟、噪声、量化或饱和,都会让仿真中“完美”的策略在真机上出现振荡或漂移。

在仿真中建议显式建模:IMU 噪声与偏置、观测延迟、电机一阶响应、推力系数随机化、电池电压跌落。这些是 Sim2Real 迁移中最常见也最有效的域随机化维度。

五、案例与常见误区

假设训练一个悬停策略:仿真中观测为理想位置与姿态,动作直接映射为四个推力。若不做域随机化,真机上 IMU 噪声会让姿态估计抖动,电机延迟会让推力响应滞后,电池电压下降会让同样 PWM 对应更小推力。策略可能在高频修正中发散。

  • 误区一:把欧拉角直接作为网络输出且不做范围约束,导致俯仰接近 90° 时数值爆炸。
  • 误区二:忽略电机饱和,策略学到“无限推力”的激进动作,真机无法执行。
  • 误区三:用世界系动作控制机体系推力,坐标系混淆导致方向错误。
  • 误区四:只随机化质量而不随机化推力系数,迁移后高度控制偏差明显。
# 简化四旋翼推力分配(机体 z 向下,总推力向上)
# u = [T_total, tau_x, tau_y, tau_z]
# 电机转速平方向量 w2 = A_inv @ u
# 其中 A 由机臂长度 L、推力系数 kT、反扭矩系数 kQ 决定
L = 0.25      # 机臂长度 m
kT = 1.2e-5   # 推力系数
kQ = 2.0e-7   # 反扭矩系数
# 悬停时 T_total ≈ m * g,四电机均分
m = 1.2       # kg
g = 9.81
T_hover = m * g
w2_each = T_hover / (4 * kT)
print("单电机转速平方:", w2_each)