opendrive 1.7格式文档:
OpenDRIVE数据存储于XML文件中,文件拓展名为.xodr。OpenDRIVE压缩文件的拓展名为".xodrz"(压缩格式gzip)。
浮点数为 IEEE754双精度浮点数,在xml中使用保留17位有效数字
xodr阅读器:Online OpenDRIVE Viewer
1. 三种类型坐标系:
1.1 惯性x/y/z轴坐标系
根据ISO 8855惯性坐标系是右手坐标系
-
x轴 ⇒ 东
-
y轴 ⇒ 北
-
z轴 ⇒ 上方
1.2 参考线s/t/h轴坐标系
右手坐标系,应用于道路参考线
s方向跟随着参考线的切线方向
s:坐标沿参考线,以[m]为单位,由道路参考线的起点开始测量,在xy平面中计算(这里不考虑道路的高程剖面)
t:侧面,在惯性x/y平面里正向向左,垂直于s
h:在右手坐标系中垂直于st平面
1.3 局部u/v/z轴坐标系
参考线总是被放置在由惯性坐标系定义的x/y平面里。t方向与s方向成正交
u:向前匹配s(与x方向一致)
v:向左匹配t(与y方向一致)
z:向上匹配h
1.4 三个坐标系相对于彼此的位置与方向设定
2.几何表达
2.1道路参考线
在OpenDRIVE中,参考线的几何形状用<planView>元素里的 <geometry>
元素来表示,<planView>
元素是每个 <road>
元素里必须要用到的元素。 每条道路必须有一条(且只有一条)参考线
geometry元素属性有:
name | type | unit | value | Description |
| t_grEqZero | m | [0;∞[ | s-coordinate of start position 起始位置的s坐标 |
| double | m | ]-∞;∞[ | Start position (x inertial) 起始位置(x 惯性) |
| double | m | ]-∞;∞[ | Start position (y inertial) 起始位置(y 惯性) |
| double | rad | ]-∞;∞[ | Start orientation (inertial heading) 起始方向 (惯性航向角/偏航角) |
| t_grZero | m | [0;∞[ | Length of the element’s reference line 元素的参考线长度 |
2.2直线表达
直线用<geometry> 元素里的 <line>
元素来表示:
<geometry
s="0.0000000000000000e+0"
x="-1.3184461297625262e+3"
y="-3.2566663458810303e+3"
hdg="-4.0809199493558879e-3"
length="1.6841933359905383e+1">
<line/>
</geometry>
2.3弧线表达
弧线为曲率恒定的道路参考线,用<geometry> 元素里的<arc>元素来表示(曲率不能为0):
<geometry
s="1.6841933359905397e+1"
x="-1.3016043366444273e+3"
y="-3.2567350762720926e+3"
hdg="-4.0809199493549997e-3"
length="1.1974898633573525e+2">
<arc curvature="-1.4043041269313957e-2"/>
</geometry>
弧线元素属性:
名称 | 类型 | 单位 | 值 | 描述 |
curvature | double | 1/m | (-∞,0)U(0;∞) | 恒定曲率贯穿元素 |
2.4 螺旋线
描述参考线变化曲率的回旋曲线,用来描述曲率在<line>到<arc>连贯的转换,曲率从头至尾呈线性,曲率为正为向下弯曲,曲率为负向下弯曲。用<geometry> 元素里的<spiral>元素来表示。
名称 | 类型 | 单位 | 值 | 描述 |
| double | 1/m | ]-∞;∞[ | 元素开始时的曲率 |
| double | 1/m | ]-∞;∞[ | 元素结束时的曲率 |
<geometry
s="1.6841933359905397e+1"
x="-1.3016043366444273e+3"
y="-3.2567350762720926e+3"
hdg="5.0809199493549997e-3"
length="1.1974898633573525e+2">
<spiral curvStart="0.0" curvEnd="0.013"/>
</geometry>
2.5 从几何形状元素中生成任意车道线
为避免曲率中出现断口,建议使用螺旋线将直线与弧线以及其他有不同曲率的元素进行结合。
s = 前一条线s + 前一条线length (道路首条线s=0)
(1.0397223962398842e+1) = (2.1754837850168779e-1) + (1.0179675583897154e+1)
<planView>
<geometry s="0.0000000000000000e+0" x="-1.2623439799404255e+2" y="1.0244946534960997e+2" hdg="-1.5776650136941166e+0" length="2.1754837850168779e-1">
<line/>
</geometry>
<geometry s="2.1754837850168779e-1" x="-1.2623589225399026e+2" y="1.0223192210293031e+2" hdg="-1.5776650136941175e+0" length="1.0179675583897154e+1">
<arc curvature="8.6947876688903566e-2"/>
</geometry>
<geometry s="1.0397223962398842e+1" x="-1.2207864324563513e+2" y="9.3301512674689690e+1" hdg="-6.9256383629238449e-1" length="1.0463479449748982e+1">
<arc curvature="6.6044718027037028e-2"/>
</geometry>
2.6 三次多项式(1.6版本后已弃用)
y(x) = a + b*x + c*x2 + d*x³ -------该方程描述了x/y坐标系里三次多项式的插值
参数a、b、c、d用于定义道路的走向
2.7参数三次曲线
参数三次曲线相较于三次多项式更为灵活,它能描述更多种类的道路线。
- 使用参数三次曲线生成道路:
<planView>
<geometry
s="0.000000000000e+00"
x="2.8320040338131969e+2"
y="3.0889004858859460e+2"
hdg="-1.0293673214773813e-2"
length="2.8146476527684044e+1">
<paramPoly3
aU="0.000000000000e+00"
bU="1.000000000000e+00"
cU="-39957489954739e-09"
dU="-2.629787927644e-08"
aV="0.000000000000e+00"
bV="1.5629485737237e-16"
cV="-2.011633536378e-04"
dV="-1.220532535118e-09"
pRange="arcLength">
</paramPoly3>
</geometry>
</planView>
名称 | 类型 | 单位 | 值 | 描述 |
| double | m | ]-∞;∞[ | 多项式参数a |
| double | 1/m | ]-∞;∞[ | 多项式参数d |
| double | 1/m² | ]-∞;∞[ | 多项式参数c |
| double | 1/m³ | ]-∞;∞[ | 多项式参数d |
| double | m | ]-∞;∞[ | 多项式参数a |
| double | 1/m | ]-∞;∞[ | 多项式参数d |
| double | 1/m² | ]-∞;∞[ | 多项式参数c |
| double | 1/m³ | ]-∞;∞[ | 多项式参数d |
| e_paramPoly3_pRange | 1/m³ | arcLength ; normalized | 参数p的范围 - arcLength: p in [0, @length of |
3.道路(Road)
每条道路都沿一条道路参考线延伸。一条道路必须拥有至少一条宽度大于0的车道。只有在道路的属性不能在先前 <road>
元素中得到描述或需要一个交叉口的情况下,才应开始一个新的 <road>
元素。
名称 | 类型 | 单位 | 值 | 描述 |
| string | 道路的名称;可以(may)随意选择 | ||
| t_grZero | xy平面中参考线的总长度;无需考虑被高程影响的长度变化。 | ||
| string | -;[0;∞[ | ID在数据库中是唯一的。若其形式是一个整数,它则应符合uint32_t且不超出给定范围。 | |
| string | -;-1 | 交叉口的ID,道路作为联接道路属于该交叉口(无(none)使用= -1) | |
| e_trafficRule | ]-∞;∞[ | 使用道路的基本规则; RHT =靠右行车,LHT =靠左行车。当缺少此属性时,将假定为RHT。 |
<road id="1" junction="-1" length="8.4020000000000010e+1" name="Road 1">
<road id="1" junction="-1" length="8.4020000000000010e+1" name="Road 1">
3.1 道路连接
为了能够在路网中行进,道路必须相互连接。道路可以连接到其他道路或交叉口上(孤立的道路除外)。
相互连接的道路的车道及其参考线需与其前驱以及后继道路的车道及其参考线直接连接 。
道路连接用 <road>
元素里的 <link>
元素来表示。 <predecessor>
以及 <successor>
元素在 <link>
元素中被定义。对于虚拟和常规的交叉口来说, <predecessor>
以及 <successor>
元素必须使用不同的属性组。
道路连接前驱以及后继元素的属性:
名称 | 类型 | 单位 | 值 | 描述 |
| string | 被连接的元素ID | ||
| e_road_link_elementType | road ; junction | 被连接的元素类型 | |
| e_contactPoint | start ; end | 被连接元素中的链接接触点 | |
| t_grEqZero | m | 用于虚拟交叉口的接触点contactPoint的备选;标明了前驱中的联接,意为不在前驱的起点或终点。只能(shall)用于"road"元素类型 | |
| e_elementDir | +;- | 该属性将在用elementS定义联接时提供,它标明了道路进入的前面的道路的方向。 |
<link>
<predecessor elementType="junction" elementId="4310"/>
<successor elementType="junction" elementId="4323"/>
</link>
3.2 道路类型
定义了道路的主要用途以及相关的交通规则。用<road>
元素中的 <type>
元素来表示,道路类型将持续有效,直到另一个道路类型被定义。
道路类型元素的属性:
名称 | 类型 | 单位 | 值 | 描述 |
| t_grEqZero | m | [0;∞[ | 起始位置的s坐标 |
| e_roadType | 道路的国家/地区代号,参见ISO 3166-1,alpha-2代号。 | ||
| e_countryCode | 道路的国家/地区代号,参见ISO 3166-1,alpha-2代号。 |
可在<speed>中使用max为道路类型设置速度限制(限速),unit设置速度单位。
<type s="0.0000000000000000e+0" type="town">
<speed max="30" unit="km/h"/>
</type>
注:单独车道可以有不同于其所属道路的速度限制,其将被定义为<laneSpeed>
3.3 道路高程
介绍一下沿道路参考线(s方向)的高程,以起始参考线为基准的道路横截面高度(单位为米),高程用 <elevationProfile>
元素中的 <elevation>
元素来表示。
s长度不随着高程变化,此处的s可以通过道路参考线计算的来。
elev(ds) = a + b*ds + c*ds² + d*ds³
elev:是给定位置上的高程(惯性 z)
ds:是沿着参考线上新高程元素的起点与给定位置之间的距离
a,b,c,d:参数
每当新的元素出现,`ds`则清零
<elevationProfile>
<elevation s="0.0000000000000000e+0" a="2.6763916015625000e-2" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="6.2729507433974163e-1" a="2.6763916015625000e-2" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="1.6672950743397337e+0" a="2.6763916015625000e-2" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="1.7472950743397462e+0" a="2.6763916015625000e-2" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="6.1311092061320434e+0" a="2.6763916015624997e-2" b="-1.7347234759768071e-18" c="-2.6043755166215718e-3" d="0.0000000000000000e+0"/>
<elevation s="7.8048094650488649e+0" a="1.9468350353576188e-2" b="-8.7178879529723127e-3" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="9.2011092061320419e+0" a="7.2955656620488068e-3" b="-8.7178879529723162e-3" c="2.6043755166215718e-3" d="0.0000000000000000e+0"/>
<elevation s="1.0874809465048864e+1" a="0.0000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="1.3047959335590454e+1" a="0.0000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="1.3127597905470102e+1" a="0.0000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<elevation s="1.5208390409400968e+1" a="0.0000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
</elevationProfile>
3.4道路表面
待续。。。
4.车道(Lanes)
所有道路都包含了车道。使用中心车道对OpenDRIVE中的车道进行定义和描述。中心车道没有宽度,并被用作车道编号的参考,其编号为0。对其他车道的编号以中心车道为出发点:车道编号连续无间断,向右呈降序,也就是朝负t方向;向左呈升序,也就是朝正t方向。
<lanes>
<laneOffset s="0.0000000000000000e+0" a="0.0000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<laneSection s="0.0000000000000000e+0">
<left>
<lane id="2" type="driving" level="false">
<link>
<successor id="2"/>
</link>
<width sOffset="0.0000000000000000e+0" a="3.5000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<roadMark sOffset="0.0000000000000000e+0" type="none" material="standard" color="white" laneChange="none"/>
<roadMark sOffset="2.1903324430638804e-4" type="solid" material="standard" color="white" width="1.2500000000000000e-1" laneChange="none"/>
<userData>
<vectorLane sOffset="0.0000000000000000e+0" laneId="{09da117d-7f84-4114-8432-5c0f37a5d709}" travelDir="backward"/>
</userData>
</lane>
<lane id="1" type="driving" level="false">
<link>
<successor id="1"/>
</link>
<width sOffset="0.0000000000000000e+0" a="3.5000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<roadMark sOffset="0.0000000000000000e+0" type="broken" material="standard" color="white" width="1.2500000000000000e-1" laneChange="both"/>
<userData>
<vectorLane sOffset="0.0000000000000000e+0" laneId="{d00da887-b500-43dc-a529-73b68b04c248}" travelDir="backward"/>
</userData>
</lane>
</left>
<center>
<lane id="0" type="none" level="false">
<roadMark sOffset="0.0000000000000000e+0" type="broken" material="standard" color="yellow" width="1.2500000000000000e-1" laneChange="none"/>
<userData/>
</lane>
</center>
<right>
<lane id="-1" type="driving" level="false">
<link>
<successor id="-1"/>
</link>
<width sOffset="0.0000000000000000e+0" a="3.5000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<roadMark sOffset="0.0000000000000000e+0" type="broken" material="standard" color="white" width="1.2500000000000000e-1" laneChange="both"/>
<userData>
<vectorLane sOffset="0.0000000000000000e+0" laneId="{20cb3408-2b73-43f5-8ad5-bfccca789f30}" travelDir="forward"/>
</userData>
</lane>
<lane id="-2" type="driving" level="false">
<link>
<successor id="-2"/>
</link>
<width sOffset="0.0000000000000000e+0" a="3.5000000000000000e+0" b="0.0000000000000000e+0" c="0.0000000000000000e+0" d="0.0000000000000000e+0"/>
<roadMark sOffset="0.0000000000000000e+0" type="solid" material="standard" color="white" width="1.2500000000000000e-1" laneChange="none"/>
<userData>
<vectorLane sOffset="0.0000000000000000e+0" laneId="{c68f3587-dce1-4c32-b196-247794015a36}" travelDir="forward"/>
</userData>
</lane>
</right>
</laneSection>
</lanes>
4.1 车道分组
车道组用 <laneSection>
元素内的 <center>
、 <right>
和 <left>
元素来表示。
4.2 车道段
路段被分割成不同的车道段。每一条道路都会被分为多段车道段,每一段车道段可以有不同的车道线数量和车道线宽度。若车道编号改变,则需要定义一个新的车道段:
- 每条道路都必须拥有至少一个车道段
- 车道段必须按升序来定义
4.3 车道偏移
车道偏移用<lanes>元素内的<laneOffset>元素来表示。
元素属性:
名称 | 类型 | 单位 | 值 | 描述 |
| t_grEqZero | m | [0;∞[ | s坐标的起始位置 |
| double | m | ]-∞;∞[ | 多项式参数a, 在@s (ds=0)处偏移 |
| double | 1 | ]-∞;∞[ | 多项式参数 d |
| double | 1/m | ]-∞;∞[ | 多项式参数 c |
| double | 1/m² | ]-∞;∞[ | 多项式参数 d |
计算给定点的偏移(横向偏移):
offset (ds) = a + b*ds + c*ds² + d*ds³
偏移值的绝对位置计算方式:
s = Sstart + ds
4.4 车道连接
车道连接用<lane>元素里的<link>元素来表示。<predecessor>和<successor>元素在<link>元素内得到定义。
前驱与后继元素的属性:
名称 | 类型 | 单位 | 值 | 描述 |
| integer | [-∞;∞[ | 前驱/后继连接的车道ID |
<lane id="3" type="parking" level="false">
<link>
<predecessor id="3"/>
<successor id="3"/>
</link>
4.5 车道属性
包括宽度、边界、类型、材质、限速、使用规则、高度等。
5. 交叉口(Junctions)
交叉口指三条或更多道路交汇的地方,用 <junction>
元素来表示,联接道路(红色部分)则用 <junction>
元素中的 <connection>
元素来表示。
交叉口连接元素的属性:
名称 | 类型 | 单位 | 值 | 描述 |
| tstring | 数据库中databaseUnique ID中的唯一性ID | ||
| e_junction_type | default; virtual | 交叉口的类型;常规交叉口的类型为"默认"。属性对虚拟交叉口来说是必要的。 | |
| string | 来路的ID(也可以是去路的ID) | ||
| string | 联接道路的ID | ||
| e_contactPoint | start; end | 联接道路的接触点;值参见UML模式 |
联接元素的车道连接属性:
名称 | 类型 | 单位 | 值 | 描述 |
| integer | 来路车道的ID | ||
| integer | 联接车道的ID |
<junction id="2328" name="junction2328">
<connection id="0" incomingRoad="38" connectingRoad="2343" contactPoint="end">
<laneLink from="5" to="5"/>
<laneLink from="4" to="4"/>
<laneLink from="3" to="3"/>
<laneLink from="2" to="2"/>
<laneLink from="1" to="1"/>
</connection>
6. 物体(Objects)
物体指通过拓展、定界以及补充道路走向从而对道路产生影响的项。常见的有停车位(parkingSpace)、人行横道(crosswalk)以及交通护栏(railing)(还有隧道、桥梁等),还可以表达障碍物(barrier,obstacle),1.7版本还有车辆、行人。物体用 <object>
元素中的 <objects>
元素来表示。
两种用于描述物体的边界框的方式:
-
四边形物体:定义宽度、长度以及高度
-
圆形物体: 定义半径以及高度
使用 <outline>
元素对复杂的物体进行进一步的描述。
<objects>
<object id="2822" name="SimpleCrosswalk" s="1.2796405247664078e+0" t="4.6337135660934337e-2" zOffset="0.0000000000000000e+0" hdg="-1.6865161657333374e+0" roll="0.0000000000000000e+0" pitch="0.0000000000000000e+0" orientation="+" type="crosswalk" width="2.9197787986978492e+0" length="2.1306047136885997e+1">
<outline>
<cornerLocal u="-9.8736651713683159e+0" v="-1.4600080900433170e+0" z="0.0000000000000000e+0"/>
<cornerLocal u="-1.0653008444957308e+1" v="1.0245952406277610e+0" z="0.0000000000000000e+0"/>
<cornerLocal u="1.0653038505159884e+1" v="1.4597707403646183e+0" z="0.0000000000000000e+0"/>
<cornerLocal u="1.0122487920527561e+1" v="-1.0515871410538580e+0" z="0.0000000000000000e+0"/>
<cornerLocal u="-9.8736651713683159e+0" v="-1.4600080900433170e+0" z="0.0000000000000000e+0"/>
</outline>
</object>
##计算u,v对应的坐标值
def covt_uv(self, point, u, v, hdg):
x0 = point[0]
y0 = point[1]
hdg_sin = math.sin(hdg)
hdg_cos = math.cos(hdg)
y = y0+v*hdg_cos+u*hdg_sin
x = x0+u*hdg_cos-v*hdg_sin
return x, y
7. 标志(Signals)
标志是指交通标志、交通灯以及为控制和规范道路交通所设的路标。
(1)signal元素定义的基本都是信号灯的实际物理位置,fromlane和tolane都为0;
该信号灯id=365为当前road下st坐标系下位置上的信号灯,但是逻辑关联的信号灯为id=364的信号灯。
(2)signalReference元素定义信号灯的逻辑关联位置(与控制道路关联),fromlane和tolane为对应车道最小值和最大值,其中在1.6版本为惯性坐标系表达(x,y),1.4版本为st坐标系,1.7版本又回归st坐标系;


1.7版本定义