本文詳細介紹了自動駕駛汽車的硬件和軟件,以及所需要做的準備工作,每個研發者或者準備投身于無人駕駛領域的人都應該好好看一下。
全球有數不清的公司在忙著研發自動駕駛汽車,他們的產品也千奇百怪,不過基本思路和核心技術是類似的,本文詳細介紹了自動駕駛汽車的硬件和軟件,以及所需要做的準備工作,每個研發者或者準備投身于無人駕駛領域的人都應該好好看一下。
大家都知道智能車(Intelligent Vehicle)是一個集環境感知、規劃決策、多等級輔助駕駛等功能于一體的綜合系統,它集中運用了計算機、現代傳感、信息融合、通訊、人工智能及自動控制等技術,是典型的高新技術綜合體。
自動駕駛的關鍵技術依次可以分為環境感知、行為決策、路徑規劃和運動控制四大部分。
自動駕駛理論聽上去很簡單,四大關鍵技術,但到底如何實現的呢?Google 從 2009 年開始做自動駕駛,到現在已有 8 個年頭。8 個年頭的技術積累還無法將自動駕駛技術量產落地,可見自動駕駛技術并不簡單。自動駕駛是一個龐大而且復雜的工程,涉及的技術很多,而且太過細致。我從硬件和軟件兩方面談一談自動駕駛汽車所涉及的技術。
硬件
離開硬件談自動駕駛都是耍流氓。先看個圖,下圖基本包含了自動駕駛研究所需要的各種硬件。
然而,這么多傳感器并不一定會同時出現在一輛車上。某種傳感器存在與否,取決于這輛車需要完成什么樣的任務。如果只需要完成高速公路的自動駕駛,類似 Tesla 的 AutoPilot 功能,那根本不需要使用到激光傳感器;如果你需要完成城區路段的自動駕駛,沒有激光傳感器,僅靠視覺是很困難的。
自動駕駛系統工程師要以任務為導向,進行硬件的選擇和成本控制。有點類似于組裝一臺計算機,給我一份需求,我就給你出一份配置單。
汽車
既然要做自動駕駛,汽車當然是必不可少的東西。從上汽做自動駕駛的經驗來看,做開發時,能不選純汽油車就別選。一方面是整個自動駕駛系統所消耗的電量巨大,混動和純電動在這方面具有明顯優勢。另一方面是 發動機的底層控制算法相比于電機復雜太多,與其花大量時間在標定和調試底層上,不如直接選用電動車研究更高層的算法。
國內也有媒體專門就測試車輛的選擇做過調研。「為什么谷歌、蘋果不約而同的選擇了雷克薩斯RX450h(混動汽車)?」「科技公司測試自己的自動駕駛技術時,對于測試車的選擇又都有哪些講究?」等問題。他們得出的結論是「電」和「空間」對無人車改裝至關重要,其次從技術層面上對車的「熟悉程度」是另外一個因素,因為如果不和車企合作改裝,需要「Hack(侵入)」某些控制系統。
在前期算法預研階段,推薦使用工控機(Industrial PC,IPC)作為最直接的控制器解決方案。因為工控機相比于嵌入式設備更穩定、可靠,社區支持及配套的軟件也更豐富。百度開源的 Apollo 推薦了一款包含 GPU 的工控機,型號為Nuvo-5095GC,如下圖。
Github ApolloAuto
當算法研究得較為成熟時,就可以將嵌入式系統作為控制器,比如 Audi 和 TTTech 共同研發的 zFAS,目前已經應用在最新款 Audi A8 上量產車上了。
CAN 卡
工控機與汽車底盤的交互必須通過專門的語言——CAN。從底盤獲取當前車速及方向盤轉角等信息,需要解析底盤發到 CAN 總線上的數據;工控機通過傳感器的信息計算得到方向盤轉角以及期望車速后,也要通過 CAN 卡將消息轉碼成底盤可以識別的信號,底盤進而做出響應。
CAN 卡可以直接安裝在工控機中,然后通過外部接口與 CAN 總線相連。Apollo 使用的 CAN 卡,型號為 ESD CAN-PCIe/402,如下圖。
全球定位系統(GPS)+慣性測量單元(IMU)
人類開車,從 A 點到 B 點,需要知道 A 點到 B 點的地圖,以及自己當前所處的位置,這樣才能知道行駛到下一個路口是右轉還是直行。
無人駕駛系統也一樣,依靠 GPS + IMU 就可以知道自己在哪(經緯度),在朝哪個方向開(航向),當然 IMU 還能提供諸如橫擺角速度、角加速度等更豐富的信息,這些信息有助于自動駕駛汽車的定位和決策控制。
Apollo 的 GPS 型號為NovAtel GPS-703-GGG-HV,IMU 型號為NovAtel SPAN-IGM-A1。
感知傳感器
相信大家對車載傳感器都耳熟能詳了。感知傳感器分為很多種,包括視覺傳感器、激光傳感器、雷達傳感器等。視覺傳感器就是攝像頭,攝像頭分為單目視覺,雙目(立體)視覺。比較知名的視覺傳感器提供商有以色列的Mobileye,加拿大的PointGrey,德國的Pike等。
激光傳感器分為單線,多線一直到 64 線。每多一線,成本上漲 1 萬 RMB,當然相應的檢測效果也更好。比較知名的激光傳感器提供商有美國的 Velodyne 和 Quanergy,德國的 Ibeo 等,國內有速騰聚創。
雷達傳感器是車廠 Tier1 的強項,因為雷達傳感器已經在汽車上得到了廣泛使用。知名的供應商當然 是博世、德爾福、電裝等。
硬件部分總結
組裝一套可以完成某項功能的自動駕駛系統需要及其豐富的經驗,并且要對各傳感器的性能邊界及控制器計算能力了如指掌。優秀的系統工程師能在滿足功能的要求下將成本控制在最低,使其量產、落地的可能性更大。
軟件
軟件包含四層:感知、融合、決策、控制。
各個層級之間都需要編寫代碼,去實現信息的轉化,更細化的分類如下。
先分享某創業公司公開的一份 PPT。
實現一個智能駕駛系統,會有幾個層級:
感知層 → 融合層 → 規劃層 → 控制層
更具體一點為:
傳感器層 → 驅動層 → 信息融合層 → 決策規劃層 → 底層控制層
各個層級之間都需要編寫代碼,去實現信息的轉化。
最基本的層級有以下幾類:采集及預處理、坐標轉換、信息融合。
采集
傳感器跟我們的 PC 或者嵌入式模塊通信時,會有不同的傳輸方式。
比如我們采集來自攝像機的圖像信息,有的是通過千兆網卡實現的通信,也有的是直接通過視頻線進行通信的。再比如某些毫米波雷達是通過 CAN 總線給下游發送信息的,因此我們必須編寫解析 CAN 信息的代碼。
不同的傳輸介質,需要使用不同的協議去解析這些信息,這就是上文提到的「驅動層」。 通俗地講就是把傳感器采集到的信息全部拿到,并且編碼成團隊可以使用的數據。
預處理
傳感器的信息拿到后會發現不是所有信息都是有用的。
傳感器層將數據以一幀一幀、固定頻率發送給下游,但下游是無法拿每一幀的數據去進行決策或者融合的。為什么?
因為傳感器的狀態不是 100% 有效的,如果僅根據某一幀的信號去判定前方是否有障礙物(有可能是傳感器誤檢了),對下游決策來說是極不負責任的。因此上游需要對信息做預處理,以保證車輛前方的障礙物在時間維度上是一直存在的,而不是一閃而過。
這里就會使用到智能駕駛領域經常使用到的一個算法——卡爾曼濾波。
坐標轉換
坐標轉換在智能駕駛領域十分重要。
傳感器是安裝在不同地方的,比如毫米波(上圖中紫色區域)是布置在車輛前方的;當車輛前方有一個障礙物,距離這個毫米波雷達有 50 米,那么我們就認為這個障礙物距離汽車有 50 米嗎?
不是的!因為決策控制層做車輛運動規劃時,是在車體坐標系下完成的(車體坐標系一般以后軸中心為 O 點),因此毫米波雷達檢測到的 50 米,轉換到自車坐標系下,還需要加上傳感器到后軸的距離。
最終所有傳感器的信息,都是需要轉移到自車坐標系下的,這樣所有傳感器信息才能統一,供規劃決策使用。
同理,攝像機一般安裝在擋風玻璃下面,拿到的數據也是基于攝像機坐標系的,給下游的數據,同樣需要轉換到自車坐標系下。
自車坐標系:拿出你的右手,以大拇指 → 食指 → 中指 的順序開始念 X、Y、Z。然后把手握成如下形狀:
把三個軸的交點(食指根部)放在汽車后軸中心,Z 軸指向車頂,X 軸指向車輛前進方向。
各個團隊可能定義的坐標系方向不一致,只要開發團隊內部統一即可。
信息融合
信息融合是指把相同屬性的信息進行多合一操作。
比如攝像機檢測到了車輛正前方有一個障礙物,毫米波也檢測到車輛前方有一個障礙物,激光雷達也檢測到前方有一個障礙物,而實際上前方只有一個障礙物,所以我們要做的是把多傳感器下這輛車的信息進行一次融合,以此告訴下游,前面有一輛車,而不是三輛車。
決策規劃
這一層次主要設計的是拿到融合數據后,如何正確做規劃。規劃包含縱向控制和橫向控制:縱向控制即速度控制,表現為什么時候加速,什么時候制動;橫向控制即行為控制,表現為 什么時候換道,什么時候超車等。
個人對這一塊不是很了解,不敢妄作評論。
軟件長什么樣子?
自動駕駛系統中的部分軟件看起來和下面類似。
軟件的名字反映了該軟件的實際作用:
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:規劃決策
然而實際上攻城獅們會編寫一些其他軟件用于自己的調試工作,比如記錄數據和回放數據的工具。
還有用于傳感器信息顯示的可視化程序,類似下圖的效果。
掌握了軟件的思路,那么我們來看你都要做哪些準備。
準備
操作系統安裝
既然是做軟件,首先得有個操作系統。常見的操作系統 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。)
Linux 基本指令
作為 Linux 的核心——命令行操作不僅對開發大有幫助,而且是裝 X 利器。另一個好處是使用指令apt-get install,可以快捷地完成很多軟件的安裝,不用像 Windows 那樣,在網上四處尋覓適配的安裝包。Linux 的指令很多,而且比較雜,使用起來需要多學,多用。
開發環境安裝
開發環境會涉及很多實際使用的庫,不同的程序員處理相同的問題,可能使用不同的庫。下面通過安裝我在工作和學習中經常使用到的庫,拋磚引玉,將開發者「引進門」。
搭建環境所需安裝包:
(鏈接: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 庫完全可以做出這張圖展現的效果。
Tips:
請至少購買版本為 2.4 以上的教程學習 OpenCV,但目前市面上買得到的 OpenCV 中文教程都講的太淺,甚至連經典的 Kalman Filter 都不介紹。我推薦直接學習英文版的 Learning OpenCV3。
奉上電子版,講解很詳細,每次打印一章閱讀,循序漸進。
(鏈接:http://pan.baidu.com/s/1dE5eom9 密碼:n2dn)
libQGLViewer
libQGLViewer 是大名鼎鼎的 OpenGL 適配 qt 的一個庫,編程接口及方法與 OpenGL 大同小異,我們經常在各大無人駕駛公司宣傳畫上看到的環境感知信息的顯示,就完全可以用 QGL 做出來。
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
Git & Github
Git 是團隊開發不可缺少的版本控制工具,大家在寫論文時肯定每天一個版本,如果沒有特別標注每個版本改了些什么時間久了就會忘記。寫代碼更是如此。
使用 Git 可以極大地提高多人開發的效率,而且版本管理規范,代碼追溯起來十分方便。
Github 在軟件開發領域如雷貫耳,需要某些代碼時,直接上去搜索即可。
Tips:
目前世面上介紹 Git 的書,讓人看起來十分吃力,而且對細枝末節的東西介紹地太過深入,讓人無法快速上手。
于是我要強烈推薦 Git 入門的教程:廖雪峰的 Git 教程,淺顯易懂,而且還配合圖文+視頻,簡直良心。
以上基本介紹完了,掌握好這些東西,你就變成無人駕駛領域的老司機了。
-
傳感器
+關注
關注
2560文章
52143瀏覽量
761307 -
控制器
+關注
關注
113文章
16820瀏覽量
182119 -
自動駕駛汽車
+關注
關注
4文章
379瀏覽量
41124
原文標題:自動駕駛汽車硬件與軟件技術介紹
文章出處:【微信號:jingzhenglizixun,微信公眾號:機器人博覽】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論