OpenDrive格式地图数据解析

2023-11-02

OpenDrive地图解析代码可以参考,https://github.com/liuyf5231/opendriveparser

OpenDrive地图文件格式为xml,详细的介绍可以参考
http://www.opendrive.org/docs/OpenDRIVEFormatSpecRev1.4H.pdf

该xml文件中中包含了很多地图信息,例如Road、Junction等,下图是xml文件的主要结构,

这里写图片描述

下图为绘制地图的一个简单思路,读取OpenDRIVE文件,即地图数据,构造路网,通过渲染展示给用户。

这里写图片描述

下面结合OpenDRIVE文件中的数据,介绍如何构造路网。

坐标系

首先需要考虑的是坐标系,我们平时看到的地图都是二维的,而地球是个椭球体,因此需要通过某种方式将椭球上的表示转换为二维平面。

在GIS中一般使用两种常用的坐标系类型:

  • 全局坐标系或球坐标系,例如经纬度。这些坐标系通常称为地理坐标系(GCS)。
  • 基于横轴墨卡托、亚尔勃斯等积或罗宾森等地图投影的投影坐标系,这些地图投影(以及其他多种地图投影模型)提供了各种机制将地球球面的地图投影到二维笛卡尔坐标平面上。(PCS)

GCS使用三维球面来定义地球上的位置。

image

PCS在二维平面中进行定义。与地理坐标系不同,在二维空间范围内,投影坐标系的长度、角度和面积恒定。投影坐标系始终基于地理坐标系,而后者则是基于球体或旋转椭球体的。

image

上图为经过某种投影变换后的二维投影图(本文记作xy坐标系),x表示经度(正,东经,负,西经),y表示纬度(正,北纬,负,南纬)。

在OpenDRIVE数据中,具体体现在,

