自駕車之路 (系統整合)
畢業季
這次的作業是整個Udacity Self-Driving Car Nanodegree的最後一個作業,題目是System Integration,顧名思義就是要把所有東西串在一起跑。本次作業的要求是用ROS實作一個簡單的車道維持系統,除此之外本次作業最有噱頭的兩件事情就是:
- 學生必須要組隊完成作業,一起合作寫程式
- 最終的作業會被放到真的車子上去試跑
組隊
作業的要求一組是四~五個學生,必須同樣是7/7這梯次的同學。組隊方式意外的簡單,Udacity開了一個Google表單大家自行上去填寫分組。截至最後總共有78組,我開始組隊時大約已經是第62組了…同學們真的都非常的積極。我這組的組員都是在美國東西岸只有我一個人是UTC+8,算是一個難得練習跟國外同學合作的機會,過程中也滿有挑戰性的(一度差點被拿去球員交易)但總之最後還是大家一起完成了作業。
系統
這次的整個作業都是建立在ROS(Robot Operating System)上,ROS是一個適合做機器人相關開發的框架(Middleware),具備許多機器人相關開發常需要用到的工具,例如編譯工具,套件管理,視覺化工具…還有許多開源函式庫讓開發者省下不少發明輪子的時間。在ROS上可以使用C++和Python兩種程式語言開發,因此開發時可以快速用Pythony做Prototype,真的推出產品時可以用C++來做高效能的運算。
一個ROS的系統是由許多的Node所構成,Node之間可以透過Message Passing(Publisher/Subscriber)來做Process (Node)之間的溝通,當然這些架構ROS也都已經處理好了。
根據Udacity所提供的系統架構,學生需要完成以下的幾個模組:
- Traffic Light Detection node
- Waypoint updater node
- DBW(Drive By Wire) node
TL (Traffic Light) Detector Node
用利用車上的攝影機訊號找出紅綠燈並加以辨識,然後將前方的號誌燈號狀態透過 /traffic_waypoint這個topic廣播出去,讓其他的node來決定要做什麼。要辨識交通號誌必須完成兩件事情 1. 在影像中找出紅綠燈 2. 辨識紅綠燈的顏色。實作的方法和之前道路影像汽車追蹤的作業很像,在此就不贅述了。
值得一提的是這次作業我們沒有透過Sliding Window /FastRNN /YOLO 之類的方法來找出紅綠燈在畫面中的位置,而是用另一個有點作弊的方法。我們透過 ROS的 tf (transform) 模組,推算出車上攝影機和紅綠燈的相對座標轉換矩陣,然後再透過 Camera Transform 計算出紅綠燈應該出現在攝影機畫面上的pixel位置,這樣做法比起上述的其他方法省下了很多的CPU/GPU運算,但僅限於有很完整的3D地圖下的環境才可行。
Waypoint updater node
這個node要做的事情是監聽/traffic_waypoint這個Topic 然後計算出接下來車子該用怎麼樣的速度/加速度行使,然後用/final_waypoint這個topic廣播出去。有點類似之前 Path Plaining 作業在做的事情。
DBW (Drive By Wire) Node
Udacity 的車子是透過 Dataspeed 得介面來控制車子,當我們把Waypoint的指令透過類似 Model Prediction Controller 作業的方式轉換成方向/速度/加速度的指令之後,還是得透過 PID Controller 來真正的控制油門/煞車/方向盤。而這個Node就是在做這樣的事情,更多細節可以參考之前的作業。值得注意的點是,真正的汽車是透過煞車跟油門來控制正負兩種加速度,為了避免我們的程式在煞車跟油門之間高頻率交換造成零件不必要的損耗,我們還會透過Dead Band Function 來處理這種情況。
上路
最後當我們這組準備好了,Udacity就會把我們的程式碼放到真正的車子上面跑!雖然說我們的程式碼最後在車子上跑起來走走停停的太劇烈被工作人員強制終止了,不過看到程式碼實際在車子上跑的影片也還是非常感動!
畢業!
經過了一年的努力我終於完成了所有的必要課程,稍微看了一下我是去年(2016)十月的時候付了第一筆學費,到現在差不多一整年的時間。雖然一切都是自找的,但這樣一邊工作一邊上課堅持下來一整年實在是不輕鬆…但的確是收穫滿滿!由於我們是第一批的學生/畢業生,課程上的確還有許多可以更改進的地方,但也正因為這些不完整的地方,讓我們花了更多時間去自己學習找資料,覺得反而收穫更多!
這一路上有太多支持跟鼓勵我的人要感謝了,但最感謝的其實是願意在Medium上花時間看我分享的人,謝謝你們間接的督促我堅持到這一刻 !課程結束後我會再花一點時間把之前的作業拿出來翻修一翻,挑戰一些更進階的技術,有什麼新的發現還是會上來跟大家分享的。
