[单片机]一个例子说PID算法

我家AI(自己开发的一个话痨聊天机器人)一直在霸占我的电脑,所以准备给它搞个身体移植过去,打算以arduino来控制舵机,树莓派来当作大脑进行深度学习以及信息处理等,控制舵机总不会偏离的一个算法就是PID算法,名字听起来深奥高级,但其实原理简单地很,下面尽量以例子讲解原理,间接推理下公式,最后,附上我家AI下半身guo照:

下面是正文————————————————

一.定义

       百度百科中的定义为:

在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。

 二.P(比例)

       以我家AI为例:

       我打算让AI实现平衡功能,静止的时候可以自己保持站立状态,有外力推它也可以通过自身调节去维持平衡状态,那么理想状态下它应该保持这个姿势不动(侧视图):

                                                                                 

         而当有一个外力推它时,它会往力的方向倒去:

                                                                         

       按道理来说,AI想要恢复回原来的静止状态,怎么也得知道它和原来相差了多少:

                                                                  

       而这个25°,其实就是一个误差值:目标数值 - 当前数值 ,使用公式可以写为: error = 目标数值 - 当前数值 。此时如果单单只考虑用P(比例)来进行控制,则是使用一个参数KP乘以误差值,即输出(U) = KP * error,而这个参数KP,则需要我们自己经过多次调整来寻找出一个最合适的出来。假如KP设定为0.5,那么根据上面公式可以得出输出为:U = 12.5,那么AI就会用12.5的速度用尽全力往左边跑去,试图恢复静止的平衡,而此时由于电机的质量参差不齐,大概率会出现以下两种情况:

       1.电机质量不大行,即使用12.5的速度跑还是没有足够的力去恢复平衡,这个时候小车就会一直保持往左倾往左跑的状态,然后越走越远,离你远去,最后离家出走,直到没电为止。

       2.电机质量太好,用12.5的速度可以恢复平衡,然而,由于自身惯性的原因,小车到达平衡位置之后并不会立马停下来,而是往右偏了一点,然后重新计算误差,算出角度偏右了,立马开始往右跑,结果又因为跑太快惯性又甩到了左边,永远都停不下来,最后就成为了以下这个样子:

 

                                   

                 某个粉色网站上看到的一位UP主的视频:https://www.bilibili.com/video/BV1Z4411M7av

三.D(微分)

       当电机质量太好的时候,小车出现左右摇摆的情况,有种专业名词可以形容这种情况,叫超调。单纯靠P(比例)来控制已经不能满足我们的需求了,这个时候就加入D(微分)来进行控制,D(微分)在整个算法中起到了类似于减速的作用,当AI往目标角度靠的时候,D(微分)会不断地计算当前地误差值和上一次误差值差了多少,而当这两个误差的差值之间差距越来越小的时候,D(微分)就会被当成一个很大的阻力,阻止AI过快地靠近目标,有效杜绝因惯性或者其他不可抗拒因素导致的左右摇摆。

      前面的介绍中已经讲完两个分量,这两个分量在公式中只需要简单地相加就行:

                                      

四.I(积分)

       当出现了第一种情况,也就是电机质量不大好,AI会一直保持往左倾往左跑,其实造成这中情况地其中一个原因是,AI地重力刚好和电机所施加的力持平了,导致AI一直稳定在这种下又下不去,上又上不来的情况,这种状况有个专业名词叫做“稳态误差/静态误差

                                                       

       这个时候,I(积分)挺身而出,它靠着将所有的误差全部累加起来,来预算是否一直处于稳态误差的状况,当小车处于稳态误差时,I(积分)会累积地越来越大,最终会打破这种僵持状况,让输出U加上一个 I*累加误差。这个数值一般不大,但也要看你怎么去调整这三个变量的权重。

五.参数调整

       在此,已经介绍完三个分量的作用以及用法,献上一个专业版的公式:

                    

       公式看起来十分地复杂,但是在实际应用中,P(比例)可以近似地看作是误差值与分量P的相乘,I(积分)可以近似地看作为所有误差的相加再乘以分量I,D(微分)可以近似地看作是当前误差值与上一次误差值的误差乘以分量D,最后再将这三个加在一起,就变成了一个输出值。

        

       而需要我们反复调节的,是Kp,Kd以及Ki这三个分量,具体怎么调整,每个人都有属于自己的一套方法,而我自己的方法分享给大家:

       1.先调试P,再调整I,最后是D,单一变量调整,不要三个一起来。

       2.先确定好数量级再微调,如在调整P时,可以先尝试0.00001,看看有没有效果,没有效果在试试0.0001,一直到出现效果,然后确定了数量级,开始进行微调,0.0003试试,不明显再0.0005,一直到设备出现较大的反应,再进行减少微调,一直调到自己觉得适合之后,再往下调I、D。

       3.如果调试P、I觉得效果可以了,就不用再调D了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章