3.3 使用PID算法对车轮进行速度调节(一般采用的方法,但会抖动)
很多工程控制都会用到PID,PID的思路很简单,假设我们开车,想把车维持在60km/s的速度上,那么车速如果只有十几而且不加速,那么了我们就要往死里踩油门,当车子嗖一下子窜出去了,我们就得松油门;如果车速是58,59的样子,那么我们就轻轻,或者几乎不踩油门。如果速度是65,那么我们就松开油门,如果速度是120,那么我们就得猛踩刹车。
这就是PID算法中的P因子。我们控制车速,参考的就是当前的速度和目标速度,如果这两个速度差的很大,那么我们就多给点儿油速度小,我们就少给点儿油。我们踩油门的程度就大致符合:
油门=(目标车速-当前车速)X一个固定的力道(Propotion)
这就是PID控制中的P(Percentage)。使用这种方式控制轮子的方式可以称作P算法,现在我们把它实现一下:
在这个程序里,与P值的代码就三句(红框),第一句:计算当前速度与目标速度的差值;第二句:差值乘上一个比例因子;第三句,返回这个结果。这个程序有三个输入,分别为当前速度,目标速度以及最大油门。返回值就是基于当前速度和目标速度计算出的油门数值。
但是在生活中我遇到过这样一个问题:我有一辆小摩托,在我启动小摩托后,为了达到我想要的速度,我肯定是给足了油门,但是此时我的小摩托嗖一下就窜出去了(有一个很大的加速度),骑鬼火的社会人比较喜欢这种加速感,但生活不是鬼火,毕竟车头一翘阎王爷笑。当我发现我的小鬼火要翘头,我得赶快把油门松开。
此时我速度还没达到目标速度,油门还得捏着(P比例因子告诉我要捏住油门),但是因为我不能加速太快了,所以我还得松点儿油门。此时在P因子外,又有一种因子影响了油门,它就是:
微分比例因子(Derivative)
P因子和D因子在一起就构成了PD算法:
油门=P*(目标速度-当前速度)+D*(当前速度-上一时刻的速度)
参考了D值,刚刚的算法我们可以改为:
PID算法中,我们已经掌握了P因子和D因子,当然,这这样可能会导致另一个问题:我上一秒的速度是0,因为加速太快导致第二秒的速度一下子升高到了59km/h,按照常理,按照P因子作用,我此时应该不踩油门了(因为目标速度-当前速度≈0),但是由于D因子的存在(D因子发现我加速太快了),我会猛踩刹车。最后结果就是我速度到59了,踩刹车,速度下降,加速,又踩刹车;这样也会达到目标速度,但是这种加速是非常不稳定的。
所以,我们综合了微分,积分与比例因子,构建了完整的PID函数:
3.3-2使用改良的积分累加法对机器人进行控制
刚才的算法问题在于PID很难调,一般情况下轮子都面临着很强的抖动。所以我们换个思路来思考控制速度的问题(当然不是说PID不行,这个只是提供了一种更稳定的控制方法,具体采用哪种大家自行思考)
之前我们思考的逻辑,或者说数学模型是关于速度和油门之间的关系,速度矩阵是自变量,踩油门的力道是一个因变量。现在我们自变量不变,还是速度矩阵,而因变量我们变为踩油门力道的变化值,用一个公式来表示: