基於Unity的自動駕駛模擬總結(Apollo)

什麼是Apollo平臺

  • 阿波羅是百度的全棧開放開源的自動駕駛軟件平臺。
    在這裏插入圖片描述
  • 上圖是Apollo 3.5版本的架構圖,我們可以看到阿波羅是從下往上的全棧式的平臺,從硬件到各種感知器,到我們自主開發的Cyber實時操作系統,再到上面自動駕駛所有模塊,從地圖、定位、感知、規劃、控制、人機交互各種模塊。最頂層是雲端的各種服務。我們可以看到雲端各種服務裏面有一個是Simulation,也就是自動駕駛的仿真,這是阿波羅的自動駕駛仿真。

爲什麼使用遊戲引擎開發自動駕駛的仿真

  • 首先仿真的目的是爲自動駕駛開發、測試、評估提供一個高效的環境。
  • 如果我們完全基於路況進行測試,很多情況是很難遇見的。例如在硅谷,基本上從來不會下雪,我們就很難測試下雪或多霧的天氣。另外還有一些極端的情況,各種交通流不是說想碰就可以碰到的,我們都可以通過仿真來模擬這些情況。
  • 最主要原因是遊戲引擎可以幫我們高效的產生一個全棧的閉環的仿真,尤其在感知模塊的仿真。如果使用遊戲引擎創建一個賽車遊戲,我們可以重構一個三維環境,在三維環境裏面模擬相機,激光雷達等各種輸入信號。
  • 當我們使用遊戲引擎進行仿真,我們擁有所有的信息,可以輸出最準確的真值來供它們進行訓練。我們可以動態改變這個世界,可以有不同的時間、不同的天氣、不同的路況,這些在仿真裏都很容易實現。
    在這裏插入圖片描述
  • 上圖是我們使用遊戲引擎仿真的結果,可以看到我們使用不同方式的渲染,可以得到深度圖像和語義分割,我們可以知道哪裏是車,哪裏是路,哪裏是建築物。我們可以很容易分割出不同的語義並得到不同的真值。
  • 我們模擬不同路況,一些標誌線看不清楚、路面開裂的情況,還有模擬不同天氣的情況,這就是遊戲引擎的強大功能所在。
  • 當然遊戲引擎開發仿真還有很多挑戰,最大的挑戰就是如何來建一個高效的真實場景?
  • 這個真實的場景可以是真實世界的重構,也可以是虛擬的完全人造的場景,例如是遊戲虛擬的未來世界或外星世界的場景。我們現在使用二種方式進行處理,一個是手工通過我們的美術來創建,另一個是通過自動化的方式。對於真實世界來說,就是通過數據驅動的方式,我們從真實世界採集一些數據,然後利用人工智能數據驅動方式來自動、全自動、半自動來重構真實世界的場景。

爲什麼使用Unity來開發阿波羅的仿真

我們看重Unity主要有以下幾個原因:

  • Unity有很好的生態系統。Unity有很好的社區,我們可以得到各種問題的反饋。
  • Unity有很完善的Asset Store資源商店,我們可以重用第三方的很多工具,不用一切從頭開始,從頭造輪子。
  • Unity有很高效的圖形渲染系統,我們可以實時渲染出逼真的圖像。
  • Unity的性能現在也越來越好了,在雲端加速,GPU加速方面都可以給我們提供很大的幫助。
  • 最後一點,也是很重要的一點就是,Unity是一個傳統的遊戲引擎,但現在Unity也越來越看重汽車工業,其中也包括自動駕駛領域。Unity最近還推出了自動駕駛的工具包,這也是我們和Unity合作的一個重要原因。

