自动驾驶精细化路面标准 - ASAM OpenCRG解读
背景:OpenX标准解读,OpenDrive负责静态路网信息,OpenCRG负责描述精细化的路面形貌信息。在行业内算比较冷门的玩意,一来是自动驾驶仿真中有用,拥有精细化的路面的场景,可以对车辆进行更好的动力学仿真。
二来是涉及一些悬架控制的场景,比如高级一些的车辆行驶时扫描地面,根据前方路况实时调整悬架刚度、高度。以达到更好的舒适性、通过性。
附赠自动驾驶最全的学习资料和量产经验:链接
1. 前言
1.1 概述
OpenCRG(Open Curved Regular Grid)描述的是“路面的微观形貌”,如路面的起伏,粗糙度等。
OpenCRG描述路面的基本原理是:沿道路参考线Reference line的切向和法向划分网格,然后将高程数据填充进这些网格中。OpenCRG有bin和ASCII两种文件格式,其文件通常是被OpenDrive文件引用。
Matlab-Open CRG数据在局部坐标系下以及全局XY坐标系下的表示
1.2 OpenCRG 的版本
版本 | 发行日期 | 描述 |
---|---|---|
1.1.2 | 2018.06 | 早期Vires公司(VTD开发者)提供版本,后移交ASAM维护 |
1.2 | 2020.09 | 最新版本 |
本文解读的版本为现行最新的 1.2 版本。
1.3 必要的准备
正如OpenDrive最终的形态就是一份XML文件,OpenCRG的最终形态就是二进制文件或ASCII文件,因此只要遵循规则对其进行解析即可,其规则与OpenDrive相比十分简单。在此之前,必要的知识储备与准备有:
- **坐标转换:**默认读者理解Cartisian坐标系与Frenet坐标系(st 坐标系)之间的区别以及转换;
笛卡尔坐标系与参考坐标系
-
**大地坐标:**默认读者了解大地坐标系相关内容;了解WGS84、CGCS2000等椭球坐标系;高斯-克鲁格投影、墨卡托投影相关知识;
-
文件下载:官网链接ASAM OpenCRG®,文件下载后包含了如下图所示的内容。与OpenDrive主要提供文档格式的Manual + 示例不同,OpenCRG还提供了开源的API,可以创建、编辑、可视化以及评估OpenCRG文件。
-
**OpenCRG的嵌入OpenDrive的四种格式:**在ASAM OpenX标准解读(一)——OpenDrive 2022.06.20 中提到,OpenCRG的应用有四种格式:attach、attach0、genuine、global,默认读者对其已有充分理解。
OpenCRG包含内容 | 说明 |
---|---|
用户说明书,Html格式 | OpenCRG的详细解析 |
OpenCRG文件样例 | 解释性示例,包含ASCII格式以及bin格式 |
C-API,包括演示文件和测试脚本 | C-API可以读取、评估OpenCRG文件 |
MATLAB库,包括演示文件和测试脚本 | Matlab API可以创建、操作、可视化、评估OpenCRG文件 |
OpenCRG标准下载
Ref:
-
坐标系:Frenet坐标系与Cartesian坐标系互转(一):公式推导_windSeS的博客-CSDN博客_cartesian坐标系
-
ASAM官网:ASAM OpenCRG®
-
Demo:Digital Twin of a road with the help of OpenCRG - YouTube
2. OpenCRG1.2 文件解读
2.1 OpenCRG的文档结构
OpenCRG由多个纯文本的数据段组成,而实际的道路数据段由二进制格式提供,最大长度为80字节,具体地:
数据段 | 关键字 | 内容 | 备注 |
---|---|---|---|
标题 | $CT | 纯文本、非结构化的文件描述 | 必填 |
道路参数 | $ROAD_CRG | 纯文本、结构化的道路参考线定义 | 如果有道路数据,则必填 |
地图投影 | $ROAD_CRG_MPRO | 用于将 OpenCRG 数据映射到地理位置的数据的结构化定义 | 可选 |
数据定义 | $KD_Definition | 纯文本、结构化的数据通道定义 | 如果有道路数据,则必填 |
选项 | $ROAD_CRG_OPTS | 纯文本、结构化的评估选项定义 | 可选 |
修饰 | $ROAD_CRG_MODS | 纯文本、结构化的数据集修饰定义 | 可选 |
文件引用 | $ROAD_CRG_FILE | 对其他OpenCRG文件的引用 | 可选 |
道路数据 | / | 纯文本或二进制格式的实际路面数据 | 可选 |
注释 | * 和 ! | “*”为单行注释,“!”为多行注释 |
2.2 表头Header - $CT
表头提供的文件信息可能有:名称、用途、版本、作者、日期、版权声明等基本信息,没什么新鲜的。
$CT ! comment text block
CRG file example for road surface description (width: 3m, length: 22m)
with default straight reference line and grid of 0.5m x 1.0m
% *****************************************************************
% ASAM OpenCRG Matlab Example File
% OpenCRG version: 1.2.0
% package: crg-txt
% file name: handmade_straight_double.crg
% author: ASAM e.V.
% C by ASAM e.V., 2020
% Any use is limited to the scope described in the license terms.
% The license terms can be viewed at www.asam.net/license
% More Information on ASAM OpenCRG can be found here:
% https://www.asam.net/standards/detail/opencrg/
$!**********************************************************************
2.3 道路参数描述Road Parameters - $ROAD_CRG
道路参数部分主要是28个关于道路参考线Reference line的信息,通过在不同的坐标系下提供起点Start和终点End的位置,可以将弯曲的网格放置在惯性XY坐标系下或者WGS84大地坐标系下(一般大地坐标系不够精确,只用作参考)。
参数 | 解释 |
---|---|
REFERENCE_LINE_START_X + END_XREFERENCE_LINE_START_Y + END_YREFERENCE_LINE_START_Z + END_ZREFERENCE_LINE_OFFSET_X + Y + Z | 道路参考线在笛卡尔坐标系下的起始、终止位置;以及在笛卡尔坐标系下的全局偏移; |
REFERENCE_LINE_START_PHI + END_PHIREFERENCE_LINE_OFFSET_PHI | 起始、终止位置的航向角;以及全局的航向角偏移; |
REFERENCE_LINE_START_LON + END_LONREFERENCE_LINE_START_LAT + END_LATREFERENCE_LINE_START_ALT + ND_ALT | 道路参考线在WGS84坐标系下起始、终止位置的经度、纬度、海拔; |
REFERENCE_LINE_START_U + END_ULONG_SECTION_V_LEFT + RIGHT | UV坐标系下起始、终止位置的U坐标;UV坐标系下V轴的左、右边界; |
REFERENCE_LINE_START_B + END_BREFERENCE_LINE_START_S + END_S | 起始、终止位置沿前进方向的坡度(slope);起始、终止位置侧面的倾斜(banking);Banking和Slope的区别 |
REFERENCE_LINE_INCREMENTLONG_SECTION_V_INCREMENT | 横截面之间的距离;轴向截面之间的距离; |
Banking和Slope的区别
*所有数据类型为双精度浮点;
$ROAD_CRG ! crg road parameters
REFERENCE_LINE_START_U = 0.0
REFERENCE_LINE_START_X = 0.0
REFERENCE_LINE_START_Y = 0.0
REFERENCE_LINE_START_PHI = 0.0
REFERENCE_LINE_END_U = 22.0
REFERENCE_LINE_END_X = 22.0
REFERENCE_LINE_END_Y = 0.0
REFERENCE_LINE_END_PHI = 0.0
REFERENCE_LINE_INCREMENT = 1.0
LONG_SECTION_V_RIGHT =-1.50
LONG_SECTION_V_LEFT = 1.50
LONG_SECTION_V_INCREMENT = 0.50
到这里,读者可能会观察到一个问题:以上所有参数完全不足以构建一条完整的道路参考线,只是定义了参考线起始、终止位置的参数。事实上这并没有问题:
其一,在后面的道路数据Road Data部分,可以包含经过每一个Step后道路参考线的航向角,籍此可对整条参考线进行积分。当然,航向角的精度不算高,长距离的积分会导致较大的偏移,此时终止位置的参数就可以很好地校正此偏移。
其二,OpenCRG可依附于OpenDrive文件,使用OpenDrive定义的道路参考线即可。
2.4 地图投影方式Map projection data - $ROAD_CRG_MPRO
该部分包含了将道路数据投影到地理位置所需的信息,如**“投影方法名称”、或者“投影参数”。**如果使用了WGS84之外的(如CGCS2000)大地坐标系,则应当提供对应椭球的名称、长半轴、短半轴信息。
地图投影涉及到基准转换,例如使用WGS84坐标的Gauss-Krüger投影,则应当指定局部椭球和7个参数。
参数 | 值 | 描述 |
---|---|---|
GELL_A + B | 双精度浮点 | 全局椭球长、短半轴 |
GELL_NM | WGS84、USERDEFINED等16种 | 全局椭球的名称标识 |
TRAN_NM | NOP无转换,HL7线性Helmert变换HN7非线性Helmert变换,HS7简单Helmert变换 | 基准转换标识符 |
TRAN_DSTRAN_RX + RY + RZTRAN_TX + TY + TZ | 双精度浮点 | Helmert变换参数:标量比例因子减1沿X、Y、Z轴的旋转沿X、Y、Z轴的平移 |
LELL_A + B | 双精度浮点 | 局部椭球长、短半轴 |
LELL_NM | WGS84、USERDEFINED等16种 | 局部椭球的名称标识 |
PROJ_NM | GK3_0 … GK3_119, GK6_0 … GK6_59, UTM_01C … UTM_60X, TM_0 … TM_359, TM | 地图投影的标识符:GK:高斯-克吕格UTM、TM 横轴墨卡托投影 |
PROJ_F0 + P0 + L0 + E0 + N0 | 双精度浮点 | 投影参数:中心子午线缩放、初始纬度、初始经度、东伪偏移、北伪偏移 |
$ROAD_CRG_MPRO
PROJ_NM = 'UTM_32U'
Ref:
2.5 数据定义Data definition - $KD_Definition
该部分定义了道路数据Road Data的格式以及顺序,具体如下
定义 | 解释 |
---|---|
#:LRFI | 实数类型的二进制数据格式 |
#:LDFI | double类型的二进制数据格式 |
#:KBRI(Default) | 实数类型的可读纯文本格式 |
#:KDBI | double类型的可读纯文本格式 |
D:reference line phi,rad | 道路参考线航向角 |
D:reference line banking,m/m | 道路参考线的侧向倾斜 |
D:reference line slope,m/m | 道路参考线沿前进方向坡度 |
D:long section at v = X,m | V坐标上X位置的纵向切割,单位为米 |
D:long section X,m | V坐标上第X个纵向切口。若使用此定义,必须在“道路参数”部分中定义道路宽度LONG_SECTION_V_LEFT + RIGHT,以及v方向上的增量LONG_SECTION_V_INCREMENT。 |
如下是使用D:long section X,m 等距分割对道路进行纵向进行切分的格式:
如下是使用D:long section at v = X,m 实际位置对道路进行纵向进行切分的格式:
$ROAD_CRG ! road parameters section
REFERENCE_LINE_INCREMENT = 0.01 ! 1 cm between every lateral cut
LONG_SECTION_V_RIGHT = -1.50 ! right road border
LONG_SECTION_V_RIGHT = 1.50 ! left road border
LONG_SECTION_V_INCREMENT = 0.10 ! 10 cm between every longitudinal cut
$!********************************
$KD_DEFINiTION ! data definition section
#:KRBI ! binary data, numbers of type real
D:reference line phi,rad ! heading angle
D:long section 1,m ! 1.50 m right of reference line
D:long section 2,m ! 1.40 m right of reference line
...
D:long section 16,m ! on reference line
...
D:long section 30,m ! 1.40 m left of reference line
D:long section 31,m ! 1.50 m left of reference line
$!********************************
2.6 选项Options - $ROAD_CRG_OPTS
该部分影响对OpenCRG数据的评估,并不会对道路数据Road Data本身产生影响。具体地:
选项 | 值 | 描述 |
---|---|---|
BORDER_MODE_U + V | 0, 1, 2, 3, 4 (default: 2) | 当查询的坐标超出道路范围时候,返回的z值,0:返回NaN或error、1:返回0、2:返回最后一个有效z值、3:循环道路数据、4:返回镜像数据 |
BORDER_OFFSET_U + V | 双精度浮点 | 当查询的坐标超出道路范围时候,返回z值的偏移量 |
BORDER_SMOOTH_UBEG + UEND | 双精度浮点(0.0 to umax) | z值从0线性缩放到实际值、从实际值线性缩放到0,在道路起点、终点提供平滑过渡 |
REFLINE_CONTINUATION | 0, 1(default: 0) | 给定的u坐标位于定义的参考线之外,计算x/y位置的模式0:沿两端外推参考线; 1:如可能,将参考线视为闭合轨迹 |
WARN_MSGS | -1- ∞(default: -1) | 显示的警告消息数-1:All; 0:None. >0:最大显示数量 |
WARN_CURV_LOCAL | 0, 1(default: 0) | 检查是否超过局部曲率极限0:不检查 1:检查 |
WARN_CURV_GLOBAL | 0, 1 (default: 0) | 检查是否超过全局曲率极限0:不检查 1:检查 |
CHECK_EPS + INC + TOL + PRO + WGS | 略 | 预期最小精度、最小增量、绝对公差、投影公差、WGS84公差,用于数值一致性检查。 |
$ROAD_CRG_OPTS
BORDER_MODE_U = 3 ! return 0 when query exceeds the beginning or end of the road
BORDER_SMOOTH_UBEG = 0.5 ! over the first 2 m, increase z-values linearly from 0 to the actual value
BORDER_SMOOTH_UEND = 0.5 ! over the last 2 m, decrease z-values linearly from 0 to the actual value
$!*********************
2.7 修改器Modifiers - $ROAD_CRG_MODS
Modifier可以改变存储的OpenCRG数据,具体有:
Modifier | Values | Description |
---|---|---|
REFPOINT_U + V | 双精度浮点 | 参考点的UV坐标,用于通过参考点重新定位 |
REFPOINT_U + V_FRACTION | 双精度浮点 [0.0, 1.0] (default: 0.0) | 参考点的相对UV坐标,用于通过参考点重新定位 |
REFPOINT_U + V_OFFSET | 双精度浮点 (default: 0.0) | 参考点的UV坐标偏移,用于通过参考点重新定位 |
REFPOINT_X + Y + Z | 双精度浮点 (default: 0.0) | 通过参考点重新定位的目标位置的三维坐标 |
REFPOINT_PHI | 双精度浮点 (default: 0.0) | 通过参考点重新定位的目标位置的绝对航向角 |
REFLINE_ROTCENTER_X + Y | 双精度浮点 | 旋转中心的坐标,用于通过旋转和平移重新定位 |
REFLINE_OFFSET_PHI | 双精度浮点 (default: 0.0) | 通过旋转和平移重新定位的旋转角度 |
REFLINE_OFFSET_X + Y + Z | 双精度浮点 (default: 0.0) | 通过旋转和平移重新定位的三维偏移量 |
SCALE_Z_GRID | 双精度浮点 (default: 0.0) | 数据在z方向的缩放因子 |
SCALE_SLOPE + Banking | 双精度浮点 (default: 0.0) | 坡度和倾斜的缩放因子 |
SCALE_LENGTH + WIDTH | 双精度浮点: ]0.0,∞] (default: 0.0) | 数据在UV方向的缩放因子 |
SCALE_CURVATURE | 双精度浮点 : [0.0,∞] (default: 0.0) | 曲率的缩放因子 |
GRID_NAN_MODE | 0, 1, 2 | 替换道路数据边界中NaN值的模式:0:维持NaN 1:以“0”替代 2:以最近的有效值替代 |
GRID_NAN_OFFSET | 双精度浮点 (default: 0.0) | 应用于替换NaN值的偏移量 |
例子:参考线首先围绕x/y坐标系的原点旋转1.57 rad(90°),然后在x方向、y方向和z方向移动100 m。
$ROAD_CRG_MODS
REFLINE_ROTCENTER_X = 0 ! rotation center at x = 0
REFLINE_ROTCENTER_Y = 0 ! rotation center at y = 0
REFLINE_OFFSET_PHI = 1.57 ! rotated by 1.57 rad (90°)
REFLINE_OFFSET_Z = 100 ! shift 100 m in x-direction
REFLINE_OFFSET_Y = 100 ! shift 100 m in y-direction
REFLINE_OFFSET_Z = 100 ! shift 100 m in z-direction
$!************************
如何将边界上的NaN值替换为任意值(此处:10 m)
$ROAD_CRG_MODS
GRID_NAN_MODE = 1 ! replace NaN with z = 0
GRID_NAN_OFFSET = 10 ! offset former NaN values by 10 m
$!************************
2.8 文件引用File reference - $ROAD_CRG_FILE
OpenCRG可以引用多个文件,如此操作可以将上述“选项”、“修改器”等控制文件和实际的道路数据分离,实际工作中更为方便。如果解析引用导致定义冲突,则以最后一个定义为准。
/home/name/crg-files/handmade_straight.crg ! 绝对位置
./handmade_straight.crg ! 相对位置
$crgpath/handmade_straight.crg ! 环境变量
$ROAD_CRG_FILE ! 多个引用
/home/name/crg-files/control_file.crg
/home/name/crg-files/road_data.crg
$!********
2.9 道路数据Road data
前面的内容都是一些参数控制项,而该部分才是真正的道路表面数据。其规定为:每一列是平行于道路基准线的纵向切割,而每一行则是与道路参考线正交的横向切割。其他列还可能包含一些道路参考线的数据,比如,航向角、坡度、倾斜度等等,具体的形式在数据定义Data Definition一节已经阐述,这里不再重复给出。
道路数据可有ASCII模式和二进制格式,其区别也不再赘述。
$ROAD_CRG ! road parameters section
REFERENCE_LINE_INCREMENT = 0.50 ! 10 cm between every lateral cut
LONG_SECTION_V_RIGHT = -0.50 ! right road border
LONG_SECTION_V_RIGHT = 0.50 ! left road border
LONG_SECTION_V_INCREMENT = 0.50 ! 50 cm between every longitudinal cut
$!********************************
$KD_DEFINiTION ! data definition section
#:LRBI ! plain-text data, numbers of type real
D:reference line phi,rad ! heading angle
D:long section 1,m ! 0.50m right of reference line
D:long section 2,m ! on reference line
D:long section 3,m ! 0.50m left of reference line
$!********************************
$
0.0000000 0.0000000 0.0000000 0.0000000
0.0000000 0.0000000 0.0000000 0.0000000
0.0000000 0.0000000 0.0000000 0.0000000
0.0000000 0.0111111 0.0111111 0.0000000
0.0000000 0.0000000 0.0000000 0.0000000
0.0111111 *missing* 0.0000000 0.0111111
0.0111111 0.0111111 0.0111111 0.0222222
0.0111111 0.0111111 0.0222222 0.0333333
0.0111111 0.0111111 0.0111111 0.0222222
0.0111111 0.0000000 0.0000000 0.0111111
Ref:
- CSDN:文本文件与二进制文件的区别;
3. OpenCRG API的实践
OpenCRG给了C、Matlab两种格式的API,其中matlab API的功能更全面一些,可以创建、操作、可视化、评估OpenCRG文件。读者可自行实践,并不复杂。
4. OpenCRG的应用
文章开始提到了OpenCRG在仿真和悬架控制中可以起到作用。而在应用形式上,两者存在一些区别。在仿真中,OpenCRG所代表的精细化路面应当是随OpenDrive静态道路场景一同提供的,或者说OpenCRG是嵌入到OpenDrive中的。
而对于实际场景中的悬架控制,一般还是更多走车端感知路面坑洼-决策-控制的路线。如果路面信息往地图里面集成,这样会让地图太重了,与目前轻地图的趋势是不符合的。其实回传一些关键的、数据量更小的语义信息即可。比如一定数量的自动驾驶车辆在某一位置遇到凹坑后,在语义地图上有所体现,让后续的车辆主动在这一路段避开凹坑,或者采取减速等控制措施即可。