ECA GROUP - DRIVING SIMULATION
如何構建自動駕駛仿真系統?
仿真最主要的目的是:透過模擬真實環境和建構汽車模型,找出自動駕駛過程中,可能出現的問題。
那麼如何建構自動駕駛仿真系統呢?目前主流的實現方式,是透過遊戲引擎來模擬真實環境,透過 CarSim 等軟體建構汽車的動力學模型,來實現自動駕駛仿真。下面我們先看下自動駕駛仿真系統的整體結構。
我們需要自動駕駛仿真系統滿足:
- 場景豐富
- 接口靈活
- 恢復快速
- 部署方便
場景
首先我們關注仿真器本身,仿真器無非是模擬支持各種場景,其中場景分為:可以定義的場景和隨機場景。可以定義的場景又分為:單元場景和真實場景。
- 下面我們分別介紹下這幾種場景:
- 可定義的場景: 主要是針對駕駛過程中,遇到的不同情況,比如會車,超車,紅綠燈,變道等,這些場景一般都比較簡單,類似於單元測試,主要是測試單個場景,是否能夠滿足要求,這一部分業界已經有規範,可以參考 openscenario [1] 。拿超車的場景舉例子,可以創建一輛 NPC 車輛在本車的前面,在不同的速度和距離條件下,測試本車超車是否成功。
- 真實場景:復現真實場景中遇到的問題,比如真實路測過程中遇到問題,需要復現當時的情況,並且驗證問題是否已經解決,可以回放真實場景的數據來進行測試。
- 隨機場景:這種場景類似於路測,模擬真實環境中的地圖,並且隨機生成 NPC,天氣,交通情況等,模擬汽車在虛擬的環境中進行路測,由於可以大規模部署,可以快速的發現問題。
我們可以看到不管是哪個場景,都是 " 地圖 + 車 + 行為 " 的模式,場景的需求複雜多變,因此能夠靈活的加載地圖,車和行為就成為仿真器易用性的關鍵。
我們的需求是能夠根據不同的要求創建不同的場景,動態的添加地圖,車和行為。場景生成器是一個框架,支持通過不同的配置,動態創建不同的場景,來滿足我們的要求。除了場景生成器,我們還需要仿真器具備以下幾個基本功能:
- 復位 - 在故障發生之後,我們能夠復位環境和車輛到初始狀態,同時也要求我們能夠復位對應的自動駕駛系統。這樣在每次故障後,可以不用人工操作,而自動恢復測試。
- 快照 - 能夠生成對應幀的資訊,保存快照的好處是能夠恢復事故現場,同時也可以用於自動駕駛數據集的建設。保存的點雲和圖片有 groundtruth,可以作為機器學習的輸入來訓練模型。
- 回放 - 回放功能主要是用於故障定位,在發生碰撞之後,回放資訊用於定位問題。
- 統計 - 統計主要是用於作為 benchmark,來衡量系統的穩定性。
有了這些基礎功能還不夠,我們還需要關心具體的場景,下面我們分別對地圖、車以及行為,來詳細描述需要實現的具體功能:
地圖
地圖是場景中第一個需要考慮的,地圖包括 2 部分,其中一部分是遊戲中的模型,另外一部分是這些模型的高精度地圖。換一種說法就是,首先我們需要在遊戲中建構一個 1:1 的虛擬世界,然後再繪製出這個世界的高精度地圖。
其實遊戲中的模型是遊戲引擎的需求,遊戲引擎是根據模型來渲染遊戲畫面的,沒有模型也就渲染不出地圖。
而高精度地圖是自動駕駛系統所需要的,高精度地圖可以採用根據現場繪製的地圖,也可以先得到遊戲模型,然後在模型中繪製。下面是遊戲中的地圖和高精度地圖的對應關係。
1. 真實場景地圖生成
① 地圖模型製作:
遊戲中地圖模型的製作,相對來說是工作量比較大的工作,涉及到以下 2 點:
- 單個模型製作 - 單個模型包括地圖中的建築物、道路、樹木、信號燈、交通牌、以及其他的資訊。這些資訊如果是要完全模擬真實環境,需要大量的材質和貼圖,一般是在 Maya 和 3D-max 等軟體中建模,然後再導入模型到遊戲引擎中使用。
- 地圖佈局 - 有了單個模型,當需要把單個模型組合成地圖的時候,首先需要解決的是道路的位置資訊,比如這個道路有多長,道路的曲率是多少?比較簡單點的方法是直接導入 2D 地圖(高德,OSM),然後對照著 2D 地圖放模型,最後生成整個地圖的佈局。而實際的問題是 2D 地圖的精度往往達不到要求,國內的地圖還加入了 GPS 偏置,所以生成的地圖佈局必定會不太準確。
② 高精度地圖製作:
- 根據模型生成地圖 - 接著上面的地圖佈局來講,雖然得到的地圖佈局不準確,但是我們再根據遊戲中的模型佈局,繪制出高精度地圖,然後把這個高精度地圖,給自動駕駛系統使用,基本上也能滿足我們的要求。
- 根據地圖生成模型 - 上述的問題就是遊戲中的真實位置,和實際道路的位置,有輕微的誤差。要解決上面的問題,我們可以反其道而行之,先生成高精度地圖,即根據真實環境先繪製出高精度地圖,然後再把高精度地圖導入遊戲引擎,動態的生成模型,這個方案的好處是地圖 100% 是真實場景,而且不需要在遊戲引擎中,重新繪製高精度地圖,壞處是建築的模型無法生成。
關於真實場景的地圖生成,目前還沒有一個比較完美的解決方案,都需要大量的工作。下面我們再看下虛擬場景的地圖生成。
2. 虛擬場景地圖生成
虛擬場景的道路生成就比較簡單,主要的應用場景是一些園區,或者一些測試場景。這一部分完全可以製作一個地圖編輯器,類似遊戲中的地圖編輯器,玩家可以根據自己的需求創建遊戲中的地圖,然後再由腳本動態的生成高精度地圖。這部分的功能主要是對標 Carsim 等仿真軟體的地圖編輯功能。
說完了地圖,接下來看下車。
車
車主要分為 2 部分:車的動力學模型,以及感測器。接下來我們詳細分析下這 2 部分:
- 車的動力學模型 - 這一部分是傳統仿真軟體的強項,由於應用已經非常成熟,遊戲中的汽車動力學模型都比較簡單,由於 CarSim 等軟件沒有開源,所以目前短期內一個比較好的解決方案是,仿真器提供 API 接口,調用 CarSim 和 Simulink 等軟體的動力學模型,實現對汽車的模擬。
- 感測器 - 感測器主要是 GPS、IMU、LIDAR、RADAR、CAMERA 等,涉及到感測器的位置,校準參數等。當然這一部分也可以仿真感測器視野範圍 ( FOV ),也可以仿真感測器的校準算法。
行為
現在我們加載了地圖,車輛,接著我們需要定義一些行為,來模擬真實世界。
1. NPC
NPC 包括行人和車輛。
- 行人 - 目前主要是模擬行人過馬路,以及在路邊行走,以及更加複雜的場景,例如下雨天打傘的行人,對於這些異常場景,感知模組不一定能夠正常辨識。
- 車輛 - 車輛的行為可以由一些簡單的行為來,模擬複雜的行為,例如停車,變道,加速,減速,來組合出超車,會車等複雜行為。也可以透過模擬真實情況的交通流數據,來模擬整個行為。前一種測試的行為比較成熟,後一種需要根據實際的情況,提取出行為,再加入補全資訊,才能夠正常工作。
2. 天氣
天氣主要是影響感測器的感知,最主要的就是攝影機。對 LIDAR 的影響,由於目前沒有閱讀相關平台是否有加入噪聲,這裡就先不提及了。
- 天氣 - 雨、雪、霧、雲層 調整不同的比率,來模擬不同的天氣情況,對感測器的影響,雲層主要是會影響光照變化,多雲投射的陰影對車道線變識等會有影響。
- 時間 - 白天和夜晚不同光照場景下對感測器的影響。
3. 紅綠燈
這一部分可以歸納為交通信號的行為,其中分為:
- 有保護的紅綠燈 - 各大城市是最普遍的,即有箭頭的紅綠燈,根據對應車道的紅綠燈直行或者拐彎。
- 無保護的紅綠燈 - 即圓形的紅綠燈,對面可以直線的同時,你可以拐彎,需要注意對面直行的車輛,選擇讓車之後再拐彎。
- 無紅綠燈 - 這種常見於郊區路口,需要判斷有沒有車輛經過而讓行或者停止,然後再通過路口。
關於仿真器就介紹完畢了,那麼我們如何控制仿真器,來實現這些呢?
API
目前主要是透過 python API 的方式來控制仿真器加載模型,控制仿真器的行為。好處是不用圖形介面手工操作,可以實現自動化部署。API 的主要是根據上述所說仿真器的功能,實現統一的接口,實現交互。
部署
為了提高測試效率,我們還需要大規模部署,一個比較好的方式是透過容器化的方式部署。針對於多台機器,一個顯而易見的需求,就是創建一個管理平台,來實現對仿真器的管理。容器部署平台可以監控對應仿真器的狀態,並且提供可視化的配置介面,生成和部署不同的場景。
- 監控 - 可以監控仿真器的監控狀態,顯示正常和有問題的集群,保存日誌,維護集群的穩定。
- 可視化 - 首先是配置可視化,可以方便的選擇不同的配置(不同的地圖,車,行為)來生成不同的場景,其次是透過可視化反饋仿真結果,屏蔽仿真集群的細節,使用起來更加直觀方便。
總結
沒有留言:
張貼留言