在知乎上看到了不少大牛寫的自動駕駛技術介紹文章,大多談到的是AI, Deep Learning, Computer Vision等等感知(Perception)層面的。但在各個感測器(雷達、攝像頭、激光雷達等)探測到目標信息及周圍環境後,車輛該如何做出反應?自動駕駛的大腦該怎樣根據感知層的信息對車輛進行控制?

這些其實都是在自動駕駛軟體中的功能應用層中實現,那麼功能層還需要做些什麼呢?本文試圖以最簡單的語言就以下幾方面聊聊自動駕駛中的功能開發。

  • 什麼是自動駕駛系統的功能?
  • 自動駕駛中的功能要做些什麼?
  • 功能設計包含了哪些內容?
  • 練習一下

1 什麼是自動駕駛的功能?

嚴格來說,本文並不討論「自動駕駛」這個主題。考慮量產的情況下,所謂的自動駕駛現階段只能分為高度自動駕駛(Highly Automated Driving, HAD)和部分自動駕駛(Partially Automated Driving, PAD),所以本文出現的自動駕駛字樣代表的是HAD和PAD。

HAD --- L3+的功能。Audi A8的交通擁堵引導(Traffic Jam Pilot, TJP)算一個,儘管宣佈了很久後依然沒有上市,未來幾年很多車企會主推這個功能。

PAD --- L1-L2的功能。比如國外Tesla的Autopilot,Cadillac CT6的Super Cruise,國內吉利博瑞GE的智能領航,長安CS55的IACC等等,均可以歸類到此。

那什麼是功能呢?

剛才HAD或PAD裏舉例展現出來的系統都是由一個個功能組成的,比如Tesla的Autopilot,其實就包括了以下功能:

  • 車道偏離預警 Lane Departure Warning (LDW)
  • 自適應巡航 Automated Adapt Cruise (ACC)
  • 交通擁堵輔助 Traffic Jam Assist (TJA)
  • 高速功能輔助 Highway Assist(可變道)(HWA)

吉利和長安的基本也包含以下幾個功能:

  • 車道偏離預警 Lane Departure Warning (LDW)
  • 車道偏離預防 Lane Departure Prevention (LDP)
  • 自適應巡航 Automated Adapt Cruise (ACC)
  • 交通擁堵輔助 Traffic Jam Assist (TJA)
  • 集成式巡航 Integrated Cruise Assist (ICA)

當然,這些功能不同的OEM叫法都不一樣。可以看出,無論是什麼級別,自動駕駛其實是由一個個小功能組成,甚至Super Cruise中的駕駛員Handsoff也可以算作一個功能。再舉例,Audi A8中的L3功能,其實也是在包含了LDW/LDP/TJA/ICA等等一系列功能的基礎上,再加上TJP。當然,自動駕駛級別越高,單個的功能也會越複雜。

至於這些功能在哪實現,可以在感測器中,在雷達ECU中,在攝像頭ECU中,或是在中央控制器ECU中(發展趨勢),均是可以的 。

2 自動駕駛中的功能要做些什麼?

現在的車載ECU軟體,基本都是按照AUTOSAR架構標準設計,如下:

功能基本都在Application Layer中實現,至於其它層的作用,由於相關性不高,這裡就不贅述了。

參考下圖,可以把每個功能理解為一個函數,有輸入輸出,通過獲取感測器和車身CAN的信息,經過分析計算,輸出CAN信號對車輛進行控制和顯示。

具體來說,

輸入

  • 各個感測器識別到的感知信息,比如攝像頭識別到的車道線信息,交通燈/路標信息,雷達識別到的車輛信息,周圍物體信息等等
  • 車身CAN上傳入的信號,一般又能分為幾類:
    • 車身狀態信號(車速,橫擺角速率等等)
    • 駕駛員操作信號(功能開關,轉向燈,油門,剎車等)

