PID控制

这次是结合百度的Apollo自动驾驶课程和代码对PID进行学习~

control的作用

control(控制)在Apollo的自动驾驶框架中的作用:

  • 位于localplan的后面,获取localplan生成的局部规划图(目标值)和车辆当前的定位、车速、航线角等实际值,生成合适的、可直接发到汽车执行器的油门刹车踏板开度和方向盘转角

控制中的频率

控制求解频率会影响到指令执行的效率,例如,在被控制量要求变化很快时,如果控制的速度跟不上,那么就达不到效果了
Apollo课程中还有提到共振的问题,目前还不明白控制中的共振是如何发生的

控制中的开环和闭环

一个小猫喂食机,如果我们设定每天出粮多少份,喂食机就只管库库出,那么这个喂食机系统是一个开环系统
我们一般都会设置喂食机多出一点粮,避免小猫饿到,但是小猫有时候胃口不好,有些日子吃得少,或者有天你煮了一盘鸡胸肉,小猫吃了鸡胸肉就不会想吃猫粮了,这样就造成了猫粮堆积—很容易受潮坏掉
现在市面上很多喂食机都有防余粮堆积功能了,一般是用摄像头或者称重装置,判断碗里是不是粮挺多的,是的话就自动暂停出粮,这就相当于一个闭环系统
这样看下来闭环系统的优势就很大了,闭环控制需要增加一些系统的复杂度,但是可以实现更精确的控制
在自动驾驶的控制部分,车速和车的方向都可以用到闭环控制,来实现更精准的巡航。在百度的Apollo项目中,车速控制用的就是经典的PID

实车自动驾驶控制部分常用算法

  • 纵向控制(难度低):常用PID
  • 横向控制(难度高):常用现代控制 Pure Pursuit、Stanley、LQR、MPC(多)

PID

PID控制示意图,来自Apollo课程
PID控制示意图,来自Apollo课程

如图,PID的流程是在每个控制周期读取当前误差,立即计算PID三项误差修正结果并输出为本周期的控制指令。图中F(x)F(x)为下发给车辆的指令,uu为planner下发,X(s)X(s)为车辆反馈,ee为车速差(实际与规划)

  • P:(proportional controller) 与速度误差成正比,可以理解为比目标车速小就加上,比目标车速多就减去
    Kp太小:响应时间较长,控制不够灵敏
    Kp太大:容易加的或者减的太多,超调较严重(振荡)
  • I:(Intergral controller) 关于时间积分,修正响应时间长的问题,且可消除稳态误差:当系统误差很小时,P控制难以推进,I控制的累积效果会累积放大稳态误差,进而消除
  • D:(derivative controller) 关于时间微分,根据误差的变化速度提前加大或减小控制,能改善跟随快速目标的能力,适用对瞬态响应要求大的情况
    PID本身的输入和输出没有单位,实际上输出的是什么量,全看参数调完后所实现的效果,在自动驾驶的control中,PID的输入是速度差,输出是加速度

PID控制由于其形式简单、计算量小,在现实世界中使用很多,我查阅ai得知,很多汽车底层控制用的都是PID,例如节气门控制、电机中的电流环等。但是PID也有一个特点,就是model free,也就是不需要被控者的数学模型,只根据表现进行修正,这会带来以下问题:

  • 执行器有延迟:油门、刹车、转向都有响应时间。误差已经变小了,之前的控制量才生效,容易超调或振荡。
  • 执行器有上限:油门最多 100%,方向盘转角有限。PID 算出再大的值也达不到目标。
  • 执行器有变化率限制:方向盘不能瞬间从左打满到右打满。
  • 系统存在外部扰动:坡度、风阻、载荷变化会让同样的指令产生不同效果。
  • 目标本身不可达:例如要求车辆在很短距离内从高速完全刹停,再好的 PID 也做不到。

使用时经常会配合输出限幅、积分微分限幅等方法来应对这些问题

参考链接

百度Apollo课程