1. 程式人生 > >自動駕駛汽車硬體與軟體技術介紹

自動駕駛汽車硬體與軟體技術介紹

來源:知乎

概要:本文詳細介紹了自動駕駛汽車的硬體和軟體,以及所需要做的準備工作,每個研發者或者準備投身於無人駕駛領域的人都應該好好看一下。

全球有數不清的公司在忙著研發自動駕駛汽車,他們的產品也千奇百怪,不過基本思路和核心技術是類似的,本文詳細介紹了自動駕駛汽車的硬體和軟體,以及所需要做的準備工作,每個研發者或者準備投身於無人駕駛領域的人都應該好好看一下。

大家都知道智慧車(Intelligent Vehicle)是一個集環境感知、規劃決策、多等級輔助駕駛等功能於一體的綜合系統,它集中運用了計算機、現代感測、資訊融合、通訊、人工智慧及自動控制等技術,是典型的高新技術綜合體。

自動駕駛的關鍵技術依次可以分為環境感知、行為決策、路徑規劃和運動控制四大部分。

0?wx_fmt=jpeg

自動駕駛理論聽上去很簡單,四大關鍵技術,但到底如何實現的呢?Google 從 2009 年開始做自動駕駛,到現在已有 8 個年頭。8 個年頭的技術積累還無法將自動駕駛技術量產落地,可見自動駕駛技術並不簡單。自動駕駛是一個龐大而且複雜的工程,涉及的技術很多,而且太過細緻。我從硬體和軟體兩方面談一談自動駕駛汽車所涉及的技術。

硬體

離開硬體談自動駕駛都是耍流氓。先看個圖,下圖基本包含了自動駕駛研究所需要的各種硬體。

0?wx_fmt=jpeg

然而,這麼多感測器並不一定會同時出現在一輛車上。某種感測器存在與否,取決於這輛車需要完成什麼樣的任務。如果只需要完成高速公路的自動駕駛,類似 Tesla 的 AutoPilot 功能,那根本不需要使用到鐳射感測器;如果你需要完成城區路段的自動駕駛,沒有鐳射感測器,僅靠視覺是很困難的。

自動駕駛系統工程師要以任務為導向,進行硬體的選擇和成本控制。有點類似於組裝一臺計算機,給我一份需求,我就給你出一份配置單。

汽車

既然要做自動駕駛,汽車當然是必不可少的東西。從上汽做自動駕駛的經驗來看,做開發時,能不選純汽油車就別選。一方面是整個自動駕駛系統所消耗的電量巨大,混動和純電動在這方面具有明顯優勢。另一方面是 發動機的底層控制演算法相比於電機複雜太多,與其花大量時間在標定和除錯底層上,不如直接選用電動車研究更高層的演算法。

國內也有媒體專門就測試車輛的選擇做過調研。「為什麼谷歌、蘋果不約而同的選擇了雷克薩斯RX450h(混動汽車)?」「科技公司測試自己的自動駕駛技術時,對於測試車的選擇又都有哪些講究?」等問題。他們得出的結論是「電」和「空間」對無人車改裝至關重要,其次從技術層面上對車的「熟悉程度」是另外一個因素,因為如果不和車企合作改裝,需要「Hack(侵入)」某些控制系統。

控制器 

在前期演算法預研階段,推薦使用工控機(Industrial PC,IPC)作為最直接的控制器解決方案。因為工控機相比於嵌入式裝置更穩定、可靠,社群支援及配套的軟體也更豐富。百度開源的 Apollo 推薦了一款包含 GPU 的工控機,型號為 Nuvo-5095GC,如下圖。

0?wx_fmt=jpeg

Github ApolloAuto

當演算法研究得較為成熟時,就可以將嵌入式系統作為控制器,比如 Audi 和 TTTech 共同研發的 zFAS,目前已經應用在最新款 Audi A8 上量產車上了。

0?wx_fmt=jpeg

CAN 卡

工控機與汽車底盤的互動必須通過專門的語言——CAN。從底盤獲取當前車速及方向盤轉角等資訊,需要解析底盤發到 CAN 總線上的資料;工控機通過感測器的資訊計算得到方向盤轉角以及期望車速後,也要通過 CAN 卡將訊息轉碼成底盤可以識別的訊號,底盤進而做出響應。

CAN 卡可以直接安裝在工控機中,然後通過外部介面與 CAN 匯流排相連。Apollo 使用的 CAN 卡,型號為 ESD CAN-PCIe/402,如下圖。

