PID是目前工程上使用最广泛,最稳定的方法,说实话想做点实际的东西PID必不可少,对于PID的掌握是搞控制的基本。
本文会系统梳理PID控制,从基础的P控制器开始,PI控制器解决P控制器不能用大增益的问题,PID控制器解决PD控制器稳态误差不为0的问题,自动控制原理对一二阶系统的讨论附在后面,算是对基础知识的补充。
最简单的反馈控制器就是P Control and First-Order Error Dynamics,也就是PID里的P,PID是比例-积分-微分控制的缩写,这个了解自动控制原理的话大家都很熟悉了,它的控制律为:

0″>K_p>0,这种控制器被称为比例控制器,或P控制器,因为它创建一个与位置误差\theta_e(t)=\theta_d(t)-\theta(t)成比例的校正控制,换句话说,恒定的控制增益K_p有点像一个虚拟的弹簧,试图把实际的关节位置拉到期望的关节位置。P控制器是线性控制器的一个例子,因为它产生的控制信号是误差\theta_e(t)的线性组合也可能是其的导数和积分。
如果\theta_d(t)是常数,那么\dot\theta_d(t)=0,就称为setpoint control,这时候误差动力学为:

代入P控制器就有:

显然这是一个时间常数\tau=1/K_p的一阶误差动力学方程,它的衰减指数误差响应如下图,稳态误差为零,没有超调,2%的沉降时间为4/K_p,更大的K_p意味着更快的响应。

如果\theta_d(t)不是常数,而\dot\theta_d(t)=c,这时候误差动力学代入P控制器为:

处理一下:

解微分方程,就有:

当时间趋于无穷时,它收敛于非零值c/K_p,与setpoint control不同,稳态误差e_{ss}是非零的,关节位置总是滞后于运动参考点,通过选择控制增益K_p,可以使稳态误差c/K_p变小,但是K_p的大小受到实际情况的限制,一个是真正的关节有速度限制,K_p过大显然是不行的,另一方面,较大的增益可能给系统带来不稳定的问题。
那么想用大的增益怎么办?比例积分控制器或PI控制器PI Control and Second-Order Error Dynamics就出现了,它添加与误差对时间积分成比例的项:

PI控制器的方块图如下:

如果\theta_d(t)不是常数,而\dot\theta_d(t)=c,这时候误差动力学代入PI控制器为:

上式对时间求导:

利用上一帖中二阶误差动力学的相关知识,可以看出系统的固有频率\omega_n=\sqrt{K_i},阻尼比为\zeta=K_p/2\sqrt{K_i}类比经典的弹簧阻尼系统,增益K_p的作用等同于b/m(K_p越大,阻尼常数b越大),增益K_i的作用等同于k/m(K_i越大,弹簧刚度k越大)。
那么0″>K_p,K_i>0时,PI控制的误差动力学方程是稳定的,特征方程的根为:

让K_p等于20,然后在复平面上画出K_i从0增长的根轨迹(root locus)为下图:

对于根轨迹图的讨论就不再赘述了,可以画出下面的误差响应图,罗马数字1,2,3分别对应过阻尼,临界阻尼和欠阻尼的响应。

有了上面的讨论,对于临界阻尼情况(K_i=K_p^2/4),我们总是可以选择K_p,K_i,增加K_p,K_i使误差响应尽可能快,然而,实际情况的限制也不能让增益取的过大,在满足实际情况下,尽可能使K_p,K_i满足临界阻尼条件。
现在来对比一下P控制器和PI控制器,下图显示了P控制器和PI控制器尝试跟踪匀速轨迹的性能,两种情况下的比例增益K_p是相同的,而对于P控制器K_i=0,从响应的形状来看,似乎PI控制器的K_i选择的大了一些,使系统欠阻尼,但依旧很明显,PI控制器的e_{ss}=0,而P控制器的e_{ss}\not=0,这与上面的分析一致。
如果期望的速度\dot\theta_d(t)\not=c,PI控制器就不能完全消除稳态误差,但是,如果期望速度变化缓慢,那么一个设计良好的PI控制器可以提供比P控制器更好的跟踪性能。

进入PID前,先看这个:

如上图,考虑摩擦等阻力,动力学方程就为:

