mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1864 字
5 分钟
Pid控制总结
2026-06-14

Pid控制总结#

一、传统Pid#

1.建模#

对于Pid闭环控制,通过控制器计算实际值(ref)与目标值(target)之间的差距(diff)来算出需要电机等被控制器的电流/速度/角度等数值。 开闭环区别 由于闭环控制存在反馈机制,从而可以更加准确的实现控制目标,同时在实际环境中对于不同环境的适应性远强于开环控制。

2.kp#

对于传统Pid,kp为 Pout=kpdiffP_{out} = kp * diff ,因此在实际应用中,Kp负责对误差值进行纠正,但由于采用对diff的差值运算,因此无法实现完美的diff=0,产生稳态误差。 kp稳态误差 并且在实际调参过程中,会产生“超调”的现象,由于kp过大,导致其产生低频大幅的震荡。 Kp过大产生超调

3.Ki#

由于单纯Kp调控会产生稳态误差,因此Ki应运而生。Ki即积分,通过对误差值diff进行积分,从而不断的逼近极限。因此对于Ki,采用 Iout=+KidiffI_{out} =+ Ki * diff 加入Ki后消除稳态误差 如图所示,在将仅Kp加入Ki后,系统成果稳定在目标值v=5处。但是当我们希望动态响应更加迅速时,则会出现尖峰的现象,这是由于其即将到达目标值时无“阻尼”,导致其在Kp偏大时超过对应目标值后才可以降低。 Kp+Ki过大产生超调

4.kp#

由于其在快速动态响应时产生超调的现象,因此我们加入Kd充当阻尼。Kd借鉴了微分的思想,即 Dout=Kd(diffdifflast)D_{out} = Kd * (diff - diff_{last}) 。在这种环境下,可以成功在希望加速和降速时更快的达到目标值且不产生震荡超调的现象。 加入Kd后震荡减少 而Kd过大同样会产生震荡,导致产生高频小幅震荡产生。 Kd过大产生震荡

二、多环Pid#

由于很多时候我们要控制电机转动到对应的角度上,因此我们使用多环控制电机转动到我们所需要的目标角度上。例如在GM6020控制云台Yaw轴转动到对应角度上,我们有两种办法。一种是通过第一层Pid控制器输出目标速度,再通过第二层Pid控制器输出目标电流。而第二种则是通过对Pid控制器直接输出目标电流。 多环角度环Pid 对于这两种方式,通常第一种方式更加的符合直觉且效果更加的好,而第二种方式则更加的简单去编写控制代码和调参。

对于多环Pid的调参,我们应当采取由内向外的调参方式,且仅在最外环添加Ki

对于多环Pid,若内外环均添加Ki,则会产生迟滞的现象且两个Ki相互积分影响的情况,因此一般仅在最外环添加Ki即可。

三、前馈控制#

推荐前馈讲解视频(b站-华南小虎队):https://www.bilibili.com/video/BV19T411t7du

1.使用场景#

对于动态改变的目标(如以 v=sin(t)v = sin(t) 运动的电机、RM比赛中的底盘小陀螺),由于其目标运动存在规律性且我们希望diff尽可能的偏小,因此我们可以对其“未卜先知”的控制其运行。

2.数学原理#

由高等数学的泰勒展开我们可以知道,当我们对函数偏导越多,我们就可以更加逼近于函数实际的曲线。由于在实际中我们仅需一小段的,因此一般采用微分得1/2阶导来进行前馈运算。一般来说公式为 Fi=kftargetitargeti1F_i = k_f * \text{target}_i - \text{target}_{i-1} 前馈效果 对于含有重力的Pitch轴,我们同样可以通过对于重力计算得出对应的数值,利用D(s)计算出外界固定干扰值,从而使Pitch轴更加的稳定。

3.代码示例#

/*
采样周期:T = 0.001s(1ms)
转动惯量:J = 1
摩擦系数:f = 1
角速度/力矩:G(s) = 1 / (s + 1)
前馈环节:Gf(s) = s + 1
输出:out = in' + in = (in - Last_in)/T + in
*/
#define T 0.001;
float Last_in = 0;
float ForwardFeed(fload in)
{
float out;
out = (in - Last_in)/T + in;
last in = in;
return out;
}

以上代码就是前馈控制的代码,在这部分代码中,采样周期等数值为理想变量,实际过程中需要测量对应的数值从而代入得到最终值。

四、积分分离和变速积分#

1.PID 积分分离意义#

在普通的PID控制中引入积分环节的目的,主要为了消除静差,提高控制精度。但在过程启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,致使控制量超过执行机构可能允许的最大动作范围对应的极限控制量,引起系统较大的超调,甚至引起系统较大的震荡。

积分本身是用于消除静态误差。但在短期内存在很大偏差的情况下,会造成积分累积,导致控制量超出执行机构可能允许的最大动作范围对应极限控制量,引起超调以及振荡。 而积分分离的原理则是:当误差值比较大时,取消积分作用,以免由于积分作用使得系统稳定性降低,超调量增大;当被控量接近目标值时(即误差较小时),引入积分控制,以消除净差,提高控制精度。 因此简单来说,就是积分作用是用来消除静态误差,但是不能整个状态中都使用。误差较大时,如果还使用积分,就会使控制量很大,比较容易产生超调或者振荡。所以这里的分离的意思就是,在误差大的时候不用积分,在误差比较小的时候才用积分作用,用于消除静差。

2.运算逻辑#

在积分分离中,我们对于超出积分积累的数值采用Pd调节器,而在处于积分分离区域的数值,我们采用Pid控制器,从而保证在实际应用中产生由于积分积累过大难以消除的问题。 积分分离

3.代码示例#

/*
kp/ki/kd 为pid参数
epsilon 为Ki输出点
*/
float Pid_cala (float ref , float set)
{
static float last_diff;
static float I_out;
float diff = set - ref;
float P_out = kp * diff;
float D_out = diff - last_diff;
last_diff = diff;
if(diff < -epsilion || diff > epsilion)
{I_out =+ diff * Ki;}
float output = P_out + I_out + D_out;
return output;
}

4.变速积分#

由于积分分离只能对于Pid或者Pd控制器的切换,但并不能控制偏离大小后对于积累速度的大小。因此为了使得积分积累更加的平滑,因此变速积分应运而生。 对于变速积分来说,采用对于不同偏移大小不同处理的思想。对于大于极限点,不积分;在最大点和积累最小值间,采用变速积分;对于小于最小,则Ki=设定值。 因此可以把积分分离理解为,变速积分的常数化形式。积分分离把每一段的beta值都用常数,而变速积分则采用系数的形式,使得积分的分段更加线性化。但是会产生作用效果偏慢的副作用,因此应当在不同环境下有选择的使用这两种方法。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Pid控制总结
https://github.com/zhenzhen0915
作者
zhenzhen0915
发布于
2026-06-14
许可协议
CC BY 4.0

部分信息可能已经过时

目录