本文介紹如何繪制Autoware.universe使用的高精地圖并驗(yàn)證地圖,本系列其他文章:
Autoware.universe部署01:Ubuntu20.04安裝Autoware.universe并與Awsim聯(lián)調(diào)
Autoware.universe部署03:與Carla(二進(jìn)制版)聯(lián)調(diào)
Autoware.universe部署04:universe傳感器ROS2驅(qū)動(dòng)
引言
目前行業(yè)并沒(méi)有通用的標(biāo)準(zhǔn)(OpenDrive并不是為自動(dòng)駕駛設(shè)計(jì)的),Autoware自動(dòng)駕駛系統(tǒng)的矢量地圖和地圖引擎計(jì)劃使用Lanelet2,本文我們就來(lái)了解并且上手一下Lanelet2高精度地圖框架。Lanelet2架構(gòu)可以劃分為:
- lanelet2稱可以被觀測(cè)到的要素為地圖的物理層(physical layer) ,諸如路標(biāo)、紅綠燈、交通標(biāo)志、防撞欄等等,其他的所有地圖元素,比如車道(lane),是這些物理元素的一種抽象表示。
- 同樣地,交通規(guī)則是規(guī)則源(例如交通信號(hào)燈)與其所應(yīng)用的車道之間的關(guān)聯(lián)。根據(jù)這些物理元素我們可以追蹤這些關(guān)聯(lián)信息,我們稱這些元素為地圖的關(guān)聯(lián)層(relational layer)。
- 然而,并非地圖的所有元素都可以與物理層相關(guān)聯(lián),因?yàn)榈缆方煌ㄖ型鶗?huì)包含隱含的規(guī)則,比如說(shuō)在路口內(nèi),車道線和車道邊緣并沒(méi)有畫(huà)出來(lái),但是它們是存在的,HAD map必須包含這些隱含的元素以保證路網(wǎng)拓?fù)涞倪B通性,這些元素都是我們的行為“常識(shí)”引入的,不和實(shí)際的可觀測(cè)元素關(guān)聯(lián),即拓?fù)鋵?/strong>(topological layer)。
創(chuàng)建與Autoware兼容的矢量地圖最簡(jiǎn)單的方法是使用TIER IV公司提供的基于Web的免費(fèi)工具Vector Map Builder。Vector map builder是Autoware官方提供的一個(gè)在線lanelet2地圖繪制工具矢量地圖生成器,允許您創(chuàng)建車道,并使用點(diǎn)云地圖作為參考添加額外的管制元素,如停止標(biāo)志或交通燈。
對(duì)于開(kāi)源軟件選項(xiàng),MapToolbox是專門為Unity設(shè)計(jì)的插件,用于為Autoware創(chuàng)建Lanelet2地圖。雖然JOSM是另一個(gè)可以用來(lái)創(chuàng)建Lanelet2地圖的開(kāi)源工具,但是需要注意的是,為了使地圖與Autoware兼容,必須進(jìn)行大量的手工修改。這個(gè)過(guò)程可能是繁瑣和耗時(shí)的,因此不建議使用JOSM。
Lanelet2默認(rèn)的格式為XML形式的OSM地圖格式,可以使用OSM地圖編輯器進(jìn)行編輯和可視化。Lanelet2假定地圖中的所有元素均能投射到平面,不過(guò)元素的高度信息也會(huì)被保存,以避免將立交橋處理成十字路口的情況。當(dāng)加載地圖的時(shí)候,為了方便地圖的使用,會(huì)采用通用莫卡托投射(UTM,Universal Transverse Mercator)將地圖投射到笛卡爾坐標(biāo)系。
Lanelet基礎(chǔ)元素
Lanelet2地圖主要包含6類基元:
- Points:點(diǎn)
- Linestrings: 由點(diǎn)前后連接構(gòu)成的折線序列
- Polygons:多邊形
- Lanelets:車道的原子單元,或者說(shuō)對(duì)車道的最小劃分
- Areas:區(qū)域,類似與lanelet,但是它一般用于描述建筑、停車區(qū)等獨(dú)立區(qū)域
- Regulatory elements:控制元素,能產(chǎn)生交通規(guī)則的元素,如信號(hào)燈、限速牌等
前三類為物理層,其余為關(guān)聯(lián)層,每一個(gè)元素都有自己唯一的ID
Lanelet2項(xiàng)目各個(gè)模塊
Lanelet2論文的另外一個(gè)工作就是基于以上設(shè)計(jì)理念和基本要素開(kāi)源了一套C++編寫(xiě)的地圖框架,lanelet2項(xiàng)目依靠catkin編譯,所以每個(gè)模塊都是以ros package的形式進(jìn)行管理,各個(gè)模塊內(nèi)容如下:
- lanelet2:基礎(chǔ)模塊,沒(méi)有具體實(shí)現(xiàn)
- lanelet2_core:實(shí)現(xiàn)了基元、地理計(jì)算等核心庫(kù)
- lanelet2_io:lanelet地圖的IO庫(kù)
- lanelet2_traffic_rules:提供地圖交通規(guī)則的支持
- lanelet2_projection:提供WGS84坐標(biāo)系到指定坐標(biāo)系下的投影的實(shí)現(xiàn)
- lanelet2_routing:提供基于lanelet地圖的routing功能
- lanelet2_maps:lanelet2官方提供的示例地圖
- lanelet2_python:lanelet2的python接口
- lanelet2_validation:驗(yàn)證Lanelet2地圖
- lanelet2_examples:教程和示例
一、安裝Lanelet2項(xiàng)目
注意
:如果不需要額外的地圖驗(yàn)證工具,可以直接到下一章節(jié)開(kāi)始學(xué)習(xí)繪制Lanelet2地圖
1.1 安裝依賴
環(huán)境是Ubuntu18.04,依賴于ROS melodic
sudo apt-get install ros-melodic-rospack ros-melodic-catkin ros-melodic-mrt-cmake-modules ros-melodic-unique-id
sudo apt-get install libboost-dev libeigen3-dev libgeographic-dev libpugixml-dev libpython-dev libboost-python-dev python-catkin-tools
1.2 編譯
mkdir catkin_ws_lanelet2_mapping && cd catkin_ws_lanelet2_mapping && mkdir src
catkin init
# build in release mode (or whatever you prefer)
catkin config --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo
cd src
git clone https://github.com/AbangLZU/ad_with_lanelet2.git
cd ..
catkin build
- 編譯報(bào)錯(cuò):
error: ‘::memset’ has not been declared
可能是boost版本的問(wèn)題。memset是C 庫(kù)函數(shù),void *memset(void *str, int c, size_t n) 復(fù)制字符 c(一個(gè)無(wú)符號(hào)字符)到參數(shù) str 所指向的字符串的前 n 個(gè)字符。如果是C++編譯,需要調(diào)用的是cstring。報(bào)錯(cuò)是因?yàn)樵贑++環(huán)境下使用了memset卻沒(méi)有導(dǎo)入cstring,所以解決辦法很簡(jiǎn)單,修改boost頭文件
sudo gedit /usr/local/include/boost/geometry/algorithms/detail/relate/result.hpp
打開(kāi)報(bào)錯(cuò)的源碼,添加以下頭文件:
#include <cstring>
- 報(bào)錯(cuò):
/home/autoware/catkin_ws_lanelet2_mapping/devel/.private/lanelet2_extension/lib/liblanelet2_extension_lib.so:
undefined reference to `lanelet::routing::RoutingCostTravelTime::travelTime(lanelet::traffic_rules::TrafficRules const&, lanelet::ConstLanelet const&) const'
這是由于我們之前安裝Autoware1.15時(shí)安裝了與當(dāng)前項(xiàng)目同名的ROS包(lanelets一系列),導(dǎo)致現(xiàn)在找到了對(duì)應(yīng)的老版本的ROS包,把它們卸載就行了:
sudo apt-get remove ros-melodic-lanelet2-core ros-melodic-lanelet2-validation ros-melodic-lanelet2-io ros-melodic-lanelet2-maps ros-melodic-lanelet2-projection ros-melodic-lanelet2-routing ros-melodic-lanelet2-traffic-rules
編譯成功:
1.3 在ROS中使用lanelet2地圖完成routing
在你的ros workspace中,運(yùn)行本項(xiàng)目:
cd your_ros_workspace
source devel/setup.bash
roslaunch src/ad_with_lanelet2/run_map_simulator.launch
run_map_simulator.launch內(nèi)容如下,一共會(huì)啟動(dòng)4個(gè)ros node:
- planning仿真節(jié)點(diǎn):來(lái)自Autoware的簡(jiǎn)單planning仿真
- map loader:加載Autoware擴(kuò)展版lanelet2地圖,發(fā)送用于可視化的Rviz marker,以ros msg的形式發(fā)送map
- mission planning模塊:來(lái)自Autoware的任務(wù)規(guī)劃模塊,在本例中主要使用了Routing路線生成
- Rviz:?jiǎn)?dòng)Rviz并使用預(yù)先設(shè)置的配置參數(shù)
如圖,map被加載與Rviz中:
點(diǎn)擊Rviz中的2D Pose Estimate在圖中設(shè)置當(dāng)前位置,仿真節(jié)點(diǎn)根據(jù)這個(gè)init pose發(fā)一個(gè)base_link 到world坐標(biāo)系的tf,設(shè)置完成后如下圖所示:
接著使用Rviz中的2D Nav Goal設(shè)置routing的終點(diǎn),如圖中所示,mission planner會(huì)根據(jù)設(shè)置的目標(biāo)位姿動(dòng)態(tài)生成routing路線(圖中深綠色路線):
注
:該樣例地圖為Tier 4公司(Autoware的主要維護(hù)者)開(kāi)源的地圖,在日本,所以是靠左行駛,routing的時(shí)候需要按照靠左行駛的規(guī)則設(shè)定起終點(diǎn)。
二、Autoware Vector Map Builder繪制高精地圖
Vector map builder需要多次練習(xí)熟練理解才能繪制出正確且美觀的地圖
Vector map builder是Autoware官方提供的一個(gè)在線lanelet2地圖繪制工具,地址為:https://tools.tier4.jp/feature/vector_map_builder_ll2/,需要注冊(cè)賬號(hào):
注冊(cè)后選擇v1.13~,地圖數(shù)據(jù)格式為.osm
2.1 創(chuàng)建地圖
(1)進(jìn)入后選擇右上角文件導(dǎo)入PCD點(diǎn)云地圖
這里導(dǎo)入官方的點(diǎn)云數(shù)據(jù)
鼠標(biāo)右鍵拖動(dòng)點(diǎn)云,左鍵旋轉(zhuǎn)點(diǎn)云,滾輪放大縮小點(diǎn)云,左上角可以切換3D視角
(2)創(chuàng)建矢量地圖
創(chuàng)建Lanelet2新地圖需要輸入MGRS(橫軸莫卡托投影UTM坐標(biāo)系網(wǎng)格),查詢地理位置對(duì)應(yīng)的MGRS網(wǎng)站:https://mgrs-mapper.com/app。如果是局部坐標(biāo)系(沒(méi)有絕對(duì)坐標(biāo)),可以填(31N,AA),即經(jīng)緯度(0,0)
2.2 繪制車道
有兩種方法,一種是先繪制Linestring,再合成Lanelet,另一種方法是直接利用工具繪制Lanelet
2.2.1 Linestring合成
(1)選擇Lanelet2Map工具,開(kāi)始繪制
打開(kāi)Linestring,點(diǎn)選車道線邊緣繪制車道線,繪制完一側(cè)之后關(guān)閉Linestring完成繪制,同樣的方法繪制另一側(cè)車道線邊緣
繪制完一條車道的兩條車道線之后,按住shift鍵,鼠標(biāo)選擇兩條車道線,點(diǎn)擊右上角Action中的Add Lanelet,生成Lanelet元素(生成后界面如果無(wú)法控制,按一下shift有奇效,如果不能旋轉(zhuǎn)就點(diǎn)擊左上角rotate on)
選中端點(diǎn)(出現(xiàn)坐標(biāo)系,選不中試一下shift按鍵),再打開(kāi)Linestring,按照上述方法可以繪制前繼與后繼車道的Linestring,再合成前繼與后繼車道Lanelet(車道方向可以根據(jù)Next Lanelet屬性判斷),我在繪制彎道的時(shí)候比較糙,實(shí)際繪制的時(shí)候點(diǎn)可以給密集一點(diǎn),而且不能太窄,否則后面Autoware自動(dòng)駕駛時(shí)無(wú)法轉(zhuǎn)彎(Drivable Area)
使用Reverse Direction功能對(duì)Lanelet方向進(jìn)行調(diào)整,Lanelet標(biāo)紅為報(bào)錯(cuò),綠色為正確,標(biāo)紅的原因是拓?fù)潢P(guān)系不正確(Next Lanelet is empty),改變方向使拓?fù)潢P(guān)系正確,會(huì)變成綠色見(jiàn)右下角:
選中Lanelet在右側(cè)屬性表可以編輯屬性,比如:車道最大限速,車道轉(zhuǎn)彎方向(左轉(zhuǎn)、直行、右轉(zhuǎn)),一定要編輯,否則后面Universe無(wú)法獲得車道信息
右上角Action工具可以生成中心線,掉轉(zhuǎn)方向,聚焦,伸直和改變寬度
畫(huà)完一條車道之后,可以選中然后打開(kāi)工具欄的Copy Lanelet按鈕,然后點(diǎn)擊與旁邊車道共用的邊,即可自動(dòng)生成(與當(dāng)前車道一樣)旁邊車道,生成后再手動(dòng)微調(diào)(選中端點(diǎn)拖動(dòng)可以改變形狀,坐標(biāo)軸是按照坐標(biāo)方向移動(dòng),選中方塊可以任意方向移動(dòng))同樣的方法繪制后繼車道,出現(xiàn)車道鏈接點(diǎn)斷開(kāi)的情況:
這時(shí)可以按住shift,選擇前后兩條車道線,點(diǎn)擊join Lanelet,使其相連,之后再調(diào)整形狀(注意要先把方向換對(duì),否則就亂了):
2.2.2 Lanelet工具直接繪制
使用Lanelet工具直接繪制車道線,打開(kāi)Lanelet工具,然后鼠標(biāo)直接根據(jù)車道中心線繪制車道線,再使用Join Lanelet連接車道,但寬度不對(duì)需要再微調(diào),再用copy繪制相鄰車道:填寫(xiě)屬性,上方Problem報(bào)錯(cuò),點(diǎn)開(kāi)看到車道限速超過(guò)了最大速度,將其最大速度增加就可解決
2.2.3 繪制變道車道
多向變道:在有節(jié)點(diǎn)的Lanelet端(從這里可以看出,盡量不要繪制一條到底的長(zhǎng)直車道,尤其是路口一定要斷,事實(shí)上,繪制太長(zhǎng)也會(huì)導(dǎo)致規(guī)劃的時(shí)候不夠精確)繪制新的Lanelet,然后使用join Lanelet連接車道,最后微調(diào)節(jié)點(diǎn)位置即可:
同向變道:需要設(shè)置Linestring可變道,選中同向車道之間的Linestring,線型選擇虛線(dashed),添加屬性lane_change,值為yes,添加屬性width,值為0.0
2.3 繪制路沿
打開(kāi)Linestring,繪制路沿邊線,然后在右側(cè)屬性表的type中選擇road_boder即可:
2.4 繪制停止線和交通燈
選中要繪制停止線的車道,打開(kāi)停止線工具,點(diǎn)擊停止線位置即可生成
選中要繪制紅綠燈的車道,再打開(kāi)交通燈工具,然后在等紅綠燈的位置點(diǎn)擊,即可生成停車線,并在對(duì)面生成紅綠燈(注意車道方向),生成之后可以調(diào)整停車線以及紅綠燈位置(按住shift可以劃定區(qū)域多選)
2.5 繪制人行道
選中車道,然后打開(kāi)Abstraction下的Crosswalk,點(diǎn)擊人行道兩端自動(dòng)生成人行道,選中人行道,在右側(cè)的participants屬性下填寫(xiě)pedestrian:
2.6 繪制路邊??寇嚨?/h3>
選中路邊??客?寇嚨缹?duì)應(yīng)的正常車道,然后點(diǎn)擊右上角CopyLanelet(先畫(huà)一條lanestring再與以有車道邊合成也行,即必須與車道有一條公共邊),再點(diǎn)擊車道邊線,即可自動(dòng)生成并列車道,再把生成的車道的subtype屬性修改為road_shoulder,即繪制了??寇嚨溃ㄕ{(diào)整形狀可以)
2.7 繪制禁停區(qū)
如下圖在某建筑門前繪制禁停區(qū),首先選中車道,然后打開(kāi)上方東的NoStoppingArea,即可繪制禁停區(qū)域,同時(shí)自動(dòng)生成一條停止線,選中角點(diǎn)調(diào)整形狀:
2.8 繪制停車場(chǎng)以及停車位
選中車道,打開(kāi)上方的NoStoppingArea,繪制Area,調(diào)整大小,然后在屬性表中修改屬性為parking_lot
繪制一條Linestring,然后選中在屬性表中修改type為parking_space,添加屬性width,值為3,即繪制了一個(gè)停車位,然后可以直接復(fù)制幾條
2.9 地圖拓?fù)潋?yàn)證(可以跳過(guò))
繪制完成之后,確定右上角Problem項(xiàng)沒(méi)有報(bào)錯(cuò),即可點(diǎn)擊File導(dǎo)出Lanelet2地圖
然后使用第二節(jié)的功能包驗(yàn)證,將導(dǎo)出的地圖復(fù)制到catkin_ws_lanelet2_mapping/src/ad_with_lanelet2/map/map_loader/data路徑下,修改文件名稱為lanelet2_map.osm
然后運(yùn)行規(guī)劃節(jié)點(diǎn):
source devel/setup.bash
roslaunch src/ad_with_lanelet2/run_map_simulator.launch
即可加載自己繪制的地圖,按照第二節(jié)的方法可以驗(yàn)證地圖,如果有問(wèn)題方便及時(shí)修改
路徑規(guī)劃也沒(méi)問(wèn)題:
2.10 Universe的使用
將生成的地圖(命名為lanelet2_map.osm)與點(diǎn)云地圖(命名為pointcloud_map.pcd)放在一個(gè)新建文件夾下,并創(chuàng)建一個(gè)yaml文件(map_config.yaml),填入以下內(nèi)容:
/**:
ros__parameters:
map_origin:
latitude: 0.0
longitude: 0.0
elevation: 0.0
roll: 0.0
pitch: 0.0
yaw: 0.0
運(yùn)行Autoware.universe,路徑換成你自己的:
source install/setup.bash
ros2 launch autoware_launch planning_simulator.launch.xml map_path:=${You_map_path} vehicle_model:=sample_vehicle sensor_model:=sample_sensor_kit
可以planning
加了一條到停車場(chǎng)的路線(需要有經(jīng)過(guò)停車場(chǎng)的車道,才能駛?cè)胪\噲?chǎng),并準(zhǔn)備入庫(kù)),倒車入庫(kù)也是沒(méi)有問(wèn)題的,其他地圖元素的測(cè)試參考Autoware.universe部署01:Ubuntu20.04安裝Autoware.universe并與Awsim聯(lián)調(diào)
三、JOSM可視化和編輯Lanelet2地圖
因?yàn)椴捎昧薕SM的地圖格式定義,Lanelet2地圖可以很方便地使用OSM的工具鏈進(jìn)行查看和編輯,下面我們使用JOSM工具對(duì)項(xiàng)目?jī)?nèi)的lanelet2_map.osm地圖進(jìn)行可視化和編輯(不建議,但是JOSM事實(shí)上功能更多,只是不容易)。JOSM是一個(gè)Java實(shí)現(xiàn)的對(duì)OSM進(jìn)行編輯的工具,因其為Java程序,所以可以跨平臺(tái)使用,官網(wǎng)下載最新版本的JOSM,本文采用的是jar包的形式運(yùn)行,jar下載鏈接:https://josm.openstreetmap.de/josm-tested.jar
3.1 配置Java環(huán)境
參照教程:https://josm.openstreetmap.de/wiki/Download#Java
編輯源文件列表/etc/apt/sources.list.d/josm.list:
sudo /etc/apt/sources.list.d/josm.list
根據(jù)你的ubuntu版本選擇填入下列源:
# 22.04
deb [signed-by=/usr/local/share/keyrings/josm-apt.gpg] https://josm.openstreetmap.de/apt jammy universe
# 20.04
deb [signed-by=/usr/local/share/keyrings/josm-apt.gpg] https://josm.openstreetmap.de/apt focal universe
# 18.04
deb [signed-by=/usr/local/share/keyrings/josm-apt.gpg] https://josm.openstreetmap.de/apt bionic universe
下載公鑰:
# Create the directory for manually downloaded keys if it was not already created
sudo mkdir -p /usr/local/share/keyrings
# Download the key
wget -q https://josm.openstreetmap.de/josm-apt.key -O- | sudo gpg --dearmor -o /usr/local/share/keyrings/josm-apt.gpg
然后更新源:
# You may need to install ssl support for apt in advance:
sudo apt-get install apt-transport-https
# Refresh sources
sudo apt-get update
然后安裝:
# You can skip this first line if these packages were not installed before.
sudo apt-get remove josm josm-plugins
# 測(cè)試版(穩(wěn)定版)
sudo apt-get install josm
# 最新版
sudo apt-get install josm-latest
通過(guò)java --version檢查系統(tǒng)中安裝的Java,我的環(huán)境如下(我裝的版本可能有點(diǎn)低):
通過(guò)java --version檢查系統(tǒng)中安裝的Java,我的環(huán)境如下(我裝的版本可能有點(diǎn)低):
下載好josm-tested.jar包后,在同目錄下使用以下命令運(yùn)行JOSM:
java -jar josm-tested.jar
報(bào)網(wǎng)絡(luò)鏈接錯(cuò)誤錯(cuò)不用管(科學(xué)上網(wǎng)之后就不會(huì)再報(bào)了),在JOSM中選擇presets->preset preferences可以改變語(yǔ)言文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-676488.html
3.2 配置Lanelet2格式
在JOSM中添加lanelet2的地圖樣式和預(yù)設(shè)組合標(biāo)簽,在JOSM中選擇預(yù)設(shè)組合->預(yù)設(shè)首選項(xiàng)->地圖樣式->+,分別將ROS項(xiàng)目中l(wèi)anelet2_maps/josm/目錄下的lanelets.mapcss和lines.mapcss添加為地圖樣式:
在添加預(yù)設(shè)組合標(biāo)簽下,添加lanelet2_maps/josm/目錄下的laneletpresets.xml文件:
在JOSM中,選擇文件->打開(kāi),選擇項(xiàng)目中map/map_loader/data/目錄下的lanelet2_map.osm文件,得到如下地圖:
可在JOSM中查看和編輯地圖中的各個(gè)元素,地圖編輯教程可以參考https://learnosm.org/en/josm/josm-tools/??梢栽诓藛螜诘挠跋裰屑虞d(全球)遙感圖像作為底圖繪制(國(guó)內(nèi)的影像分辨率可能比較低,并且沒(méi)有測(cè)繪資質(zhì)進(jìn)行高精地圖的繪制可能存在較高的技術(shù)壁壘和法規(guī)風(fēng)險(xiǎn)):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-676488.html
到了這里,關(guān)于Autoware.universe部署02:高精Lanelet2地圖的繪制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!