分享 | 撞壞遙控車後,有個技術大牛爸爸是種怎樣的體驗

最近,Mapbox 的 Android 工程師 Antonio 使用計算機視覺和機器學習技術,爲他的女兒 Violeta 重新制作了一臺遙控車。接下來我們看看 Antonio 是如何實現是:

今年上半年的一天,我和女兒 Violeta 在玩着她爺爺奶奶送給她的遙控車。爲了學習如何操控它, Violeta “有條不紊”地開着車撞向每一個傢俱,結果就在某一個“砰”聲後,遙控車罷工了。我們打開了遙控車內部,瞧瞧是哪兒出了問題——幸好只是一根電線鬆了,幾分鐘後,我就搞定它了。

然而,這個小插曲卻引起了我的思考。這些用集成電路板做的小玩具生產成本低但是修起來卻未必那麼容易。

如果下一次把車裏的零件撞壞了,我們又修不了,那該怎麼辦?

在那段時間,安卓剛剛發佈了 Android Things, 是安卓開發的“小周邊”,在樹莓派(Raspberry Pi) 和類似的 IoT 設備上運行。我對安卓非常熟悉,所以我做了個決定,相信你們也能猜到:我決定重新制造一臺“不怕撞”的遙控車。

硬件

輸入圖片說明

硬件方面,我是用現成的組件組裝的,這樣如果有部件損壞,更換起來比較方便。以下是我的簡短的購物單(總價略高於100美元):

一個樹莓派(Raspberry Pi)(大約35美元);
一個馬達控制器(22美元)—— 馬達不能直接連接在樹莓派上;
一個便攜式充電器(用來爲樹莓派和馬達充電)(30美元);
最後,是一個支撐框架。Junior Runt Rover 是一個不錯的選擇(28美元),當然你也可以從別的玩具上拆一個下來。
輸入圖片說明

通過一個安卓系統下的配套應用程序可以控制遙控車,該控制通過一個本地服務器實現。然而,我不得不告訴你,用一個復古的任天堂控制器一定會有趣的多(當然你的預算得調高35美元)。

將這些組件直接拼裝在一起即可,拼裝過程我另有記錄。此外,還有一些注意的地方:

關於焊接:我還未找到一臺與樹莓派兼容且已焊接的馬達控制器。你可能需要從牀底翻出你的焊臺或者問朋友借一臺。焊接本身不難,但是你可能需要提前練習一下,畢竟零件都太小了。

超越樹莓派:Android Things 是 IoT 設備上一個抽象的圖層,雖然樹莓派廣受興趣愛好者的歡迎,但其它設備也同樣支持,而且不需要改一行代碼。到目前爲止,我的最愛還是 NXP Pico. 它的優勢在於高速的內存(這樣你就不需要再額外買一張 SD 卡),並且它帶有一個模組化系統。如果你想要將你的硬件項目實體化,那麼哪些實體產品設備會用到這種模塊(是不是似乎看到了商機……)

一開始,我以爲我女兒會害怕我自制的遙控車,沒想到她毫不畏懼,還很喜歡帶着它“跌跌撞撞”闖蕩世界。看,領居家的貓也很喜歡它……

輸入圖片說明

軟件

設計軟件時,發生了一些我計劃外的事。在我已經制作完成一輛可以運行的遙控車時,Udacity 公司發佈了一個自駕車“nanodegree”項目,來展示自動駕駛汽車的工作原理。

他們運用了計算機視覺(Computer Vision)和深度學習(Deep Learning)技術來使自動駕駛汽車識別道路和人行道。這些技術都從實用角度出發,讓你在模擬器甚至在車子裏都可以進行編程。

有很長一段時間,自動駕駛汽車技術於我而言就是一個未知的匣子,我渴望探索,因此我毫不猶豫報名了相關課程並申請加入了遙控車項目。

在課程中你第一個學到的是自動駕駛汽車識別物體的兩種方式(通常兩種方法結合使用):計算機視覺技術(Computer Vision)和機器學習技術(Machine Learning)。

無論你使用哪種技術,你都需要一個攝像頭來探測車前的情況。這並不困難。現在你只要花30美金就能買到一個800萬像素的可直接連接樹莓派或其它設備的攝像頭。

計算機視覺技術(Computer Vision)

計算機視覺技術是最爲直觀的技術。它的主要原理是從車上的攝像頭提取關於街道的信息並進行圖像過濾和轉化(這裏就需要車內攝像頭有足夠的高度來拍攝一個比較好的視角)。

爲了使這樣的分析可行,並且使車子可以對分析結果有實時的應對,我使用了一種同地圖 SDK 很類似的方法:花了一番功夫在C++上(使用開源的計算機視覺技術代碼),並在Java端展示了所用的方法,藉此,安卓系統可以做出判斷是直行或轉彎。

