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