# Autoware架構基本介紹
## Overview
* Autoware 運作機制主要分成以下階段: Sensing, Computing 及 Actuation,其中 Computing 包含了核心演算法 Perception, Decision, Planning。
* 本文章將以 Sensing, Perception, Decision, Planning 等四個核心階段做介紹。

* 總體控制流程為:
* (**Sensing**) 從各式 Sensor 接收訊息。
* (**Computing**) 透過 Sensor 資料來進行控制邏輯的判斷。
* (*Perception*) 感知自駕車周遭環境及狀態(e.g 定位處理、障礙物偵測),以利後續決策。
* (*Decision*) 以感知資訊決定自駕車狀態(e.g 按照路徑前進、緊急迴避、煞車等等)
* (*Planning*) 規劃路徑分為以下兩種:
* Mission Planner:以特定演算法(e.g.最短路徑演算法)決定起點到終點的參考路徑。
* Motion Planner:以當前狀態去動態計算一段距離內的行走軌跡,主要用來控制自駕車沿著 Mission Planner 之路徑行走或迴避障礙物。
* (**Actuation**) 取得自駕車狀態下達控制指令。
* [Autoware官方文件](https://gitlab.com/autowarefoundation/autoware.ai/autoware/wikis/home)提供功能與 API 的對應與介紹,可以更詳細地了解 Autoware 中的功能
## 資料流程圖

## Sensing
本段將列出自駕車常見之感測器,及其運作機制。
### Camera
* 透過影像偵測物體,Autoware 即是使用 [Yolo3](https://www.youtube.com/watch?v=pO4vM4ehI98) 來辨識物體。

### LiDAR (光達/雷射雷達) / RADAR (雷達)

* LiDAR: 環繞式地發射**雷射脈衝**,並透過接收反射來得知周遭物體位置。


* RADAR: 發射**無線電波**並且透過反射來得知物體的位置,目前 Autoware 並未採用 RADAR 的設計,目前特斯拉的駕駛輔助系統便是以 RADAR 為主。

### IMU
* 測量物體慣性(加速度/角速度),用於取得當前車輛姿態及輔助自駕車定位。
### GPS & RTK
* GPS:衛星定位,誤差較大。
* RTK (Real Time Kinematic):GPS 的改良版,GPS 訊號除了會傳到自駕車上,同時也會傳到鄰近的站台上(站台為固定地標,因此已知座標),此站台將會再次通知 RTK,以修正誤差。
## Map file
* 地圖檔案為自駕車運作時的已知資訊,因此必須在事前採集,而 Autoware 主要使用下列幾種格式,而這些為非必要性,例如少了 Vector Map 仍然可以使用 Waypoint 來運作,少了 PCD file 仍可以只靠 GPS 訊號運作,主要差在準確度。
> 資料越多,準確度越高。(有效資料的前提下)
> [name=ShaoHua Wang]
### PCD (Point Cloud Data) Map
* LiDAR 使用 **Normal Distributions Transform (NDT)** 來進行定位,也可透過該演算法,在定位同時以點雲 (Point Cloud) 的形式記錄場景物件,產生對應的 pcd map。
* PCD map 可使用 Autoware 中 [ndt_mapping](https://www.youtube.com/watch?v=ss6Blrz23h8) 的功能來製作,車子必須開啟 LiDAR 環繞場景一圈(目前實驗都是先手動開一圈蒐集資料),NDT_mapping 會根據車子 gps 位置以及 LiDAR 掃到的點雲來生成一張pcd地圖檔案。

### Vector Map
* Vector Map 透過向量的形式來儲存地理資訊,其中便包含道路的走勢及方向,產生此地圖需要專業的測量手法及儀器,因此精度相當高。

[(來源)](https://www.youtube.com/watch?v=xTtdLlferxQ)
### HD Map
* 近似於 Vector Map,為另外一套開源軟體 Baidu Apollo 所使用的地圖格式。
* 這個名詞定義目前還很模糊,也有可能是指 Vector map + PCD 的統稱。
### Waypoint
* 為自駕車行走過的路徑格式,路徑上的點記錄了速度資訊及方向。
* 相較於 Waypoint,Vector map 類似於參考用路徑,因此自駕車在運作時,會以 Vector map 為基礎,動態地產生 Waypoint 來進行迴避的動作。
* 使用者將前次駕駛時的移動軌跡紀錄成 Waypoint,下一次載入Waypoint 便可重現上次的行走軌跡。


### How to get these data?
* PCD file:[ndt_mapping](https://gitlab.com/autowarefoundation/autoware.ai/core_perception/-/tree/master/lidar_localizer/nodes/ndt_mapping)(Autoware)
* Vector/HD Map:外部工具(例如 LG simulator 等)繪製而成
* Waypoint:[waypoint_maker](https://gitlab.com/autowarefoundation/autoware.ai/core_planning/-/tree/master/waypoint_maker)(Autoware)
## Perception
### Localization (定位)
#### gnss_localizer
* 利用 GPS 定位,可與 lidar_localizer 協作。
#### lidar_localizer
* 使用 Normal Distributions Transform (NDT) 演算法。
* Input:PCD map、起始位置點、LiDAR 即時訊號。
* Output:根據 PCD map,運算目前自駕車位置。
* 原理: 利用 LiDAR 的即時點雲資料,比對 PCD map 上已經紀錄好的點雲,以機率分佈算出自駕車位置。
* [實做影片](https://www.youtube.com/watch?v=ODlxMzGTJzw)

### Detection
* lidar_detector:透過 LiDAR 偵測物體的存在(例如點雲密的地方可能就是有物體)
* vision_detector:透過 Camera 偵測物體的存在(例如點雲密的地方可能就是有物體)
* 可利用 sensor fusion,將上述兩個 detector 合併使用,以強化準確度。
## Decision
> 其實目前在 Autoware 的實作中,Decision 與 Planning 並沒有很清晰地區分,甚至是實坐在一塊,但為了方便講解還是會將兩者抽離。
在 Decision Phase 中自駕車透過狀態機來決定加速,煞車,迴避障礙物,緊急迴避等功能的運作,並根據目前狀態來選擇要使用 Planner 的對應功能
## Planning
### Mission Planner
* 透過 vector map 導航:Mission Planner 會根據 vector map 規劃從資訊系館到安平的路徑,類似 google map 導航。
* 透過 waypoint 導航:假如你已經有一組從資訊系管到安平的 waypoint 資料,你可以手動載入並且車子會以此資料為主去前進
### Motion Planner
* Motion Planner 負責規劃短程路徑(約 10-30m 之間),並控制車子的轉彎角度及速度去貼合 mission planner 所規劃出來的路徑。
* 裡面有不同的 planner 演算法,例如 A* planner 適合用於自由空間(例如停車場),lattice planner 適合用於車道變換。
* 通常用來配合避障、紅綠燈偵測、停止線偵測等功能。