如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

想象一下,当你驾驶自己的车辆在一条马路上行驶时,你是怎么保证车一直在车道内行驶的?

这个过程涉及到以下几个方面:

1)你选定了一条车道;

2)你习惯让车在车道正中间行驶;

3)你不喜欢急打方向盘,喜欢温柔待车;

4)你可以接受车偏离中心线一点小的距离,偏离不要太大;

5)你喜欢车平稳的行驶

6)当车偏离车道中心线一定距离后,你希望它能快点儿回到中心位置

然而,无人驾驶汽车中的司机不再是你,而是车上的智能驾驶系统。智能驾驶系统的大脑—计算机,该如何让车辆的行驶满足上面六条要求呢?

首先,无人驾驶系统利用车载的摄像头、激光雷达、高精地图等传来的信息,明确当前正在行驶的马路一共有几条车道。

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

系统根据目的地,择优选择了一条车道(如何择优?后续系列文章会持续讲解,不属于本文主题范围),假设车辆已经在选定的车道上行驶。

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

在无人驾驶系统的眼里,车道是由两条曲线包围的平面区域。人在开车时,只要车偏离中心不太远,或者离车道边界线不太近的情况下,都会认为是合理的。然而,目前计算机还不能像人一样,给出"不太远","不太近"的估摸。

根据当前路况,如果工程师编写的是按照车道中心线自动驾驶的策略,那么计算机会根据车道两边的车道线计算出车道中心线。在计算机的眼里,它必须按照车道中心线严格的行驶。

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

那么问题来了:无人车如何按照车道中心线行驶?

<strong>Bang-Bang控制

一个新手司机在马路上行驶时,有时候容易犯的一个错误就是按照固定的幅度打方向盘。不管向左还是向右打方向,新手会不停的来回按照固定的角度转动方向盘,要么向左转半圈,要么向右转半圈。虽然他的初衷是好的,是为了让车在车道中间行驶。

然而,固定幅度转动方向盘带来的后果就是,汽车在马路上走蛇形曲线。这种固定转动方向盘的控制策略,在控制领域称之为Bang-Bang控制。这个名字非常形象的表达出了新手的恐慌,向左"砰"的一声到底,向右"砰"的一声到底,所以也有人叫它"砰-砰控制"。

在Bang-Bang控制策略下,计算机的表现跟人的表现其实差不多。不过,新手在恐慌下转动得幅度是由其身体转动幅度、胳膊扭动幅度限制的。如果在不用换手的情况下,方向盘可以转动360度,新手司机在恐慌下也是会转出360度的。

计算机通过控制传动机构及动力驱动机构来直接转动车轮,在Bang-Bang控制策略下,需要人为提前设定车轮允许转动得最大角度。计算机没有左右的概念,在它的眼里一切都是数字。车辆偏离车道中心线,计算机看到的是偏离误差的正负。左偏为正,则右偏为负;右偏为正,则左偏为负。这需要工程师在设计是就定好。

假设左偏为正,右偏为负,车道中心线上为0。如果当前车辆左偏中心线20公分,则在计算机眼里汽车的偏离误差为error = 0.2米;如果当前汽车右偏中心线30公分,则在计算机眼里汽车的偏离误差为error = -0.3米。

假设左偏为正,右偏为负。如果车辆左偏,则需要向右转动方向盘,在计算机的系统里,转动方向盘的幅度为control = -45度;如果车辆右偏,则需要向左转动方向盘,在计算机认为方向盘应该转动control = 45度。

至此,Bang-Bang控制的策略可以总结为:

如果error>0, control = -45度;如果error<=, control = 45度;如果error = 0, control = 0

显然,Bang-Bang控制策略并不适合无人驾驶汽车。人们不可能允许一个持续走蛇形曲线的无人车在路上行驶的。

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

<strong>比例-积分-微分控制:PID控制

如果是老司机开车,乘客的感受可以用三个字来形容:稳、准、快。不管是加速、减速、超车、转弯,老司机开车就是稳;老司机可以在车道中心线上行驶很长一段时间,而不会偏离车道,这就是准;同样的距离,老司机开车比新手要快。

稳、准、快,就是控制领域对控制系统的要求。在无人驾驶领域,比例-积分-微分控制(PID控制),可以在一定程度上满足这些要求。那么问题来了:什么是PID控制?

