自动驾驶高精地图调研
1. 高精地圖定義
高精地圖即為“兩高一多”的地圖,在自動駕駛中常常被稱為HapMap,這是自動駕駛汽車中非常重要的一部分
- 高精度:精度可以達到厘米級別
- 高動態:高精地圖實時性,為了應對各類突發狀況,自動駕駛車輛需要高精地圖的數據具有較好的實時性
- 多維度:地圖中不僅包含有詳細的車道模型、道路部件信息,還包含與交通安全相關的一些道路屬性信息,例如GPS信號消失的區域、道路施工狀態等
2. 自動駕駛地圖框架
? 2.1 Apollo OpenDrive(百度)
- 道路邊界是強約束,即自動駕駛的時候,道路邊界是永遠不能壓的。車道線理論上也是不能壓的,但是如果在緊急情況下可以壓車道線,比如說可以越過虛黃線進行借道超車。
- 可以通過路口的邊界,對感知進行過濾。如果感知識別到的靜態物體不在地圖的路口邊界之內,就可以暫時忽略它。虛擬車道主要是用來路口的行駛引導。
- 高精地圖會為紅綠燈提供一個三維空間位置,其次也會提供紅綠燈跟車道之間的關聯關系,即告知當前所在車道,應該看哪個燈。道路標志主要包括人行橫道,停止線以及一些路上的文字信息。
- 邏輯關系表述。當前,地圖中各個元素之間的關系并沒有嵌入到元素的表述中,而是使用overlap來表述兩個元素之間的空間關系。如下圖所示,Lane和Junction在空間上有重疊,它們之間就會有Overlap。
? 2.2 Lanelet2(Autoware)
- points由ID,3d坐標和屬性組成,是唯一存儲實際位置信息的元素,ID必須是唯一的。其他基本元素都是直接或者間接由points組成的。在Lanelet2中,Points本身并不是有意義的對象,Points僅與Lanelet2中的其他對象一起使用有意義。
- 線串是兩個或者多個點通過線性插值生成的有序數組,用來描述地圖元素的形狀。線串可以是虛線,它可以通過高度離散化實現,來描述任何一維形式,并應用于地圖上的任何可物理觀察到的部分。與樣條曲線相比,線串可以高效計算,并且可以用來描述尖角,最終轉化為非線性微分方程的求解問題。
-
多邊形與線串非常相似,但形成一個Area。隱式假定多邊形的第一個點和最后一個點被連接以閉合形狀。多邊形很少用于傳輸地圖信息(交通標志除外)。相反,它們通常用作將有關區域的自定義信息添加到地圖(例如,感興趣區域)的一種手段。
-
Lanelets定義了發生定向運動時,地圖車道的原子部分。原子表示沿當前lanelet行駛時,有效的交通規則不會改變,而且與其他Lanelet的拓撲關系也不會更改。
lanelet可以引用表示適用于該lanelet的交通規則的regulatory elements。多個lanelet可以引用同一regElem。必須始終始終可以直接從車道上確定車道的當前速度限制。可以通過引用SpeedLimit監管元素或標記小車的位置來完成。在這種情況下,假定道路類型的最大速度(例如,如果位置是德國城市,則為最大50公里/小時)。
-
Areas是地圖上沒有方向或者是無法移動的部分區域,比如路標,停車位,綠化帶等。他們由一條或者多條linestring組成的閉合的區域。Area也有相關聯的regulatory elements。
-
regElem是表達交通規則的通用方式,它們由適用的lanelet或Area引用。在應用的時候,regElem 會和一個或者多個Lanelets、Areas相關聯。regElem是動態變化的,意味著它只是在某些條件下是有效的。
-
諸如限速,道路優先級規則、紅綠燈等,交通規則有許多不同的類型,因此每個regElem的準確結構大都不一樣。他們通常引用定義規則的元素(例如交通標志),并在必要時引用取消規則的元素(例如速度區末尾的標志)。
3.制圖流程概述
高精地圖是一種語義地圖,概括地說,就是利用SLAM/SFM等算法融合多種傳感器數據,構建高精度的三維點云地圖,在點云地圖上或者是圖像上,對所用到的元素進行分類和提取、之后對不同元素分別進行矢量化并構建路網與車道關聯關系,最后進行質量校驗,形成一套地圖引擎來存儲并支撐其他模塊的需求。
高精地圖制作完成后,其數據量其實是非常小的。地圖數據可以存儲在云端,也可以直接直接在本地,大地圖還有可以用數據庫來存儲。先暫且不論地圖格式是Lanelet2還是OpenDrive以及其他,完整的理解高精地圖的元素結構設計,以及數據存儲和使用則為重中之重,后續的自定義格式要求可按自己的需求來適配。
小地圖手工標注方法
對于3km以內的小地圖而言,一般可以采取手工標注點云地圖的方法來制圖。目前我了解到的以下軟件均可,比如
-
RoadRunner
2020年最新版可直接標注點云PCD文件,添加語義,可直接導出標準Opendrive,缺點就是目前語義類別不太完善,導出格式只支持標準OpenDrive。在使用上,高校等科研單位申請免費,每所學校一個密鑰。
-
LGSVL Map Annotation(windows Unity 插件版,需要手動編譯)
支持目前的主流地圖格式,可導入導出如Apollo Opendrive/標準Opendrive/Autoware VectorMap/Lanelet2等,缺點是目前只能標注LGSVL提供的一些虛擬環境,使用上是完全開源的。目前2020.03的版本已經開始支持直接標注點云pcd。
在這里插入圖片描述
-
Autocore MapToolBox插件
AutoCore提供的開源工具,用于標注生成Autoware vector map矢量地圖,更新速度快,目前可標注車道線,路沿,紅綠燈,目前已全面支持Lanelet2 ,項目完全開源,本篇將著重于此。大家可以在issue里面多提bug,感謝作者moelang以及Autocore做出的極大貢獻!
-
Assure mapping tools
Github@hatem-darweesh開源的標注工具,格式支持齊全,包括Google Earth、KML、opendrive、Lanelet、Vector Map等,標注上自動Fix height、smooth line,并集成了一些自動化的提取算法和。功能相當齊全,就是性能較差,大地圖加載進來很卡,需要配合GPU使用,另外有些功能也可能是目前我還沒有研究透徹。
-
51VR、四維圖新等高精地圖地圖服務提供商(收費)
一般是圖商直接用自家的制圖車進行采集數據制作,按次數收費,目前一般城區道路收費5k-1w/每公里。少數廠商會提供高精地圖標注軟件及相關仿真系統服務,成本較高,目前就試用情況來看也不是十分完善。
4.制圖流程實踐
構建點云底圖
構建點云地圖可以用一些主流的激光SLAM算法,結合多種傳感器來完成,其中要保證戶外場景的建圖效果,IMU和GPS是必須的,下面有一些推薦的開源算法,按優先級排列
-
LIO-SAM(緊耦合的激光慣導SLAM算法,速度快)
-
LIO-MAPPING (緊耦合的激光慣導SLAM算法,第一套緊耦合的激光慣導)
-
LEGO-LOAM(松耦合、輕量級,性能不錯,配置簡單)
-
VLOAM(能找到非官方的代碼)
-
ALOAM(僅里程計,可用于學習)
自動標注
自動標注涉及到的算法相當多,流程大致如下:
手工標注(Autoware)
對比下來發現采用Autoware的地圖標注插件更好,Unity + MapToolBox進行標注,插件地址如下:https://github.com/autocore-ai/MapToolbox,這里注意下載的Unity版本需2019.3+,在Windows環境下使用,最新版的priview6已經加入對road mark和crosswalk的支持。目前Autoware社區已經增加了對Lanelet2的支持。
手工標注(Apollo)
Apollo Opendrive高精地圖的話一般存在下面四種思路。
-
可以根據上面Autoware開源的MapToolbox,這倆都是C#項目,前者可以改寫后端,存儲標準點的時候按照Apollo Opendrive的格式去存儲,由于都是坐標序列描述,改寫難度不大。
-
LGSVL Map Annotation,目前支持直接導入PCD點云標注(2020.03版新功能不完善),也可導入已有的Apollo Opendrive/標準Opendrive/Lanelet2,可導出Apollo Opendrvie/Autoware Vector Map/Lanelet2/標準Opendrive等格式的地圖。其問題主要在于性能較差,對硬件要求高。
- 利用RoadRunner標注點云PCD,導出標準Opendrive地圖,采用LGSVL模擬器將標準Opendrive轉換到Apollo Opendrive地圖。此步驟已驗證,示例標注的Apollo Opendrive地圖如下
由于目前支撐Opendrive的開源lib庫很少,雖然自己寫也不是特別費勁,可以利用其他的開源地圖框架,生成高精地圖之后再轉換為Apollo Opendrive格式。這里目前可選擇的僅僅是Liblanelets/Lanlets2,按照Lanlets2的接口規范可以生成OSM地圖,在用開源的JSOM編輯器編輯完OSM地圖后,再轉換成Apollo Opendrive地圖
5. Lanelet2地圖代碼解析
地圖格式官方推薦的是OSM格式(XML),開源可編輯。當然也可以是二進制文件,加載速度快,缺點是不可直接編輯。下面的地圖文件是按XML形式來存儲的,結構十分明朗。關于OSM規范,可以參考其WIKI,https://wiki.openstreetmap.org/wiki/Map_Features。
地圖里面的每一個3D點都會用一個node標簽存儲,包含其經緯度LaLon,id是其唯一標志。后續的way標簽存儲lineString形式的元素,通過id引用node節點存儲的3D點。而和交規相關的relation標簽則又引用這些way id。
我們在JOSM編輯器中打開可以看到地圖的基本形狀,此編輯器的使用方法可查看官網https://learnosm.org/en/josm/correcting-imagery-offset/。下圖是一個復雜的十字路口,地圖上所有的黃色小框框都是一個3D/2D坐標點。這里紅色的線是地圖里面的stop_line,在軟件界面右側可以看到其屬性是stop line,并且有四個節點。地圖上畫出來了所有的車道線,路沿,人行橫道,綠化帶區域等,還有各個road user(比如行人,車輛等)需要遵守的交通規則,以及車輛在十字路口可能的換道路線(現實中是沒有的,屬性定義為virtual)。
Lanelet2代碼的安裝可以參考官方文檔https://github.com/JokerJohn/Lanelet2,其層級結構如下
我們常用的代碼在lanelet_core、lanelet_io、lanelet_projection、lanelet_routing和lanelet_traffic_rules這幾個模塊中。項目采用gtest框架來測試,閱讀起來比較容易。
這里我們首先需要知道如何去使用,首先是圖元的基本定義方法(增刪改查),還有交通規則的定義方法及其與車道和road user的關聯關系。之后是如何去構建、加載使用OSM地圖,并且根據需求查詢相關的車道等信息。最后是如何生成生成路由圖,并利用路由圖和實際需求進行合理的路徑規劃。
詳細參考了高精地圖制作流程詳解與實踐、Lanelet2地圖框架代碼解析、高精地圖與車輛協同
總結
以上是生活随笔為你收集整理的自动驾驶高精地图调研的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 行测-常识积累(2)
- 下一篇: 金海佳学C++primer 练习9.43