万字详解OpenDRIVE文件
- opendrive簡介_whuzhang16的博客-CSDN博客_opendrive
- 一文讀懂opendrive的xodr文件內容_布拉德先生的博客-CSDN博客_xodr格式
- 自動駕駛場景仿真標準(一)- OpenDRIVE - 知乎 (zhihu.com)
- opendrive坐標系_whuzhang16的博客-CSDN博客_opendrive坐標系
1 OpenDRIVE概要
ASAM OpenDRIVE描述了自動駕駛仿真應用所需的靜態道路交通網絡,并提供了標準交換格式說明文檔。該標準的主要任務是對道路及道路上的物體進行描述。OpenDRIVE說明文檔涵蓋對如道路、車道、交叉路口等內容進行建模的描述,但其中并不包含動態內容。
OpenDRIVE格式使用文件拓展名為xodr的可擴展標記語言(XML)作為描述路網的基礎。存儲在OpenDRIVE文件中的數據描述了道路的幾何形狀以及可影響路網邏輯的相關特征(features),例如車道和標志。
OpenDRIVE中描述的路網可以是人工生成或來自于真實世界的。OpenDRIVE的主要目的是提供可用于仿真的路網描述,并使這些路網描述之間可以進行交換。
該格式將通過節點(nodes)而被構建,用戶可通過自定義的數據擴展節點。這使得各類應用(通常為仿真)具有高度的針對性,同時還保證不同應用之間在交換數據時所需的互通性。
1.1 OpenDRIVE文件結構
OpenDRIVE數據存儲在擴展名為.xodr的XML文件中。OpenDRIVE文件結構符合XML規則。元素按XML格式的等級進行排列,級別大于零(0)的元素為 子元素。級別為(1)的元素稱為主元素。每個元素都可以用戶定義的數據進行擴展。每個OpenDRIVE文件都會有一個主元素<OpenDRIVE>,所有描述道路的特征類都是它的子元素。
OpenDRIVE中使用的所有浮點數都是IEEE 754雙精度浮點數的數字。為了保證浮點數字在XML中的準確表示,在XML中的浮點數表示應該使用一個已知的正確精度,一般使用保留17位有效數字來描述數字。
所有可以在 OpenDRIVE 文件中使用的屬性都在 UML 模型中被完全注釋:
- 單位: 道路長度或速度等的單位
- 種類: 描述一個屬性的數據類型, 可以是一個原始數據類型,例如,string、double、float,或者是指代對象的復雜數據類型。
- 值: 值決定了給定屬性的值范圍,例如:
其中geometry代表了當前元素所要描述的道路單元,其中geometry的屬性有s,x,y,hdg和length,他們的值跟隨在后面。
1.2 OpenDrive重要節點介紹
Unity解析OpenDRIVE地圖數據,并生成路網模型_方寸想法,編碼宇宙-CSDN博客_opendrive unity
XML節點和屬性的導圖。“【】”表示這個節點一般有多個。
2 格式說明
范例:
<?xml version="1.0"?> <OpenDRIVE> ... </OpenDRIVE>OpenDRIVE的例子可以參考如下的xodr文件:
.xord示例文件github.com/ruomusim/Intro_OpenDRIVE
2.1 header 描述文件整體屬性 (僅一個)
<header>元素是 <OpenDRIVE>中的第一個元素。
注意:instances 意思是實例數,而該實例數要求是1。
說明:
revMajor.revMinor就是最終的版本號,比如1.6;
north,south,east,west指的是慣性坐標系下的東南西北方向的位置坐標值,也就是慣性坐標系下對應的x,y最大最小值等。
示例:
<header date="XXXX日期" west="-10" revMinor="2" name="XXX名稱" revMajor="1" east="10" north="10" version="1" south="-10"/>2.2 road 描述道路屬性 (可多個)
完整道路的表示方式:
①道路參考線 —— <planView>
②一條道路上的單獨車道 ——
<lanes> <laneSection> <center/left/right> <lane> <width/...>③沿道路放置的道路特征(如標志)
解釋:
length就是所有路徑geometry長度的累加
junction:交叉口的ID,道路作為聯接道路屬于該交叉口(無(none)使用= -1)
使用道路的基本規則; RHT =靠右行車,LHT =靠左行車。當缺少此屬性時,將假定為RHT。
示例:
以及
<road id="3" name="prototype" length="5" junction="0">2.2.1 link
t_road_link在OpenDRIVE中,道路連接用 <road> 元素里的 <link> 元素來表示。 <predecessor> 以及 <successor> 元素在 <link> 元素中被定義。對于虛擬和常規的交叉口來說, <predecessor> 以及 <successor> 元素必須使用(shall)不同的屬性組。
屬性:
2.2.1.1 Successor
前驅
t_road_link_predecessorSuccessor-
必須(shall)將不同屬性用于虛擬以及常規的交叉口。
-
@contactPoint須(shall)用于常規交叉口;@elementS 和 @elementDir則須(shall)用于虛擬交叉口。
只有在連接(linkage)清晰的情況下,才能(shall)直接連接兩條道路。如果與前驅或后繼的關系模糊,則必須(shall)使用交叉口。
示例:
<link><predecessor elementId="0" elementType="junction"/> </link>以及
<link><predecessor elementId="0" contactPoint="end" elementType="road"/><successor elementId="1" contactPoint="start" elementType="road"/> </link>2.2.1.2 predecessor
后繼
t_road_link_predecessorSuccessor-
必須(shall)將不同屬性用于虛擬以及常規的交叉口。
-
@contactPoint須(shall)用于常規交叉口;@elementS 和 @elementDir則須(shall)用于虛擬交叉口。
2.2.2 planView
<planView> 元素是每個 <road> 元素里必須要用到的元素。
2.2.2.1 planView -> geometry
在OpenDRIVE中,參考線的幾何形狀用<planView>元素里的 <geometry> 元素來表示。
通用屬性(對于不同類型的參考線形式,比如螺旋線、樣條曲線等,可能有新增的附屬屬性,通用屬性寫在<geometry>標簽里,而新增的附屬屬性在<geometry>標簽下再寫一層):
以下規則適用于道路參考線:
分類:
在OpenDRIVE中,直線用<geometry> 元素里的 <line> 元素來表示。
示例:
<planView><geometrys="0.0000000000000000e+00"x="-4"y="7"hdg="6"length="5"><line/></geometry> </planView>t_road_planView_geometry_spiral里描述了層次關系,先是road,然后planView是road的下一層,同理,geometry和spiral。
螺旋線是以起始位置的曲率(@curvStart)和結束位置的曲率(@curvEnd)為特征。沿著螺旋線的弧形長度(見 <geometry> 元素@length),曲率從頭至尾呈線性。
在OpenDRIVE中,螺旋線用<geometry> 元素里的<spiral>元素來表示。
屬性:
示例:
注意:曲率:
正曲率:左曲線(逆時針運動)
負曲率:右曲線(順時針運動)
<geometry s="100.0" x="38.00" y="-1.81" hdg="0.33" length="30.00"><spiral curvStart="0.0" curvEnd="0.013"/> </geometry>3.弧線
弧線描述了有著恒定曲率的道路參考線。
在OpenDRIVE中,弧線用<geometry> 元素里的<arc>元素來表示。
屬性:
示例:
注意:曲率:
正曲率:左曲線(逆時針運動)
負曲率:右曲線(順時針運動)
<planView><geometrys="3"x="-4"y="4"hdg="5"length="9"><arc curvature="-1.2e-01"/></geometry> </planView>通過對OpenDRIVE中所有可用的幾何形狀元素進行組合,便可以創建諸多種類的道路線。
示意圖:
示例:
寫上連接的路的屬性:
這個示例是用圓弧和直線相連,注意后者的起始弧長s處就是前者的起始弧長s加上其長度。
<planView><geometry x="278" y="-828" hdg="0.50" s="0" length="34"><arc curvature="0.06"/></geometry><geometry x="2" y="-51" hdg="2.9" s="39.2" length="4.2"><line/></geometry> </planView>5.三次多項式(棄用)
t_road_planView_geometry_poly3三次多項式可(may)用來生成衍生于測量數據的復雜道路走向。測量對為x/y坐標系中沿參考線的被測量坐標的指定次序定義了線段的多項式極限。
局部三次多項式描述了道路的參考線。通過對線段極限處的連續性條件例如線段連續性、切線和/或曲率連續性等進行詳細說明,可以對多個三次多項式線段進行融合并且為整個道路走向生成一條全局三次樣條線插值曲線。另一個優點則是,沿著多項式的路徑方式比沿回旋曲線更有效。
局部三次多項式表達式:
v(u) = a + b*u + c*u2 + d*u3不能用全局三次多項式,原因:
而全局坐標系和局部坐標系之間的轉換:
在OpenDRIVE中,三次多項式用 <geometry> 元素里的 <poly3> 元素來表示。
屬性:
要求:
<geometry>元素的起始點(@x,@y)定位在局部u/v坐標系的v軸上。
示例:
<geometrys="0.0000000000000000e+00"x="-6.8858131487889267e+01"y="4.1522491349480972e-01"hdg="6.5004409066736524e-01"length="2.5615689718113455e+01"><poly3a="0.0000000000000000e+00"b="0.0000000000000000e+00"c="1.4658732624442020e-02"d="-5.7746497381565959e-04"/> </geometry>6.參數三次曲線
t_road_planView_geometry_paramPoly3只需使用x軸和y軸便可以用參數三次曲線生成道路線。為保持三次多項式的連貫性,可(may)利用u軸和v軸同時將它們計算到三次多項式里。
參數三次曲線表達式:
u(p) = aU + bU*p + cU*p2 + dU*p3 v(p) = aV + bV*p + cV*p2 + dV*p3示意圖:
u(p) = aU + bU*p + cU*p2 + dU*p3:
v(p) = aV + bV*p + cV*p2 + dV*p3:
u(p) = aU + bU*p + cU*p2 + dU*p3` `v(p) = aV + bV*p + cV*p2 + dV*p3在OpenDRIVE中,參數三次曲線用 <geometry> 元素里的 <paramPoly3> 元素來表示。
要求:
-
若@pRange=“arcLength”,那么p可(may)在[0, @length from ]范圍內對其賦值。
-
若@pRange=“normalized”,那么p可(may)在[0, 1]范圍內對其賦值。
屬性:
示例:
2.2.3 elevationProfile
2.2.3.1 elevationProfile -> elevation
t_road_elevationProfile_elevation縱向。
在OpenDRIVE中,高程Road elevation 用 <elevationProfile> 元素中的 <elevation> 元素來表示。
該屬性定義了參考線上給定點處的高程元素。此外,必須(shall)沿參考線按升序對元素進行定義。s的長度不隨高程而改變。
表達式:
elev(ds) = a + b*ds + c*ds2 + d*ds3示例:
<elevationProfile><elevation b="1.2" s="0" c="0.175" d="-0.0175" a="0"/><elevation b="-0.5499999999999989" s="10" c="-0.5800000000000002" d="0.04050000000000001" a="12"/><elevation b="0" s="20" c="0" d="0" a="-11"/> </elevationProfile>2.2.4 lateralProfile
2.2.4.1 lateralProfile -> superelevation
t_road_lateralProfile_superelevation在OpenDRIVE中,超高程用<lateralProfile>元素中的 <superelevation> 元素來表示。
橫向。
超高程從數學角度被定義為圍繞參考線的道路橫截面的傾斜角。這意味著超高程對于向右邊傾斜的道路具有正值,對于向左邊傾斜的道路具有負值。
該屬性被定義為圍繞著s軸的路段傾斜角。必須(must)沿參考線按升序定義元素。元素的參數將持續有效,直到下一個元素開始或道路參考線結束。道路的超高程程默認為零。
給定位置的超高程表達式:
sElev (ds) = a + b*ds + c*ds2 + d*ds3示例:
<lateralProfile><superelevation b="0" s="0" c="0" d="0" a="0"/><crossfall b="0" s="0" side="both" c="0" d="0" a="0"/> </lateralProfile>2.2.4.2 lateralProfile -> shape
t_road_lateralProfile_shape該屬性被定義為相對于參考水平面路段的路面。一個擁有不同t值的s位置上可(may)存在多個形狀,從而對道路的彎曲形狀進行描述。
給定位置參考平面上方的高度表達式:
hShape (ds)= a + b*dt + c*dt2 + d*dt32.2.5 lanes
在OpenDRIVE中,所有道路都包含了車道。每條道路必須(shall)擁有至少一條寬度大于0的車道,并且每條道路的車道數量不受限制。
需要使用中心車道對OpenDRIVE中的車道進行定義和描述。中心車道沒有寬度,并被用作車道編號的參考,自身的車道編號為0。對其他車道的編號以中心車道為出發點:車道編號向右呈降序,也就是朝負t方向;向左呈升序,也就是朝正t方向。
在OpenDRIVE中,車道用 <road> 元素里的 <lanes> 元素來表示。
示例:
<lanes><laneSection s="0.0"><left><lane id="2" type="border" level="false"><link></link><width sOffset="0.0" a="1.0" b="0.0" c="0.0" d="0.0"/></lane><lane id="1" type="driving" level="false"><link></link><width sOffset="0.0" a="4.0" b="0.0" c="0.0" d="0.0"/></lane></left><center><lane id="0" type="none" level="false"><link></link></lane></center><right><lane id="-1" type="driving" level="false"><link></link><width sOffset="0.0" a="4.0" b="0.0" c="0.0" d="0.0"/></lane><lane id="-2" type="border" level="false"><link></link><width sOffset="0.0" a="1.0" b="0.0" c="0.0" d="0.0"/></lane></right></laneSection> </lanes>2.2.5.1 Lanes -> laneSection
t_road_lanes_laneSection在OpenDRIVE中,車道組用 <laneSection> 元素內的 <center> 、 <right> 和 <left> 元素來表示。ID屬性用嵌套在 <center> 、<right> 和 <left> 元素里的 <lane> 元素來定義。
在OpenDRIVE中 ,車道段用 <lanes> 元素里的 <laneSection> 元素來表示。
示例:
<laneSection s="0" singleSide="false"> ... </laneSection>2.2.5.2 Lanes -> laneSection -> center
t_road_lanes_laneSection_center2.2.5.2.1 Lanes -> laneSection -> center -> lane
t_road_lanes_laneSection_center_lane車道元素被包括在左/中/右元素中。車道元素必須(should)使用降序ID從左到右展示車道。
lane屬性:level, type
level: 0 —— 不采用超高程;1 —— 采用超高程。
type: 每條車道都會被定義一個類型。車道類型定義了車道的主要用途及與其相對應的交通規則。
屬性:
包括:
- 路肩shoulder:描述了道路邊緣的軟邊界。
-邊界border:描述了道路邊緣的硬邊界。其與正常可供行駛的車道擁有同樣高度。
-
駕駛driving:描述了一條“正常”可供行駛、不屬于其他類型的道路。
-
停stop:高速公路的硬路肩,用于緊急停車。
-
無none:描述了道路最遠邊緣處的空間,并無實際內容。其唯一用途是在(人類)駕駛員離開道路的情況下,讓應用記錄OpenDRIVE仍在運行。
-
限制restricted:描述了不應有車輛在上面行駛的車道。該車道與行車道擁有相同高度。通常會使用實線以及虛線來隔開這類車道。
-
泊車parking:描述了帶停車位的車道。
-
分隔帶median:描述了位于不同方向車道間的車道。在城市中通常用來分隔大型道路上不同方向的交通。
-
自行車道biking:描述了專為騎自行車者保留的車道。
-
人行道sidewalk:描述了允許行人在上面行走的道路。
-
路緣curb:描述了路緣石。路緣石與相鄰的行車道在高度有所不同。
-
出口exit:描述了用于平行于主路路段的車道。主要用于減速。
-
入口entry:描述了用于平行于主路路段的車道。主要用于加速。
-
加速車道onramp:由鄉村或城市道路引向高速公路的匝道。
-
減速車道offRamp:駛出高速公路,駛向鄉村或城市道路所需的匝道。
-
連接匝道connectingRamp:連接兩條高速公路的匝道。例如高速公路路口。
高速公路的車道類型:
在OpenDRIVE中,車道類型用<lane>元素內屬性@type元素來表示。
示例:
<lane level="0" id="0" type="border">2.2.5.2.2 Lanes -> laneSection -> center -> lane -> link
t_road_lanes_laneSection_lcr_lane_link在OpenDRIVE中,車道連接用<lane>元素里的<link>元素來表示。<predecessor>和<successor>元素在<link>元素內得到定義。
2.2.5.2.2.1 Lanes -> laneSection -> center -> lane -> link -> predecessor
t_road_lanes_laneSection_lcr_lane_link_predecessorSuccessor<predecessor>和<successor>元素在<link>元素內得到定義。
要求:
一條車道可(may)擁有另外一條車道作為其前驅或后繼。
只有當兩條車道的連接明確時,它們才能(shall)被連接。若與前驅或后繼部分的關系比較模糊,則必須(shall)使用交叉口。
若車道結束于一個路口內或沒有任何連接,則必須(shall)刪除 <link> 元素。
示例:
<lane level="0" id="-1" type="driving"><link><predecessor id="-1"/><successor id="-1"/></link>... </lane>2.2.5.2.2.2 Lanes -> laneSection -> center -> lane -> width
t_road_lanes_laneSection_lr_lane_width車道屬性描述了車道的用途以及形狀。每個車道段都定義了一條車道屬性,該屬性也可能(may)在該車道段中有變化。如果沒有特意為車道段定義一條屬性,應用便可(can)采用默認屬性。
車道屬性的示例是車道寬度、車道邊界和限速。
車道的寬度是沿t坐標 (s坐標系下的橫向偏移) 而定義的。車道的寬度有可能(may)在車道段內產生變化。
車道寬度與車道邊界元素在相同的車道組內互相排斥。若寬度以及車道邊界元素在OpenDRIVE文件中同時供車道段使用,那么應用必須(must)使用 <width> 元素提供的信息。
在OpenDRIVE中,車道寬度由 元素中的 <width> 元素來描述。
表達式:
Width (ds) = a + b*ds + c*ds2 + d*ds3示例:
<width b="0" sOffset="0" c="0" d="0" a="3.75"/>2.7.1.1.1.3 Lanes -> laneSection -> center -> lane -> speed
t_road_lanes_laneSection_lr_lane_speed在OpenDRIVE中,車道速度用<lane>元素內的<speed>元素來表示。
該屬性定義了給定車道上允許的最大行駛速度。直到新的元素得到定義,每個元素都在s坐標的增長方向中繼續有效。
屬性:
示例:
<speed max="-1" sOffset="0" unit="m/s"/>以及
<lane id="-1" type="driving" level="false"><link><successor id="-3"/></link><width sOffset="0.0" a="2.0" b="0.0" c="0.0" d="0.0"/><speed sOffset="0.0" max="80.0" unit="km/h"/><height sOffset="0.0" inner="0.12" outer="0.12"/> </lane>2.7.1.1.1.4 Lanes -> laneSection -> center -> lane -> border
車道邊界是用來描述車道寬度的另一種方法,它并不會直接定義寬度,而是在獨立于其內部邊界參數的情況下,對車道的外部界限進行定義。根據上述情況,內車道也被定義為車道,該車道雖然與當前被定義的車道有著相同ID符號,但內車道的ID絕對值要更小。
相比較對寬度進行詳細說明而言,此類定義要更加地便利。尤其是在道路數據是源自于自動測量結果的情況下,該方式可以避免多個車道段被創建。
車道寬度與車道邊界元素在相同的車道組內互相排斥。若寬度以及車道邊界元素在OpenDRIVE文件中同時供車道段使用,那么應用必須(must)使用 <width> 元素提供的信息。
在OpenDRIVE中,車道邊界用 <lane>元素中的 <border> 元素來表示。
表達式:
tborder (ds) = a + b*ds + c*ds2 + d*ds3示例:
<lane level="0" id="0" type="border"><link/><userdata value="0" code="frictionCoeff"/><userdata value="0" code="adhesionCoeff"/><width b="0" sOffset="0" c="0" d="0" a="0"/><border b="0" sOffset="0" c="0" d="0" a="0"/> </lane>2.7.1.1.1.5 Lanes -> laneSection -> center -> lane -> material
t_road_lanes_laneSection_lr_lane_material在OpenDRIVE中,車道材質用<lane>元素內的<material>元素來表示。
屬性:
2.7.1.1.1.6 Lanes -> laneSection -> center -> lane -> access
t_road_lanes_laneSection_lr_lane_access車道可(can)局限于特定的道路使用者,例如卡車或公共汽車。這類限制可(may)在道路標識描述的限制之上另外在OpenDRIVE中得到定義。
OpenDRIVE在 <lane> 元素內提供了 <access> 元素,以便描述車道使用規則。
屬性:
示例:
<lane id="2" type="driving" level="false"><link><successor id="2"/></link><width sOffset="0.0" a="2.0" b="0.0" c="0.0" d="0.0"/><access sOffset="0.0" rule="allow" restriction="bus"/> </lane>2.7.1.1.1.7 Lanes -> laneSection -> center -> lane -> height
t_road_lanes_laneSection_lr_lane_height在OpenDRIVE中,車道高度用<lane>元素內的<height>元素來表示。
屬性:
示例:
<lane id="-2" type="sidewalk" level="false"><link><successor id="-3"/></link><width sOffset="0.0" a="2.0" b="0.0" c="0.0" d="0.0"/><height sOffset="0.0" inner="0.12" outer="0.12"/> </lane>2.7.1.1.1.8 Lanes -> laneSection -> center -> lane -> roadMark
t_road_lanes_laneSection_lcr_lane_roadMark
該屬性定義了車道外邊界線條的樣式。而分隔左右車道的中心線的樣式由專為中心車道而設的路標元素來確定。
道路上的車道可(can)擁有不同的車道標識,比如不同顏色和樣式的線。OpenDRIVE為路標提供了 <roadMark> 元素。路標信息定義了車道外邊界上的線的樣式,在左車道上則為左邊界,在右車道則為右邊界。而作為分隔左右車道的中心線的樣式則由中心車道路標元素來確定。
可(may)為道路橫斷面內的每一條車道定義多個路標元素。也可(may)使用多個屬性(如@type, @weight和 @width)來描述車道標志的屬性。
有兩種規定路標類型的方法:
(1) 通過<roadMark>元素內的@type屬性可以輸入存儲在應用內的關鍵詞。這些關鍵詞被用于描述簡化的路標類型如實線、虛線或草地。
(2) <type>元素包含了更多<line>元素,這些元素將對路標進行更詳細的描述。
在OpenDRIVE中,路標用 <lane> 元素內的 <roadMark> 元素來表示。
屬性:
示例:
<roadMark color="standard" sOffset="0" weight="standard" laneChange="none" width="0.13" material="none" height="0.004999999888241291" type="solid"/>2.7.1.1.1.8.1 Lanes -> laneSection -> center -> lane -> roadMark -> sway
t_road_lanes_laneSection_lcr_lane_roadMark_sway
可(may)使用 <sway> 元素來描述非直線但有側邊曲線的車道標志。 <sway> 元素為以下的(顯性)類型定義轉移了橫向參考位置,從而定義了一個偏移。橫向偏移曲線(sway)偏移將相對于車道標識的名義參考位置,即車道邊界。
橫向曲線的主要應用案例為創建穿過施工現場的道路。行車道在黃線之間,白線被橫向偏移(swayed),并只作為標志存在。
示意圖:
表達式:
tOffset (ds) = a + b*ds + c*ds2 + d*ds32.2.5.3 Lanes -> laneSection -> left
t_road_lanes_laneSection_left為了能夠便利地在OpenDRIVE的道路描述中進行查找,一個車道段內的車道可分為左、中和右車道。每個車道段均必須(shall)包含一個<center>元素和至少一個<right>或<left>元素。
2.2.5.3.1 Lanes -> laneSection -> left -> lane
t_road_lanes_laneSection_left_lane2.2.5.3.2 Lanes -> laneSection -> right
t_road_lanes_laneSection_right2.2.5.3.3 Lanes -> laneSection -> right -> lane
t_road_lanes_laneSection_right_lane2.2.5.4 Lanes -> laneOffset
t_road_lanes_laneOffset在OpenDRIVE中,車道偏移用<lanes>元素內的<laneOffset>元素來表示。
車道偏移可(may)用于將中心車道從道路參考線上位移。
表達式:
offset (ds) = a + b*ds + c*ds2 + d*ds3屬性:
要求:
若邊界定義已存在,則不允許(shall)出現偏移。
示例:
<lanes><laneOffset s="25.0" a="0.0" b="0.0" c="3.9e-03" d="-5.2e-05"/><laneOffset s="75.0" a="3.25" b="0.0" c="0.0" d="0.0"/>…<\lanes>2.2.6 type
t_road_typeRoad type 道路類型
示例:
<type s="0" type="motorway"/>2.2.6.1 type -> speed
t_road_type_speed在OpenDRIVE中,速度限制用 <type> 元素里的 <speed> 元素來表示。
示例:
<speed max="-1" sOffset="0" unit="m/s"/>2.2.7 surface
t_road_surface_CRG2.3 junction 描述交叉路口屬性 (可多個)
t_junction交叉口指的是三條或更多道路相聚的地方,與其相關的道路被分為兩種類型:含有駛向交叉口車道的道路稱為來路Incoming roads。
特點:
與道路不同,交叉口并不具備任何前驅或后繼交叉口。
2.3.1 connection
在OpenDRIVE中,交叉口用 <junction> 元素來表示。聯接道路則用 <junction> 元素中的 <connection> 元素來表示。OpenDRIVE并未特意將去路定義為元素或屬性,來路也可被視作為去路,因此二者在此處可被相提并論。通往該道路的聯接道路將此類道路隱性地定義為去路。
為能詳細說明一條作為來路的道路,將通過在 <connection> 元素中使用@incomingRoad屬性來引用該道路的ID。
示意圖:
解釋:
incomingRoad 表示連接的兩條車道的進入交叉路口的車道(Incoming roads)的id
connectingRoad 表示交叉路口中間新增的車道(Connecting roads)(會同時在road里也更新一條路來,該路的junction屬性不為-1)的id
示例:
contactPoint 表示聯接道路的方向:
"start"值必須(shall)用于標明聯接道路正在沿<laneLink>元素中的連接延伸。
"end"值必須(shall)用于標明聯接道路正在沿<laneLink>元素中的連接的反方向延伸。
2.3.1.1 connection -> laneLink
t_junction_connection_laneLink
該屬性提供了關于在一條來路和一條聯接道路之間被連接的車道信息。強烈建議使用該元素。忽略<laneLink>元素的做法已經不符合時宜。
聯接道路將基于其車道對路線進行描述。聯接道路詳細說明了相同交叉口的來路和去路的車道之間的連接。如果該車道并沒有被連接,就意味著這些車道之間的路線不通。
示例:
<junction name="myJunction" id="555" ><connection id="0"incomingRoad="1"connectingRoad="2"contactPoint="start"><laneLink from="-2" to="-1"/></connection> </junction>3 OpenDRIVE中的坐標系
OpenDRIVE使用三種類型的坐標系,如下圖所示:
- 慣性x/y/z坐標系
- 參考線s/t/h坐標系
- 局部u/v/z軸坐標系
若無另外說明,對局部坐標系的查找與定位將相對于參考線坐標系來進行。對參考線坐標系位置與方向的設定則相對于慣性坐標系來開展,具體方法為對原點、原點的航向角/偏航角、橫擺角/翻滾角和俯仰角的旋轉角度及它們之間的關系進行詳細說明。
3.1 慣性x/y/z坐標系
慣性坐標系描述的是地圖中具體某個點在當前參考坐標系下的位置。其中x y z坐標可以具體表示某一個點所在的位置。如在描述某一段道路時,道路起始點的位置就是由x y z坐標定義。道路就是在這個點開始,按一定方向和一定長度延伸。
<geometry s="4.9957524872074799e+02" x="4.9469346060416666e+02" y="5.3447643627860181e+01" hdg="5.8804473418180125e-02" length="6.2079164697363019e+01"> <line/> </geometry>在上述例子中,x=“4.9469346060416666e+02” 和y="5.3447643627860181e+01"描述的是此段道路的起始點在慣性坐標系中的位置。
根據ISO 8855慣性坐標系是右手坐標系,其軸的指向方向如下(見圖7):
- x軸 ? 右方
- y軸 ? 上方
- z軸 ? 指向繪圖平面外
以下慣例適用于地理參考:
- x軸 ? 東邊
- y軸 ? 北邊
- z軸 ? 上方
通過依次設置航向角/偏航角(heading)、俯仰角(pitch)和橫擺角/翻滾角(roll),元素(如物體、標志等)可被置于慣性坐標系中:
圖7展示了對應角的正軸與正方向。
x’/y’/(z’=z) 指的是以航向角/偏航角圍繞z軸旋轉x/y/z軸之后的坐標系。坐標系x’’/(y’’=y’)/z’’指的是以俯仰角圍繞y’軸旋轉x’/y’/z’軸之后的坐標系。最后,坐標系(x’’’=x’’)/y’’’/z’’’在用橫擺角/翻滾角旋轉x’’/y’’/z’’后獲得。
3.2 參考線s/t/h坐標系
參考線坐標系適用于沿道路的參考線。它是一個右旋坐標系。s方向沿參考線的切線。需要注意的是,參考線總是位于慣性坐標系定義的x/y平面內。t方向與s方向正交。右手系統通過定義與x軸和y軸正交的上方向h來完成。
如下為參考線坐標系的三個方向描述:
- s方向:沿參考線的坐標,從道路起點開始測量,單位為[m]。參考線,在 xy 平面上計算(即,不考慮道路高程剖面圖)
- t方向:橫向位置,從參考線出發,延與s方向正交的方向,指向s方向左側。
- h方向:在右手坐標系中與st平面正交
在上述例子中,s="4.9957524872074799e+02"描述的是此段道路的起始點在參考線坐標系中的位置。
3.3 三種坐標系的關系
三種坐標系的關系可通過下圖清晰展示,慣性坐標系、參考線坐標系和局部坐標系將在OpenDRIVE中同時被使用。圖中的示例描述了三個坐標系相對于彼此的位置與方向設定。
3.4 OpenDRIVE中的地理坐標參考
空間參考系的標準化由歐洲石油調查組織(EPSG)執行,該參考系由用于描述大地基準的參數來定義。大地基準是相對于地球的橢圓模型的位置合集所作的坐標參考系。
通過使用基于PROJ(一種用于兩個坐標系之間數據交換的格式)的投影字符串來完成對大地基準的描述。該數據應標為CDATA,因為其可能包含會干預元素屬性XML語義的字符。
在OpenDRIVE中,關于數據集的地理參考信息在<header>元素的<geoReference>元素中得以呈現。Proj字符串(如以下XML示例中所示)包含了所有定義已使用的空間參考系的參數:
關于proj字符串的細節信息,參見 https://proj.org/usage/projections.html
投影的定義不能(shall)多于一個。若定義缺失,那么則假定為局部笛卡爾坐標系。
這里強烈建議使用proj字符串的官方參數組(使用該鏈接查詢字符串: https://epsg.io/ )。參數不應(should)被改變。一些空間參考系如UTM具有隱東及北偽偏移,這里使用+x_0與+y_0參數對它們進行定義。
若想應用偏移,請使用<offset>元素,而不是改變所有參數值。
XML示例:
<geoReference><![CDATA[+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs]]> </geoReference>規則:
- <offset> 應使OpenDRIVE 的x和y坐標大致集中在(0;0)周圍。在x和y坐標過大的情況下,由于IEEE 754雙精度浮點數的精確度有限,在內部使用浮點坐標的應用可能無法對它們進行精確處理。
4 OpenDrive格式地圖數據解析
OpenDrive格式地圖數據解析_lyf’s blog-CSDN博客_opendrive
OpenDrive地圖解析代碼可以參考,https://github.com/liuyf5231/opendriveparser
該xml文件中中包含了很多地圖信息,例如Road、Junction等,下圖是xml文件的主要結構,
下圖為繪制地圖的一個簡單思路,讀取OpenDRIVE文件,即地圖數據,構造路網,通過渲染展示給用戶。
下面結合OpenDRIVE文件中的數據,介紹如何構造路網。
5 與其他標準的關聯
5.1 ASAM OpenDRIVE在ASAM標準系列中的角色
ASAM OpenDRIVE是ASAM仿真標準的一部分,該標準專注于車輛環境的仿真數據。除了ASAM OpenDRIVE,ASAM還提供其他仿真領域的標準,例如ASAM OpenSCENARIO和ASAM OpenCRG。
5.2 OpenDRIVE與OpenCRG以及OpenSCENARIO之間的關聯
ASAM OpenDRIVE為路網的靜態描述定義了一種存儲格式。通過與ASAM OpenCRG結合使用,可以將非常詳細的路面描述添加至路網當中。OpenDRIVE和ASAM OpenCRG僅包含靜態內容,若要添加動態內容,則需要使用ASAM OpenSCENARIO。三個標準的結合則提供包含靜態和動態內容、由場景驅動的對交通模擬的描述。
圖 OpenDRIVE, OpenCRG 以及 OpenSCENARIO之間的關聯
5.3 向后兼容早期版本
OpenDRIVE 1.6版包含了在1.5版中出現過的元素,但這些元素與1.4版不兼容。為了確保能與1.4版和1.5版兼容,這些元素在1.6版的XML模式中從技術上被定義為可選。在UML模型的注釋中,它們被標記為“向后兼容的可選”。
6 OpenDRIVE高精地圖查看器
OpenDRIVE地圖在線查看 - BimAnt是一個免費的OpenDRIVE高精地圖在線查看工具,可以直接在瀏覽器網頁內打開.xodr格式的高精地圖并自動創建并顯示相應的道路三維模型。
地址:http://opendrive.bimant.com/
總結
以上是生活随笔為你收集整理的万字详解OpenDRIVE文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米上市之后的危与机
- 下一篇: eclipse中文语言包在线安装方法