PID控制
这次是结合百度的Apollo自动驾驶课程和代码对PID进行学习~
control的作用
control(控制)在Apollo的自动驾驶框架中的作用:
- 位于localplan的后面,获取localplan生成的局部规划图(目标值)和车辆当前的定位、车速、航线角等实际值,生成合适的、可直接发到汽车执行器的油门刹车踏板开度和方向盘转角
控制中的频率
控制求解频率会影响到指令执行的效率,例如,在被控制量要求变化很快时,如果控制的速度跟不上,那么就达不到效果了
Apollo课程中还有提到共振的问题,目前还不明白控制中的共振是如何发生的
控制中的开环和闭环
一个小猫喂食机,如果我们设定每天出粮多少份,喂食机就只管库库出,那么这个喂食机系统是一个开环系统
我们一般都会设置喂食机多出一点粮,避免小猫饿到,但是小猫有时候胃口不好,有些日子吃得少,或者有天你煮了一盘鸡胸肉,小猫吃了鸡胸肉就不会想吃猫粮了,这样就造成了猫粮堆积—很容易受潮坏掉
现在市面上很多喂食机都有防余粮堆积功能了,一般是用摄像头或者称重装置,判断碗里是不是粮挺多的,是的话就自动暂停出粮,这就相当于一个闭环系统
这样看下来闭环系统的优势就很大了,闭环控制需要增加一些系统的复杂度,但是可以实现更精确的控制
在自动驾驶的控制部分,车速和车的方向都可以用到闭环控制,来实现更精准的巡航。在百度的Apollo项目中,车速控制用的就是经典的PID
实车自动驾驶控制部分常用算法
- 纵向控制(难度低):常用PID
- 横向控制(难度高):常用现代控制 Pure Pursuit、Stanley、LQR、MPC(多)
PID

如图,PID的流程是在每个控制周期读取当前误差,立即计算PID三项误差修正结果并输出为本周期的控制指令。图中为下发给车辆的指令,为planner下发,为车辆反馈,为车速差(实际与规划)
- 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 也做不到。
使用时经常会配合输出限幅、积分微分限幅等方法来应对这些问题