式中:
0″>\\ \tau_{fric}=b\dot \theta,b>0
简写一下,就为:

Feedback Control: PID Control(线性比例-积分-微分控制或PID控制),PID控制器就是PI控制器加上与误差对时间的导数成比例的一项,控制律如下:

上式中增益K_p,K_i,K_d都是正的,比例增益K_p类似于一个弹簧,试图减少位置误差\theta_e=\theta_d-\theta,微分增益K_d类似于一个阻尼器,试图减少速度误差\dot\theta_e=\dot\theta_d-\dot\theta,积分增益可用于减少或消除稳态误差。PID控制器方块图如图:

(1)PD Control and Second-Order Error Dynamics
如果K_i=0,就称为PD控制,假设机器人在水平面上运动(g = 0),将PD控制律代入动力学,就有:

如果\theta_d是常数,那么\dot\theta_d=\ddot\theta_d=0,那么\dot\theta_e=-\dot\theta,\ddot\theta_e=-\ddot\theta,这时候误差动力学为:

写成二阶形式:

那么固有频率和阻尼比就为:

系统要稳定,那么b+K_d,K_p就要为正,如果误差动力学方程是稳定的,则稳态误差为零,如果不出现超调和快速响应,增益K_d和K_p应选择满足临界阻尼情况,如果想要快速响应,应选择尽可能高的满足实际问题的K_p,过高的K_p可能导致抖振(扭矩快速变化的情况)的发生。
如果其它条件不变,连杆在垂直平面上运动(g > 0),根据上面的PD控制律,误差动力学可以写成:

观察上式,你会发现在K_p\theta_e=mgrcos\theta时,关节将保持静止,即\theta_d\not=\pm\pi/2时稳态误差\theta_e\not=0,因为机器人在\theta_d\not=\pm\pi/2必须提供一个非零的力矩来保持连杆静止,但PD控制律只有在\theta_e\not=0会在静止时产生非零力矩,这就陷入了矛盾,想让稳态误差变成0,但它就不是0,当然我们可以通过增大K_p来降低稳态误差,但是,我们上面讨论了,K_p会受到实际情况的限制,那这种情况该如何解决?PID就出场了。
(2)PID Control and Third-Order Error Dynamics
为了消除稳态误差,我们通过设置0″>K_i> 0让控制器化身PID控制器,下图展示了积分项加入控制器的效果:

写出误差动力学:

\tau_{dist}为扰动力矩代替了重力项mgrcos\theta,上式两边求导,就有三阶误差动力学:

如果\tau_{dist}是常数,那么上式的特征方程为:

如果特征方程的所有根都有负实部,则误差动力学是稳定的,且收敛于零,为了稳定还必须满足以下控制增益条件:

增益K_i必须同时满足一个下限和一个上限。合理的设计策略是选择K_p,K_d以获得良好的瞬态响应,然后选择K_i(从下面的根轨迹可以看出K_i太大,系统是不稳定的)使其能够减少或消除稳态误差,但又不至于对稳定性产生显著影响,在上面左边那张图可以明显看出效果。

实际使用中,对于许多机器人控制器K_i=0,因为稳定性是最重要的,可以用其他方法限制积分控制不利稳定的问题,比如integrator anti-windup,对允许的误差积分的大小设置一个限制。
PID控制算法的伪代码如下图:

虽然上述的分析集中于setpoint control,但是PID控制器很好地适用于轨迹跟踪,当然,它不是什么时候都有用,积分控制并不能消除沿任意轨迹的跟踪误差。
把一二阶系统特性放在最后,算是自动控制原理基础知识:
先来看Linear Error Dynamics,即讨论线性一般微分方程所描述的线性系统的误差动力学:

上式是一个p阶的微分方程,当c=0就是齐次的,c\not=0就是非齐次的。
对于齐次线性误差动力学,就有:

通过向量x=(x_1,\dots,x_p)

就可以把齐次微分方程写为:

很明显上式就为\dot x(t)=Ax(t),在介绍罗德里格斯旋转公式的时候详细讨论过这个方程

如果A是负定的,那么\dot x(t)=Ax(t)将收敛于x=0,也就意味着A的所有特征值(可能是复数)都有负实分量。列出A的特征方程:

