3、位置控制基础:PID控制原理、串级PID结构、位置环与速度环设计、调参方法论
各位同学,欢迎来到位置控制这一章。说实话,PID控制是咱们飞控算法里最基础、也最实用的东西。你想想看,一个四轴飞起来稳不稳,说白了就看PID调得好不好。我在项目里见过太多“飞起来像喝醉了一样”的飞机,最后查来查去,都是PID参数没设对。
这一章我会把PID的原理、串级结构、环路设计,还有我最头疼但也最有心得的调参方法,一次性讲清楚。
3.1 PID控制原理——从“误差”到“控制量”的魔法
PID,全称比例-积分-微分控制。它的核心思想很简单:根据当前误差,算出你该给电机多大的力。
误差是什么?就是“我想要的位置”减去“我现在的位置”。比如我想让飞机悬停在10米高度,现在它只有9.5米,那误差就是0.5米。
PID控制器会把这个误差拆成三部分来处理:
- P(比例):误差越大,输出越大。说白了就是“看到偏差就猛推”。但光有P,系统会震荡,因为推过头了又会拉回来。
- I(积分):把过去的误差累加起来。如果一直有稳态误差(比如悬停总差那么0.1米),积分项会慢慢累积,最终把误差吃掉。嗯,这里要注意:积分项用不好,系统会“积分饱和”,响应变慢。
- D(微分):预测误差的变化趋势。如果误差正在快速减小,微分项会提前“刹车”,防止超调。我刚开始做飞控时,D项给得太大,飞机一抖一抖的,像得了帕金森。
数学表达式长这样:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
其中u(t)是控制输出,e(t)是误差。Kp、Ki、Kd就是我们要调的三个参数。
核心要点:P决定响应速度,I消除稳态误差,D抑制超调。三者缺一不可,但也不能贪多。
3.2 串级PID结构——为什么一个PID不够用?
你可能会问:一个PID控制器不就能控制位置了吗?为什么还要搞串级?
我举个例子。假设你直接用一个位置PID去控制飞机。当有风干扰时,位置误差会突然变大,PID输出一个很大的力去纠正。但问题是,这个力直接作用在电机上,飞机会猛地一冲,然后过冲、回调、再震荡……
说白了,位置环的响应太慢,直接驱动电机太粗暴。
串级PID的思路是:外层环算“目标速度”,内层环算“目标加速度/力”。这样一层层传递,控制更平滑、抗干扰能力更强。
典型的串级结构是:
- 位置环(外环):输入是位置误差,输出是目标速度。
- 速度环(内环):输入是速度误差(目标速度 - 当前速度),输出是目标加速度或直接是电机油门值。
我在PX4和ArduPilot的代码里都见过这种结构。实际飞行中,内环(速度环)的频率通常跑在100Hz-200Hz,外环(位置环)跑在50Hz-100Hz。内环快,外环慢,这样系统才稳定。
个人经验:串级PID的调试顺序一定是“先内后外”。先把速度环调稳了,再去碰位置环。否则你根本分不清是哪个环在抖。
3.3 位置环与速度环设计——环路怎么搭?
好,我们具体看看这两个环怎么设计。
3.3.1 位置环设计
位置环的输入是位置误差(比如X、Y、Z方向上的偏差),输出是目标速度。通常我们用P控制器就够了,甚至只用P。
为什么?因为位置环本身不需要积分项——速度环会帮它消除稳态误差。如果你在位置环里加了I,反而会让系统响应变慢,甚至产生“位置超调”。
位置环的公式很简单:
target_velocity = Kp_pos * position_error
其中Kp_pos就是位置环的比例系数。这个值越大,飞机对位置偏差的反应越猛,但太大就会震荡。
3.3.2 速度环设计
速度环是串级PID的核心。它接收位置环给的目标速度,再结合当前速度(由IMU或光流传感器测得),输出控制量。
速度环通常用PI控制器:
control_output = Kp_vel * velocity_error + Ki_vel * ∫velocity_error dt
积分项在这里很重要。因为风阻、地面效应等干扰,光靠P项可能永远追不上目标速度。积分项会慢慢累积,直到误差消失。
但要注意:积分饱和。如果飞机被卡住(比如撞到东西),积分项会一直累加,等障碍物消失后,飞机会猛地冲出去。我遇到过这种情况,差点炸机。
避坑指南:我曾经在调试物流无人机时,忽略了积分限幅。结果飞机在降落时被一阵风吹偏,积分项疯狂累积,等风停了飞机直接侧翻。从那以后,我每次都会给积分项加一个限幅值,比如最大不超过油门量的30%。
3.4 调参方法论——从“抖成筛子”到“稳如老狗”
调参是门手艺活,也是玄学。但我总结了一套相对科学的方法,分享给大家。
3.4.1 准备工作
- 把飞机固定好(或者用仿真环境),确保安全。
- 先调内环(速度环),再调外环(位置环)。
- 记录每次修改的参数和对应的响应曲线(强烈建议用日志分析工具,比如FlightPlot)。
3.4.2 速度环调参步骤
- 先调P:从0开始慢慢增加Kp_vel,直到飞机出现轻微震荡(比如悬停时上下抖动)。然后回调20%-30%,得到一个相对稳定的值。
- 再加I:保持P不变,慢慢增加Ki_vel,直到稳态误差消失(比如悬停高度误差小于0.1米)。注意观察是否有“低频摆动”,如果有,说明I太大了。
- 最后调D(可选):如果系统响应太慢或者超调明显,可以加一点Kd_vel。但D对噪声敏感,IMU数据滤波不好时慎用。
3.4.3 位置环调参
位置环简单很多。保持速度环参数不变,从0开始增加Kp_pos,直到飞机能快速响应位置指令且不超调。通常Kp_pos的值在0.5-2.0之间(具体取决于单位)。
我个人的习惯是:先给一个很小的Kp_pos(比如0.5),然后给一个1米的阶跃指令,观察响应。如果响应太慢,就加倍;如果出现超调,就减半。反复几次就能找到合适的值。
调参口诀:P给响应,I消误差,D压超调。先内后外,先P后I,D项慎用。
3.5 一个完整的调参示例
假设我们要调一个四轴飞行器的Z轴(高度)控制。初始参数如下:
| 参数 | 初始值 | 调整后值 | 说明 |
|---|---|---|---|
| Kp_vel | 0.0 | 2.5 | 从0开始,每次加0.5,直到出现震荡后回调 |
| Ki_vel | 0.0 | 0.3 | 消除悬停时的稳态高度误差 |
| Kd_vel | 0.0 | 0.0 | 本例中未使用,因为响应已经够快 |
| Kp_pos | 0.0 | 1.2 | 位置环只用P,响应平滑即可 |
调完后的效果:给一个2米的高度阶跃指令,飞机在1.5秒内到达目标,超调量小于5%,稳态误差小于0.05米。嗯,这个效果已经可以用于大多数应用场景了。
小技巧:如果你在调参时发现飞机“嗡嗡”响或者高频抖动,大概率是P太大或者D太大。如果飞机“慢悠悠”地晃,可能是I太大或者P太小。多观察、多记录,调参其实没那么玄乎。
好了,这一章的内容就到这里。PID控制是飞控算法的基石,串级结构更是工程实践的精华。下一章我们会讲更高级的控制方法,比如LQR和MPC。但相信我,先把PID吃透了,后面的路会好走很多。