1. 程式人生 > >百度Apollo(一):程式碼模組

百度Apollo(一):程式碼模組

一級目錄結構重要資料夾內容:

  1. docker:docker有關的檔案,如啟動docker指令碼,進入docker容器指令碼。

  2. docs:文件模組,有完整英文文件和部分中文文件 。

  3. modules:apollo中各個模組的原始碼,如感知,決策,規劃等核心模組。

  4. scripts:啟動指令碼,如啟動hmi的指令碼。

  5. third_party:第三方的庫。

  6. tools:編譯相關配置檔案。

Apollo專案是用Bazel來做為程式碼編譯工具,每個原始碼資料夾下都有一個 BUILD檔案即bazel的編譯配置檔案。

modules目錄內容:

  1. calibration:校準模組,使用前必須對系統進行校準和標定,包括鐳射雷達與攝像頭、毫米波雷達與攝像頭等。所謂校準就是要對齊鐳射雷達、攝像頭以及毫米波雷達獲得的資訊,我們知道鐳射雷達可以獲得詳細的3D資訊,但是不能獲得顏色資訊,攝像頭可以獲得顏色資訊,但是無法獲得深度等3D資訊,毫米波雷達不能獲得顏色資訊,但是可以獲得3D資訊,三者獲得的資訊對齊後,就可以同時獲得實際環境中的3D資訊和顏色資訊。

  2. canbus:接收控制指令,同時給控制模組control傳送車身狀態資訊。

  3. common:公共原始碼模組如日誌,工廠模式的實現,日誌系統,監控模組,數學演算法等。

  4. control:控制模組,基於決策規劃的輸出路徑及車身的狀態使用不同的控制演算法來輸出控制命令,如轉向剎車,控制等。

  5. data:收集、儲存、處理收集到的各種資料。

  6. dreamview:視覺化模組,檢視規劃的軌跡及實時的轉向剎車油門資訊。

  7. drivers:GNSS裝置驅動,包括NovAtel, Applanix, u-blox.鐳射雷達velodyne驅動,用來讀取感測器內容並輸出對應的訊息。

  8. e2e:end to end,端到端深度學習,所謂e2e指的是由感測器的輸入,直接決定車的行為,例如油門,剎車,方向等。也就是機器學習的演算法直接學習人類司機的駕駛行為。這部分在程式碼中需要另外下載,學習的資料主要來源於感測器的原始資料,包括影象、鐳射雷達、雷達等。end-to-end輸入以影象為主。 輸出是車輛的控制決策指令,如方向盤角度、加速、剎車。 連線輸入輸出的是深度神經網路,即通過神經網路直接生成車輛控制指令對車輛進行橫向控制和縱向控制,中間沒有人工參與的邏輯程式。橫向控制,主要是指通過方向盤控制車身橫向移動,即方向盤角度。縱向控制,是指通過油門和剎車控制車身縱向的移動,即加速、剎車等。橫向模型的輸出沒有采用方向盤角度,而是使用要行駛的曲率(即拐彎半徑的倒數)。

  9. elo:利用高精地圖的自定位模組。這部分的程式碼也是另外下載。前向的攝像頭會採集車道資料以實現更精確的定位,輸出的位置資訊包括車輛的x y z座標,還有就是在百度高精度地圖中的ID。

  10. localization:定位模組,輸入GPS和IMU資訊輸出自車定位資訊。

  11. map:高精地圖模組,輸出結構化地圖資訊,如車道線,十字路口等。

  12. monitor:監控模組,監控硬體狀態,同時把狀態發給hmi。

  13. perception:感知模組,輸入鐳射點雲,高精地圖,變換座標,輸出3D障礙物包括速度大小和方向。

  14. planning:決策規劃模組,apollo1.0中決策各規劃是分開的模組decision和planning模組,現在decision模組合併在planning裡了。

  15. prediction:預測模組,輸出感知的障礙物資訊及自定位資訊輸出障礙物未來的軌跡。

  16. routing:全域性導航模組,輸入包括地圖資訊各起點終點地址,輸出一個全域性的導航資訊。

  17. third_party_perception:第三方感知。

  18. tools:工具模組。

首先,使用者輸入目的地,routing模組就可以根據終點位置計算出具體的導航資訊。鐳射雷達、毫米波雷達和攝像頭拍攝到的資料配合高精度地圖由percepting模組計算出3D的障礙物資訊並識別交通標誌及交通訊號,這些資料進入perdiction模組,計算出障礙物的可能軌跡,如此就可以結合以上資訊並根據車輛定位模組localizationg提供的車輛位置由planning模組得到車輛應該走的具體車道。

得到車道後車輛control模組結合車輛的當前狀態計算加速、剎車和方向的操作訊號,此訊號進入CAN卡後輸出到車內,如此實現了車輛的自動駕駛。