0?wx_fmt=jpeg

全球定位系統(GPS)+慣性測量單元(IMU)

人類開車,從 A 點到 B 點,需要知道 A 點到 B 點的地圖,以及自己當前所處的位置,這樣才能知道行駛到下一個路口是右轉還是直行。

無人駕駛系統也一樣,依靠 GPS + IMU 就可以知道自己在哪(經緯度),在朝哪個方向開(航向),當然 IMU 還能提供諸如橫擺角速度、角加速度等更豐富的資訊,這些資訊有助於自動駕駛汽車的定位和決策控制。

Apollo 的 GPS 型號為 NovAtel GPS-703-GGG-HV,IMU 型號為 NovAtel SPAN-IGM-A1。

0?wx_fmt=jpeg

感知感測器 

相信大家對車載感測器都耳熟能詳了。感知感測器分為很多種,包括視覺感測器、鐳射感測器、雷達感測器等。視覺感測器就是攝像頭,攝像頭分為單目視覺,雙目(立體)視覺。比較知名的視覺感測器提供商有以色列的 Mobileye,加拿大的 PointGrey,德國的 Pike 等。

鐳射感測器分為單線,多線一直到 64 線。每多一線,成本上漲 1 萬 RMB,當然相應的檢測效果也更好。比較知名的鐳射感測器提供商有美國的 Velodyne 和 Quanergy,德國的 Ibeo 等,國內有速騰聚創。

雷達感測器是車廠 Tier1 的強項,因為雷達感測器已經在汽車上得到了廣泛使用。知名的供應商當然 是博世、德爾福、電裝等。

硬體部分總結

組裝一套可以完成某項功能的自動駕駛系統需要及其豐富的經驗,並且要對各感測器的效能邊界及控制器計算能力瞭如指掌。優秀的系統工程師能在滿足功能的要求下將成本控制在最低,使其量產、落地的可能性更大。

軟體

軟體包含四層:感知、融合、決策、控制。

各個層級之間都需要編寫程式碼,去實現資訊的轉化,更細化的分類如下。

先分享某創業公司公開的一份 PPT。

0?wx_fmt=jpeg

實現一個智慧駕駛系統,會有幾個層級:

  • 感知層 → 融合層 → 規劃層 → 控制層

更具體一點為:

  • 感測器層 → 驅動層 → 資訊融合層 → 決策規劃層 → 底層控制層

各個層級之間都需要編寫程式碼,去實現資訊的轉化。

最基本的層級有以下幾類:採集及預處理、座標轉換、資訊融合。

0?wx_fmt=jpeg

採集

感測器跟我們的 PC 或者嵌入式模組通訊時,會有不同的傳輸方式。

比如我們採集來自攝像機的影象資訊,有的是通過千兆網絡卡實現的通訊,也有的是直接通過視訊線進行通訊的。再比如某些毫米波雷達是通過 CAN 匯流排給下游傳送資訊的,因此我們必須編寫解析 CAN 資訊的程式碼。

不同的傳輸介質,需要使用不同的協議去解析這些資訊,這就是上文提到的「驅動層」。 通俗地講就是把感測器採集到的資訊全部拿到,並且編碼成團隊可以使用的資料。 

預處理

感測器的資訊拿到後會發現不是所有資訊都是有用的。

感測器層將資料以一幀一幀、固定頻率傳送給下游,但下游是無法拿每一幀的資料去進行決策或者融合的。為什麼?

因為感測器的狀態不是 100% 有效的,如果僅根據某一幀的訊號去判定前方是否有障礙物(有可能是感測器誤檢了),對下游決策來說是極不負責任的。因此上游需要對資訊做預處理,以保證車輛前方的障礙物在時間維度上是一直存在的,而不是一閃而過。

這裡就會使用到智慧駕駛領域經常使用到的一個演算法——卡爾曼濾波。

座標轉換

座標轉換在智慧駕駛領域十分重要。

感測器是安裝在不同地方的,比如毫米波(上圖中紫色區域)是佈置在車輛前方的;當車輛前方有一個障礙物,距離這個毫米波雷達有 50 米,那麼我們就認為這個障礙物距離汽車有 50 米嗎?

不是的!因為決策控制層做車輛運動規劃時,是在車體座標系下完成的(車體座標系一般以後軸中心為 O 點),因此毫米波雷達檢測到的 50 米,轉換到自車座標系下,還需要加上感測器到後軸的距離。

