如何開始無人駕駛學習?

又快到年底了,我覺得有必要把自己近一年的無人駕駛學習經歷做一個總結,不僅僅是幫自己,同時也希望能夠幫助更多對無人駕駛感到困惑的同學(當然或許沒有太多幫助)。

我是18年雙十一之後才開始無人駕駛的學習過程,之前瞭解的資訊僅僅侷限於網路上關於自動駕駛等級的介紹,以及一些基本的如汽車底盤,線控卡和感測器的介紹,具體的細節我十竅通了九竅,是一竅不通。當初為何做這個決定?

主要是覺得這麼多優秀的人都在做無人駕駛,那麼我何不跟優秀的人一起做一個未來很有前景的行業呢

。下面開始介紹個人的學習過程。

迷茫期

最初2個月的時間,我對無人駕駛的理解沒有多大改觀,總是圍著門口的無人駕駛車觀察半天,其實也看不出一個所以然來。由於我開始做的都是系統相關的工作,最開始接觸到的就是鐳射點雲,於是在網上找了點雲相關的介紹,一些PCL庫以及鐳射雷達之類,最後在網上把所有鐳射雷達廠家的產品都分析了一遍,也知道了旋轉鐳射雷達和固態鐳射雷達,雖然聊勝於無,也算是對鐳射雷達有了初步的認識。但現在回想起來,這些鐳射雷達廠家都對技術諱莫如深,我曾經嘗試給Velodyne的廠家發郵件,問他們有沒有雨天或者霧天的鐳射雷達資料,以及這塊的benchmark效能和誤差分析,他們直接答覆沒有,或者只是不想告訴我?我覺得對於一個鐳射雷達廠家來說,如果連自己產品的benchmark資料都不清楚,如何能夠保證產品的穩定性呢?也許這些廠家也學習晶片廠家總是守著自己的一些不傳之秘,例如Intel就一直不開放他們的記憶體控制器和training演算法,但這是否有利於行業的發展呢?

這段時間可以稱得上我最迷茫的時期,對單個模組,我沒有太多實踐機會,對整個系統,又感覺太龐大,雖然我到了廬山,但還是不識廬山真面目

。這時候我決定從最基礎的開始,也就是先爭取對無人駕駛各個模組有一個大概的映像,各個模組幹了什麼,有什麼作用,以及它們如何工作起來驅動無人車的。我覺得當初的這個決定很正確,所謂一葉障目不見泰山,我登泰山之前就對泰山的全貌有所瞭解了。比較有幫助的課程是百度和優達學城推出的自動駕駛公開課,雖然很短小,但是對了解無人車的全貌來說非常有幫助。看完之後基本對無人車的各個模組有了初步的瞭解,之後再根據具體的模組深入瞭解,憑著這個方法對無人駕駛產生更深的認識。

現在回想起來,

為什麼現在資訊彙總型的文章都特別受歡迎

,github上的awesome型別的文章的star都特別高。在資訊時代,如果一個新手需要對一門技術大概能入門,自己可能都不知道自己要學習什麼,也不知道哪些資訊好,哪些資訊壞,網上的資源良莠不齊,而且大部分都不夠系統。這時候如果有人給了你一本百科全書,內容詳細,自成體系,當然對你來說如獲至寶,跟著這些資料學習就足夠了。所以我認為迷茫期的時候能夠找到這樣的一份awesome是非常有幫助的,有了這份資料,然後再從簡單的入門級別的資料學起,對整個知識體系有個大概的認識,基本上你就會突破迷茫期了,因為你拿到了整個知識地圖,接下來知道自己要往哪裡走了。

次迷茫期

雖然這時候對無人駕駛有了初步的認識,但對細節還是一無所知。

這時候最關鍵的是自己沒有思考,都是在被動的接受知識,而之後我覺得需要系統的資料來強化下自己對無人駕駛的認識

,“學而不思則罔”學習過程中如果沒有思考,則會對知識感到迷惑。我在這個時候買了2本書,價格100多不算高也不算低,我當時想著要捨得為技術投資。當時的想法沒有錯,這2本書對入門來說非常有幫助,主要的原因是:書中的知識很系統;加入了方案的優劣對比;能接觸到一些新的知識。看完這2本書,基本上對目前各個模組的現有方案都有了瞭解,最重要的是對為什麼這麼做也有了瞭解。這段時間我也寫了一些入門級的模組介紹,比如“定位思考”,“高精度地圖製作”,“規劃控制模組簡介”等,結合自己的思考對各個模組做了一些總結。如果能做到這樣,基本上對無人駕駛的理解可能比大部分人都好了。

《無人駕駛原理與實踐》

如何開始無人駕駛學習?

《無人駕駛:人工智慧如何顛覆汽車》

如何開始無人駕駛學習?

成長期

可以說,經過上述的過程,雖然已經對無人駕駛比較熟悉了,但是心裡還是沒底,因為沒有實踐的學習往往都是空中樓閣。如果只是停留在字面的理解和方案分析上,還是不夠的。這時候我一直在思考,我究竟該如何去學習呢?如何能夠保證對各個模組瞭如指掌呢?如果現在給我一輛車,我能不能把它跑起來?

