自动驾驶精细化路面标准 - ASAM OpenCRG解读

自动驾驶精细化路面标准 - ASAM OpenCRG解读

背景:OpenX标准解读,OpenDrive负责静态路网信息,OpenCRG负责描述精细化的路面形貌信息。在行业内算比较冷门的玩意,一来是自动驾驶仿真中有用,拥有精细化的路面的场景,可以对车辆进行更好的动力学仿真。

二来是涉及一些悬架控制的场景,比如高级一些的车辆行驶时扫描地面,根据前方路况实时调整悬架刚度、高度。以达到更好的舒适性、通过性。

附赠自动驾驶最全的学习资料和量产经验:链接


1. 前言

1.1 概述

OpenCRG(Open Curved Regular Grid)描述的是“路面的微观形貌”,如路面的起伏,粗糙度等。
OpenCRG描述路面的基本原理是:沿道路参考线Reference line的切向法向划分网格,然后将高程数据填充进这些网格中。OpenCRG有bin和ASCII两种文件格式,其文件通常是被OpenDrive文件引用。

image

Matlab-Open CRG数据在局部坐标系下以及全局XY坐标系下的表示

1.2 OpenCRG 的版本

版本发行日期描述
1.1.22018.06早期Vires公司(VTD开发者)提供版本,后移交ASAM维护
1.22020.09最新版本

本文解读的版本为现行最新的 1.2 版本。

1.3 必要的准备

正如OpenDrive最终的形态就是一份XML文件,OpenCRG的最终形态就是二进制文件或ASCII文件,因此只要遵循规则对其进行解析即可,其规则与OpenDrive相比十分简单。在此之前,必要的知识储备与准备有:

  1. **坐标转换:**默认读者理解Cartisian坐标系与Frenet坐标系(st 坐标系)之间的区别以及转换;

image

笛卡尔坐标系与参考坐标系

  1. **大地坐标:**默认读者了解大地坐标系相关内容;了解WGS84、CGCS2000等椭球坐标系;高斯-克鲁格投影、墨卡托投影相关知识;

  2. 文件下载:官网链接ASAM OpenCRG®,文件下载后包含了如下图所示的内容。与OpenDrive主要提供文档格式的Manual + 示例不同,OpenCRG还提供了开源的API,可以创建、编辑、可视化以及评估OpenCRG文件。

  3. **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文件

image

OpenCRG标准下载

Ref:

  1. 坐标系:Frenet坐标系与Cartesian坐标系互转(一):公式推导_windSeS的博客-CSDN博客_cartesian坐标系

  2. ASAM官网ASAM OpenCRG®

  3. Demo:Digital Twin of a road with the help of OpenCRG - YouTube

  4. 路面形状のOpenCRG/OpenDriveデータ化 - YouTube

  5. Jeongseon-gun detailed road 3D model for CarMaker - YouTube

  6. Tank following a path defined by an openCRG road - 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 + RIGHTUV坐标系下起始、终止位置的U坐标;UV坐标系下V轴的左、右边界;
REFERENCE_LINE_START_B + END_BREFERENCE_LINE_START_S + END_S起始、终止位置沿前进方向的坡度(slope);起始、终止位置侧面的倾斜(banking);Banking和Slope的区别
REFERENCE_LINE_INCREMENTLONG_SECTION_V_INCREMENT横截面之间的距离;轴向截面之间的距离;

image

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_NMWGS84、USERDEFINED等16种全局椭球的名称标识
TRAN_NMNOP无转换,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_NMWGS84、USERDEFINED等16种局部椭球的名称标识
PROJ_NMGK3_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:

  1. https://en.wikipedia.org/wiki/Transverse_Mercator_projection

2.5 数据定义Data definition - $KD_Definition

该部分定义了道路数据Road Data的格式以及顺序,具体如下

定义解释
#:LRFI实数类型的二进制数据格式
#:LDFIdouble类型的二进制数据格式
#:KBRI(Default)实数类型的可读纯文本格式
#:KDBIdouble类型的可读纯文本格式
D:reference line phi,rad道路参考线航向角
D:reference line banking,m/m道路参考线的侧向倾斜
D:reference line slope,m/m道路参考线沿前进方向坡度
D:long section at v = X,mV坐标上X位置的纵向切割,单位为米
D:long section X,mV坐标上第X个纵向切口。若使用此定义,必须在“道路参数”部分中定义道路宽度LONG_SECTION_V_LEFT + RIGHT,以及v方向上的增量LONG_SECTION_V_INCREMENT。

如下是使用D:long section X,m 等距分割对道路进行纵向进行切分的格式:

image

如下是使用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 + V0, 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_CONTINUATION0, 1(default: 0)给定的u坐标位于定义的参考线之外,计算x/y位置的模式0:沿两端外推参考线; 1:如可能,将参考线视为闭合轨迹
WARN_MSGS-1- ∞(default: -1)显示的警告消息数-1:All; 0:None. >0:最大显示数量
WARN_CURV_LOCAL0, 1(default: 0)检查是否超过局部曲率极限0:不检查 1:检查
WARN_CURV_GLOBAL0, 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数据,具体有:

ModifierValuesDescription
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_MODE0, 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:

  1. CSDN:文本文件与二进制文件的区别

3. OpenCRG API的实践

OpenCRG给了C、Matlab两种格式的API,其中matlab API的功能更全面一些,可以创建、操作、可视化、评估OpenCRG文件。读者可自行实践,并不复杂。

4. OpenCRG的应用

文章开始提到了OpenCRG在仿真和悬架控制中可以起到作用。而在应用形式上,两者存在一些区别。在仿真中,OpenCRG所代表的精细化路面应当是随OpenDrive静态道路场景一同提供的,或者说OpenCRG是嵌入到OpenDrive中的。

而对于实际场景中的悬架控制,一般还是更多走车端感知路面坑洼-决策-控制的路线。如果路面信息往地图里面集成,这样会让地图太重了,与目前轻地图的趋势是不符合的。其实回传一些关键的、数据量更小的语义信息即可。比如一定数量的自动驾驶车辆在某一位置遇到凹坑后,在语义地图上有所体现,让后续的车辆主动在这一路段避开凹坑,或者采取减速等控制措施即可。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值