最終所有感測器的資訊,都是需要轉移到自車座標系下的,這樣所有感測器資訊才能統一,供規劃決策使用。

同理,攝像機一般安裝在擋風玻璃下面,拿到的資料也是基於攝像機座標系的,給下游的資料,同樣需要轉換到自車座標系下。

0?wx_fmt=jpeg

自車座標系:拿出你的右手,以大拇指 → 食指 → 中指 的順序開始念  X、Y、Z。然後把手握成如下形狀:

0?wx_fmt=jpeg

把三個軸的交點(食指根部)放在汽車後軸中心,Z 軸指向車頂,X 軸指向車輛前進方向。

各個團隊可能定義的座標系方向不一致,只要開發團隊內部統一即可。

資訊融合

資訊融合是指把相同屬性的資訊進行多合一操作。

比如攝像機檢測到了車輛正前方有一個障礙物,毫米波也檢測到車輛前方有一個障礙物,鐳射雷達也檢測到前方有一個障礙物,而實際上前方只有一個障礙物,所以我們要做的是把多感測器下這輛車的資訊進行一次融合,以此告訴下游,前面有一輛車,而不是三輛車。

0?wx_fmt=jpeg

決策規劃

這一層次主要設計的是拿到融合資料後,如何正確做規劃。規劃包含縱向控制和橫向控制:縱向控制即速度控制,表現為什麼時候加速,什麼時候制動;橫向控制即行為控制,表現為 什麼時候換道,什麼時候超車等。

個人對這一塊不是很瞭解,不敢妄作評論。

軟體長什麼樣子?

自動駕駛系統中的部分軟體看起來和下面類似。

0?wx_fmt=png

軟體的名字反映了該軟體的實際作用:

  • app_driver_camera:攝像機驅動

  • app_driver_hdmap:高精度地圖驅動

  • app_driver_ins:慣導驅動

  • app_driver_lidar:鐳射感測器驅動

  • app_driver_mwr:毫米波感測器驅動

  • app_fusion_freespace:自由行駛區域融合

  • app_fusion_lane:車道線融合

  • app_fusion_obstacle:障礙物融合 

  • app_planning&decision:規劃決策 

然而實際上攻城獅們會編寫一些其他軟體用於自己的除錯工作,比如記錄資料和回放資料的工具。

0?wx_fmt=jpeg

還有用於感測器資訊顯示的視覺化程式,類似下圖的效果。

0?wx_fmt=jpeg

0?wx_fmt=jpeg

掌握了軟體的思路,那麼我們來看你都要做哪些準備。

準備

作業系統安裝

既然是做軟體,首先得有個作業系統。常見的作業系統 Windows/Linux/Mac...(打...的作業系統我也沒用過),考慮到社群支援、開發效率,推薦使用 Linux 作為無人駕駛研究的作業系統。

大部分做無人駕駛的團隊都用的 Linux,跟著大趨勢走,可以省很多事。

Linux 又分為很多版本,最常用且普及率很高的當屬 Ubuntu 系列。雖然 Ubuntu 已更新至 17.04,但從穩定性上,推薦安裝 14.04 版本。