有了這些輸入信息後,就可以通過功能的內部運算來進行輸出,輸出以下信息:

輸出

  • 車輛控制信息
    • 發送給EPS的車輛轉向扭矩角度等
    • 發送給EMS/ESP的車輛加減速信息
  • HMI信息提示
    • 當前功能的狀態
    • 駕駛員的提示信息等

那麼重點來了,功能的內部運算如何實現?我們這裡就介紹下功能設計所包含的內容。

3 功能設計包含了哪些內容

按照我的經驗和理解,功能層設計中主要包含了以下幾個方面:

  • 狀態機 State Machine
  • 人機交互 HMI
  • 控制器 Controller

分別設計實現以上幾個方面,就能相對完善地做出一個功能。這裡以車道保持輔助( Lane Keeping Assist, LKA) 功能設計為例,看看要做些什麼。

LKA指的是通過攝像頭識別車道線,檢測本車在自車道中的位置,經過實時計算,連續輸出扭矩請求信號至執行器電子助力轉向系統EPS,以控制車輛隨時保持在車道中間行駛,如下圖:

好了,那現在我們要在一輛車上實現車道保持,在感知層已經開發好的基礎上,功能層該怎麼做呢?

  • 狀態機 State Machine

第一步,是需要設計一個狀態機。這是功能開發中最複雜也最重要的一部分,因為無論HMI的輸出還是控制信號的輸出都需要基於狀態機。狀態機指的就是LKA功能當前處於哪種狀態下,這些狀態之間在何種條件下如何轉換。

ISO 11270 Intelligent transport systems — Lane keeping assistance systems (LKAS) — Performance requirements and test procedures中,為我們展示了一個狀態機,如下圖:

可以看出,其將LKAS分為了OFF和ON兩個主狀態,ON中又分為了standby和active兩個子狀態,這樣設計是最佳的麼?其實不一定,這裡展示的僅僅是一個最基本的狀態機,根據OEM需求的不一樣,對於HMI顯示的不同要求,是可以將這個狀態機擴展開來的。

比如主狀態,其實除了ON和OFF,是否需要額外表示ERROR狀態,ERROR又可以分為Permanent Error和Temporary Error,那在這些狀態之間,如何切換呢?

OFF -> ON:這個比較直觀,駕駛員按下開關,軟體讀取到功能開啟的信號後

ON -> OFF:同理,駕駛員將功能關閉

那麼如果此時功能是OFF,這時候功能出現故障,比如感測器出現故障,或所需要接收的車速等重要信息報文丟失,此時的狀態是繼續保持OFF還是轉為ERROR呢?這些就是狀態機裏需要定義的了。

此時功能狀態是ON,這時候出現故障, 狀態應該跳到ERROR,但之後,故障自動消失,比如之前丟失的報文又重新正常發送,那此時功能是回到ON還是回到OFF(讓駕駛員手動重新開啟)?這裡,一樣是取決於OEM的策略,沒有哪種一定好或一定不好。

那LKA在ON的狀態下,有active和standby兩種狀態。active顧名思義,功能正在激活,方向盤此時依據軟體計算髮出的請求扭矩進行自動調整,但出現了一定抑制,比如車速過低,一般而言,LKS只在車速60以上纔可以使用,那如果功能開啟,但車速在60以下,此時就是standby了。那僅僅standby和active兩個狀態就夠了麼?其實也不一定。

這裡需要引出抑制條件的概念,這也是LKA功能設計中比較重要的一環,LKA功能設計的初衷是輔助駕駛員打方向盤,使其開車時更加舒適,那麼如果駕駛員想要變道,此時如果還發出扭矩牢牢控制住方向盤把車維持在中間,是不是就有問題了?如果車輛處於一些極端工況下,這時候LKA還在正常激活,是否會對駕駛員的操作進行幹擾?同樣的,如果激活過程中突然丟失了車道線,LKA也應該進入抑制狀態。

