当PID算法遇上VEX机器人(上篇)

pid算法

pid的英文全称为Proportion Integration Differentiation,它是一个数学物理术语,即由比例单元(P)、积分单元(I)和微分单元(D)组成。其输入e (t)(设定值和实际值的差)与输出u (t)(比如功率值)的关系为

u(t)=Kp{e(t)+1/Ti∫e(t)dt+Td*d[e(t)]/dt} 式中积分的上下限分别是0和t

  1. 比例系数 Kp 的作用是加快系统的响应速度,提高系统的调节精度。Kp 越大,系统的响应速度越快,系统的调节精度越高,但是Kp过大(超调)会使系统不稳定。Kp 取值过小,则会使响应速度变慢,降低调节精度,从而延长调节时间,使得系统静态、动态特性变差;
  2. 积分系数 Ki 的作用是消除系统的静态误差(过去的状态)。Ki 越大,使得公式中的积分项趋于0的速度越快,静态误差越小;若 Ki 过小,将使系统静态误差难以消除,影响系统的调节精度;
  3. 微分系数 Kd 的作用是改善系统的动态特性(以后的状态),其作用主要是在响应过程中抑制偏差向任何方向的变化,对偏差变化进行提前预报。
    (关于积分、微分为什么会有这样的作用可以自己去研究积分、微分的作用功能)

讲了这么多,大家是不是对pid是什么还是不太了解呢,pid到底是一个什么东西呢。别着急,举一个非常生动形象的例子来帮助大家理解它。

现在你接到一个任务,要求你把水缸中水的温度保持在70度(允许存在些许的偏差),水缸里面有温度传感器、温度加热器和温度冷却器。根据温度传感器反馈回来的数值,我们就能够做出判读并采取行动。

  • 如果水的温度小于70度,那么我就给水加热;如果水的温度大于70度,那么我就给水降温。(70度是我们设定的值,温度传感器得到的值是我们得到的实际值,它们两者的差值就是我们上面公式中的e(t),为了让水温能够尽快的达到我们的要求,就需要给温度加热器/温度冷却器提供一个极大的功率(即上面公式中的u(t)),根据这两个值,我们就能够得到Kp的值)
  • 但是由于当水的温度达到70度的时候,虽然温度加热器停止了工作,但是温度加热器的余温还在继续给水加热,余温就有可能使得水温达到80度左右。也就是说,只根据上面的判断方式来进行操作,最终我们无法精确做到使水的温度一直保持在70度上下。要想达到70度,我们就需要提前停止加热/降温,那么要提前多久呢,这就需要我们对过去的情况和以后的趋势进行总结来得出。也就是上面公式中的积分过程(对过去)和微分过程(对未来)。

pid算法实现vex“不倒翁”机器人

如果读者看完上面的那个例子之后,对pid的功能还存在一些疑惑的话,没关系,下面我带着大家用pid算法来做一个具体的项目,相信看完之后大家应该就能够理解了。

想要用代码来实现“不倒翁”的功能,首先我们的明白其中的原理,再将其翻译成代码。所以我先给大家介绍一下我们的机器人,铛铛铛,如下所示,就是我们帅气的“不倒翁”先生了。它的功能主要由两个电机、两个橡胶轮和一个陀螺仪组成来实现的。

当PID算法遇上VEX机器人(上篇)_第1张图片

其实原理很简单,要想让两个轮子的机器人保持站立的状态,我们需要有一个参考角度(由陀螺仪来给出,假设为0),如果机器人往前倾斜了(陀螺仪的值大于0),那我们就应该使机器人的轮子往前滚,来保持平衡;如果机器人往后了(陀螺仪的值小于0),那我们就应该使机器人的轮子往后滚,来保持平衡。

从机器人的角度来考虑如何实现上面的过程,就是根据实际得到的陀螺仪的数据-设定的参考值得到差值e(t),接着主控将Kp*e(t)(也就是公式中的u(t))的值作为输出的功率传达给电机,电机开始转动,带动轮子转来保持平衡。

在理想的环境下,按照上述的方式进行操作理应就能够实现平衡,但是由于车有惯性,一下可能就过调了(Kp值过大),直接倒了。这时,就需要对以前所有的误差进行处理,通过积分系数来减小误差,来消除系统的静态误差。除此之外,我们还应该对误差的变化率进行处理(对误差的走向进行预测),也就是对误差进行求导处理,以此来改善系统的动态特性。


由于篇幅受限,我将在下一篇中来讲解程序是如何实现。

你可能感兴趣的:(vex(c语言))