回想老司机是怎么开车的:根据车辆偏离车道中心线的距离大小,适时的调整转动方向盘的幅度大小,当车辆回到中心线时,方向盘也回中,偏离车道距离越小,方向盘转动越小。

这种考虑偏离程度的控制策略,控制领域称之为比例控制,即P控制。

这个在计算机眼里,可以表达为:方向盘的转动角度control,是车辆偏离当前车道的误差error的倍数。我们用Kp来表示这个倍数大小,那么比例控制可以表达为:

control = Kp*error

问题来了,左偏error为正,此时应该向右(负方向)转动方向盘,但是按照上面式子算出来的结果却是control也为正?这是一个细节问题,记住一句话:没有人规定Kp必须大于零。Kp的正负,在实际中与你定义的error和control的正负有关。Kp可以表示正的倍数,也可以表示负的倍数,而且Kp也可以是小数。

如果用比例控制,无人车的控制效果要比Bang-Bang控制好很多,但是存在的问题就是:汽车可能会不停的穿越车道中心线,并且来回调整,并不能稳稳地按照车道中心线行驶。控制领域,称这种现象为"超调"。

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

那有没有什么办法可以避免超调?其实仔细思考,超调就相当于你加速冲向一面墙,但是刹不住了,就一下子撞墙上了。如果你能根据你和墙的距离、以及你的速度来判断是不是减速,就可以避免撞墙。这里面就用到了两个概念:你和强的距离,比例控制用到了;你的速度,还没有用到。

对无人车来说,如果将车辆和中心线距离变化的快慢也考虑进来,是不是可以避免超调?车辆和中心线距离变化的快慢,实际上是偏离量error的变化快慢,我们用error_rate来表示这个快慢。

如果汽车正在从左偏向中心线靠拢,而且靠拢的速度很快,如果不采取措施,汽车很快会变成右偏。左偏的时候error是负值,向中心线靠拢的时候,偏离程度在减小,error从负值向0变化,那么相当于error在变大,即error_rate为正。

我们从control中拿掉error_rate的Kd倍,即control = control + Kd*error_rate,让control变小。Control变小之后,汽车向中心线靠拢的速度会变慢,这样就可以避免汽车冲过中心线,跑道车道中心线右边了。

有人又问了,不是让control变小吗?看表达式,明显是变大了啊!同样的,记住一句话:没有人规定Kd必须大于零,根据本文的定义,Kd是负值。

同时考虑偏离程度、向中心线考虑快慢两个因素的控制器,控制领域称之为比例-微分控制,即PD控制,表达式如下:

control = Kp*error + Kd*error_rate

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

PD控制可以很好地解决P控制的超调问题,可以让汽车稳稳地向中心线靠拢了。

但是,有时候会发现汽车接近车道中心线,但是偏离距离很小时,control的值也很小,并不足以驱动车辆继续向中心线靠拢;或者,路上路面不平,导致控制效果变差,车辆行驶路线与车道中心线有一个持续的偏差error。

按照前面的思路,在control里面加上或减去一个和error相关的量,是比例控制;在control里面加上或减去一个和error_rate相关的量,是微分控制。还有没有一个量,可以将这种持续的偏差error考虑在内呢?答案就是:积分控制。

这种持续的偏差,持续一段时间后,车辆的路线跟车道中心线会形成一个长条形的区域。这个区域可以称之为累积误差,记为error_sum。这个累积误差,实际上是长条形区域的面积,可以用error的积分来表示:

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

如果在control中,加上error_sum的倍数,就可以将这种持续误差带来的影响逐渐消除,这时control = control + Ki*error_sum。控制量control中叠加Ki*error_sum,如果车辆持续在车道中心线左边,那么error_sum是负值,control中再叠加一个正向右偏的量,就可以将车辆控制到车道中心线上。

有人又问了,error_sum是负值,Ki*error_sum是负值,control不是变小了吗?同样的道理,根据本文对error和control的定义,Ki是负值。在实际工程中,工程师也要根据需求,定义这些参数的正负。

这种同时考虑偏离程度、向中心线考虑快慢、持续偏离误差三个因素的控制器,控制领域称之为比例-积分-微分控制,即PID控制,表达式如下:

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了

在PID控制器的控制下,无人车可以实时保证自己按照期望的路线行驶。

如何让无人车规规矩矩的在车道上行驶?这篇文章讲清楚了


分享到:


相關文章: