掌桥专利:专业的专利平台
掌桥专利
首页

一种面向交通仿真的交叉路口通行分配及轨迹计算方法

文献发布时间:2024-04-18 20:02:18


一种面向交通仿真的交叉路口通行分配及轨迹计算方法

技术领域

本发明属于交通工程技术领域,具体为一种面向交通仿真的交叉路口通行分配及轨迹计算方法。

背景技术

20世纪80年代以来,国家大力发展基础交通设施建设,我国大中城市的道路建设取得了很大的进步,现在车联网、智能交通系统(ITS,Intelligent Transport System)也在快速的发展,形成了较为完善的道路交通系统。但随着车辆数量的增长,城市污染也越来越严重、交通压力也越来越大,交通道路的利用率也呈现出不同的差异,对于交通拥堵路段,市政规划就会重新设计和规划,为了对汽车尾气对环境污染进行评估和验证市政道路设计的合理性和有效性,需要根据城市道路数据设计一套三维的交通仿真系统,来测试仿真效果和效率,同时对于城市交通展示、还原事故现场等具有很重要的意义。目前的交通仿真技术,从仿真规模方面来说,还存在仿真规模小、仿真不够灵活、利用价值较局限。从三维仿真方面来说,大多使用3dMax、CAD等图形工具对道路进行建模,而通过程序来对三维路网路口建模的方法都比较复杂,并且需要以计算机图形学知识为基础。

现有技术一,Adam Goode-nough和Scott Brown提出了将CityEnine和SUMO进行融合的方法来构建场景,结合了SUMO的仿真优势和City-Engine城市模型的建模优势。

现有技术一的缺陷,其交叉路口通行分配需要手动设置,不够灵活,遇到道路修改,需要重新设置。

现有技术二,王贤隆等人提出了一种自动构建三维城市路网的方法,实现了平面道路结构和交叉结构的自动识别和三维场景的自动构建。

现有技术二的缺陷,其交叉路口通行分配需要手动设置,不够灵活,遇到道路修改,通行分配需要重新设置。

发明内容

本发明的目的在于提供一种面向交通仿真的交叉路口通行分配及轨迹计算方法,以解决背景技术中提出的交叉路口通行分配需要手动设置,不够灵活,遇到道路修改,需要重新设置的问题。

为解决上述技术问题,本发明所采用的技术方案是:

一种面向交通仿真的交叉路口通行分配及轨迹计算方法,包括以下步骤:

步骤S1,获取交叉路口信息;具体为:通过交叉路口所连接的路段信息列表RoadInfos获取交叉路口信息,路段信息列表中包括路段Id、路段连接路口处的控制点索引MarkerIndex;每条路段的车道分为进口道EnterLanes、出口道ExitLanes;车道信息LaneData包括车道名称、位置以及方向向量;

步骤S2,获取每条路段的进口道和出口道信息;包括以下步骤:

步骤S201,从路段信息列表获取路段轮廓点的矩形点集Polygon,大小为n;

步骤S202,定义两个字典Dictionary>,命名为Road_EnterLanes和Road_ExitLanes,用于存放路段对应的进口道和出口道,字典的键为路段Id,值为车道信息;

步骤S203,定义一个大小为2的数组Pos保存所需的路段轮廓点,用于后面计算车道位置;

步骤S204,循环遍历交叉路口所连接的路段信息列表RoadInfos,判断MarkerIndex是否为0;

步骤S205,若MarkerIndex等于0,则路段左车道为出口道,右车道为进口道,取Polygon[0]、Polygon[1]两点存于Pos中;遍历左车道获取出口道信息存于List,车道名称为RoadId_Left_i;将获取的出口道信息List存放在字典Road_ExitLanes中,键为当前路段Id;遍历右车道获取进口道信息,车道名称为RoadId_Right_i;存放在字典Road_EnterLanes中;

步骤S206,若MarkerIndex不等于0,则路段左车道为进口道,右车道为出口道,取Polygon[n-1]、Polygon[n-2]两点存于Pos中;遍历左车道获取进口道信息存于List,车道名称为RoadId_Left_i;将获取的进口道信息List存放在字典Road_EnterLanes中,键为当前路段Id;遍历右车道获取出口道信息,车道名称为RoadId_Right_i;存放在字典Road_ExitLanes中;

步骤S3,计算各路段进口道分配到其他路的情况;

步骤S4,计算各路段出口道从其他路进来的情况;

步骤S5,车道通行分配和计算车辆路口行驶轨迹。

根据上述技术方案,路段信息以路口为中心顺时针存储。

根据上述技术方案,车道名称包括路段Id(RoadId)、左右方向(Direction)和车道号(LaneNum),即RoadId_Direction_LaneNum。

根据上述技术方案,步骤S205中,遍历左车道具体为:

位置:

Position=Pos[0]+(width+LeftLaneWidth[i]/2)*(Pos[1]-Pos[0]).normalized

其中,width为前面车道宽度之和,LeftLaneWidth[i]为当前车道宽度,normalized为取单位向量;

方向向量:

Vector=Cross(Pos[0]-Position,N).normalized

其中,Cross为叉乘函数,N为路段垂直向上的法线。

根据上述技术方案,步骤S205中,遍历右车道具体为:

位置:

Position=Pos[1]+(width+RightLaneWidth[i]/2)*(Pos[0]-Pos[1]).normalized

其中,width为前面车道宽度之和,RightLaneWidth[i]为当前车道宽度,normalized为取单位向量;

方向向量:

Vector=Cross(Pos[1]-Position,N).normalized

其中,Cross为叉乘函数,N为路段垂直向上的法线。

根据上述技术方案,步骤S3中,具体计算方法包括以下步骤:

步骤S301,首先定义字典Dictionary>FromTo_EnterLanes,键为从一条路段(From)到另一条路段(To)的Id组成的字符串From_To,值为From路段的进口道;

步骤S302,循环遍历交叉路口所连接的路段信息RoadInfos,当前路段信息在列表中的索引为Index,根据路段信息中的RoadId,通过步骤S2获取的字典Road_EnterLane,并从中字典Road_EnterLane中获得当前路段的进口道信息;

步骤S303,对获得的进口道信息进行判断,若进口道数量不为0,则有车道分配路段的系数:

C

其中,InfoCount表示RoadInfos的大小即路段数量,EnterLaneCount表示进口道数量。

根据上述技术方案,根据系数C

步骤S3011,定义步骤次数为count,步长为step,步长系数C

count=CeilToInt(C

其中,CeilToInt(x)为返回大于等于x的最小整数的函数;

步骤S3012,当k=1时,step=0,当k>1时,判断是否有InfoCount-1≥EnterLaneCount,若InfoCount-1大于等于EnterLaneCount,则有:

step=CeilToInt(C

C

若InfoCount-1小于EnterLaneCount,则有:

C

step=CeilToInt(C

步骤S3013,执行内循环,记录分配的情况,判断是否step<count并且step≥0,每次循环结束step递增;创建键=当前路段Id+“_”+第(Index+1+step)%InfoCount路段Id;

步骤S3014,判断键在字典FromTo_EnterLanes中是否存在值,若存在,则直接在值中添加第j车道的进口道信息,若不存在,则新建值,添加第j车道的进口道信息,新增键值对到FromTo_EnterLanes中。

根据上述技术方案,步骤S4中,计算方法具体为:

步骤S401,定义字典Dictionary>FromTo_ExitLanes,键为从一条路段(From)到另一条路段(To)的Id组成的字符串From_To,值为To路段的出口道;

步骤S402,循环遍历交叉路口所连接的路段信息RoadInfos,当前路段信息在列表中的索引为Index,根据路段信息中的RoadId,在步骤S2获取的字典Road_ExitLanes,并从字典Road_ExitLanes中获得当前路段的出口道信息;

步骤S403,根据步骤S402中获得的当前路段的出口道信息,有路段分配车道的系数C

C

其中,InfoCount表示RoadInfos的大小,即路段数量,ExitLaneCount表示出口道数量。

根据上述技术方案,根据系数C

步骤S4011,定义步长次数为count,步长为step,步长系数C

count=CeilToInt(C

其中,CeilToInt(x)为返回大于等于x的最小整数的函数;

步骤S4012,当k=1时,step=0,当k>1时,判断是否ExitLaneCount≥InfoCount-1,若ExitLaneCount大于等于InfoCount-1,则有:

step=CeilToInt(C

C

若ExitLaneCount小于InfoCount-1,则有:

C

step=CeilToInt(C

步骤S4013,执行内循环,记录分配的情况,判断是否step<count并且step≥0,每次循环结束step递增;创建键=第(Index+1+j)%InfoCount路段Id+“_”+当前路段Id;

步骤S4014,判断键在字典FromTo_ExitLanes中是否存在值,若存在,则直接在值中添加第step车道的出口道信息,若不存在,则新建值,添加第step车道的出口道信息,新增键值对到FromTo_ExitLanes中。

根据上述技术方案,步骤S5中,具体计算方法为:

步骤S501,首先定义字典Dictionary>VehicleTrack,键为进口道的车道名称,值为通行情况,Connection为连接信息,由出口道的车道名称,转向类型,车辆行驶轨迹点组成;

步骤S501,经过步骤S3和步骤S4获取到字典FromTo_EnterLanes和FromTo_ExitLanes后,通过字典相同的键获取与路段的进口道相匹配的路段的出口道,完成车道通行的分配;

步骤S502,循环遍历字典FromTo_EnterLanes的键值对,取到值ListEnterLanes;

步骤S503,判断键的值是否包含在字典FromTo_ExitLanes中,若在字典FromTo_ExitLanes中含有键的值,则取到ListExitLanes,则有进口道分配出口道的系数:

C

其中,EnterLaneCount表示列表EnterLanes的大小,ExitLaneCount表示列表ExitLanes的大小;

根据系数C

步骤B1,定义步长次数为count,步长为step,步长系数C

count=CeilToInt(C

其中,CeilToInt(x)为返回大于等于x的最小整数的函数;

步骤B2,当k=1时,step=0,当k>1时,判断是否ExitLaneCount≥EnterLaneCount,若ExitLaneCount大于等于EnterLaneCount,则:

step=CeilToInt(C

C

若ExitLaneCount小于EnterLaneCount,则:

C

step=CeilToInt(C

步骤B3,执行内循环,记录分配的情况,判断是否有step<count并且step≥0,判断成功执行继续,不成功则结束循环;

步骤B4,一次循环结束后step递增;创建键=EnterLanes[i].LaneName,判断键在字典VehicleTrack中是否存在值;

步骤B5,判断步骤S5014若存在,则新建Connection对象,出口道名称为ExitLanes[step].LaneName;

步骤B6,计算转向类型,通过计算夹角的大小来判断转向类型,具体为:

angle=Angle(EnterLanes[i].Vector,ExitLanes[step].Vector)

其中,Angle(V

步骤B7,当45<angle<165时,判断点乘结果的大小来确定左转或右转,具体为:

Dot(Cross(EnterLanes[i].Vector,ExitLanes[step].Vector),V

其中,Dot为点乘函数,Cross为叉乘函数,向量V

车辆行驶轨迹点计算方法如下:

步骤B8,计算进口道与出口道的交点;进口道车道位置、方向和出口道位置、方向在步骤S2中已求得,进口道车道位置和方向能确定一条直线,出口道车道位置和方向能确定另一条直线,两条不平行的直线能求出交点Intersection;

步骤B9,已知进口道位置、出口道位置以及步骤S5018中计算得到的交点,已知三点再通过贝塞尔曲线算法求出进口道到出口道之间的车辆行驶轨迹路径点;

步骤B10,在值中添加新建的Connection对象;

步骤B11,若步骤S5014中值不存在,则新建值,添加新建的Connection对象,新增键值对到VehicleTrack中。

与现有技术相比,本发明具有以下有益效果:

通过本发明中的方法,车道通行分配自动计算,无需手动设置,有效的降低了交叉路口的放置设置的工作量,解决了现有交通仿真系统中交叉路口通行分配存在手动设置工作量大、灵活性低的问题。

通过本发明中的方法,还能自动计算仿真车辆路口行驶轨迹以及自动判断路口仿真车辆转向类型。

附图说明

图1为本发明步骤路段与路口结构示意图;

图2为本发明中车道信息示意图;

图3为本发明中道分路示意图;

图4为本发明中路分道示意图;

图5为本发明T型交叉路口车道通行分配效果图;

图6为本发明十字交叉路口车道通行分配效果图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一

一种面向交通仿真的交叉路口通行分配及轨迹计算方法,包括以下步骤:

如图1所示,步骤S1,获取交叉路口信息;具体为:通过交叉路口所连接的路段信息列表(RoadInfos)获取交叉路口信息,路段信息列表中包括路段Id、路段连接路口处的控制点索引MarkerIndex;每条路段的车道分为进口道EnterLanes、出口道ExitLanes;车道信息(LaneData)包括车道名称、位置以及方向向量;

如图2所示,步骤S2,获取每条路段的进出口车道信息;包括以下步骤:

步骤S201,获取路段轮廓点的矩形点集Polygon,大小为n;

步骤S202,定义两个字典Dictionary>,命名为Road_EnterLanes,和Road_ExitLanes,用于存放路段对应的进口道和出口道,字典的键为路段Id,值为车道信息;

步骤S203,定义一个大小为2的数组Pos保存所需的路段轮廓点,用于后面计算车道位置;

步骤S204,循环遍历交叉路口所连接的路段信息RoadInfos,判断MarkerIndex是否为0;

步骤S205,若MarkerIndex等于0,则路段左车道为出口道,右车道为进口道,取Polygon[0]、Polygon[1]两点存于Pos中;遍历左车道获取出口道信息存于List,车道名称为RoadId_Left_i;将获取的出口道信息List存放在字典Road_ExitLanes中,键为当前路段Id;遍历右车道获取进口道信息,车道名称为RoadId_Right_i;存放在字典Road_EnterLanes中;

步骤S206,若MarkerIndex不等于0,则路段左车道为进口道,右车道为出口车道,取Polygon[n-1]、Polygon[n-2]两点存于Pos中;遍历左车道获取进口道信息存于List,车道名称为RoadId_Left_i;将获取的进口道信息List存放在字典Road_EnterLanes中,键为当前路段Id;遍历右车道获取出口道信息,车道名称为RoadId_Right_i;存放在字典Road_ExitLanes中;

步骤S3,计算各路段进口道分配到其他路的情况;

步骤S4,计算各路段出口道从其他路进来的情况;

步骤S5,车道通行分配和计算车辆路口行驶轨迹。

如图5和图6所示,通过本发明中的方法,车道通行分配自动计算,无需手动设置,有效的降低了交叉路口的放置设置的工作量,解决了现有交通仿真系统中交叉路口通行分配存在手动设置工作量大、灵活性低的问题

通过本发明中的方法,还能自动计算仿真车辆路口行驶轨迹以及自动判断路口仿真车辆转向类型。

实施例二

本发明的发明构思为:

步骤S1、确定交叉路口信息

已知交叉路口所连接的路段信息列表(RoadInfos),路段信息包括路段Id、路段连接路口处的控制点索引MarkerIndex(0或者n,0表示起始控制点,n表示末尾控制点),路段信息以路口为中心顺时针存储,如图1所示。

每条路段的车道分为进口道EnterLanes、出口道ExitLanes,车道信息(LaneData)包括车道名称、位置、方向向量,其中车道名称由路段Id(RoadId)、左右方向(Direction)、车道号(LaneNum)组合构成,即RoadId_Direction_LaneNum,车道的左右方向是指以路段控制点起始到末尾的方向分左右车道,车道号则是以路段从外到内的第几车道,车道号以0向内递增,位置(Position)为路段车道与路口连接处的三维空间点坐标,方向向量(Vector)则为车道的方向。

步骤S2、获取每条路段的进出口车道信息

已知路段轮廓点为矩形点集Polygon,大小为n。

首先定义两个字典Dictionary>,键为路段Id,值为路段车道信息,分别为Road_EnterLanes,Road_ExitLanes,存放路段对应的进口道和出口道,定义一个大小为2的数组Pos保存所需的路段轮廓点,用于后面计算车道位置。

循环遍历交叉路口所连接的路段信息RoadInfos,判断MarkerIndex是否为0;若等于0,则路段左车道为出口道,右车道为进口道,取Polygon[0]、Polygon[1]两点存于Pos中;若不等于0,则路段左车道为进口道,右车道为出口道,取Polygon[n-1]、Polygon[n-2]两点存于Pos中。

如图2所示,以MarkerIndex等于0为例,定义i=0,依次递增,遍历左车道可以获取进口道信息存于List,车道名称为RoadId_Left_i;位置为:

Position=Pos[0]+(width+LeftLaneWidth[i]/2)*(Pos[1]-Pos[0]).normalized

其中,width为前面车道宽度之和,LeftLaneWidth[i]为当前车道宽度,normalized为取单位向量;方向向量为:

Vector=Cross(Pos[0]-Position,N).normalized

其中,Cross为叉乘函数,N为路段垂直向上的法线;将获取的进口道信息List存放在字典Road_EnterLanes中,键为当前路段Id。同理遍历右车道可获取出口道信息,车道名称为RoadId_Right_i;

位置为:

Position=Pos[1]+(width+RightLaneWidth[i]/2)*(Pos[0]-Pos[1]).normalized;

方向向量为:

Vector=Cross(Pos[1]-Position,N).normalized

存放在字典Road_ExitLanes中。

步骤S3、计算各路段进口道分配到其他路的情况

如图3所示,首先定义字典Dictionary>FromTo_EnterLanes,键为从一条路段(From)到另一条路段(To)的Id组成的字符串From_To,值为From路段的进口道;

循环遍历交叉路口所连接的路段信息RoadInfos,当前路段信息在列表中的索引为Index,根据路段信息中的RoadId,通过步骤S2获取的字典Road_EnterLane,并从中字典Road_EnterLane中获得当前路段的进口道信息;

对获得的进口道信息进行判断,若进口道数量不为0,则有车道分配路段的系数:

C

其中,InfoCount表示RoadInfos的大小即路段数量,EnterLaneCount表示进口道数量。

可以根据系数C

定义步长次数(步骤次数为step递增的最大值)为count,步长为step,步长系数C

count=CeilToInt(C

其中,CeilToInt(x)为返回大于等于x的最小整数的函数;

当k=1时,step=0,当k>1时,判断是否有InfoCount-1≥EnterLaneCount,若InfoCount-1大于等于EnterLaneCount,则有:

step=CeilToInt(C

C

若InfoCount-1小于EnterLaneCount,则有:

C

step=CeilToInt(C

执行内循环,记录分配的情况,判断是否step<count并且step≥0,每次循环结束step递增;创建键=当前路段Id+“_”+第(Index+1+step)%InfoCount路段Id;例如图1中,4条路段,则infoCount=4,当前路段为第一条时index=0,当step=0时,则(index+1+step)%InfoCount=1%4=1,为第二条路段。路段1的id为0,路段2的id为1,则key=“0_1”。

判断键在字典FromTo_EnterLanes中是否存在值,若存在,则直接在值中添加第j车道的进口道信息,若不存在,则新建值,添加第j车道的进口道信息,新增键值对到FromTo_EnterLanes中。

执行完整个流程可以获取到各路段进口道分配到其他路的情况,以键值对的形式存储在字典FromTo_EnterLanes中。

步骤S4、计算各路段出口道从其他路进来的情况

如图4所示,定义字典Dictionary>FromTo_ExitLanes,键为从一条路段(From)到另一条路段(To)的Id组成的字符串From_To,值为To路段的出口道;

循环遍历交叉路口所连接的路段信息RoadInfos,当前路段信息在列表中的索引为Index,根据路段信息中的RoadId,在步骤S2获取的字典Road_ExitLanes,并从字典Road_ExitLanes中获得当前路段的出口道信息;

根据获得的当前路段的出口道信息,有路段分配车道的系数C

C

其中,InfoCount表示RoadInfos的大小即路段数量,ExitLaneCount表示出口道数量。

可以根据系数C

定义步长次数为count,步长为step,步长系数C

count=CeilToInt(C

其中,CeilToInt(x)为返回大于等于x的最小整数的函数;

当k=1时,step=0,当k>1时,判断是否ExitLaneCount≥InfoCount-1,若ExitLaneCount大于等于InfoCount-1,则有:

step=CeilToInt(C

C

若ExitLaneCount小于InfoCount-1,则有:

C

step=CeilToInt(C

执行内循环,记录分配的情况,判断是否step<count并且step≥0,每次循环结束step递增;创建键=第(Index+1+j)%InfoCount路段Id+“_”+当前路段Id;

判断键在字典FromTo_ExitLanes中是否存在值,若存在,则直接在值中添加第step车道的出口道信息,若不存在,则新建值,添加第step车道的出口道信息,新增键值对到FromTo_ExitLanes中。

步骤S5、车道通行分配和计算车辆路口行驶轨迹

首先定义字典Dictionary>VehicleTrack,键为进口道车道名称,值为通行情况,Connection为连接信息,由出口道车道名称,转向类型,车辆行驶轨迹点组成;

经过步骤S3和步骤S4获取到字典FromTo_EnterLanes和FromTo_ExitLanes后,通过字典相同的键获取与路段的进口道相匹配的路段的出口道,完成车道通行的分配;

循环遍历字典FromTo_EnterLanes,取到键键和值ListEnterLanes;

判断键的值是否包含在字典FromTo_ExitLanes中,若在字典FromTo_ExitLanes中含有键的值,则取到ListExitLanes,则有进口道分配出口道的系数:

C

其中,EnterLaneCount表示列表EnterLanes的大小,ExitLaneCount表示列表ExitLanes的大小。

可以根据系数C

定义步长次数为count,步长为step,步长系数C

count=CeilToInt(C

其中,CeilToInt(x)为返回大于等于x的最小整数的函数;

当k=1时,step=0,当k>1时,判断是否ExitLaneCount≥EnterLaneCount,若ExitLaneCount大于等于EnterLaneCount,则:

step=CeilToInt(C

C

若ExitLaneCount小于EnterLaneCount,则:

C

step=CeilToInt(C

执行内循环,记录分配的情况,判断是否有step<count并且step≥0,判断成功执行继续,不成功则结束循环;

一次循环结束后step递增;创建键=EnterLanes[i].LaneName,判断键在字典VehicleTrack中是否存在值,若存在,则新建Connection对象,出口道名称为ExitLanes[step].LaneName;

计算转向类型,通过计算夹角的大小来判断转向类型,具体为:

angle=Angle(EnterLanes[i].Vector,ExitLanes[step].Vector),

其中,Angle(V

判断点乘结果的大小,具体为:

Dot(Cross(EnterLanes[i].Vector,ExitLanes[step].Vector),V

其中,Dot为点乘函数,Cross为叉乘函数,向量V

车辆行驶轨迹点计算方法如下:

通过计算进口道与出口道的交点,进口道车道位置、方向和出口道位置、方向在步骤S2中已求得,即可求出两线之间的交点Intersection,已知进口道车道位置、出口道位置、交点三点,再通过贝塞尔曲线算法求出进口道到出口道之间的车辆行驶轨迹路径点。

在值中添加新建Connection对象。

若不存在,则新建值,添加新建的Connection对象,新增键值对到VehicleTrack中。执行完整个流程可以获取车道通行分配和车辆路口行驶轨迹,存储在字典VehicleTrack中。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。

最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术分类

06120116581303