<header revMajor="1" revMinor="4" name="OpenDRIVE TestFile" version="1" date="Tue Aug 15 16:21:00 2017" north="5.4355531085039526e+06" south="5.4143611839699000e+06" east="3.2681018217470363e+07" west="3.2670519445542485e+07" vendor="AUTONAVI">
        <geoReference originLat="3.2675915701523371e+07" originLong="5.4273604273430230e+06" originAlt="0.0000000000000000e+00" originHdg="0.0000000000000000e+00">
            <![CDATA[PROJCS["WGS 84 / UTM zone 32N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],AUTHORITY["EPSG","32650"],AXIS["Easting",EAST],AXIS["Northing",NORTH]]]]>
        </geoReference>
</header>

geoReference元素定义了该文件使用的投影坐标系,其中地理坐标系为WGS-84,而投影坐标系采用的是Transverse_Mercator,横轴墨卡托投影。

在OpenDRIVE数据中大量使用的位置信息都是投影后的xy坐标,而除了该投影坐标系,还定义了一种轨迹坐标系,如下所示,

这里写图片描述

s坐标是沿着reference line的,关于reference line后面介绍,长度是在xy坐标下计算的,应该是通过积分计算的吧(例如下图中的123.45)。
t坐标,是相对于reference line的侧向位置,左正,右负。

这里写图片描述

reference line

reference line是路网结构中一个很重要的概念,绘制地图的时候先是画reference line,reference line包含xy位置坐标、路的形状属性,然后在reference line基础上再去画其他其他元素。

下图是OpenDRIVE中路网结构中的一个road,该road有三部分组成,蓝色的reference line,车道lane,车道lane的其他feature(限速等)。

这里写图片描述

整个地图路网由很多的road构成,而每个road中都会包含reference line,就是一条线,它没有宽度

All roads consist of a reference line which defines the basic geometry (arcs, straight lines etc.). Along
the reference line, various properties of the road can be defined.

reference line,线条有好几种类型,直线,螺旋线等,

The geometry of the reference line is described as a sequence of primitives of various types. The
available primitives are:

  • straight line (constant zero curvature)
  • spiral (linear change of curvature)
  • curve (constant non-zero curvature along run-length)
  • cubic polynom
  • parametric cubic curves

下图为几种常见的reference line,注意图中的两个坐标系,xy和st
这里写图片描述

而在OpenDRIVE数据中,reference line体现在planView元素下的geometry,顾名思义,俯视图下的road几何形状,该road是条直线,螺旋线等等。

 <planView>
            <geometry s="0.0000000000000000e+00" x="-3.0024844302609563e+03" y="2.7962779217697680e+03" hdg="2.8046409307224991e+00" length="1.3647961224498889e+02">
                <arc curvature="-3.3912133325369736e-05" />
            </geometry>
            <geometry s="1.3647961224498889e+02" x="-3.1311844847723842e+03" y="2.8416976011684164e+03" hdg="2.7974752903867355e+00" length="9.9592435217850038e+01">
                <arc curvature="-1.2467775981482813e-03" />
            </geometry>
</planView>

这里写图片描述

一个road的并不是只有一根reference line,因为假如一个road长度为100米,有可能这100米有些地方是直路,有些地方是拐弯的曲线,每一条都是一个geometry标签,通过s(起始位置)和长度进行连接(后一个s是前一个的length)。
而属性中的x,y,hdg分别是投影坐标系xy下的起始点位置以及起始点的角度(定义了曲线方程以及起始点坐标和长度,曲线肯定就能画出来了)。

车道lane

一个road中包含了很多的车道lane(lanes),而车道(lane)本身有宽度(width),以及虚线、实线等属性参数(roadMark)。结合这些参数,我们就能在reference line的基础上将车道画出来。

下面是OpenDRIVE中对应的车道相关的元素,

 <lanes>
            <laneSection s="0.0000000000000000e+00">
                <center>
                    <lane id="0" type="driving" level="false">
                        <link />
                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" material="standard" LDM="none" width="2.9999999999999999e-01" laneChange="both" />
                    </lane>
                </center>
                <right>
                    <lane id="-1" type="driving" level="false">
                        <link>
                            <predecessor id="-1" />
                            <successor id="-1" />
                        </link>
                        <width sOffset="0.0000000000000000e+00" a="3.8890850467340541e+00" b="-1.4514389448175911e-03" c="1.0899364495936138e-04" d="-1.3397356888919692e-06" />
                        <width sOffset="7.6500000000000000e+01" a="3.8161122099921028e+00" b="1.6531839124687595e-03" c="-3.0234314157904548e-06" d="-2.9791355887866248e-08" />
                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" material="standard" LDM="none" width="1.4999999999999999e-01" laneChange="both" />
                    </lane>
                </right>
            </laneSection>
 </lanes>

在lanes下还有个laneSection车道横截面的概念,一个road包含了数个laneSection,每个laneSection中又包含了车道lane,在一个laneSection中车道lane是顺着reference line分为left,center,right。

这里写图片描述

reference line是center,没有宽度width,只是一条线。
left的lane的id为正,right为负。上图中坐边定义了5条车道,1,2,3,-1,-2,而右边多了一条-3。

此外,在lane元素中,width元素定义了车道的宽度,都是基于曲线进行拟合的。roadMark元素定义了车道线的属性,OpenDrive中规定的车道线的属性如下所示,有实线,虚线等。

这里写图片描述

通过上面的介绍,已经画完了一个road,而前面提到OpenDrive地图是由多个road组成,下面介绍如何将这些road连接起来。

road连接

road之间的连接定义了两种(每个road有唯一的ID),一种是有明确的连接关系,例如前后只有一条road,那么通过
successor/predecessor进行连接(例如下图中的road 1和road 2),

In order to navigate through a road network, the application must know about the linkage between different roads. Two types of linkage are possible:

  • successor/predecessor linkage (standard linkage)
  • junctions

Whenever the linkage between two roads is clear, a standard linkage information is sufficient. A junction is required when the successor or predecessor relationship of a road is ambiguous. Here, the application needs to select one of several possibilities.

这里写图片描述

如果前后的连接关系不是很明确,就需要一个junctions,上图road 2的后置节点successor就无法确定,

这里写图片描述

在OpenDrive中,将上图中的3,4,5称为junction,road 3,4,5,称为connecting road,而2称为incoming road,6,7,8称为outgoing road。

具体体现在OpenDrive中如下所示,junction 41的incomingRoad为road 42,而road 55属于junction中的connectingRoad,

    <junction name="normal" id="41">
        <connection id="1" incomingRoad="42" connectingRoad="55" contactPoint="start">
            <laneLink from="-3" to="-3" />
            <laneLink from="-2" to="-2" />
            <laneLink from="-1" to="-1" />
        </connection>
    </junction>

由于road中又包含了很多lanes车道,所以需要将车道的连接关系也表示清楚,上面的laneLink元素就是用来连接lanes的,对road 42和55的-3,-2,-1进行连接(center右边的车道)。

一个完整的例子

这里写图片描述

上图体现了OpenDrive中的路网连接关系,分为:

  • 左边road 10,reference line黑线所在位置,左边有lane 1 ,2,右边为lane -1,-2,-3
  • 上边road 60,reference line黑线所在位置,左边有lane 1 ,2,右边为lane -1,-2
  • 右边road 50,reference line黑线所在位置,左边有lane 1 ,2,右边为lane -1,-2,-3
  • 下边road 70,reference line黑线所在位置,左边有lane 1 ,2,右边为lane -1,-2
  • 中间是一个Junction,包含road 40, road 20,road 30,都是connectingRoad,对应的连接关系为road 10 -1 lane (incoming road)<—>road40(connectingRoad) -1 lane,road 10 -2 lane (incoming road)<—>road30(connectingRoad) -1 lane,road 10 -1 lane (incoming road)<—>road20(connectingRoad) -1 lane,road 10 -2 lane (incoming road)<—>road20(connectingRoad) -2 lane,而outgoingRoad与之类似。

总之,对于一个road来说,先确定reference line,有了reference line的几何形状和位置,然后再确定reference line左右的车道lane,车道lane又有实线和虚线等属性;road 和road之间通过普通连接和Junction进行连接,同时还要将road中的相关车道进行连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenDrive格式地图数据解析 的相关文章

  • java获取所有方法及注释_获取类的方法上的所有方法上的注解

    最近在加深注解这块的理解 很多框架都使用到了注解 直接上代码 注解的实现类 Anno java package com robot test import java lang annotation ElementType import ja
  • 《The Road Less Traveled》,心智成熟之旅

    少有人走的路 Scott Peck 规矩 人生苦海无边 人生不是享乐的过程 是解决一个个问题的过程 这个过程中我们会遇到越来越多的问题 我们要正视问题 而不是选择忽略 忽略问题不会使它消失 到后面也是要自己承担 通俗来说就是 现在所受的苦很
  • 梳理百年深度学习发展史-七月在线机器学习集训营助你把握深度学习浪潮

    作为机器学习最重要的一个分支 深度学习近年来发展迅猛 在国内外都引起了广泛的关注 然而深度学习的火热也不是一时兴起的 而是经历了一段漫长的发展史 接下来我们了解一下深度学习的发展历程 1 深度学习的起源阶段 图1 AI之父 马文 明斯基 1
  • 列表页曝光埋点实现

    列表页曝光埋点实现 以商品为例 要求 商品一半以上出现在视窗中时 上报该行的商品 快速滑动过去的商品不上报 滑动过程中如果一行商品一直未消失在视野中 一半以上 不能重复上报 滑出视野的商品 再次滑入视野时需要再次上报 分析 需要以下信息 商
  • Mybatis---resultMap详解

    目录 一 resultMap介绍 二 自定义映射关系 一 resultMap介绍 该标签的作用是自定义映射关系 Mybatis可以将数据库结果封装到对象中 是因为结果集和对象属性名相同 也就是你写的pojo类型的参数名和数据库的字段名相同
  • Your account has been blocked. fatal: Could not read from remote repository

    1 首先设置自己的账户 https blog csdn net qq 38125058 article details 81209667 2 然后 删除在git配置密码的文件下 home kevin ssh 删除别人的文件
  • Reactive Streams, flux, mono介绍之白话版

    目录 要解决的问题 解决原理 解决方法 发布者Publisher 订阅者Subscriber 订阅对象Subscription 处理者Processor 源码简析 spring中响应式流的应用 服务端技术栈 响应式Http客户端 服务端修改
  • NodeJs入门(一)

    1 process nextTick callback 它的功能是为事件循环设置一项任务 nodeJs会在下一个事件循环时调用callback Node js是单线程的 除了系统IO之外 在它的事件轮询过程中 同一时间只会处理一个事件 你可
  • windows server2016创建AD域账户并登录

    上篇介绍了Windows Server2016下安装配置AD域 查看文章请点这里 接下来介绍创建AD域账户并登录域账户的流程步骤 创建域账户 1 右键AD服务器 选择Active Directory管理中心 2 右键AD名称 选择新建 组织
  • TCP 通信流程

    1 TCP通信过程 TCP 是一个面向连接的 安全的 流式传输协议 这个协议是一个传输层协议 1 面向连接 是一个双向连接 通过三次握手完成 断开连接需要通过四次挥手完成 2 安全 tcp 通信过程中 会对发送的每一数据包都会进行校验 如果
  • Java中使用JDBC操作Postgresql

    目录 在Rocky Linux上安装postgresql 用IntelliJ创建JavaFx项目 画一个表格 建立数据库访问 在Rocky Linux上安装postgresql Rocky的仓库中自带了postgresql安装包 我们直接用
  • ffmpeg: error while loading shared libraries: libavdevice.so.57

    编译完ffmpeg后 在终端敲ffmpeg 反馈如下 ffmpeg error while loading shared libraries libavdevice so 57 cannot open shared object file
  • 在matlab中寻找曲线上离原点距离最近的点的坐标的思考

    syms y x linspace 2 2 200 n length x g for i 1 n a x i t vpa solve y 1 a 2 y 2 sin a cos y y 3 g g t end 对于这个代码主要是想算出对应x

随机推荐

  • 第六章 存储器层次结构 第一节 存储技术之磁盘存储

    磁盘能比RAM存储更大的信息 但是读取速度上比DRAM慢了10万倍 比SRAM慢了100万倍 1 磁盘构造 磁盘是由盘片 platter 构成 盘片中央有一个可以旋转的主轴 它使得盘片以固定的旋转速率旋转 每个盘片有两面或者称为表面 表面覆
  • JDK开发环境配置

    JRE Java Runtime Environment Java运行环境 用来运行JAVA程序 JDK Java Development Kit Java开发工具包 包含JRE JDK 是整个Java的核心 包括了Java运行环境 Jav
  • 深度神经网络加速库cuDNN简介

    深度神经网络加速库cuDNN简介 简介 NVIDIA CUDA深度神经网络库 cuDNN CUDA Deep Neural Network 是用于深度神经网络的 GPU 加速基元库 它提供了 DNN 应用程序中经常出现的例程的高度调整实现
  • JVM面试题

    JVM相关 jvm详解 GC 堆内存参数调优 春 的博客 CSDN博客 jvm堆内存调优 常见JVM面试题及答案整理 Java程序员 张凯的博客 CSDN博客 jvm面试题 JVM的模块 常见问题 JVM的理解 java8虚拟机和之前的变化
  • 表白代码,HTML

    1 在电脑桌面右击鼠标选择新建 文本文档 2 并命名为 biaobai txt 3 打开并且把一下代码复制并粘贴到biaobai txt
  • 【华为OD机试】TLV解析Ⅰ(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • coco数据集

    1 win10安装cocoapi pip install git https github com philferriere cocoapi git subdirectory PythonAPI win10安装cocoapi 君莫笑 CSD
  • [计算机毕业设计]MATLAB的人脸识别

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • BIT Python科学计算三维可视化(一)Tvtk库使用

    文章目录 一 课程来源 二 软件安装 三 Tvtk库使用 1 创建长方体数据源 2 Tvtk库中的其他数据源 3 Tvtk库中显示三维对象 4 Tvtk中的管线技术 1 可视化管线 2 图形管线 4 使用ivtk观察管线 5 Tvtk数据集
  • C++STL中set不存在对应元素时set.find的返回值

    先说结论 用find函数查找不存在的元素时 返回和 end 方法一样的迭代器 1 include
  • ArrayList的用法

    最近做个项目 需要用到ArrayList或List
  • 瑟瑟发抖吧~OpenAI刚刚推出王炸——引入ChatGPT插件,开启AI新生态

    5分钟学会使用ChatGPT 插件 ChatGPT plugins ChatGPT生态建设的开端 ChatGPT插件是什么 OpenAI最新官方blog资料表示 已经在ChatGPT中实现了对插件的初步支持 插件是专门为以安全为核心原则的语
  • Eigen源码阅读——杂文

    目录 README md signature of eigen3 matrix library eigen3 pc in pkg config配置文件 INSTALL CTestCustom cmake in CTest测试 COPYING
  • VS2015 经常卡顿的解决办法

    文章目录 方法1 关闭codelens 方法2 关闭视觉效果 方法3 改变并发编译数 方法4 源代码管理插件选 无 方法5 关闭 IntelliTrace 方法1 关闭codelens 工具 选项 搜索codelens 取消勾选 重启VS
  • 路由器虚拟服务器的设置

    在路由器 帐号和密码登录之后 路由器外网IP 虚拟服务器定义了广域网服务端口和局域网服务器之间的关系 所有对该广域网服务端口的访问都会被重定位给通过IP地址指定的局域网网络服务器 8888是80 你本机的端口 192 168 1 108 是
  • 堆的简单理解和代码实现

    目录 1 堆的概念及结构 1 1概念 1 2性质 2 堆的实现 2 1定义堆 2 2向下调整 2 3向上调整 2 3 2两种建堆方式时间复杂度的比较 2 4堆的初始化 2 5堆的销毁 2 6堆的插入操作 2 7堆的删除操作 2 8获取堆顶元
  • Python输出csv文件中文乱码及解决

    如图所示 python爬取信息后保存为csv格式 打开后中文乱码 原因是编码的缘故 CSV保存是编码格式ANSI 解决办法是以记事本方式打开CSV文件 然后另存为时编码选择UTF 8进行保存即可 失败了 换种方法 df to csv dat
  • unity 贴图设置

    把图片给物体时 由于比例不对 所以看起来不舒服 可以调节红色勾选的两个参数从而调好
  • IDEA下 tomcat&output输出乱码的解决方法

    在主界面选择help进入 选择 在编辑界面如下 添加以下代码 Dfile encoding UTF 8 保存退出即可 可以看到已经恢复正常了
  • OpenDrive格式地图数据解析

    OpenDrive地图解析代码可以参考 https github com liuyf5231 opendriveparser OpenDrive地图文件格式为xml 详细的介绍可以参考 http www opendrive org docs