PID控制---基于python模拟

    PID是控制中非常经典的一个模型,利用P(比例)、I(微分)、D(积分)三者相互合作来实现对一个信号的闭环控制,同时可以让信号波形平滑变化而不是突变。以下主要是结合一个python实现的控制速度的程序来模拟PID的过程。

参考博客:电机控制进阶——PID速度控制_pid速度控制算法_码农爱学习的博客-CSDN博客 

目录

简述 

P(比例)

D(微分)

I(积分)

基于Python的速度调整

Kp=0.01,Ki=0,Kd=0

Kp=0.01,Ki=0.01,Kd=0

Kp=0.01,Ki=0.01,Kd=0.01


更新于2023.9.5:原来把I和D写反了,改过来了

简述 

    PID控制分为增量式和位置式两种控制方式,因为位置式用的比较多,因此我就以位置式的为主展开(增量式我参考的博客中有,如果有兴趣可以自行了解)。

    位置式PID控制主要由P(比例)、D(微分)、I(积分)三个部分组成,下面是一个简单的结构框图。

     假设当前设定的是速度,可以看到利用目标速度-实际速度,可以得到一个误差,根据这个误差经过P、I、D三种量的运算求和得到当前需要的修正量对实际值修正,然后使得最终实际值不断接近目标值。

下面是对PID单独的解释:

P(比例)

    P大致反映的改变量大小,与当前值和目标值的差距大小有关,差距越大,那么这个量也越大。      就拿推箱子举例,离目的地越远,那么你用的力也就越大,这样才能更快达到目的地,相反,要是距离目的地很近了,这时候就需要少点用力,不然就就会偏离目标更远。

D(微分)

    D大致反映的是阻力的大小,在连续情况中反映为导数,而在一般工程学的离散情况中就是两次测量误差的差值,也就是此次误差和上一次误差的差分。 

    这其实就是相当于阻力的作用, 无论你怎么调整,我都反向变化,这在最后平衡附近震荡时是很有效的,能够显著降低震荡幅度。

I(积分)

    I大致是针对不同阶段的调整做法,与调整的误差和有关。

    这个量主要是解决静态平衡的问题,假如有一个池子,有一个预期水位,有放水有漏水,一次调整周期内,放水为u,漏水为u,那么调整后水位依旧如此,下一个状态和上一个状态完全一致,那么P和D也是和上一个状态完全一致,那么调整后还是这个状态,就陷入了死循环,此时就需要I这个量,由于这个量是和误差和直接相关,那么每次调整,误差都会增加,那么下次调整的量就会和这次的不一样,就可以打破这个死循环。

基于Python的速度调整

下面主要是针对PID模型建立速度调整的模型,就以将速度从60调整至100为例,最终的精度要求是0.001,可以感受一下各个量的作用。

为了稳定的效果,我将几个系数都设置的比较小,大了很有可能就最终直接NaN了,可以自行调参设置。

代码如下:

from matplotlib import pyplot as plt

def PID(now_v,expc_v):
    Kp = 0.01
    Ki = 0
    Kd = 0
    sum_err = 0
    v_list = []
    err = expc_v - now_v
    err_last = err  # 上一次的输出,先初始化为一致
    cnt = 0
    while abs(err) > 0.001:  # 误差还在范围外
        err = expc_v - now_v
        sum_err += err
        uk = Kp*err + Ki * sum_err + Kd * (err-err_last) # 确定本次输出
        # now_v = now_v + uk + random.uniform(0,0)  # 更新当前速度,加入一个扰动
        now_v = now_v + uk
        err_last = err
        v_list.append(now_v)
        cnt += 1
    print(cnt)
    plt.plot(v_list)
    plt.show()

if __name__ == '__main__':
    PID(60,100)

Kp=0.01,Ki=0,Kd=0

此时表示的是仅利用P来控制,运行后发现下面的调整过程

看上去非常理想,因为这种情况本身就比较理想, 如果我加入了一个扰动项,那么就会变成下面这样,将速度加入随机扰动项。

now_v = now_v + uk + random.uniform(-0.1,0.1)  # 更新当前速度,加入一个扰动

 经过测试,比较小的扰动还是可以很快收敛,但是如果扰动比较大,比如为(-2,2),那么就会像下面这样

 到了五千轮左右才收敛,随着误差的增大,这个此时会变得更多,因此仅仅靠P来控制仅适用于理想情况。

Kp=0.01,Ki=0.01,Kd=0

此时加入了积分项I,同样设置(-2,2)的随机扰动,如下:

 发现在2500轮左右就实现了精度的要求,不过从实验来看,效果并不是很明显,可能是因为参数还没有调好。

Kp=0.01,Ki=0.01,Kd=0.01

这种情况下就是加入了微分项的调整,就是完整的PID过程。

还是在(-2,2)的随机误差情况下,这种组合的相对调整次数确实会少一点。

 以上就是关于PID的一些个人理解,就是简单调试,没有真正调参,就当是做个记录了。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值