一、介绍
scenariogeneration可以用来生成ASAM标准的地图文件,包括xosc (OpenSCENARIO)和xodr (OpenDRIVE)两种格式。
github地址:

GitHub - pyoscx/scenariogeneration: Python library to generate linked OpenDRIVE and OpenSCENARIO filesPython library to generate linked OpenDRIVE and OpenSCENARIO files - GitHub - pyoscx/scenariogeneration: Python library to generate linked OpenDRIVE and OpenSCENARIO fileshttps://github.com/pyoscx/scenariogenerationAPI文档:scenariogeneration API documentation
二、使用笔记
本文主要用来记录通过scenariogeneration来生成opendrive地图的过程。
1.创建道路
from scenariogeneration import xodr, prettyprint
from scenariogeneration.xodr import LaneType
#创建planview
x_start = 234.234
y_strat = 555.343
h_start = 98
planview = xodr.PlanView(x_start, y_strat, h_start)
#描述参考线并将其添加到planview上
line1 = xodr.Line(100)
arc1 = xodr.Arc(0.05, angle=np.pi / 2)
line2 = xodr.Line(100)
cloth1 = xodr.Spiral(0.05, -0.1, 30)
line3 = xodr.Line(100)
planview.add_geometry(line1)
planview.add_geometry(arc1)
planview.add_geometry(line2)
planview.add_geometry(cloth1)
planview.add_geometry(line3)
##创建中心车道
rm = xodr.RoadMark(xodr.RoadMarkType.solid, 0.2) ##设置车道中心线路标属性
centerlane = xodr.Lane(a=2)
centerlane.add_roadmark(rm)
##创建车道组
lanesec = xodr.LaneSection(0, centerlane)
##添加左右车道
lane2 = xodr.Lane(LaneType.parking,a=3)
lane2.add_roadmark(rm)
lane3 = xodr.Lane(LaneType.shoulder,a=3)
lane3.add_roadmark(rm)
lanesec.add_left_lane(lane2)
lanesec.add_right_lane(lane3)
##将车道段添加到车道中
lanes = xodr.Lanes()
lanes.add_lanesection(lanesec)
##创建道路
road = xodr.Road(1, planview, lanes)
odr = xodr.OpenDrive("road1")
odr.add_road(road)
##根据前驱后继(如果有配置)调整道路的初始位置
odr.adjust_roads_and_lanes()
##打印地图文件
prettyprint(odr.get_element())
##保存地图文件
odr.write_xml("test.xodr")
2.添加object
生成object对象
def get_road_object(self, crosswalk, hdg, point0, s):
outlines = xodr.Outline(True)
for point in crosswalk:
crosswalk_u, crosswalk_v = self.covt_uv(
point, point0[0], point0[1], hdg)
outlines.add_corner(xodr.CornerLocal(
crosswalk_u, crosswalk_v, 0, 0))
road_object = xodr.Object(
s, 0, Type=xodr.ObjectType.crosswalk, name="crosswalk", hdg=0)
road_object.add_outline(outlines)
return road_object
添加到road上:
road.add_object(road_object)
3.生成signal
def get_road_signals(self, s, t, width, height, zoffset=5):
signal = xodr.Signal(s=s, t=t, country="", Type="1000001",
subtype="1", width=width, height=height, zOffset=zoffset)
return signal
标志 | Signal_3Light_Post01(红绿灯) | Sign_Stop(停车让行) | Sign_Yield(减速让行) |
type | 1000001 | 206 | 205 |
图示 | | | |
三. 问题汇总
1.road生成方式不同导致无法通过xodr.create_lane_links()自动连接两条道路的车道--scenariogeneration 0.13.2版本已修复