2. 无人机飞控基础
四旋翼无人机是TinyML视觉识别与飞控联动的最佳载体。要理解后续IMU数据如何驱动电机、视觉识别结果如何转化为飞行动作,必须先建立三个核心认知:四旋翼如何通过差速产生力矩、PWM信号如何通过ESC驱动无刷电机、以及姿态角在机体坐标系与地面坐标系之间如何定义与换算。本章将围绕这三条主线展开,为后续的传感器融合与视觉避障打下坚实的工程基础。
2.1 四旋翼飞行原理:差速控制与力矩平衡
四旋翼无人机通过四个独立电机的转速差实现全部六个自由度的运动控制(三个平移、三个旋转)。其核心在于力矩平衡与推力矢量合成。四个电机分为两组:M1/M3为顺时针旋转(CW),M2/M4为逆时针旋转(CCW),这种正反桨配置用于抵消反扭矩——当四个电机转速相同时,总反扭矩为零,无人机保持航向稳定。
飞行控制的基本逻辑如下:
- 垂直升降(油门):四个电机同时增加或减少转速,改变总升力。当总升力大于重力时上升,小于重力时下降。
- 俯仰控制(前后运动):前侧电机(M1/M4)与后侧电机(M2/M3)产生转速差。前快后慢时,机头下俯,产生向前推力分量。
- 横滚控制(左右运动):左侧电机(M1/M2)与右侧电机(M3/M4)产生转速差。左快右慢时,机体向左倾斜,产生向左推力分量。
- 偏航控制(旋转):利用正反桨的反扭矩差。顺时针组(M1/M3)加速、逆时针组(M2/M4)减速时,机体绕Z轴顺时针旋转。
| 运动方向 | 电机转速变化 | 物理原理 | 对应姿态角 |
|---|---|---|---|
| 上升/下降 | M1=M2=M3=M4 同步增减 | 总推力与重力差 | 无(高度变化) |
| 前倾/后仰 | M1+M4 与 M2+M3 差速 | 俯仰力矩产生 | 俯仰角 θ |
| 左倾/右倾 | M1+M2 与 M3+M4 差速 | 横滚力矩产生 | 横滚角 φ |
| 左旋/右旋 | CW组与CCW组差速 | 反扭矩不平衡 | 偏航角 ψ |
2.2 PWM与ESC控制:从数字信号到电机转速
飞控MCU无法直接驱动无刷电机,必须通过电子调速器(ESC)将PWM信号转换为三相交流驱动。PWM(脉冲宽度调制)信号通过改变高电平占空比来传递控制信息。对于大多数无人机ESC,标准PWM周期为2.5ms(400Hz),其中高电平时间1ms~2ms对应油门0%~100%。
ESC的三种主流控制协议对比如下:
| 协议 | 信号频率 | 分辨率 | 适用场景 |
|---|---|---|---|
| 传统PWM | 50Hz~500Hz | 约1000级 | 入门级、兼容性好 |
| Oneshot125 | 2kHz~4kHz | 约250级 | 穿越机、响应快 |
| DShot600 | 数字信号 | 12bit (2048级) | 高端竞速、抗干扰强 |
在TinyML无人机项目中,推荐使用传统PWM或Oneshot125,因为ESP32等MCU的定时器资源有限,且视觉识别本身占用大量CPU。PWM信号生成的关键参数包括:
// ESP32 Arduino 示例:PWM初始化与油门输出
const int freq = 400; // 400Hz PWM频率
const int resolution = 10; // 10位分辨率 (0-1023)
const int ch[4] = {0,1,2,3}; // 4个PWM通道
void setup() {
ledcSetup(ch[0], freq, resolution);
ledcAttachPin(13, ch[0]); // M1 → GPIO13
// ... 其余三个电机类似
}
void setMotorSpeed(int motorId, float throttle) {
// throttle: 0.0 ~ 1.0
int duty = (int)(throttle * 1023);
ledcWrite(ch[motorId], duty);
}
2.3 姿态角与坐标系定义:IMU数据解算的基础
姿态角描述的是机体坐标系(Body Frame)相对于地面坐标系(Earth Frame)的旋转关系。采用NED(北-东-下)地面坐标系和FRD(前-右-下)机体坐标系是航空领域的标准约定。三个欧拉角的定义如下:
- 俯仰角 θ (Pitch):绕机体Y轴旋转,机头上仰为正。范围 -90°~+90°。
- 横滚角 φ (Roll):绕机体X轴旋转,右翼下倾为正。范围 -180°~+180°。
- 偏航角 ψ (Yaw):绕机体Z轴旋转,机头右偏为正。范围 -180°~+180°。
IMU中的加速度计测量的是比力(重力与惯性力的矢量和),陀螺仪测量的是角速度。从IMU原始数据到姿态角的解算流程为:
- 数据预处理:对加速度计和陀螺仪数据进行低通滤波(去除高频噪声)和零偏校准。
- 初始姿态确定:利用加速度计在静止时测量重力方向,计算初始俯仰角和横滚角:θ = atan2(-ax, sqrt(ay²+az²)),φ = atan2(ay, az)。
- 陀螺仪积分:将陀螺仪角速度乘以时间步长,累加得到姿态增量。
- 数据融合:使用互补滤波或卡尔曼滤波,将加速度计的低频姿态估计与陀螺仪的高频积分结果融合,消除漂移。
2.4 案例拆解:基于IMU姿态反馈的悬停控制调试
以一个典型的TinyML无人机悬停调试过程为例,说明姿态角与PWM控制的联动关系。
背景与约束:无人机重量350g,使用4个1306无刷电机,ESC为Oneshot125协议,飞控为ESP32。目标:实现室内无GPS环境下的稳定悬停(姿态角误差小于±2°)。
初始现象:首次上电后,无人机在离地30cm高度出现持续振荡,俯仰角在±8°范围内波动,无法稳定悬停。
关键数据分析:
- IMU日志显示陀螺仪零偏为0.02 rad/s(约1.15°/s),积分10秒后姿态漂移达11.5°。
- 加速度计噪声标准差为0.05g,直接用于姿态估计时抖动明显。
- PID控制器中P=1.8,I=0.02,D=12,响应速度足够但阻尼不足。
分析判断:振荡频率约2Hz,与陀螺仪积分漂移周期吻合。判断为姿态估计中的陀螺仪零偏未完全补偿,导致反馈信号存在低频漂移,PID控制器为纠正虚假误差而持续输出修正量,形成振荡。
实际操作步骤:
- 在飞控启动时采集1000个静止样本,计算陀螺仪平均零偏,并在每次积分前减去该值。
- 将互补滤波系数从0.02调整为0.05,增加加速度计对低频姿态的修正权重。
- 将PID的D项从12提高到18,增加阻尼,抑制振荡。
- 在PWM输出端增加50Hz低通滤波(软件实现),平滑电机响应。
结果对比:调整后,悬停姿态角误差从±8°降至±1.5°,振荡完全消除。飞行时间从4分30秒略微降至4分10秒(滤波增加功耗),但稳定性显著提升。
风险与代价:D项过大会导致电机响应迟钝,在快速机动时出现"滞后感"。互补滤波权重过高会使姿态估计对振动敏感,在强风环境下可能引入高频抖动。
复盘经验:姿态控制调试应遵循"先校准传感器,再调PID"的顺序。TinyML项目中,视觉识别算法运行时会占用CPU,导致IMU采样间隔抖动,建议将IMU读取放在高优先级任务中,并使用DMA传输减少延迟。