认识PID:从“抖得像筛子”到“稳如老狗”的第一步
各位同学,欢迎来到《姿态调参让飞机飞得更稳》的第一章。
先问大家一个问题:你第一次给四旋翼解锁推油门时,飞机是什么反应?
我猜,八成是“嗖”一下蹿上天,然后开始疯狂点头、左右摇摆,像喝醉了酒。运气好点,你赶紧收油,它摔在草地上;运气不好……嗯,我当年在实验室就干碎过一对桨叶。
为什么会这样?因为你的飞控还没学会“控制”。而学会控制的第一步,就是搞懂PID。
PID到底是什么?
PID,全称比例-积分-微分控制。说白了,它就是一个“纠错算法”。
你想想看,你让飞机悬停在1米高度。但风一吹,它掉到了0.9米。这时候飞控需要做一个决定:怎么把它推回1米?
PID就是做这个决定的数学公式。它不复杂,就三个词:
- P(比例):看现在差多少,差得多就用力推,差得少就轻轻推。
- I(积分):看过去差了多少,把老账翻出来,把累积的误差补上。
- D(微分):预测未来会差多少,提前踩刹车,防止冲过头。
三个环节配合,就能让飞机从“抖晃”走向“丝滑”。
核心一句话:PID = 看现在(P)+ 算旧账(I)+ 预判未来(D)。
三个环节,各司其职
咱们一个一个拆开讲。我会结合我在实际项目中踩过的坑来说,这样你记得更牢。
比例环节(P)—— 最直接的“蛮力”
P的作用很简单:误差越大,输出越大。
假设你设定目标角度是0°(水平),但飞机现在倾斜了10°。P就会输出一个力,把它往回掰。误差变成5°,力就小一半。误差变成1°,力就只剩十分之一。
听起来很合理对吧?但问题来了:P太大会怎样?
我遇到过一位同学,他觉得“P越大响应越快”,直接把P拉到100。结果飞机一解锁就开始高频抖动,像电动牙刷一样。为什么?因为P太大,飞机冲过头了,发现冲过头又往回冲,来回震荡,根本停不下来。
P的作用总结:
- 让飞机“有反应”
- P太小:反应迟钝,像在棉花糖里飞
- P太大:震荡、抖晃,甚至炸机
积分环节(I)—— 专治“顽固分子”
有时候,光靠P是不够的。比如你的飞机重心偏了,或者有持续的风吹着它。这时候P会一直输出一个力,但就是差那么一点点回不到目标位置。
这就是“稳态误差”。
I就是来解决这个问题的。它会记住过去所有的误差,把它们累加起来。只要误差一直存在,I的输出就会越来越大,直到把那个“顽固分子”拉回来。
我曾经调过一架四旋翼,悬停时总是往左偏5°。P调大了就抖,调小了又偏。后来我加了点I,它自己慢慢就把角度修正回来了。嗯,那种感觉就像给飞机装了个“记仇本”——你偏多久,它就记多久,直到把你拽回来。
但I也不是越大越好。I太大,飞机会出现“低频晃动”,像坐船一样,一摇一摇的。而且I会“积分饱和”——如果飞机被卡住了,I还在一直累加误差,等飞机一脱困,它会猛地冲出去,非常危险。
避坑指南:我曾经在调试一款大轴距无人机时,I值设得偏高。飞机在地面被卡住,我解锁推油,它突然弹射起飞,直接撞墙。后来我养成了习惯:每次调参前先检查I的限幅,并且一定要在安全环境下试飞。
微分环节(D)—— 提前踩刹车
D是三个环节里最“聪明”的一个。它不看误差有多大,而是看误差变化得有多快。
如果飞机正在快速接近目标,D就会提前输出一个反向力,防止它冲过头。说白了,D就是“阻尼器”。
你想想看,开车时看到红灯,你是到了线前才猛踩刹车,还是提前慢慢减速?D就是那个“提前减速”的环节。
没有D的飞机,就像没有减震的汽车——过个坎能颠到你怀疑人生。有了D,飞机才能“柔顺”地到达目标位置。
但D对噪声非常敏感。如果你的传感器数据有毛刺,D会把那些毛刺放大成剧烈的抖动。我遇到过一架飞机,悬停时姿态数据里有一个高频噪声,D一介入,电机就开始尖叫。后来我加了个低通滤波器才解决。
D的作用总结:
- 抑制震荡,让响应更平滑
- D太小:飞机“软绵绵”,容易超调
- D太大:高频抖动,电机发热严重
为什么四旋翼必须用PID?
这个问题其实可以换个问法:不用PID行不行?
理论上,你可以用更复杂的控制算法,比如LQR、MPC、自抗扰控制。但在实际工程中,PID是性价比最高的选择。
为什么?我给你列三个理由:
- 四旋翼天生不稳定。 它是一个开环不稳定的系统。你推油门,它不会乖乖上升,而是会翻滚、偏航、俯仰。必须有一个反馈控制器把它“按住”。PID就是那个“手”。
- 计算量小。 飞控的MCU通常只有几百MHz,还要跑传感器融合、状态估计、通信协议。PID只需要几次乘法和加法,几微秒就能算完。换成MPC?算一次可能要几十毫秒,飞控早炸了。
- 物理意义明确。 P、I、D三个参数,每个都有直观的物理含义。你调参时能直接感受到变化:P大了抖,I大了晃,D大了硬。这种“手感”是其他算法很难给的。
我的个人习惯:每次拿到一架新飞机,我会先把I和D设为0,只调P。等P调到飞机能飞但有点抖,再加一点D让它稳定下来。最后才加I消除稳态误差。这个顺序能帮你快速定位问题。
一张图看懂PID
下面这张SVG图,把PID的三个环节和它们的作用画在了一起。你可以把它当作“调参地图”来用。
PID的数学形式(看一眼就行)
我知道有些同学看到公式就头疼。但PID的公式真的很简单,你只要知道它长什么样就行:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
翻译成人话:
- Kp * e(t):当前误差乘以比例系数
- Ki * ∫e(t)dt:过去所有误差的累加乘以积分系数
- Kd * de(t)/dt:误差的变化率乘以微分系数
三个结果加起来,就是最终输出给电机的控制量。
在实际代码里,它长这样(以姿态角度的P控制器为例):
// 伪代码示例:角度环P控制器
float error = target_angle - current_angle;
float p_output = Kp * error;
// 加上积分项
integral += error * dt;
float i_output = Ki * integral;
// 加上微分项
float derivative = (error - last_error) / dt;
float d_output = Kd * derivative;
// 最终输出
float output = p_output + i_output + d_output;
last_error = error;
你看,就这么几行。但就是这几行代码,决定了你的飞机是“丝般顺滑”还是“抖成筛子”。
三种参数,三种“手感”
为了让你更直观地理解P、I、D各自的影响,我整理了一个对比表。你可以把它打印出来贴在工位上:
| 参数 | 太小 | 合适 | 太大 |
|---|---|---|---|
| P | 反应迟钝,像在泥里飞 | 响应迅速,回中干脆 | 高频抖动,电机发烫 |
| I | 悬停偏航,回不到目标 | 稳态误差消除,悬停精准 | 低频晃动,积分饱和炸机 |
| D | 超调明显,飞机“点头” | 响应平滑,刹车柔和 | 高频噪声放大,电机尖叫 |
一个小技巧:如果你不确定当前参数是偏大还是偏小,可以轻轻拨动飞机(注意安全!)。如果飞机回正时“冲过头”再回来,说明P偏大或D偏小。如果飞机回正很慢,说明P偏小。如果飞机回正后还在慢慢漂移,说明I不够。
本章小结
好了,第一章的内容就到这里。我们讲了PID是什么、三个环节各自的作用、以及为什么四旋翼离不开它。
你可能会觉得:就这?不就是三个参数吗?
嗯,别急。PID看似简单,但真正把它调好,需要大量的实践和手感。接下来的课程,我会带你一步步深入:从姿态环到角速度环,从手动调参到自动调参,从理论到炸机现场……
记住一句话:PID不难,难的是“感觉”。而感觉,是靠一次次试飞、一次次炸机换来的。
下一章,我们来聊聊四旋翼的“内环”和“外环”——为什么飞控需要两层PID?它们各自在干什么?
(嗯,说漏嘴了……不过没关系,到时候你就知道了。)