如何讓無人車規規矩矩的在車道上行駛?這篇文章講清楚了
想象一下,當你駕駛自己的車輛在一條馬路上行駛時,你是怎麼保證車一直在車道內行駛的?
這個過程涉及到以下幾個方面:
1)你選定了一條車道;
2)你習慣讓車在車道正中間行駛;
3)你不喜歡急打方向盤,喜歡溫柔待車;
4)你可以接受車偏離中心線一點小的距離,偏離不要太大;
5)你喜歡車平穩的行駛
6)當車偏離車道中心線一定距離後,你希望它能快點兒回到中心位置
然而,無人駕駛汽車中的司機不再是你,而是車上的智慧駕駛系統。智慧駕駛系統的大腦—計算機,該如何讓車輛的行駛滿足上面六條要求呢?
首先,無人駕駛系統利用車載的攝像頭、鐳射雷達、高精地圖等傳來的資訊,明確當前正在行駛的馬路一共有幾條車道。
系統根據目的地,擇優選擇了一條車道(如何擇優?後續系列文章會持續講解,不屬於本文主題範圍),假設車輛已經在選定的車道上行駛。
在無人駕駛系統的眼裡,車道是由兩條曲線包圍的平面區域。人在開車時,只要車偏離中心不太遠,或者離車道邊界線不太近的情況下,都會認為是合理的。然而,目前計算機還不能像人一樣,給出“不太遠”,“不太近”的估摸。
根據當前路況,如果工程師編寫的是按照車道中心線自動駕駛的策略,那麼計算機會根據車道兩邊的車道線計算出車道中心線。在計算機的眼裡,它必須按照車道中心線嚴格的行駛。
那麼問題來了:無人車如何按照車道中心線行駛?
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控制策略並不適合無人駕駛汽車。人們不可能允許一個持續走蛇形曲線的無人車在路上行駛的。
比例-積分-微分控制: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控制器的控制下,無人車可以實時保證自己按照期望的路線行駛。