PID控制器

P控制

想这样一个事情,给定导航线路,但是小车偏离导航线路,如图,小车在预定线路的右面,我们需要让小车向左行驶重新回到线路上.

image

那么我们如何设置转向角度呢?可以想象,转向角度一定是一开始大,随着慢慢接近线路,转向角越来越小的.所以按照与预期线路的距离比例调整转向角度:

\alpha = -J_P CET

其中 \alpha 为转角,CET为与预期轨迹的垂直距离, J_P 为比例因子.

这种控制方式叫做P控制,我们把P控制的小车路径与导航线路画出来:

image

小车并没有像我们预想的那样直接运行到线路上,而是在规划的线路附近不停的震荡.

我刚开始学的时候一直弄不明白为什么会越界,明明离规划线路越近给的转向角就越小啊.

实际上这里的转向角是相对于上一时刻的转向角,而不是初始时刻.也就是说我们一直在增加转角,只是越靠近规划线路增加的越少而已.

初始时刻转角为0,而在线路上行驶转角也为0,所以要使小车到线路上行驶转角之和一定为0,但是P控制在小车越界之前一直在增加转角没有减小转角,这也是震荡的原因.

PD控制

为了消除震荡,增加一个微分控制.

\alpha = -J_P CET - J_D\frac{d}{dt}CET

其中 \alpha 为转角,CET为与预期轨迹的垂直距离, J_P,J_D 为比例因子. \frac{d}{dt}CET 为与预期轨迹的垂直距离时间的积分.

image

PID控制

现在来考虑这样一个问题,车子装配时前轮如果出现了少许的偏差,或是机械的累积偏差.

这对人类来说没什么,我们会调整它,但是PD控制器可不会像人类一样能够调整它.所以我们加入一个积分项来抵消系统偏差.积分项为历史观察到的CET之和.

PID控制是由三种算法(比例、积分、微分)相加后的结果.

\alpha = -J_P CET - J_D\frac{d}{dt}CET - J_I\sum CET

更通用的写法:

\mathrm {u} (t)=\mathrm {MV} (t)=K_{p}{e(t)}+K_{i}\int _{0}^{t}{e(\tau )}\,{d\tau }+K_{d}{\frac {d}{dt}}e(t)

image

一开始由于系统偏差导致小车越界,但是随着时间的累积,积分项会纠正系统误差.

Twiddle

我们的算法中有三个参数 J_P,J_D,J_I ,该如何确定这三个比例因子呢?
可以使用Twiddle算法,这是一种遍历所有可能值的算法.

image

手动调整参数

P项与问题建立线性关系,所以P项越大,响应越快.
I项用来消除系统的稳态误差.
D项减小系统震荡(相当于提前刹车).

  1. 将所有增益设置为零。
  2. 增加P增益,直到对干扰的响应为稳定振荡。
  3. 增加D增益直到振荡消失(即它被临界阻尼)。
  4. 重复步骤2和3,直到增加D增益不会停止振荡。
  5. 将P和D设置为最后的稳定值。
  6. 增加I增益,直到它达到设定点所需的振荡次数(通常为零,但如果你不介意一些过冲振荡,可以做出更快的响应)

这里有些文章值得一看:
https://www.youtube.com/watch?v=4Y7zG48uHRo
https://www.wikiwand.com/en/PID_controller#
https://robotics.stackexchange.com/questions/167/what-are-good-strategies-for-tuning-pid-loops
https://martin-thoma.com/twiddle/
http://georgegillard.com/programming-guides/introduction_to_pid_controllers_ed2-pdf?format=raw
https://udacity-reviews-uploads.s3.amazonaws.com/_attachments/41330/1493863065/pid_control_document.pdf
https://www.wikiwand.com/en/Ziegler%E2%80%93Nichols_method

http://molefrog.com/pidnn-talk/

posted @ 2018-08-22 18:47:33
评论加载中...
发表评论