作為一個在公司義務給應屆生和實習生培訓的「小師」,結合我自己學習的經歷,從 操作手冊 的角度,手把手教你「無人駕駛」從 入門 到 轉行 。
關註微信公眾號: 自動駕駛幹貨鋪 ,回復「 資料 」即可獲取本文中提到的所有資料。
前言
先看看無人駕駛基本的硬件構造及其成本
圖片出處: https://www. wired.com/2015/04/cost- of-sensors-autonomous-cars/
看完圖,就會發現一個十分尷尬的問題——除了超聲波雷達以外,剩下的器材都買不起。
所以個人做無人駕駛研究,在沒有大資金支持的情況下,就不要考慮基於實車做研究了。
斷了從硬件方面著手做研究的念頭,我們直接看看軟件方面。
軟件方面可以做的工作就很多了,掌握其中某一項或多項技能,對你在該領域的發展都大有裨益。
作業系統安裝
必學指數:★★★★★
易學指數:★★★★★
既然是做軟件,首先得有個作業系統。常見的作業系統Windows/Linux/Mac...(打...的作業系統我也沒用過),考慮到社區支持、開發效率,推薦使用 Linux 作為無人駕駛研究的作業系統。
大部份做無人駕駛的團隊都用的 Linux,跟著大趨勢走,可以省很多事。
Linux 又分為很多版本,最常用且普及率很高的當屬 Ubuntu 系列。雖然 Ubuntu 已更新至 17.04,但從穩定性上,推薦安裝 14.04 版本。
推薦用一塊單獨的SSD安裝Linux,或者使用虛擬機器安裝,最不推薦裝雙系統(不太穩定)
奉上 Linux Ubuntu 14.04 安裝包 + 虛擬機器安裝方法
Linux基本指令
必學指數:★★★★★
易學指數:★★★★★
作為Linux的核心——命令列操作不僅對開發大有幫助,而且是裝X利器。
另一個好處是使用指令 apt-get install ,可以快捷地完成很多軟件的安裝,不用像Windows那樣,在網上四處尋覓適配的安裝包。
Linux的指令很多,而且比較雜,使用起來需要多學,多用。
有道雲筆記分享:有道雲筆記-Linux基本指令介紹
開發環境安裝
必學指數:★★★★
易學指數:★★★★★
開發環境會涉及很多實際使用的庫,不同的程式設計師處理相同的問題,可能使用不同的庫。
下面透過安裝我在工作和學習中經常使用到的庫,拋磚引玉,將開發者"引進門"。
搭建環境所需安裝包:
關註微信公眾號: 自動駕駛幹貨鋪 ,回復「 開發環境 」,獲取資源和安裝方法。
詳細的安裝方法見筆記:有道雲筆記-Linux開發環境搭建
開發環境介紹
必學指數:★★★★
易學指數:★★★
整合式開發環境IDE
前面安裝了一款開源的IDE qt,目前 qt 在 Linux 中的地位,就和 Visual Studio 在 Windows 中的地位一樣。除非是不使用 IDE 開發的高玩,大部份在 Linux 下做開發的團隊還是會選擇用 qt 開發的。
qt 的主要作用是做互動式的界面,比如在界面中顯示當前傳感器采集到的各種資訊。界面互動會明顯加快開發者偵錯程式和標定參數的過程。
Tips:
熟悉 qt 可以網上找教程,我更推薦系統地學習,比如買一本 Qt 的書。
買書或者去圖書館借書,註意看寫書的日期,越新越好,太老的書,相應的版本也很舊。
OpenCV
OpenCV是一個非常強大的庫,其中封裝了大量的可套用於無人駕駛研究的函數,包括各種濾波器演算法、特征點提取、矩陣運算、投影座標轉換、機器學習演算法等。
當然最重要的是,它在電腦視覺領域的影響力,相機標定,目標檢測、辨識、跟蹤的介面使用起來十分方便。使用OpenCV庫完全可以做出這張圖展現的效果。
圖片出處: https://www. nvidia.com/en-us/gtc/se ssions/self-driving-and-ai-cars/
Tips:
請至少購買版本為2.4以上的教程學習OpenCV,但目前市面上買得到的OpenCV中文教程都講的太淺,甚至連經典的Kalman Filter都不介紹。我推薦直接學習英文版的 Learning OpenCV3。
奉上電子版,講解很詳細,每次打印一章閱讀,循序漸進。
libQGLViewer
libQGLViewer是大名鼎鼎的 OpenGL 適配 qt 的一個庫,編程介面及方法與 OpenGL 大同小異,我們經常在各大無人駕駛公司宣傳畫上看到的環境感知資訊的顯示,就完全可以用 QGL 做出來。
圖片出處: http:// open.163.com/movie/2015 /10/U/U/MB1G83TR9_MB1GMCRUU.html
Tips:
學習 libQGLViewer 不需要購買任何教材,官網及壓縮包內的 example 就是最好的老師,按照官網的tutorial,把每個例子實作一遍,就基本入門了。
官網連結:libQGLViewer Home Page
Boost
Boost庫是有著「C++準標準庫」之稱。這個居里面有大量的」輪子「,對於C++開發者來說,方便直接呼叫,避免重造"輪子"。
Tips:
Boost是基於標準C++開發,其構造用盡精巧手法,不要貿然費時研讀,找一份和 Boost 庫相關的(電子或紙質)書,把目錄讀一遍,大致知道裏面有哪些功能即可,需要時就某一個點,花時間做研究。
QCustomplot
除了上面提到的libQGLViewer外,還可以透過平面圖的形式顯示車載傳感器的資訊。鑒於 qt 內部只提供了基本的直線、圓等繪圖工具,使用起來並不是很方便,因此QCustomplot誕生了。簡單地呼叫API,然後把想要顯示的數據作為參數輸入進去,就可以繪制出下面這些很棒的圖形。而且可以很方便地拖動和縮放。
圖片出處:QCustomplot Home Page
下面是我在實際開發過程中,使用 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教程,淺顯易懂,而且還配合圖文+影片,簡直良心。
以上基本介紹完了開發所需要的東西,掌握好這些東西,就可以來我司面試了。
———————分割線———————
現在有了自動駕駛開發的工具,那麽再掌握一些自動駕駛開發的流程就如虎添翼了。
下面開始介紹做自動駕駛開發過程需要了解的基礎知識。
自動駕駛開發流程
必學指數:★★★★★
易學指數:★★★★
實作一個智能駕駛系統,會有幾個層級:
感知層 → 融合層 → 規劃層 → 控制層
更具體一點為:
傳感器層 → 驅動層 → 資訊融合層 → 決策規劃層 → 底層控制層
各個層級之間都需要編寫程式碼,去實作資訊的轉化。
最基本的層級有以下幾類: 采集及預處理、座標轉換、資訊融合
采集
傳感器跟我們的PC或者嵌入式模組通訊時,會有不同的傳輸方式。
比如我們采集來自攝影機的影像資訊,有的是透過千兆網卡實作的通訊,也有的是直接透過影片線進行通訊的。再比如某些毫米波雷達是透過CAN總線給下遊發送資訊的,因此我們必須編寫解析CAN資訊的程式碼。
不同的傳輸介質,需要使用不同的協定去解析這些資訊,這就是上文提到的 「驅動層」 。
通俗地講就是把傳感器采集到的資訊全部拿到,並且編碼成團隊可以使用的數據。
預處理
傳感器的資訊拿到後會發現不是所有資訊都是有用的。
傳感器層將數據以一幀一幀、固定頻率發送給下遊,但下遊是無法拿每一幀的數據去進行決策或者融合的。為什麽?
因為傳感器的狀態不是100%有效的,如果僅根據某一幀的訊號去判定前方是否有障礙物(有可能是傳感器誤檢了),對下遊決策來說是極不負責任的。因此上遊需要對資訊做預處理,以保證車輛前方的障礙物在時間維度上是一直存在的,而不是一閃而過。
這裏就會使用到智能駕駛領域經常使用到的一個演算法——卡爾曼濾波。
座標轉換
座標轉換在智能駕駛領域十分重要。
傳感器是安裝在不同地方的,比如毫米波(上圖中紫色區域)是布置在車輛前方的;當車輛前方有一個障礙物,距離這個毫米波雷達有50米,那麽我們就認為這個障礙物距離汽車有50米嗎?
不是的!因為決策控制層做車輛運動規劃時,是在車體座標系下完成的(車體座標系一般以後軸中心為O點),因此毫米波雷達檢測到的50米,轉換到自車座標系下,還需要加上傳感器到後軸的距離。最終所有傳感器的資訊,都是需要轉移到自車座標系下的,這樣所有傳感器資訊才能統一,供規劃決策使用。
同理,攝影機一般安裝在擋風玻璃下面,拿到的數據也是基於攝影機座標系的,給下遊的數據,同樣需要轉換到自車座標系下。
自車座標系:拿出你的右手,以大拇指 → 食指 → 中指 的順序開始念 X、Y、Z
然後把手握成如下形狀:
把三個軸的交點(食指根部)放在汽車後軸中心,Z軸指向車頂,X軸指向車輛前進方向。
各個團隊可能定義的座標系方向不一致,只要開發團隊內部統一即可。
資訊融合
資訊融合是指把相同內容的資訊進行 多合一 操作。
比如攝影機檢測到了車輛正前方有一個障礙物,毫米波也檢測到車輛前方有一個障礙物,激光雷達也檢測到前方有一個障礙物,而實際上前方只有一個障礙物,所以我們要做的是把多傳感器下這輛車的資訊進行一次融合,以此告訴下遊,前面有一輛車,而不是三輛車。
當然,資訊融合中還涉及時延的補償,具體如下:
對於一些大容量數據,確實不能以很高的頻率發送(比如10Hz,100ms才發送一次)。這樣的數據對高速行駛中的汽車來說,肯定會有偏差。
這些偏差我們算一下:
傳感器檢測到前方有一個靜止障礙物,我100ms之後收到了這個傳感器的資訊,告訴我這個障礙物離我有30m。如果自車這時正以60KM/h的速度行駛,則這100ms,自車行駛了60 / 3.6 * 0.1 = 1.67m。
所以實際上這個障礙與我的距離為31.67m。
所以面對通訊中產生的時延問題,尤其是低頻率的資訊,一定要考慮時延產生的後果。
時延補償的另外一個問題:程式處理時,不能保證任何時候都是按固定的頻率發送的。
這取決於硬件系統當時的環境,可能溫度高了,效能下降,處理速度變慢,10Hz 的發送頻率變成了 8Hz。如果我們的程式還是按固定的100ms去計算時延導致的偏差,必定會出現計算錯誤的情況。
因此我們需要引入時間戳,即在我們發送的資訊中加入當前的系統時間,透過兩幀數據的時間差來判斷接受到的訊號到底延時了多久,這種方式比根據頻率判斷來得更準確。
決策規劃
這一層次主要設計的是拿到融合數據後,如何正確做規劃。
規劃包含縱向控制和橫向控制。
縱向控制即速度控制,表現為 什麽時候加速,什麽時候制動。
橫向控制即行為控制,表現為 什麽時候換道,什麽時候超車等。
個人對這一塊不是很了解,不敢妄作評論。
紙上得來終覺淺,絕知此事要躬行,動手編程才是技術入門的最快途徑~
總結
以上內容就是個人研究無人駕駛的「操作手冊」,如果您覺得對您有幫助的話,就幫我點個贊吧~感謝!
———————分割線———————
微信公號 :自動駕駛幹貨鋪
知乎專欄: 無人駕駛幹貨鋪
更多無人駕駛的內容:
互聯網公司和汽車企業都在開發自動駕駛,你更看好誰?
自動駕駛汽車涉及哪些技術?
高精地圖對自動駕駛來說有多重要?在自動駕駛上和一般的導航地圖有什麽區別?
無人駕駛,個人如何研究?
更多段子:
你珍藏了哪些高級黑的段子?
你這麽好看,一定很會點贊~