如果無人駕駛是未來,程式設計師該如何入門?
為什麼需要無人駕駛?
首先我們探討下無人駕駛能如何提高人類社會的效率。
第一是無人駕駛對環境的影響:每輛傳統車每年平均排放 5 噸二氧化碳,以美國為例有 2.5 億臺車,每年二氧化碳排放就有 12.5 億噸。而如果使用中央排程的無人新能源車,那麼總排放量可以被降低到 0.6 億噸,效果十分驚人。然後我們看看無人駕駛對安全的影響:人類駕駛員每駕駛 100 萬英里的里程,平均會發生 4.2 次意外,會產生大概 1300 萬次車禍。如果我們能把無人駕駛每 100 萬英里的車禍率控制在 1 以內,那麼總車禍數會被控制在 300 萬左右。現在每年全球車禍死亡人數超過百萬,所以無人駕駛的普及可以每年在全球挽救幾十萬甚至上百萬的生命。
最後我們瞭解下無人駕駛對經濟的影響:由於減少碳排放,無人駕駛普及可以每年可減少 3000 億美金的經濟損失。另外,每次車禍帶來的經濟損失平均為 3000 美金,那麼如果無人駕駛到達每 100 萬英里的車禍率控制在 1 以內的安全目標,每年也可以 減少 3000 億美金的經濟損失。兩者相加,無人駕駛普及後每年至少可以減少 6000 億美金的經濟損失, 這基本相當於瑞士的 GDP,如果按全球國家 GDP 排行榜算可以排進前 20 左右。
無人駕駛技術無人駕駛並不是單點的技術,而是多個技術的整合。 無人駕駛的整體技術架構,大概可以分為三大模組:演算法、系統以及雲平臺。
在車輛端,上層是演算法模組,包括感測(如何更好的獲取環境資料)、感知(如何更好的理解車輛周圍環境,包括定位,物體識別,物體追蹤)以及決策(在瞭解環境後如何更好的做出決策,包括路徑規劃,行為預測和障礙物躲避等)三個部分;下層則是作業系統和硬體平臺。而在雲端,則有一個無人駕駛的雲平臺,其上囊括了高精地圖、模型訓練、模擬計算以及資料儲存等幾塊內容。
無人駕駛汽車行駛過程中最重要的是要知道自身處在什麼位置上,只有這樣才知道要怎麼去往目的地。
定位技術:GPS我們平常用的是多星 GPS,可以接收伽利略或北斗的訊號,做一個綜合,然後得出一個相對精準的位置。但是多星 GPS 的定位精度大約能做到 1-2 米,這滿足不了無人駕駛車道級定位的要求。所以,後續業內又開發出一種被稱為 RTK(Real-Time-Kinematic)的 GPS,主要是依靠在地面佈置基站,通過基站的訊號去糾正衛星的訊號,精度可以達到分米級別甚至更低。但缺點是需要佈置基站,成本很高,還需要人維護。接下來,又出現一種稱為 PPP(精密單點定位)的 GPS 技術,基於全球衛星的聯網系統,通過網際網路釋出衛星的糾正訊號,這項技術大概在 2018 年會在全球進行部署。其好處在於不需要佈置基站,無論在哪,都能得到一個比較精準的位置。
GPS 是一個比較好的定位導航工具,但是更新率低是最大的問題。有的是 1 幀 / 秒的更新,有的是 10 幀 / 秒的更新,車輛高速行駛的狀況下,這顯然不夠用。所以,一般情況下,我們會把 GPS 和 IMU 慣導系統結合起來。慣導系統能提供快速更新——1000 幀 / 秒,這彌補了 GPS 的更新率低的問題;而慣性導航所存在的“累計誤差”問題,也可以通過 GPS 來彌補。
2、定位技術:鐳射雷達(LiDAR)和高精地圖(HD Map)鐳射雷達的好處是有一定的射程,能觸及 100-200 米的距離,能很精準的得到空間中的點(3D 點雲)。將鐳射雷達的資料和高精地圖的資料做一個匹配,可以將車輛定位上升到釐米級別。
但是鐳射雷達的成本高,而且是轉動的形式,容易磨損,耐用性差。 鐳射雷達很依賴另一個感測器——高精地圖(傳統意義上也不能稱其為感測器),二者配合使用才能達到一個很好的定位效果。
具體到高精地圖的製作上。在高精地圖的最底層,是一個網格地圖,網格地圖是使用鐳射雷達掃描回來的,精度可達 5 釐米;網格地圖之上,我們會做道路的標籤,也就是最底層的 reference line;再加一些語義資訊,精確到車道,標示出 lanes;在車道之上,再做一些語義標籤,比如限速、紅綠燈這樣的標誌物。高精地圖製作起來非常昂貴,因為需要鐳射雷達裝置不斷去掃描外部環境,從而得到相關的資料來支撐其製作。
3、定位技術:視覺(Visual Odometry)傳統的做法是用雙目進行視覺導航,方法如下:左右兩個圖進來,首先做一個三角成像,就可以得出空間中深度點的資訊,每一個特徵點都有描述,然後再將前後兩幀影象的特徵點進行比對,得出其位移的資訊,大概能定位到車輛移動的距離。後續技術的發展,實現了單目視覺進行導航的功能,但是影象資訊更新率有限——30-60 幀 / 秒之間。所以,為了更快速得到資訊更新,還是要將 IMU 加上,就產生了 Visual inertial odometry 技術,可以得到很精準的位置更新。
4、定位技術:輪速計這個就相對簡單了,因為輪子周長固定,可以通過圈速來進行距離的測算,但是這個方式的累計誤差會比較大,所以也存在很大的問題。
5、定位技術:感測器融合但在實際的實踐中,只依賴一種定位技術或感測器,顯然無法實現良好的效果。天氣、光照、磁場等等,都會干擾這些定位感測器的正常使用。
真正的解決方案是感測器融合:
通過 IMU 和輪速計,得到車輛初始的位置,而 GPS 則可以不斷糾偏,把錯誤率控制在一定的範圍,比如 GPS 是釐米級的,那麼精度就能保證在釐米級別,同時再加上鐳射雷達和高精地圖的匹配,得出一個最終的很精準的位置。
二、感知(Perception)感知就是理解環境,要做感知,需要的是一個數據集。在無人駕駛行業,有一套通用的資料集——KITTI 資料集,裡面有不同的資料,包括雙目視覺的資料、定位導航的資料等。
1、感知:物體檢測(Object Detection)
傳統方法主要是針對固定物體的檢測。一般的方法是 HOG( 方向梯度直方圖),然後再加一個 SVM 的分類器。而對於動態物體的檢測,主要使用的是 DPM 模型的方法,先把手和腳識別出來,再進行組合。
2、感知:場景(Segmentation)
人行道是一個場景,道路是一個場景,在場景中對不同的物體進行分類,是一個很重要的問題。傳統的方法是採用 CRF( 條件隨機場),基本原理在於影象都是由畫素點組成的,若兩個畫素點都比較像車,那就把二者連線起來,形成對車輛的識別。
另外,就是我們所說的光流(Optical Flow),光流是針對 2D 影象來說的,如果說一個圖片流到另外一個圖片,都是 2D 的物體移動,那就用光流來做。如果是 3D 的物體流動,那我們就用場景流(Scene Flow),場景流在傳統的方法就是使用的是 SGBM,利用的是雙目成像的技術,把左圖和右圖合起來提取出空間的點,用光流在上面做,就能把場景的流動分析出來。
3、感知:物體追蹤(Object Tracking)
這也是無人駕駛中一個比較重要的技術。如何預測行人下一個動作、怎麼去跟蹤這個行人,也有一系列問題。裡面用到的是馬爾可夫鏈的解決方案,這個技術叫做 MDP,跟蹤一個人,隨時跟蹤其下一個動作,預測其下一個動作。以上其實都是一些傳統的感知方法,而這些年隨著深度學習的不斷進步,應用也非常廣泛。
在物體識別方面,有兩個非常有效的模型。
一個是 Faster R-CNN,它會將興趣點框出來,然後再進行物體識別,找到是不是你想要識別的物體;另一個是更為快速的 SSD,也是將圖中的物體識別出來。
而在場景分類方面,運用深度學習的方法則使用的是另一種模型,被稱為 PSPnet(語義分割)。這是金字塔型的場景分解模型,將一個場景不斷地壓縮,把類似的物體聚類,然後再做判斷。
光流也可以利用深度學習的模型來做,把左右兩圖用同樣的模型來提取特徵,經過計算就能得出一個深度的資訊。但是這個方式的計算量非常大。
三、決策和控制(Planning and Control)這是一個最基本的決策和控制的架構,但這個部分其實是無人駕駛中最難的部分。
最上方的感知系統可以感知行人的位置、速度及態勢,然後將這些資訊傳送給預測模組,預測行人是往前還是往後,速度多快。而下方的定位資料流進來之後,全域性的路徑規劃模組就會將這些路徑傳入到最核心的控制決策模組——其中包括行為決策、動作決策和反饋控制。最後,這些訊號會傳送給 CAN-BUS,由車輛來執行。
交通預測其實可以分成兩個問題:一個是分類問題,另一個是迴歸的問題。分類問題要了解的是行人到底是過馬路還是不過馬路,迴歸問題就更復雜一些,如果行人是過馬路,那麼針對其過馬路的速度是多少,需要做一個預測。 路徑規劃也是比較有趣的,因為這對無人車來說是一個比較特殊的問題,因為對於普通的車輛來說,只要知道這是哪條路就行了,而不需要知道這是哪一條車道。
因為每條路都有不同的車道,那我們把車道標出不同的節點,不同的節點連線在一起,就變成了一條車道。通過某種方式(Dijkstra 和 A*)找到最短車道,就能得到最優解。
有了全域性的路徑規劃以後,我們就需要進行行為決策。因為道路場景非常複雜,可以分成幾十個不同的場景——左右車道、丁字路口等等,需要做場景組合決策。
然後是動作的規劃,包括加速、減速、轉向等等,速度規劃主要使用了 ST-graph 工具來做,路徑規劃主要是動態程式設計來實現。
而最後的反饋控制則是由車廠來做,而且很多車廠採取的方案是不一樣的。實現反饋控制的一般有雙輪模型和 PID 控制模型,後者實現起來比較順暢。
四、端系統(Client System)任何一個複雜的系統都需要一個作業系統來輔助它實現功能,這樣才不至於混亂。
如上圖所示,在處理器中,其實運行了上文所述的各類演算法,包括感知、定位、全域性路徑規劃等演算法。然後再實現對車輛本身的控制,包括動作控制、方向控制。
首先我們需要一個作業系統來管理這麼多複雜的工作,現在大部分廠家用的都是 ROS——機器人作業系統,當然都做了一些個性化設計。這是一個資訊傳遞的系統,可以通過點對點的傳輸形式或是廣播的形式來做訊號傳輸的動作。
ROS 本身有很多問題:
單一主節點,很容易整體崩潰。(解決方案:可以用 Zookeeper 機制來做,設定多個主節點。) 通訊非常低效。(解決方案:可以用共享記憶體的方法來做。) 不是很安全,比如開一個惡意節點不斷去損耗資源,很容易造成整體系統的崩潰。(解決方案:這個問題可以使用 Linux Container 的技術來解決。)硬體平臺當然也是不可或缺的。其前端有很多感測器,訊號傳輸進來後,有一個計算平臺進行接收,處理完成後再通過 CAN-BUS,把控制訊號傳給車輛控制系統。
以往很多時候,無人駕駛汽車上都放了兩臺計算機進行資料處理。這樣帶來的問題是功耗高,散熱問題非常難以處理。未來,計算單元小型化會是很大的挑戰。
一年前我們探索過一個好玩的課題,如果用一個手機平臺,是否可以支撐起無人駕駛的作業?於是我們使用手機平臺,實現了一些比較簡單的無人駕駛功能,主要是用視覺來做。下圖顯示了一個面向基於視覺的無人駕駛駕駛的移動 SoC 系統組成。在這個移動 SoC 實現中,我們利用 DSP 處理感測器資料,如特徵提取和光流;我們使用 GPU 完成深度學習任務,如目標識別;採用兩個 CPU 執行緒完成定位任務以實現車輛實時定位;我們使用一個 CPU 執行緒實現實時路徑規劃;使用另一個 CPU 執行緒進行避障操作。如果 CPU 尚未被全佔有,多個 CPU 執行緒則可以在同一 CPU 核心上執行。
令人驚訝的是,實驗資料證明,無人駕駛系統在 ARM SOC 上執行的效能並不差。定位流水線每秒可處理 25 幀影象,影象生成速度為每秒 30 幀影象,這說明產生的影象大部分可以得到及時處理,不會產生大規模的丟幀。深度學習流水線每秒能夠執行 2 到 3 個目標識別任務。規劃和控制流水線目標是在 6 MS 內完成路徑規劃。當使用 ARM 移動端 SOC 進行無人駕駛時,我們能夠以 5 英里 / 小時的速度行駛車輛,並且不損失任何定位資訊;同時,整個 SOC 平均功耗為 11 瓦。
移動 SoC 的硬體資源有限,能夠支援有限範圍內的無人駕駛系統確實是非常令人驚喜的發現。這說明如果增加更多的計算資源,硬體平臺就能夠處理更多的資料,並支援車輛以更快的速度行駛,最終滿足產品級無人駕駛系統的需要。
五、雲平臺(Cloud Infrastructure)如今,很多人都關注無人駕駛的終端,而對於雲平臺沒有給予足夠的重視,實際上這塊內容是非常重要的。無人駕駛車輛每秒最多可以產生 2GB 的裸資料,怎樣利用這大量的資料去幫助無人駕駛做得更好,怎麼樣去搭建一個雲平臺去更好地服務無人駕駛的作業,這是個很大的挑戰。
雲平臺底層就是儲存和計算。我們有一個開源的專案叫做 Alluxio,基本上就把磁碟儲存給管理起來了,這是一個分散式的儲存管理器;在其上,我們運用了異構計算,不同的作業依賴的處理器也不一樣,所以會有 GPU、CPU 和 FPGA;當然,為一個處理器寫一套單獨的程式,太複雜了,所以在其上統一搭載了 OpenCL,對程式進行統一管理;分散式計算也需要一個管理平臺,我們採用了 Spark 平臺——比較通用、功能很多。再在這個平臺上搭建高精地圖、模擬計算和模型計算等作業。
在計算層面,我們運用了 Apache Yarn 這個分散式系統管理器通過 Spark 把作業分發下去,每個 Spark 的節點都有多個容器(Container),容器上會跑一些 OpenCL 的 Kernel,OpenCL 可以跑在 GPU 上,也可以跑在 FPGA 上。這個平臺的可擴充套件性非常強,模型訓練所需的時間會隨著 GPU 數量的增加而線性減少。
現在談談雲平臺的具體應用。
首先是模擬計算。比如你新開發了一個程式,想要試試新的演算法是不是好用,但是不可能每次都實車驗證,因為成本高,而且覆蓋的場景很少。所以一般採用的是模擬計算的方式:遊戲平臺和真實資料回放,更多是採用後者的形式。這裡有一個問題,單機回放必須要回放實際的資料,比如谷歌無人車累計有 8 年的資料,如果單機計算需要很長時間,這顯然不可取。所以這裡採用了 Spark Driver 的系統,可以並行處理,把作業分發下去,通過 Linux pipe 把每一個 ROS Node 節點打出來做一個回放,資料再回收到 Spark Driver 裡去。只要給的節點夠多,幾十分鐘就可以驗證一套演算法。
第二個是高精地圖的製作。這是個很複雜的工作,首先是裸資料,然後從裸資料得出一個點雲的資料,點雲和點雲之間要做一個對齊,對齊之後要把反射率的資料填到裡面,然後再加一些語義的資訊等。用分散式平臺來做高精地圖的生產,最大的計算量部分集中在點雲的生產和對齊上,用異構計算可以很好地完成這些作業。
投身無人駕駛行業學習方法如開篇時說的,許多技術方向的同學對人工智慧既愛又畏懼,一方面覺得這是未來,另一方面又覺得很難而不敢觸碰。本章我們探討一下如何為投身無人駕駛行業做好準備。
入門必備條件:好奇心與勇氣當前的人工智慧熱潮是一次大的技術革命,對廣大技術人員來說是個特別好的機會,但是如果只掌握一個技術點是不足夠的。根據過去幾年的經驗,在技術行業隔行如隔山,比如做演算法的對軟體設計未必熟悉,專注做軟體的很少懂系統,而懂系統的瞭解硬體的也不多。反過來也一樣,讓一個硬體工程師去寫軟體,他可能會覺得很難而不敢觸碰。但是如果他能靜下心來花點時間去學一下,其實這並沒有想象中那麼難。我在工作以及創業的過程中,發現能跨躍幾個細分行業(比如軟體、系統、硬體)的工程師非常難得也非常有價值。通常可以跨躍幾個細分行業的人都比較有好奇心,也有勇氣去嘗試新的東西。所以我覺得入門最重要的條件不是熟悉某個技術點,而是要有足夠的好奇心與克服困難的勇氣。
入門知識學習今年初,大家都覺得無人駕駛技術很神祕,於是我與幾位無人駕駛行業的朋友一起寫了《第一本無人駕駛技術書》。之所以是第一本,是因為這是一本入門級別的介紹書,讓對無人駕駛行業有興趣的同學對這個行業所涉及的技術點可以有快速的全面的瞭解。無人駕駛是一個複雜的系統,涉及的技術點種類多且跨度大,入門者常常不知從何入手。本書首先巨集觀地呈現了無人駕駛的整體技術架構,概述了無人駕駛中涉及的各個技術點。在讀者對無人駕駛技術有了巨集觀認識後,本書講解了無人駕駛定位導航、感知、決策與控制等演算法,深度學習在無人駕駛中的應用,無人駕駛系統軟體和硬體平臺,無人駕駛安全及無人駕駛雲平臺等多個主要技術點。
進一步瞭解無人駕駛在有了入門的知識後,大家會對整個無人駕駛的技術框架比較瞭解,這個時候就需要更深入的瞭解每個技術點。為了讓讀者更深入瞭解無人駕駛技術,我們花了很多時間梳理了當前無人駕駛使用到的技術點,在美國出版了《Creating Autonomous Vehicle Systems》,這本書被 IEEE 推薦為無人駕駛教材,已經被美國多個大學的圖書館收錄。這本書與《第一本無人駕駛技術書》最大的不同是每個技術點我們會比較深入的去解釋,還會提供許多論文的引用,當讀者對某個技術點特別感興趣時,有足夠的文獻讓讀者去深入研究。
輕輕一掃 歡迎關注~