本文介绍自动驾驶技术的标准之一《ASAM OpenDRIVE》1.8.0 版本的规范摘要,及北京联高软件开发有限公司实现的 C# 版本 xodr 文件(XML) Parser 源代码。
本文档是 ASAM e.V. 的版权财产。 在更改常规许可条款时,ASAM 允许不受限制地分发此标准。因此,ASAM 常规许可条款的 §2 (1) 替换为以下条款:"许可方授予每个人使用标准 ASAM OpenDRIVE 的基本、非排他性和无限制的许可"。
1 术语和定义
桥
桥梁在 ASAM OpenDRIVE 中建模为对象。 带有 bridge 对象的道路通向一座桥。 桥梁对道路的整个横截面有效,除非提供具有进一步限制的车道有效性记录作为子元素。
公共连接
公共路口是 ASAM OpenDRIVE 中的默认路口类型,用于指定可行驶车道可能重叠且车辆可能交叉的区域。
连接道路
连接道路是交叉路口的一部分,连接进出的道路。
路口
十字路口是没有连接道路的路口。 它们定义了可以显示交叉流量的部分。 交通不会在道口改变道路,例如在铁路道口。
直接结
直接交叉路口旨在对可行驶车道可能重叠以进行分叉或合并,但交通不会交叉的入口和出口进行建模。
进入
条目是道路合并到另一条道路的位置。 条目与用于加速车道的元素的 @type 属性的值不同。entry``<lane>
退出
出口是道路分叉成其他道路的位置。 出口与用于减速车道的元素的 @type 属性的值不同。exit``<lane>
进场道路
传入道路包含通向交叉路口的车道。
惯性坐标系
惯性坐标系是符合 ISO 8855 的右手坐标系。
结
交汇点对道路之间的交叉点进行建模。
"交汇点"组
交汇点组指示路径分配的交汇点属于同一节点,并且通常被视为一个大交汇点,例如环形交叉路口或高速公路交汇处。
车道
车道是所有道路的重要组成部分。 车道附着到道路参考线,并从内到外定义。
车道偏移
车道偏移使中心车道远离道路参考线。
车道部分
每当车道数量或其功能发生变化时,车道段就会将道路分成多个部分。
车道类型
车道具有一种定义其功能的车道类型,例如,驾驶、骑自行车或出口。
车道有效性
通道有效性将信号和对象限制为特定通道。
车道宽度
车道宽度可沿车道段内的 t 坐标加宽或变窄车道。
局部坐标系
局部坐标系是符合 ISO 8855 的右手坐标系。
对象
对象通过扩展、界定或补充道路的路线来影响道路。 对象是构成环境的元素,例如建筑物、护栏、电线杆和树木。 与信号不同,对象不会直接影响流量的行为。
出境道路
在 ASAM OpenDRIVE 中,传出道路未明确定义为元素或属性。 传入道路用作传出道路。 这些道路被隐式定义为由通向它们的连接道路传出。
路
道路是 ASAM OpenDRIVE 中任何道路网络的核心元素。 每条道路沿一条道路参考线延伸。
道路高程
道路高程指定沿道路参考线(即 s 方向)的高程。
道路标记
ASAM OpenDRIVE 中的道路标记被定义为车道标记、对象标记(例如停车位)或信号(例如停车线)。
道路参考线
道路参考线定义道路的水平路线,由一个或多个几何图形元素组成。 每条道路都有一条道路参考线。 道路的其他属性 (例如,车道、信号和对象) 是相对于道路参考线定义的。
道路参考线坐标系
道路参考线始终位于惯性坐标系定义的 x/y 平面内。 道路参考线坐标系沿道路参考线运行。 它是一个右手坐标系。 S 轴沿道路参考线的切线。 t 轴与 s 轴正交。 右手坐标系是通过定义与 x 轴和 y 轴正交的向上方向来完成的。h
S 坐标
S 坐标沿道路参考线定义,以米为单位从道路参考线起点开始测量。
信号
信号是交通标志、交通信号灯和用于控制和调节道路交通的特定道路标记。
信号控制器
信号控制器将信号周期(请参阅信号周期)应用于信号或信号组(请参阅信号组)。
信号周期
信号周期是一个动态信号的相位(参见信号相位)的有序列表。
信号依赖性
信号依存关系通过附加信号来限制或延长一个信号的有效性。 例如,仅对卡车有效的 60 公里/小时限速标志,由附加标志指定。 一个信号可能有多个依赖项。
信号组
每个动态信号都需要恰好位于一个信号组中。
信号相位
动态信号的一个阶段是语义状态(参见 信号状态)与(可能是无限的)持续时间的组合,它指定了这个语义状态处于活动状态的时间。 该术语不要与英语土木工程术语 stage 或德语术语 phase 混淆。
信号参考
信号引用将信号链接到另一个信号或对象。 一个信号可能有多个信号引用。 不应将信号参考术语与用于将信号连接到多条道路的元素混淆。<signalReference>
信号状态
动态信号的状态是信号的语义状态和可观察状态的组合。
信号同步组
多个信号组(参见 信号组)应保持同步,并且其信号周期 (参见信号周期)具有相同的有限持续时间,可以但不要求映射到同步组。 此映射可用于指示每当通过 ASAM OpenSCENARIO 或其他方式设置一个信号组的相位时,该同步组中的其他信号组应设置为其信号周期中的相应位置。TrafficSignalControllerAction
滑道
在转弯车道上,驾驶员可以在不驶入主交叉路口的情况下改变道路。
静态路网
由静态对象丰富且在模拟运行时不会更改的已连接道路的集合。
超高
超高指定沿道路参考线的横向坡度。 超高是为横截面定义的,并且可以在道路参考线方向上变化。
T 坐标
t 坐标定义为与道路参考线正交的横向位置。
隧道
隧道在 ASAM OpenDRIVE 中建模为对象。 带有 tunnel 对象的道路定义道路的一部分,即隧道或地下通道。
虚拟交汇点
虚拟路口管理不间断道路内的连接,例如,停车场的入口和出口以及人行横道。
VMS 板
在 ASAM OpenSCENARIO 的模拟期间,可变消息板可以更改其值。
2 通用架构简介
ASAM OpenDRIVE 数据存储在扩展名为 . 压缩的 ASAM OpenDRIVE 文件的扩展名为 (compression format: )。xodr``xodrz``gzip
ASAM OpenDRIVE 文件结构符合 XML 规则;关联的架构文件在 XML 中引用。 ASAM OpenDRIVE 格式的架构文件可以从"可交付成果"部分检索。
元素被组织成多个级别。 级别大于零 (0) 的元素是前一个级别的子元素。 级别为一 (1) 的元素称为主元素。
每个元素都可以使用用户定义的数据进行扩展。 此数据存储在用户数据元素中。
ASAM OpenDRIVE 中使用的所有浮点数都是 IEEE 754 [12] 双精度浮点数。 为了确保在 XML 表示形式中准确表示浮点数,实现应使用已知的正确准确性,保留最小浮点打印算法 (例如 [13]、[14]) 或确保始终生成 17 个有效十进制数字,例如使用"%.17g"ISO C printf 修饰符。 导入实现应使用已知的正确精度保留浮点读取算法(例如 [15])。
2.1 属性
可在 ASAM OpenDRIVE 文件中使用的所有属性在 UML 模型中都进行了完全注释:
-
如果单位 适用于某个属性,则这些单位根据 "单位" 部分进行说明。
-
类型:描述属性的数据类型。它可以是原始数据类型(例如 string、double、float),也可以是引用此规范中描述的对象的复杂数据类型。
-
Value:Value 确定给定属性相对于指定类型的值范围。
2.2 根元素
2.3 HEADER
3 Overview of elements
4 附加数据
ASAM OpenDRIVE 提供了包含外部数据的可能性。 此数据的处理取决于应用程序。 其他数据可以放置在 ASAM OpenDRIVE 中的任何位置。
5 坐标系简介
ASAM OpenDRIVE 使用三种类型的坐标系:
-
惯性 x/y/z 坐标系
-
道路参考线 s/t/h 坐标系
-
本地 u/v/z 坐标系
5.1 基本坐标系
5.2 地理配准
空间参考系统由欧洲石油调查组大地测量学 (EPSG:32632 WGS 84 / UTM zone 32N [16])标准化,并由描述大地基准面的参数定义。 大地基准面是相对于地球的椭球体模型的位置集合的坐标参考系统。
大地基准面由根据 PROJ 的投影字符串描述,即两个坐标系之间数据交换的格式。 此数据应标记为 CDATA,因为它可能包含干扰元素属性的 XML 语法的字符。
6 几何元素
公路路线可以有许多不同的形状。 开阔的地面上有长而直的道路,高速公路上有细长的弯道,山区有狭窄的转弯。 为了以数学上正确的方式对所有这些道路进行建模,ASAM OpenDRIVE 提供了各种几何元素:
-
直线
-
具有线性变化曲率的缓和曲线或回旋线
-
具有恒定曲率的圆弧
-
参数化三次多项式
-
三次多项式 (已弃用)
7 道路 Road
道路的一些属性是根据道路的横截面来描述的。 道路横截面是道路参考线上给定点处的道路正交视图。 引用道路横断面的特性的一个示例是 superelevation。 对道路横截面有效的元素对道路参考线上给定点处的道路整个宽度有效。
其他道路属性根据道路的平面图进行描述。 这包括车道和道路高程。 对于这些属性,使用术语 road section。 道路横断面描述道路的各个部分及其沿道路参考线的 s 坐标的特定属性。 对路段有效的特性可能对道路的整个宽度无效,而仅对特定车道有效。
这意味着可以为不同的属性(如道路类型或车道部分)创建截面。 截面由元素中的附加元素使用新的起始 s 坐标创建。 截面的长度由两个给定的 s-start 位置之间的差异隐式给出。 各节应按 s 坐标的升序存储。<road>
8 泳道 Lane
在 ASAM OpenDRIVE 中,车道是所有道路的重要组成部分。 车道附着到道路的道路参考线,并从内到外定义。 最小道路定义需要一条中央车道和一条具有定义宽度的附加车道。 每条道路的车道数量没有限制。
中间车道没有宽度,用作车道编号的参考。 中间车道本身的车道 ID 为 0。 其他车道的编号从中间车道开始:车道编号向右下降,表示负 t 方向,向左上升,表示正 t 方向。
其他车道属性
其他 lane 属性描述 lanes 的使用或其他物理属性。 车道属性是按车道部分定义的,但可能会在该部分内更改。 如果没有专门为 lane section(车道段)定义特性,则应用程序可以应用默认特性。
通道类型是按通道定义的。 车道类型定义车道的主要用途及其相应的交通规则。
可用的车道类型包括:
-
shoulder
:道路边缘的软边界。 -
border
:路边的硬边界。 它通常与可驾驶车道的高度相同。 -
driving
:不是其他类型之一的正常可驾驶道路。 -
stop
: 高速公路上的紧急停车用硬路肩 -
restricted
:汽车不应行驶的车道。车道的高度与可行驶车道相同。 通常,车道用线条分隔,并且通常还包含虚线。 -
parking
: 带停车位的车道。 -
median
:位于相反方向的行车道之间的车道。 它通常用于在大型道路上分隔城镇的交通。 -
biking
:为骑行者预留的车道。 -
walking
:行人可以行走的车道。 -
curb
:路缘石。 路缘石的高度通常与相邻的可行驶车道不同。 -
entry
:用于与主干道平行并合并到主干道的路段的车道。 它主要用于加速车道。 -
exit
:用于与主干道平行并通向主干道出口的路段的车道。 主要用于减速车道。 -
onRamp
: 从农村或城市道路通往高速公路的匝道。 -
offRamp
:从高速公路通往乡村城市道路的匝道。 -
connectingRamp
:连接两条高速公路的匝道,例如高速公路交叉口。 -
slipLane
:驾驶员在不驶入主交叉路口的情况下改变道路的车道。 -
none
:位于道路最外侧边缘的空间,没有实际内容。 它的唯一目的是让应用程序注册 ASAM OpenDRIVE 仍然存在,以防(人类)驾驶员离开道路。
Road markings
9 交汇点简介
交叉路口可以连接两条以上的道路。
存在四种类型的交汇点:
-
公共路口是具有可行驶车道的路口,这些车道可以重叠并且车辆可以穿过。
-
直接交叉路口是指交通可以改变道路但不能与其他交通交叉的交叉路口。
-
虚拟路口是主干道未中断的路口。
-
十字路口是交通无法改变道路的路口。
10 对象简介
对象是通过扩展、界定或补充道路路线来影响道路的项目。 最常见的例子是停车位、人行横道和交通障碍。
图 108 显示了使用 width、length 和 height 的角度对象的边界框,以及使用 radius 和 height 的圆形对象的边界框。
可以使用元素进一步描述复杂对象。 如果定义了元素,它将取代边界框。<outline>``<outline>
ASAM OpenDRIVE 中的对象不会更改其位置。
它们可以声明为 dynamic 或 static:
-
动态对象是静态的,但具有一个或多个可移动部分。 例如隧道或风车中的风扇。
-
静止的物体是完全静止的,没有任何可移动的部件。 例如建筑物或树木。
对象是按元素定义的。<road>
11 信号简介
信号是交通标志、交通信号灯和用于控制和调节道路交通的特定道路标记。
图 124 显示了 ASAM OpenDRIVE 的示例信号定义。
信号具有不同的功能和属性:
-
它们用于控制交通行为,例如,通过限速和转弯限制,以及提醒道路交通注意危险情况。
-
它们可以是静态的,也可以是动态的。 静态信号(例如停车标志)不会改变其含义。 动态信号(如交通信号灯或可变留言板)在仿真过程中可能会改变其含义。 它们的动态内容可以在 ASAM OpenSCENARIO 中定义。
信号应相对于特定道路放置。 使用 s 和 t 坐标描述信号相对于道路参考线的位置。 信号灯的位置应清楚地表明它们属于哪条道路或车道以及其有效性从哪里开始。 应避免对其解释的歧义。
每个国家/地区的交通规则都不同。 信号的国家/地区在 @country 属性中指定。 在 ASAM OpenDRIVE 中放置信号时,应考虑特定国家/地区的立法和交通规则。 法规变更由规则生效的年份表示。 可以在元素中的元素中定义整个 ASAM OpenDRIVE 文件的流量规则。<defaultRegulations>``<header>
信号的 @height 和 @width 属性不是必需的,但建议使用这些属性来正确表示信号。 @length 属性可用于指定信号的粗细。
不与交通绑定的道路标记不被定义为信号,而只是被定义为对象。
具有 @type 和 @subtype 属性的信号只有在与 @country 和 @countryRevision 属性组合时才是唯一的。 由于一些在 ASAM OpenDRIVE 中被视为信号的元素,例如交通信号灯,没有任何官方的 @type和@subtype表示形式,这些在 Signal reference 1.0.0中指定。 它们可以与适当的 @type、@subtype 和 @country="OpenDRIVE" 一起使用。
12 铁路简介
除了道路之外,ASAM OpenDRIVE 还可以对基于轨道的交通系统(即有轨电车和有轨电车)进行建模。 ASAM OpenDRIVE 不能用于复杂的铁路网络和铁路信号。 ASAM OpenDRIVE 仅描述公路和铁轨交汇处的铁路网络。
UML 模型中的元素
<railroad>
元素
在 ASAM OpenDRIVE 中,铁路由元素中的元素表示。<railroad>``<road>
UML class: t_road_railroad
XML tag: <railroad> (Multiplicity: 0..1)
应沿道路应用的所有铁路定义的容器。
可用的 railroad 元素集目前仅限于道岔的定义。 所有其他条目都应被现有元素覆盖,例如 track definition by 、 signal definition by 等。 特定于铁路的元素是在有轨电车应用程序的背景下定义的。<road>``<signal>
13 Parser
北京联高软件开发有限公式实现的 C# 版本xodr Parser。
纯 C#;
支持xml格式 *.xodr 文件的解析;
支持转为 json;
支持曲线、曲面的连接、过度、插值计算;
支持各种实体的显示;
部分源代码:
cs
using System;
using System.Collections;
using System.Collections.Generic;
namespace OpenDrive
{
[Serializable()]
public class t_junctionGroup : _OpenDriveElement
{
/// <summary>
/// Unique ID within database
/// </summary>
public string id { get; set; }
/// <summary>
/// Name of the junction group. May be chosen freely.
/// </summary>
public string name { get; set; }
/// <summary>
/// Type of junction group
/// </summary>
public string type { get; set; } = "";
/// <summary>
///
/// </summary>
public List<t_junctionGroup_junctionReference>? junctionReference { get; set; } = null;
public t_junctionGroup() { }
}
}
cs
using System;
using System.Collections;
using System.Collections.Generic;
namespace OpenDrive
{
public class t_road_objects_object
{
#region Attributes
/// <summary>
/// Indicates whether the object is dynamic or static,
/// default value is "no" (static). Dynamic object cannot change its position.
/// </summary>
public string dynamic { get; set; }
/// <summary>
/// Heading angle of the object relative to road direction
/// </summary>
public double hdg { get; set; } = 0.0;
/// <summary>
/// Height of the object's bounding box.
/// @height is defined in the local coordinate system u/v along the z-axis
/// </summary>
public double height { get; set; } = 0.0;
/// <summary>
/// Unique ID within database
/// </summary>
public string id { get; set; }
/// <summary>
/// Length of the object's bounding box, alternative to @radius.
/// @length is defined in the local coordinate system u/v along the u-axis
/// </summary>
public double length { get; set; } = 0.0;
/// <summary>
/// Name of the object. May be chosen freely.
/// </summary>
public string name { get; set; }
/// <summary>
/// "+" = valid in positive s-direction
/// "-" = valid in negative s-direction
/// "none" = valid in both directions
/// (does not affect the heading)
/// </summary>
public string orientation { get; set; }
/// <summary>
/// Alternative to @pitch and @roll.
/// If true, the object is vertically perpendicular to the road surface at
/// all points and @pitch and @roll are ignored. Default is false.
/// </summary>
public bool perpToRoad { get; set; }
/// <summary>
/// Pitch angle relative to the x/y-plane
/// </summary>
public double pitch { get; set; }
/// <summary>
/// radius of the circular object's bounding box, alternative to @length and @width.
/// @radius is defined in the local coordinate system u/v
/// </summary>
public double radius { get; set; }
/// <summary>
/// Roll angle relative to the x/y-plane
/// </summary>
public double roll { get; set; }
/// <summary>
/// s-coordinate of object's origin
/// </summary>
public double s { get; set; }
/// <summary>
/// Variant of a type
/// </summary>
public string subtype { get; set; }
/// <summary>
/// t-coordinate of object's origin
/// </summary>
public double t { get; set; }
/// <summary>
/// Type of object.
/// For a parking space, the <parkingSpace> element may be used additionally.
/// </summary>
public string type { get; set; }
/// <summary>
/// Validity of object along s-axis (0.0 for point object)
/// </summary>
public double validLength { get; set; }
/// <summary>
/// Width of the object's bounding box, alternative to @radius.
/// @width is defined in the local coordinate system u/v along the v-axis
/// </summary>
public double width { get; set; }
/// <summary>
/// z-offset of object's origin relative to the elevation of the road reference line
/// </summary>
public double zOffset { get; set; }
#endregion
#region Elements
/// <summary>
///
/// </summary>
public List<t_road_objects_object_repeat>? repeat { get; set; } = null;
/// <summary>
///
/// </summary>
public t_road_objects_object_outline? outline { get; set; } = null;
/// <summary>
///
/// </summary>
public t_road_objects_object_outlines? outlines { get; set; } = null;
/// <summary>
///
/// </summary>
public List<t_road_objects_object_material>? material { get; set; } = null;
/// <summary>
///
/// </summary>
public List<t_road_objects_object_validity>? validity { get; set; } = null;
/// <summary>
///
/// </summary>
public t_road_objects_object_surface? surface { get; set; } = null;
/// <summary>
///
/// </summary>
public t_road_objects_object_markings? markings { get; set; } = null;
/// <summary>
///
/// </summary>
public t_road_objects_object_parkingSpace? parkingSpace { get; set; } = null;
/// <summary>
///
/// </summary>
public t_road_objects_object_borders? borders { get; set; } = null;
/// <summary>
///
/// </summary>
public t_road_objects_object_skeleton? skeleton { get; set; } = null;
/// <summary>
///
/// </summary>
public List<t_road_objects_object_tunnel>? tunnel { get; set; } = null;
/// <summary>
///
/// </summary>
public List<t_road_objects_object_bridge>? bridge { get; set; } = null;
/// <summary>
///
/// </summary>
public List<t_road_objects_objectReference>? objectReference { get; set; } = null;
#endregion
public t_road_objects_object() { }
}
}
14 参考资料
。。。