如何在Unity中重構虛擬世界

  • 使用了Unity推薦的攝影製圖法工作流程,就是通過拍攝真實世界的圖像,然後通過圖像重構真實世界。
    在這裏插入圖片描述
  • 我們先通過高精度的數碼相機拍攝大量的圖像,然後使用的是Reality Capture,從圖像重構出三維模型。
  • 三維模型是很複雜的,所以我們使用Maya或Instant Mesh來對模型進行簡化,然後使用xNormal、Substance Designer等軟件將這些模型的紋理貼到模型上。我們使用Unity或Substance Painter來對模型進行進一步的清理,最終在Unity中使用。
  • 下面是一個簡單的例子。我們先拍攝一個樹幹的模型,保證不同的圖片之間有足夠的重疊,這樣軟件可以找到相同的特徵點,將圖片進行對齊,生成點雲。點雲進一步三角化,生成網格,同時生成模型。
    在這裏插入圖片描述- 但這樣生成的網格是非常複雜的,很可能是幾十萬到上百萬三角片,我們沒法直接拿來使用。所以我們要重構它的拓撲結構,把它大大簡化。但同時我們通過Normal Map方式保留儘可能多的細節。
    在這裏插入圖片描述
  • 例如,下圖的樹幹是一個複雜的模型,簡化過的模型,我們可以看到只有很少的三角面片,但是通過Normal Map的情況,我們還是保留了足夠多的細節。
  • 通過這種方式建立的三維場景,然後再結合Unity高精度的渲染,這樣渲染出的場景是跟真實相機拍攝的相差無幾。
    在這裏插入圖片描述
  • 我們可以看到下圖實際是百度美國研發中心門前的一條路,左側是我們渲染的場景,右邊則是用真實相機拍攝的,效果非常逼真。
    在這裏插入圖片描述
  • 通過攝影製圖法,我們可以高精度地重構現實中的三維世界。但是這個還不夠,因爲我們不可能重構所有的內容,我們還需要參考一些文檔來建一些現實中的路況標誌物和紅綠燈這類東西。
  • 因爲我們拍照片的時候,有可能是白天、晴天,但是我們還需要模擬陰天、夜晚的情況,所以我們還需要採集各種光照條件。我們還需要用HDR高動態圖形渲染方式來達到更逼真的渲染效果。
  • Unity提供了一個HDRP高清晰渲染管線,但是我們目前還沒有能夠使用它,原因是因爲我們使用了Asset Store資源商店中一些不兼容HDRP的第三方軟件,當這些軟件跟HDRP兼容時,我們也會進行更新爲HDRP。
    在這裏插入圖片描述
    我們主要使用的第三方軟件是:
  • Enviro,它可以幫我們動態地模擬各種天氣,雨雪、霧等天氣,還有不同的時間,白天黑夜的轉換。
  • Gaia和CTS,它們可以幫我們動態高效地建立更多的地形。
  • EasyRoads3D,它可以幫我們在地形上動態地加載各種建築物、植物等環境元素。
    在這裏插入圖片描述
  • Unity也發佈了SimViz,它是專爲自動駕駛而使用的工具包,我們重用了SimViz中的場景來進行一些單元測試,這可以讓我們很快地在一天之內做一些小的單元測試。
    在這裏插入圖片描述
  • 下圖左側是一個十字路口,右側是一個三車道的直路,這些場景都是來自SimViz工具包。
    在這裏插入圖片描述
  • 當然提到場景,自動駕駛畢竟跟遊戲不一樣,遊戲三維場景可能就是前面提到的內容,但自動駕駛還有一項更重要:路網的構造。
  • EasyRoads3D的初衷就是爲遊戲的路網而開發。它創建的路網還不夠複雜,因爲我們需要從路網導出高精地圖,給我們的自動駕駛軟件來使用。
  • 我們不僅需要知道每一條路,而且需要知道每條路里的各個車道線和這些車道線的連接關係、紅綠燈、各種交通標誌的位置,所以我們需要更加高效的路網創建軟件。
  • 我們可能第一個想法是:在現實中,市政施工人員是用什麼軟件來設計的。
  • 下圖中的軟件是建設真正道路的人使用的三維軟件。
    在這裏插入圖片描述
  • 但是我們衡量之後發現,這些軟件並不是爲遊戲或三維渲染引擎而設計的,所以它們有大量功能是我們用不到的。當然還有一些公司使用Houdini來製作。
  • 我們目前使用的是RoadRunner,它由VectorZero來開發的。這個軟件的功能非常強大,它可以很輕易地編輯各種複雜的路網。
  • RoadRunner有一個很重要的功能是:它可以導出OpenDRIVE的地圖格式,OpenDRIVE是現在比較通用的高精地圖格式。我們可以使用腳本把OpenDRIVE地圖格式轉化成百度阿波羅的高精地圖格式。
  • 下面是我們使用RoadRunner設計的複雜路口的示意圖。我們可以看到,這種路口如果用普通三維軟件做會耗費大量的時間。
    在這裏插入圖片描述
  • 我們不僅需要每個路有不同車道,還需要這些車道的連接關係。哪個車道能轉向哪個車道,哪個車道不能轉向哪個車道,這些連接關係RoadRunner都可以幫我們生成,這對自動駕駛模擬是非常重要的。
    在這裏插入圖片描述
  • 還有下圖這樣複雜的轉盤路和多層的立交橋,RoadRunner都可以支持。
    在這裏插入圖片描述
  • 即使有上述這些所有的工具幫忙,生成這些三維環境的時候還有一個問題:工作量和數據量。
  • 我們生成一平方公里的區域可能還是可以的,但是我們不可能生成一個幾百平方公里,甚至幾千平方公里的大城市。所以我們從真實世界開始,但是對真實世界做了簡化,因爲很多時候不需要生成整個真實世界的路網。
  • 例如,一條高速公路可能有10公里都是很簡單的路況,但是到了一些上下閘道,到了一些路口,這些路口是比較複雜的。那麼我們只需要把複雜的路口挑選出來,中間簡單的路網我們可以大大縮短,用很短的路把這些複雜路口聯繫起來。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章