方程的每个根都有负实分量的必要条件是所有系数a_0,\dots,a_{p-1}必须是正的,如果方程的每个根都有一个负实分量,就称误差动力学是稳定的,反之,则是不稳定的。其实这个也就是劳斯判据了。
其实又回到了熟悉的自动控制原理环节,对于二阶误差动力学,经典的弹簧阻尼器系统又来了,符号就不做过多赘述:

根据牛顿第二定律,就有:

如果,m=0,那么上面的二阶动力学就降阶为一阶动力学:

从上式中可以看得出,对于一阶动力学,外力产生的是速度,而非加速度,在接下来的讨论中,将考虑齐次情况(0″>f = 0,b, k > 0)的一阶和二阶误差响应,以确保误差动力学是稳定的,并且收敛到零(e_{ss}= 0)。
那么上面情况的 First-Order Error Dynamics就可以写为:

或者:
\\ \dot{\theta}_{e}(t)+\frac{1}{\tau} \theta_{e}(t)=0
\mathcal{\tau}=b/k称为一阶微分方程的时间常数。微分方程的解就为:
\\ {\theta}_{e}(t)=e^{-t/\tau}{\theta}_{e}(0)
时间常数\tau是一阶指数衰减到其初始值的大约37%时的时间,误差响应\theta_e(t)由\theta_e(0)=1决定,不同时间常数的误差响应图如下图,其中稳态误差为零,无超调,2%沉降时间由下式计算:\\ \frac{\theta_{e}(t)}{\theta_{e}(0)}=0.02=e^{-t / \tau}
\\ -t / \tau=ln0.02 \\ t=3.91\tau
2%的沉降时间约为4\tau,当弹簧常数k增大或阻尼常数b减小时,响应变快。

如果m\not=0,那么二阶误差动力学就为:

写成二阶形式:

\omega_n=\sqrt{k/m}就是熟悉的固有频率,\zeta=b/2\sqrt{km}就是阻尼比,那么特征多项式为:

两个根为:

很明显当且仅当0″>\zeta\omega_n>0和0″>\omega_n^2>0时,二阶误差动力学是稳定的。根据二阶微分方程的知识,就有下面三种情况:
(1)过阻尼:1″>\zeta>1,s_1,s_2为两不等实根,微分方程的解为:


时间常数为\tau_1=-1/s_1,\tau_2=-1/s_2
根据初始条件\theta_e(0)=1,\dot\theta_e(0)=0就有:

(2)临界阻尼:\zeta=1,s_1,s_2为两相等实根s_{1,2}=-\omega_n,微分方程的解为:

时间常数为\tau=1/\omega_n
根据初始条件\theta_e(0)=1,\dot\theta_e(0)=0就有:

(3)欠阻尼:\zeta=1,s_1,s_2为共轭复数根,s_{1,2}=-\zeta\omega_n\pm j\omega_d,\omega_d=\omega_n\sqrt{1-\zeta^2},\omega_d为阻尼固有频率,微分方程的解为:

时间常数为\tau=1/\zeta\omega_n
根据初始条件\theta_e(0)=1,\dot\theta_e(0)=0就有:

三种情况的误差响应如图:

同时根的位置与瞬态响应特性也有关系:根在复平面中更左的位置对应较短的沉降时间,根远离实轴对应较大的超调和振荡。这些根位置和瞬态响应特性之间的一般关系也适用于有两个以上根的高阶系统。

如果二阶误差动力学是稳定的,则无论误差动力学是过阻尼、欠阻尼还是临界阻尼,稳态误差e_{ss}都为零。2%沉降时间约为4\tau,如果误差动力学是过阻尼的,则与较小的根s1相对应。
对于过阻尼和临界阻尼误差动力学,超调量为零,而对于欠阻尼误差动力学,超调量可通过找到误差响应\dot\theta_e=0满足之后的时间,即超调的峰值出现在:

代入欠阻尼误差响应,得到:

根据超调的定义,那么超调就为-e^{-\pi\zeta/ \sqrt{1-\zeta^2}}\times100\%,阻尼比为0.1超调为73%,0.5时超调为16%,0.8时超调为1.5%。
参考文献:[1] Lynch K M , Park F C . Modern Robotics: Mechanics, Planning, and Control. 2017.