0.引言

现在假设你拥有一个四旋翼飞行器,你希望通过控制电机的转速使其到达并悬停在50米的高度,你该怎么做?PID控制或许是一个不错的解决方案[1].

1.P(Proportional)比例环节:着眼于当下误差

在飞行器的例子中:

[公式]

当飞行器尚未起飞的时候,误差为50米.我们设计电机的实时转速为误差乘以比例系数 [公式] ,其结构图如下:

这看上去可行,最开始的时候,飞行器距离目标高度较远,所以电机以较大的速度运行,越接近100米的目标,电机速度越小,最后达到目标高度.

问题在于,达到指定位置后,如果飞行器关闭电机,那么必然会在重力的作用下掉落.所以为了悬停,电机必须要提供一个足以对抗重力的速度,假设为50rad/s.如果 [公式],便要求误差为25米,最终飞行器只能停留在75米的高度.如果 [公式],便要求误差为10米,最终飞行器只能停留在90米的高度.我们会发现,无论 [公式] 的值取的有多大,都会存在一定的误差,这个误差项就是自控系统中常见的稳态误差.实际控制中,比如移动机器人的摩擦力,温控系统的能量泄漏等等这些都会造成稳态误差[2].

2.I(Integral)积分环节:累计过去所有误差

为了解决单纯比例环节造成的稳态误差问题,我们引入了积分环节.积分环节将过去的所有误差累加.最后乘以一个系数 [公式] .

积分环节的引入很好的解决了稳态误差的问题.但是带来了另外一个问题:超调.当飞行器到达指定高度时,由于误差为0,比例环节暂时失去作用.由于积分环节(累计过去的误差,所以值不为0)的存在,飞行器将继续向上飞行,此时会产生一个负值的误差,积分环节开始减小,同时比例环节产生一个负向的值.飞行器向下飞行.所以最终的结果是,飞行器在目标高度上下浮动,最终稳定在指定高度.其时域图相应大致如下:

3.D(Derivative)微分环节:预测下一时刻误差

微分环节对当前时刻的误差求导,从而”预测”下一时刻的误差.在离散环境下,其数值等于此时的误差减去上一时刻的误差.微分环节很好的解决了积分环节带来的超调问题.加入微分环节的PID时域相应如下:

4.总结

PID由于简单、鲁棒性高,被广泛运用于工业控制系统.其在连续时间域的公式如下所示:[3]

[公式]

由于计算机是离散的环境,所以具体的编程需要对连续的时域进行采样,在下一个PID系列文章里,我将会利用Arduino实现电机速度的PID控制,并给出相应的代码,你的点赞支持是我更新的最大动力,敬请期待吧乀(ˉεˉ乀).

参考

  1. ^YouTube Understanding PID Control https://www.youtube.com/watch?v=wkfEZmsQqiA&list=PLn8PRpmsu08pQBgjxYFXSsODEF3Jqmm-y&index=1
  2. ^一文读懂PID算法 https://blog.csdn.net/qq_25352981/article/details/81007075
  3. ^Modern Control Systems