想这样一个事情,给定导航线路,但是小车偏离导航线路,如图,小车在预定线路的右面,我们需要让小车向左行驶重新回到线路上.
其中为转角,CET为与预期轨迹的垂直距离,为比例因子.
这种控制方式叫做P控制,我们把P控制的小车路径与导航线路画出来:
小车并没有像我们预想的那样直接运行到线路上,而是在规划的线路附近不停的震荡.
我刚开始学的时候一直弄不明白为什么会越界,明明离规划线路越近给的转向角就越小啊.
实际上这里的转向角是相对于上一时刻的转向角,而不是初始时刻.也就是说我们一直在增加转角,只是越靠近规划线路增加的越少而已.
初始时刻转角为0,而在线路上行驶转角也为0,所以要使小车到线路上行驶转角之和一定为0,但是P控制在小车越界之前一直在增加转角没有减小转角,这也是震荡的原因.
为了消除震荡,增加一个微分控制.
其中为转角,CET为与预期轨迹的垂直距离,为比例因子.为与预期轨迹的垂直距离时间的积分.
现在来考虑这样一个问题,车子装配时前轮如果出现了少许的偏差,或是机械的累积偏差.
这对人类来说没什么,我们会调整它,但是PD控制器可不会像人类一样能够调整它.所以我们加入一个积分项来抵消系统偏差.积分项为历史观察到的CET之和.
PID控制是由三种算法(比例、积分、微分)相加后的结果.
更通用的写法:
一开始由于系统偏差导致小车越界,但是随着时间的累积,积分项会纠正系统误差.
我们的算法中有三个参数,该如何确定这三个比例因子呢?
可以使用Twiddle算法,这是一种遍历所有可能值的算法.
P项与问题建立线性关系,所以P项越大,响应越快.
I项用来消除系统的稳态误差.
D项减小系统震荡(相当于提前刹车).
这里有些文章值得一看:
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/