万字详解OpenDRIVE文件
Posted 爱是与世界平行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万字详解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 s="4.9957524872074799e+02" x="4.9469346060416666e+02" y="5.3447643627860181e+01" hdg="5.8804473418180125e-02" length="6.2079164697363019e+01"> <line/> </geometry>
其中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 length="53" id="0" name="XXX名称" junction="-1">
以及
<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>
标签下再写一层):
以下规则适用于道路参考线:
- 每条道路必须(shall)有一条参考线。
- 每条道路只能(shall)有一条参考线。
- 参考线通常在道路中心,但也可能(may)有侧向偏移。
- 几何元素应(shall)沿参考线以升序(即递增的s位置)排列。
- 一个 元素应(shall)只包含一个另外说明道路几何形状的元素。
- 若两条道路不使用交叉口来连接,那么新的道路的参考线应(shall)总是起始于其前驱或后继道路的 。参考线有可能(may)被指向相反方向。
- 参考线不能(shall)有断口(leaps)。
- 参考线不应(should)有扭结(kinks)。
分类:
- 直线
- 螺旋线
- 线
- 直线
- 螺旋线或回旋曲线(曲率以线性方式改变)
- 有恒定曲率的弧线
- 三次多项式曲线
- 参数三次多项式曲线
- 直线
在OpenDRIVE中,直线用<geometry>
元素里的 <line>
元素来表示。
示例:
<planView>
<geometry
s="0.0000000000000000e+00"
x="-4"
y="7"
hdg="6"
length="5">
<line/>
</geometry>
</planView>
- 螺旋线Spiral
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>
<geometry
s="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*u³
不能用全局三次多项式,原因:
而全局坐标系和局部坐标系之间的转换:
在OpenDRIVE中,三次多项式用 <geometry>
元素里的 <poly3>
元素来表示。
属性:
要求:
<geometry>
元素的起始点(@x,@y)定位在局部u/v坐标系的v轴上。
示例:
<geometry
s="0.0000000000000000e+00"
x="-6.8858131487889267e+01"
y="4.1522491349480972e-01"
hdg="6.5004409066736524e-01"
length="2.5615689718113455e+01">
<poly3
a="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*p³
v(p) = aV + bV*p + cV*p2 + dV*p³
示意图:
u(p) = aU + bU*p + cU*p2 + dU*p³
:
v(p) = aV + bV*p + cV*p2 + dV*p³
:
u(p) = aU + bU*p + cU*p2 + dU*p³`
`v(p) = aV + bV*p + cV*p2 + dV*p³
在OpenDRIVE中,参数三次曲线用 <geometry>
元素里的 <paramPoly3>
元素来表示。
要求:
-
若@pRange=“arcLength”,那么p可(may)在[0, @length from ]范围内对其赋值。
-
若@pRange=“normalized”,那么p可(may)在[0, 1]范围内对其赋值。
属性:
示例:
<planView>
<geometry
s="0"
x="6.8"
y="5.4"
hdg="5.2"
length="6.56">
<paramPoly3
aU="0"
bU="1.0"
cU="-4.66e-09"
dU="-2.62e-08"
aV="0.00e+00"
bV="1.66e-16"
cV="-1.98e-04"
dV="-1.31e-09"
pRange="arcLength">
</paramPoly3>
</geometry>
</planView>
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*ds² + d*ds³
示例:
<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*dt3
2.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"OpenDrive格式的高精度地图