推薦用一塊單獨的 SSD 安裝 Linux,或者使用虛擬機器安裝,最不推薦裝雙系統(不太穩定)奉上 Linux Ubuntu 14.04 安裝包 + 虛擬機器安裝方法。(連結:http://pan.baidu.com/s/1jIJNIPg 密碼:147y。)

0?wx_fmt=jpeg

Linux 基本指令

作為 Linux 的核心——命令列操作不僅對開發大有幫助,而且是裝 X 利器。另一個好處是使用指令 apt-get install,可以快捷地完成很多軟體的安裝,不用像 Windows 那樣,在網上四處尋覓適配的安裝包。Linux 的指令很多,而且比較雜,使用起來需要多學,多用。

開發環境安裝

開發環境會涉及很多實際使用的庫,不同的程式設計師處理相同的問題,可能使用不同的庫。下面通過安裝我在工作和學習中經常使用到的庫,拋磚引玉,將開發者「引進門」。

搭建環境所需安裝包:

0?wx_fmt=jpeg

(連結:http://pan.baidu.com/s/1sllta5v 密碼:eyc8)

附:開發環境介紹

整合開發環境 IDE

前面安裝了一款開源的 IDE qt,目前 qt 在 Linux 中的地位,就和 Visual Studio 在  Windows 中的地位一樣。除非是不使用 IDE 開發的高玩,大部分在 Linux 下做開發的團隊還是會選擇用 qt 開發的。

qt 的主要作用是做互動式的介面,比如在介面中顯示當前感測器採集到的各種資訊。介面互動會明顯加快開發者除錯程式和標定引數的過程。

Tips:

  • 熟悉 qt 可以網上找教程,我更推薦系統地學習,比如買一本 Qt 的書。

  • 買書或者去圖書館借書,注意看寫書的日期,越新越好,太老的書,相應的版本也很舊。

OpenCV

OpenCV 是一個非常強大的庫,其中封裝了大量的可應用於無人駕駛研究的函式,包括各種濾波器演算法、特徵點提取、矩陣運算、投影座標轉換、機器學習演算法等。

當然最重要的是,它在計算機視覺領域的影響力,相機標定,目標檢測、識別、跟蹤的介面使用起來十分方便。使用 OpenCV 庫完全可以做出這張圖展現的效果。

0?wx_fmt=jpeg

Tips:

  • 請至少購買版本為 2.4 以上的教程學習 OpenCV,但目前市面上買得到的 OpenCV 中文教程都講的太淺,甚至連經典的 Kalman Filter 都不介紹。我推薦直接學習英文版的  Learning OpenCV3。

奉上電子版,講解很詳細,每次列印一章閱讀,循序漸進。

(連結:http://pan.baidu.com/s/1dE5eom9 密碼:n2dn)

libQGLViewer

libQGLViewer 是大名鼎鼎的 OpenGL 適配 qt 的一個庫,程式設計介面及方法與 OpenGL 大同小異,我們經常在各大無人駕駛公司宣傳畫上看到的環境感知資訊的顯示,就完全可以用 QGL 做出來。

0?wx_fmt=jpeg

Tips:

學習 libQGLViewer 不需要購買任何教材,官網及壓縮包內的 example 就是最好的老師,按照官網的tutorial,把每個例子實現一遍,就基本入門了。

官網連結:libQGLViewer Home Page

Boost

Boost 庫是有著「C++準標準庫」之稱。這個庫裡面有大量的「輪子」,對於 C++ 開發者來說,方便直接呼叫,避免重造「輪子」。

Tips:

Boost 是基於標準 C++ 開發,其構造用盡精巧手法,不要貿然費時研讀,找一份和 Boost 庫相關的(電子或紙質)書,把目錄讀一遍,大致知道里面有哪些功能即可,需要時就某一個點,花時間做研究。

QCustomplot

除了上面提到的 libQGLViewer 外,還可以通過平面圖的形式顯示車載感測器的資訊。鑑於 qt 內部只提供了基本的直線、圓等繪圖工具,使用起來並不是很方便,因此 QCustomplot 誕生了。簡單地呼叫 API,然後把想要顯示的資料作為引數輸入進去,就可以繪製出下面這些很棒的圖形。而且可以很方便地拖動和縮放。

下面是我在實際開發過程中,使用 QCustomplot 顯示的部分感測器資訊。

Tips:

官網提供了該庫的原始碼下載,你只需要在你的工程中匯入 .cpp 和 .h 檔案即可。跟著官網提供的 tutorials 學習,可以快速上手。對照著 example 中的例程寫程式碼,可以快速把自己的資料變成視覺化影象。

LCM(Lightweight Communications and Marshalling)

團隊開發軟體必然存在程式(多程序)的通訊問題,多程序通訊的方式很多,也各有優缺點,使用起來就見仁見智了。2014 年 12 月 MIT 公佈了他們在美國 DARPA 機器人挑戰賽中使用到的訊號傳輸機制 LCM,出處:MIT releases LCM driver for MultiSense SL。

LCM 含多種語言如 java,c++ 等專門針對實時系統在高頻寬和低的延遲的情況下進行訊息傳送和資料封送處理。它提供了一個釋出/訂閱訊息模型、自動封裝/解封程式碼生成工具含多種程式語言版本。這個模式和 ROS 現在節點間的通訊方式很類似。

Tips:

LCM 兩個程序間通訊的 demo 官網上有原始碼,按照官網上的 tutorial 就能快速建立屬於你自己的 LCM 通訊機制。

官方網站:LCM Projcect

以上基本介紹完了,掌握好這些東西,你就變成無人駕駛領域的老司機了。

轉載地址:http://blog.csdn.net/JtNbCOC8N2I9/article/details/78898507