一旦這一步完成了,我們就做得差不多了。那我們就從項目測試套件開始吧,下面這張圖展示了測試的一部分:

輸入圖片說明

1、將獲取的畫面轉化成圖片,這張圖看起來就像是從攝像頭拍攝的照片。(如果你熟悉開源計算機視覺技術代碼的話,你就能知道這結合了 “getPerspectiveTransform” 和 “warpPerspective”)。這一步清除了畫面中所有的無關物體,從而使車子可以集中於眼前的道路:

輸入圖片說明

2、進行色差閾分析使車子從獲取的畫面中識別出路線。根據你設計的路線顏色(比如我這裏是亮×××)可以選擇不同的色彩空間。鑑於 HSV 色彩空間更符合人類識別、感知顏色的方式,你可以將開源計算機視覺技術中默認的 BGR 色彩空間改成 HSV 色彩空間,利用 HSV 中的色相和飽和度範圍還可以更容易地過濾具體的顏色。

輸入圖片說明

3、最後,我們需要繪製分佈圖來找到最佳的位置定位(如下圖所示的垂直藍線):

輸入圖片說明

好了,做完上面幾步,你的小車就能聽你的話看準自己的車道了!

輸入圖片說明

接下來,我們要爲小車安裝雷達定位器了 :-)

你想知道從小車的攝像頭裏看出去是怎樣的嗎?那不妨來看看這個視頻吧(https://www.youtube.com/watch?v=dRzs0s_xFaw).這是你在 Udacity 訓練中要做的一個練習。

機器學習技術(Machine Learning)

另一種讓小車自動駕駛的方法就是機器學習技術(Machine Learning)(又稱:深度學習卷積神經網絡)。深度學習技術目前已經成爲自動駕駛汽車發展中十分重要的一種方法。大部分情況下,你都會用真實數據構建一個模型來區分交通信號,或是通過克隆學習真實情況下的汽車行爲使自動駕駛汽車能夠做出即時的駕駛判斷。你會找上千張照片,然後將其中你想讓汽車學習的部分進行編碼(比如,每個車輪的轉速)。

這樣做的問題在於設計一個卷積神經網絡並不是容易事,而且對於我要達成的目標而言太小題大做了。

所以,我換了一種方法。我參考 NVIDIA 發佈的公開的相關研究報告後(點擊可查看完整研究報告),選用了其中一種網絡架構。這種架構由九層組成,包括一個標準化層,五個卷積層,三個全連接層:

輸入圖片說明

使用 Keras 這樣的工具,只需要幾行代碼就能實現。

需要注意的是,這裏用的都是 Python 語言而非 Java,其主要原因有兩個:

一方面,近來 Python 似乎已成爲運用機器學習技術時實際使用的語言。它有很大的程序庫和相關文檔記載,而且像在使用 TensorFlow 這類框架時也經常使用它。

另一方面,誰都不願意在小容量的樹莓派上調試模型,實在太慢、太不方便了。所以很多人會選擇用一個更強大的筆記本電腦或是一個雲端的服務器(比如許多 Mapboxers 會這麼做:mapbox/morecs#54)。

社區

輸入圖片說明

在我研究過程中最棒的就是能夠認識這羣熱衷於自己造自動駕駛汽車(“機器車”)的狂熱愛好者。這起初只是 Chris Anderson 在加利福尼亞州奧克蘭市發起的一場同好聚會,沒想到迅速擴散到了其他地方。

你可能因爲《連線》雜誌或是“開始DIY無人駕駛飛機”這樣的事情知道 Chris Anderson 的名字。他說他的志向就是“用‘DIY’去攻克世界上所有著名的大型產業,並看看會怎麼樣”。

下面這張圖表是最近一次機器車同好小聚上,大家對比的計算機視覺技術和機器學習技術。你可以發現,兩種技術方法表現都很好。雖然計算機視覺技術更快地取得優勢,但機器學習技術也不遜色,很快地追了上去:
輸入圖片說明

寫在最後

如果你想了解更多關於自動駕駛汽車,或是他們的小兄弟機器車的信息,不妨看看下面幾條:
如果你熟悉 Java/ Android, 可以參考這個說明來搭建你自己的安卓機器車。
如果你更喜歡用 Python,那建議你可以從兒童單車項目開始。它的編程和搭建更加複雜(它需要可打印的3D模型),但也的確非常值得你這樣的投入。

如果你有任何問題,或者分享有關遙控車、計算機視覺(Computer Vision)和深度學習(Deep Learning)技術方面的內容,隨時歡迎聯繫 Mapbox 公衆號。

輸入圖片說明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章