因此,在駕駛員主動超越車身狀態不適合LKA周圍環境不支持LKA時,功能需要被抑制。常見的抑制條件如下:

  • 轉向燈開啟
  • 作用在方向盤上的手力矩過大
  • 方向盤轉角速率過大
  • 猛踩剎車
  • ABS/ESP激活
  • 等等

那麼,那以上這幾種情況下,既可以讓功能進入standby,也可以增加一個新的狀態機ready等等,可以將抑制分為幾類,不同抑制產生時對應不同的狀態。這樣做的目的是什麼呢?是為了讓駕駛員更加了解自身所處在的環境情況,根據這個功能當前處於哪種狀態,更清晰地瞭解該系統。

  • 人機交互 HMI

由狀態機中得知,HMI中最基本的就是我們需要知道這功能什麼時候是開啟的,什麼時候是關閉的,也就是說需要接收該功能的開關信號。可以是駕駛員方向盤邊上的硬開關,也可以是中控大屏裏的軟開關,這個不重要,但重要的是我功能需要接收駕駛員是否開啟功能的信號。

此外,作為駕駛員,我需要知道功能開啟後給我的反饋,該功能是否開啟,是否可以工作,是否激活,是否有故障等等。這些輸入的基礎就是狀態機了,功能將自身的狀態發出給儀錶,作出不同的顯示,這部分就是HMI要做的內容。

這一塊也是不同OEM區別最大的部分,有的可以做的很酷炫,比如特斯拉,可以將攝像頭識別到的車道線信息顯示出來,是直道還是彎道,且彎道能隨道路半徑的不一樣而變化,實線還是虛線等等。這些信息就是通過HMI直接輸出到CAN上,儀錶以此作為輸入進行顯示的。

Tesla Autopilot

所以,一定要理清楚該功能的輸入輸出是什麼?有哪些需要駕駛員輸入的信息,有哪些信息需要提供給駕駛員。

  • 控制器 Controller

車輛控制裏大致分為開環控制和閉環控制。

以LKA為例,比較常用的就是PID控制了。

圖片來源:Unified Tuning of PID Load Frequency Controller for Multi Area Power Systems via IMC - File Exchange - MATLAB Central

知乎上關於PID控制的介紹有很多,感興趣的可以看看。

推薦一個Youtube上的視頻,有條件的小夥伴可以看看:

Controlling Self Driving Car: https://www.youtube.com/watch?v=4Y7zG48uHRo

視頻就幾分鐘,可以很直觀的理解PID中各環節在LKA中的應用。

開環裏的前饋控制,look up table也是使用頻率比較高的。

但既然用在量產的LKA中,實際車輛上的情況還是非常複雜的,實際應用控制演算法會基於這些基礎版的開環控制和閉環控制有很多改進,這部分比較涉及核心,就不細說了。

4 舉個栗子考慮下該怎麼設計脫手檢測功能

對於一個功能來說,在完成以上幾點後,相當於就有了輸入輸出,有了內部的狀態遷移,根據這些狀態遷移可以反映出不同的功能狀態信息提示駕駛員。對於整車來說,儀錶顯示交互就完成了,再加上控制演算法控制車輛行駛,基本上一個功能就形成了。

這裡,大家可以想想如何設計一個脫手檢測功能。

圖片來源於網路

輸入:方向盤上的手力矩信號 or 電容感測器

輸出:提醒駕駛員接管信號

要求:在檢測到駕駛員脫手駕駛後發出接管提醒,可以分級發送,在儀錶上作出不同的提示,在駕駛員始終脫手並沒有接管後,將車輛安全剎停。

怎麼實現這個功能呢?

一樣可以從HMI 狀態機 控制器來思考,當然這裡涉及的車輛控制部分不多,主要是前兩種。大家可以思考下如何從這幾方面來設計~

============================

寫的可能有點亂,希望能對大家有點幫助,以後慢慢改進吧。

推薦閱讀:

相關文章