在一系列的問題之下,我選擇去了解原始碼

,之前我解決問題,往往會事先分析下可能的原因,然後再針對性的查詢問題,而有一個同事總是讓我直接看原始碼。其實至今我都對這2種方法都認可,從短期來看,對簡單的問題我的方法可能可以更快的解決問題,而從長期來看,看原始碼可以解決更復雜的問題,雖然看原始碼短期內效果不明顯,長期來看對整個系統的收益更大。於是決定開始分析apollo的原始碼,現在看起來這個學習方法非常好,短期內我分析了定位和地圖模組的原始碼,長期又分析了planning,routing,以及cyber模組的原始碼,可以看到我是從一些簡單的模組開始,逐步過度到比較複雜的模組,中途也參考了很多優秀的部落格。這裡需要說明下,看模組之前一定要先知道模組的功能是什麼,輸入是什麼,輸出是什麼?帶著問題去看,雖然第一遍的時候會有很多疑惑,硬著頭皮看完,過一段時間後再去看原來的分析,發現有對的也有錯的,我後面又重新看了下定位和地圖模組之前的分析,發現有很多分析的很仔細的地方,現在反而遺漏了,也發現一些有錯誤的地方,又改正了過來,也就是說學而時習之,多看幾遍,對模組的理解就會加深。

其中有些模組看不懂的時候也要講究方法,

看routing模組的業務時有些函式看不懂,透過看測試用例看懂了

。看程式碼之前可以先了解類的資料結構,瞭解函式的功能就行了,不需要每個函式都深入細節,

藉助流程圖輔助

,瞭解整個模組的流程。

邊看邊寫總結也是很好的方式

,有的時候看似機械式的總結,逐行分析程式碼,分析、分析著反而更清晰了。在這一段時間我寫了apollo原始碼分析系列,目前還有少部分沒有完成,但是整理起來的輸出已經很可觀了。

這段時期我建議還是從原始碼開始,原始碼是理解細節的最好方式,也是最直接的方式。

精進期

如果上述的過程完成大半,對無人駕駛的來說,你已經基本合格了。但是如果滿足於現狀我覺得還不夠,

因為這個行業還不太成熟,需要不斷的創新,並且隨時可能出現新的技術,需要不斷的學習

。這段時間我反覆思考了一下我能夠做什麼?我接著能夠從哪些方面來突破?以前都是做工程方面的工作,很少需要看論文,現在反而覺得看論文也是很好的學習方式。這之前我就對DARPA很感興趣,類似於朝聖,我希望從最開始的挑戰賽中學習,也因此看了一下比較出名的2篇論文《Autonomous Driving in Urban Environments: Boss and the Urban Challenge》、《Junior: The Stanford Entry in the Urban Challenge》。可以看到之前的技術棧大部分都繼承下來了,除了深度學習的部分是目前新興的技術。

如何開始無人駕駛學習?

我做了思維導圖來分析以後需要從哪些方面來提高,以及可以從哪些方面來進一步地學習,其中給我幫助最大的還是綜述性論文,這些論文往往把目前所有的論文和最新的方法都做了介紹,對於我來說很省事,只要認真的學習一篇論文就可以把所有的模組都理解的更加深入,這裡推薦

《A Survey of Autonomous Driving: Common Practices and Emerging Technologies》

。期間也參加了小馬智行組織的無人駕駛分享,我是一個喜歡從細節中學習的人,其中雖然都是些普通介紹,但是對我來說確可以捕捉到很多細節,以此來判斷自己的差距。這期間寫了幾篇關於無人駕駛線下分享的總結,收穫很大,平時多參加線下分享確實對技術視野提升的幫助很大。

下面是一些思維導圖,也是後面準備繼續學習的方向,在這期間看了一本書《早晨從中午開始》對我的觸動很大,努力訓練才能取得好成績,艱苦卓絕的勞動既是對自己最大的交代,也是取得哪怕一點點成績的前提,雖然我認為前者更加重要。

如何開始無人駕駛學習?

不足期

吾生也有涯而知也無涯,學的越多,越感覺知識如浩瀚的大海,不積跬步無以至千里,不積小流無以成江河。如何能夠持之以恆的學習是目前最大的問號,這段時間不僅僅需要掌握學習方法,更需要堅韌的意志力,需要人生閱歷,也需要思想的交流,也許後面

不僅僅只是學習道理,還要懂得道理,領悟道理,最後傳播道理

學習雜談

看了一篇學習方法的總結,一直覺得《荀子·勸學》寫的非常好,古人對學習的態度總結的非常好,反而現在不受重視,可能是目前知識大爆炸了,接觸到的資訊太多。這篇關於孔子學習的4個階段總結的非常到位,摘錄如下:

樂學

- 強調追求學問首先在於愛學、樂學,“知之者不如好之者,好之者不如樂之者”。

講究方法

- 學習講究“學而時習之,不亦說乎”。之後又說“溫故而知新,可以為師矣”,最後學習需要學和思並重“學而不思則罔,思而不學則殆”。

博學

- 主張學習要博,要廣,不能偏頗、單一。

學以致用

- 學習必須有明確的目的,但重點在於“學以致用”