4、单机姿态控制:PID控制器设计、角速度环与角度环、参数整定经验
好,我们进入单机姿态控制这一块。这是编队控制的基础,说白了,你单机都飞不稳,编队就是空中楼阁。我当年刚入行时,就吃过这个亏,总想着一步到位搞编队,结果飞机在天上跟喝醉了似的,根本没法看。后来老老实实回来啃姿态控制,才算是把地基打牢了。
4.1 姿态控制的核心思路
四旋翼的姿态控制,本质上就是个“角度跟踪”问题。你遥控器给个俯仰角指令,飞机就得乖乖地转到那个角度。怎么转?靠电机转速差产生力矩。
这里有个关键点:角度不能直接控电机。你想想看,角度是位置量,电机输出是力,中间差着好几层呢。所以实际工程中,我们用的是串级PID结构。
串级PID结构:
- 外环:角度环(也叫位置环)—— 输出期望角速度
- 内环:角速度环(也叫速率环)—— 输出期望力矩/电机控制量
为什么非要用两层?我解释一下。角度环响应慢,角速度环响应快。如果只用单环,飞机稍微受个风,角度还没反应过来,飞机已经偏了。内环角速度环能快速抑制扰动,外环再慢慢把角度拉回来。这就像你开车,方向盘是角度环,但真正控制车头指向的是转向角速度,对吧?
4.2 角速度环设计
角速度环是内环,也是整个姿态控制的核心。它直接决定了飞机的抗风能力和响应速度。
角速度环的输入是期望角速度(来自角度环输出),反馈是陀螺仪测得的实际角速度。输出是三个轴的力矩,最终换算成四个电机的PWM值。
我个人习惯用标准PID形式:
// 角速度环PID(以俯仰轴为例)
float pitch_rate_error = desired_pitch_rate - gyro_pitch_rate;
// 比例项
float P = Kp_rate * pitch_rate_error;
// 积分项(带限幅)
integral_pitch_rate += Ki_rate * pitch_rate_error * dt;
integral_pitch_rate = constrain(integral_pitch_rate, -integral_limit, integral_limit);
// 微分项(一般不用,或者用D项滤波)
float D = Kd_rate * (pitch_rate_error - last_pitch_rate_error) / dt;
last_pitch_rate_error = pitch_rate_error;
// 输出
float output = P + integral_pitch_rate + D;
这里有个坑,我提醒一下。微分项在角速度环里要慎用。陀螺仪本身噪声就不小,你再微分一下,噪声直接放大,电机跟着抖。我一般只在角度环加D,角速度环只用PI。
我的经验:角速度环的P值可以先调大,直到飞机出现高频抖动,然后退回到70%左右。I值慢慢加,直到稳态误差消除。D项,嗯,能不用就不用。
4.3 角度环设计
角度环是外环,它的任务就是让实际角度跟上期望角度。输入是期望角度(遥控器或编队控制器给的),反馈是姿态解算出来的欧拉角。输出是期望角速度,送给内环。
角度环一般用P控制就够了,最多加个D。为什么?因为内环已经帮你处理了大部分动态响应,外环只需要做位置跟踪。
// 角度环PID(以俯仰轴为例)
float angle_error = desired_pitch - current_pitch;
// 比例项
float P = Kp_angle * angle_error;
// 微分项(预测角速度变化)
float D = Kd_angle * (angle_error - last_angle_error) / dt;
last_angle_error = angle_error;
// 输出期望角速度(限幅)
float desired_rate = P + D;
desired_rate = constrain(desired_rate, -max_rate, max_rate);
注意看,角度环的输出直接作为角速度环的输入。这就是串级控制的精髓——外环输出是内环的期望值。
我曾经踩过的坑:角度环的P值调得太大,导致期望角速度频繁饱和,内环根本追不上。结果飞机出现低频振荡,像在跳摇摆舞。后来我把角度环的P值减半,同时限制了最大角速度输出,问题就解决了。
4.4 参数整定经验
参数整定,说白了就是“调参”。这活儿没有标准答案,但有一些套路。我分享一下我的方法。
4.4.1 先内环,后外环
这是铁律。内环不稳定,外环调得再好也没用。先把角速度环调稳,再调角度环。
4.4.2 角速度环整定步骤
- P项先上:给一个小的P值(比如0.1),用手转动飞机,感受阻力。慢慢增大P,直到飞机出现高频抖动。记下这个值,然后取60%-70%。
- I项跟上:加上I项,观察稳态误差。比如你给一个固定角速度指令,看实际角速度能不能追上。I值从0.01开始,慢慢加,直到误差消除。
- D项慎用:如果飞机响应太慢,可以加一点点D,但不要超过P的10%。
4.4.3 角度环整定步骤
- P项为主:角度环的P值一般比角速度环小一个数量级。从0.05开始,慢慢加,直到飞机对角度指令有快速响应但不超调。
- D项辅助:如果飞机有超调,加D项抑制。D值从0.01开始试。
- I项一般不用:角度环本身有内环的积分在,外环再加I容易引起积分饱和。
一组典型的初始参数(以250mm轴距四旋翼为例):
| 参数 | 俯仰/横滚 | 偏航 |
|---|---|---|
| 角速度环 Kp | 0.25 | 0.35 |
| 角速度环 Ki | 0.02 | 0.03 |
| 角度环 Kp | 0.08 | 0.12 |
| 角度环 Kd | 0.01 | 0.015 |
| 最大角速度 | 200°/s | 150°/s |
注意,这只是起点。不同机架、不同桨叶、不同电池电压,参数都得微调。我建议你准备一个无线调参工具,边飞边调,效率高很多。
4.5 避坑指南
最后,我总结几个常见问题,都是我曾经摔过的跟头:
- 积分饱和:角速度环的积分项一定要限幅。不然飞机卡住时,积分一直累加,松开后飞机会猛冲。我一般把积分限幅设在输出限幅的30%左右。
- 陀螺仪噪声:如果飞机悬停时电机有轻微抖动,先检查陀螺仪数据是否干净。可以加一个低通滤波器,截止频率设在30-50Hz。
- 电机响应延迟:从PID输出到电机产生力矩,中间有几十毫秒的延迟。如果PID响应太快,反而会振荡。我一般把控制频率设在250-400Hz,太高了反而不好。
- 偏航轴特殊处理:偏航轴的响应比俯仰横滚慢,因为偏航力矩主要靠反扭力。我习惯把偏航的I值设大一些,P值小一些。
嗯,姿态控制这块就讲这么多。记住一句话:内环决定稳定性,外环决定跟踪精度。把这两层调好了,你的飞机就能稳稳地飞起来,为后面的编队控制打好基础。