def test_createMShape(self): roads = [] roads.append(pyodrx.create_straight_road(0, 10)) roads.append(self.roadBuilder.createMShape(1, 1, np.pi / 1.5, 10)) roads.append(pyodrx.create_straight_road(2, 10)) roads[0].add_successor(pyodrx.ElementType.junction, 1) roads[1].add_predecessor(pyodrx.ElementType.road, 0, pyodrx.ContactPoint.end) # roads[1].add_predecessor(pyodrx.ElementType.road,0,pyodrx.ContactPoint.start) roads[1].add_successor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[2].add_predecessor(pyodrx.ElementType.junction, 1) junction = self.junctionBuilder.createJunctionForASeriesOfRoads(roads) odrName = "test_connectionRoad" odr = extensions.createOdr(odrName, roads, [junction]) extensions.view_road( odr, os.path.join('..', self.configuration.get("esminipath"))) xmlPath = f"output/m-shape.xodr" odr.write_xml(xmlPath) extensions.saveRoadImageFromFile(xmlPath, self.esminiPath)
def test_createMShapeRightLanes(self): roads = [] roads.append(pyodrx.create_straight_road(0, 10)) roads.append( self.roadBuilder.createMShape( 1, 1, -np.pi / 1.5, 10, laneSides=junctions.LaneSides.RIGHT, direction=CircularDirection.COUNTERCLOCK_WISE)) roads.append(pyodrx.create_straight_road(2, 10)) roads[0].add_successor(pyodrx.ElementType.junction, 1) roads[1].add_predecessor(pyodrx.ElementType.road, 0, pyodrx.ContactPoint.end) # roads[1].add_predecessor(pyodrx.ElementType.road,0,pyodrx.ContactPoint.start) roads[1].add_successor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[2].add_predecessor(pyodrx.ElementType.junction, 1) junction = self.junctionBuilder.createJunctionForASeriesOfRoads(roads) odrName = "test_connectionRoad" odr = extensions.createOdr(odrName, roads, [junction]) extensions.view_road( odr, os.path.join('..', self.configuration.get("esminipath")))
def test_cubicParams(self): roads = [] roads.append(pyodrx.create_straight_road(0, 10)) roads.append(self.roadBuilder.createParamPoly3(1, isJunction=True)) roads.append(pyodrx.create_straight_road(2, 1)) roads[0].add_successor(pyodrx.ElementType.junction, 1) roads[1].add_predecessor(pyodrx.ElementType.road, 0, pyodrx.ContactPoint.end) roads[1].add_successor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[2].add_predecessor(pyodrx.ElementType.junction, 1) con1 = pyodrx.Connection(0, 1, pyodrx.ContactPoint.start) con1.add_lanelink(-1, -1) junction = pyodrx.Junction('test', 1) junction.add_connection(con1) odr = pyodrx.OpenDrive('test') for r in roads: odr.add_road(r) odr.add_junction(junction) odr.adjust_roads_and_lanes() extensions.view_road(odr, os.path.join('..', 'F:\\myProjects\\av\\esmini'))
def test_getCurvatureForAngleAndLength(self): numberofLanes = 10 laneOffset = 3 # angle = 120 # curve, angle = AngleCurvatureMap.getCurvatureForNonOverlappingRoads(angle, numberofLanes, laneOffset) angle = np.pi * 1.2 length = 20 # curve, angle = AngleCurvatureMap.getCurvatureForNonOverlappingRoads(angle, numberofLanes, laneOffset) maxCurve = AngleCurvatureMap.getMaxCurvatureAgainstMaxRoadWidth( angle, numberofLanes * laneOffset) curve = AngleCurvatureMap.getCurvatureForAngleAndLength(angle, length) print(f"max curve {maxCurve}, current curve {curve}") roads = [] roads.append( pyodrx.create_straight_road(0, 50, n_lanes=numberofLanes, lane_offset=laneOffset)) roads.append( self.roadBuilder. createSimpleCurveWithLongArcWithLaneNumberandOffset( 1, angle, False, curvature=curve, _n_lanes=numberofLanes, _lane_offset=laneOffset)) roads.append( pyodrx.create_straight_road(2, 50, n_lanes=numberofLanes, lane_offset=laneOffset)) roads[0].add_successor(pyodrx.ElementType.road, 1, pyodrx.ContactPoint.start) roads[1].add_predecessor(pyodrx.ElementType.road, 0, pyodrx.ContactPoint.end) roads[1].add_successor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[2].add_predecessor(pyodrx.ElementType.road, 1, pyodrx.ContactPoint.end) odrName = "curve_test" odr = extensions.createOdr(odrName, roads, []) extensions.view_road(odr, self.esminiPath)
def getConnectionRoadBetween(self, newRoadId, road1, road2, cp1=pyodrx.ContactPoint.end, cp2=pyodrx.ContactPoint.start, isJunction=True): """ Works only after roads has been adjusted. For now we will create a straight road which connects the reference lines of the roads, starts at second road and ends that the first. Args: road1 ([type]): first road road2 ([type]): second road cp1 ([type], optional): [description]. Defaults to pyodrx.ContactPoint.end. end for the roads which have end points in a junction cp2 ([type], optional): [description]. Defaults to pyodrx.ContactPoint.start. start for the roads which have start points in a junction """ junction = self.getJunctionSelection(isJunction) x1, y1, h1 = road1.getPosition(cp1) x2, y2, h2 = road2.getPosition(cp2) newRoadLength = math.sqrt((x1 - x2)**2 + (y1 - y2)**2) # fix heading. newConnection = pyodrx.create_straight_road(newRoadId, newRoadLength, junction=junction) return newConnection
def random2ways2Lanes(self, angleBetweenRoads): # print( f"random2ways2Lanes: creating a road network for angle: {math.degrees(angleBetweenRoads)}") roads = [] roads.append(pyodrx.create_straight_road(0, length=self.straightRoadLen)) # cannot reuse roads due to some references to links cannot be reinitialized with pyodrx lib. roads.append(self.createRandomConnectionConnectionRoad(1, angleBetweenRoads)) roads.append(pyodrx.create_straight_road(2, length=self.straightRoadLen)) self.link3RoadsWithMidAsJunction(roads) junction = self.create2RoadJunction(roads) self.lastId += 1 odrName = 'R2_L2_' + str(self.lastId) odr = self.createOdr(odrName, roads, [junction]) return odr
def test_RightLane(self): # test scenario for connection road roads = [] roads.append(pyodrx.create_straight_road(0, 10)) # roads.append(self.roadBuilder.createSimpleCurve(1, np.pi/4, True, curvature = 0.2)) # roads.append(pyodrx.create_straight_road(2, 10)) # roads[0].add_successor(pyodrx.ElementType.junction,1) # roads[1].add_predecessor(pyodrx.ElementType.road,0,pyodrx.ContactPoint.end) # # roads[1].add_predecessor(pyodrx.ElementType.road,0,pyodrx.ContactPoint.start) # roads[1].add_successor(pyodrx.ElementType.road,2,pyodrx.ContactPoint.start) # roads[2].add_predecessor(pyodrx.ElementType.junction,1, pyodrx.ContactPoint.end) odrName = "test_connectionRoad" odr = extensions.createOdrByPredecessor(odrName, roads, []) self.laneBuilder.addRightTurnLaneUS(roads[0], 3) # self.laneBuilder.addRightLaneUS(roads[1]) odr.resetAndReadjust(byPredecessor=True) extensions.view_road( odr, os.path.join('..', self.configuration.get("esminipath"))) xmlPath = f"output/test-RightLane.xodr" odr.write_xml(xmlPath)
def test_repeated_object(): object1 = pyodrx.Object(s=10.0, t=-2, dynamic=pyodrx.Dynamic.no, orientation=pyodrx.Orientation.positive, zOffset=0.00, height=1.0, Type=pyodrx.ObjectType.pole) object1.repeat(100, 50) road = pyodrx.create_straight_road(0) road.add_object(object1) pyodrx.prettyprint(road.get_element())
def createRandomConnectionConnectionRoad(self, connectionRoadId, angleBetweenRoads): """The magic connectionRoad Args: angleBetweenRoads ([type]): The angle between the roads which this connectionRoad is suppose to connect together connectionRoadId ([type]): id to be assigned to the new connection road. """ if angleBetweenRoads > 3.05: # when it's greater than 174 degrees, create a straight road return pyodrx.create_straight_road(connectionRoadId, length=self.straightRoadLen, junction=1) connectionRoad = self.roadBuilder.createRandomCurve(connectionRoadId, angleBetweenRoads, isJunction=True) return connectionRoad
def test_object_roadside(): road = pyodrx.create_straight_road(0) odr = pyodrx.OpenDrive('myroad') odr.add_road(road) odr.adjust_roads_and_lanes() object1 = pyodrx.Object(s=0, t=0, dynamic=pyodrx.Dynamic.no, orientation=pyodrx.Orientation.positive, zOffset=0.00, height=1.0, Type=pyodrx.ObjectType.pole) road.add_object_roadside(object1, 50, tOffset=0.85) pyodrx.prettyprint(road.get_element())
def test_object(): object1 = pyodrx.Object(s=10.0, t=-2, dynamic=pyodrx.Dynamic.no, orientation=pyodrx.Orientation.positive, zOffset=0.00, id="1", height=1.0, Type=pyodrx.ObjectType.pole) #same chosen ID should cause warning and be resolved automatically object2 = pyodrx.Object(s=20.0, t=-2, dynamic=pyodrx.Dynamic.no, orientation=pyodrx.Orientation.positive, zOffset=0.00, height=10, id="1", Type=pyodrx.ObjectType.streetLamp) road = pyodrx.create_straight_road(0) road.add_object([object1, object2]) pyodrx.prettyprint(road.get_element())
def test_signal(): signal1 = pyodrx.Signal(s=10.0, t=-2, dynamic=pyodrx.Dynamic.no, orientation=pyodrx.Orientation.positive, zOffset=0.00, country="US", Type="R1", subtype="1") signal2 = pyodrx.Signal(s=20.0, t=-2, dynamic=pyodrx.Dynamic.no, orientation=pyodrx.Orientation.positive, country="DEU", Type="274", subtype="120", value=120, unit="km/h") road = pyodrx.create_straight_road(0) road.add_signal(signal1) road.add_signal(signal2) pyodrx.prettyprint(road.get_element())
def test_getConnectionRoadBetween(self): # test scenario for connection road roads = [] roads.append(pyodrx.create_straight_road(0, 10)) roads.append( self.roadBuilder.curveBuilder.createSimple(1, np.pi / 4, True, curvature=0.2)) roads.append(pyodrx.create_straight_road(2, 10)) roads.append( self.roadBuilder.curveBuilder.createSimple(3, np.pi / 3, True, curvature=0.2)) roads.append(pyodrx.create_straight_road(4, 10)) roads.append( self.roadBuilder.curveBuilder.createSimple(5, np.pi / 2, True, curvature=0.2)) roads.append(pyodrx.create_straight_road(6, 10)) roads[0].add_successor(pyodrx.ElementType.junction, 1) # roads[1].add_predecessor(pyodrx.ElementType.road,0,pyodrx.ContactPoint.end) roads[1].add_predecessor(pyodrx.ElementType.road, 0, pyodrx.ContactPoint.start) roads[1].add_successor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[2].add_predecessor(pyodrx.ElementType.junction, 1) roads[2].add_successor(pyodrx.ElementType.junction, 3) roads[3].add_predecessor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[3].add_successor(pyodrx.ElementType.road, 4, pyodrx.ContactPoint.start) roads[4].add_predecessor(pyodrx.ElementType.junction, 3) roads[4].add_successor(pyodrx.ElementType.junction, 5) roads[5].add_predecessor(pyodrx.ElementType.road, 4, pyodrx.ContactPoint.start) roads[5].add_successor(pyodrx.ElementType.road, 6, pyodrx.ContactPoint.start) roads[6].add_predecessor(pyodrx.ElementType.junction, 5) junction = self.junctionBuilder.createJunctionForASeriesOfRoads(roads) odrName = "test_connectionRoad" odr = extensions.createOdr(odrName, roads, [junction]) lastConnection = self.harvester.junctionBuilder.createLastConnectionForLastAndFirstRoad( 7, roads, junction, cp1=pyodrx.ContactPoint.start) roads.append(lastConnection) odr.add_road(lastConnection) # randConnection = self.harvester.junctionBuilder.createConnectionFor2Roads(8, roads[0], roads[4], junction, cp1=pyodrx.ContactPoint.start) # roads.append(randConnection) # odr.add_road(randConnection) # randConnection2 = self.harvester.junctionBuilder.createConnectionFor2Roads(9, roads[2], roads[6], junction, cp1=pyodrx.ContactPoint.start) # roads.append(randConnection2) # odr.add_road(randConnection2) # odr.reset() # odr.add_road(lastConnection) # odr.adjust_roads_and_lanes() odr.resetAndReadjust() # pyodrx.prettyprint(odr.get_element()) odr.write_xml(f"output/test_connectionRoad.xodr") # extensions.printRoadPositions(odr) extensions.view_road( odr, os.path.join('..', self.configuration.get("esminipath"))) pass
def test_AdjustStartPointsForAnyRoadCombinations(self): # test scenario for connection road roads = [] roads.append(pyodrx.create_straight_road(0, 10)) roads.append( self.roadBuilder.curveBuilder.createSimpleCurveWithLongArc( 1, np.pi / 4, False, curvature=0.2)) roads.append(pyodrx.create_straight_road(2, 10)) roads.append( self.roadBuilder.curveBuilder.createSimpleCurveWithLongArc( 3, np.pi / 3, True, curvature=0.2)) roads.append(pyodrx.create_straight_road(4, 10)) roads.append( self.roadBuilder.curveBuilder.createSimpleCurveWithLongArc( 5, np.pi / 2, True, curvature=0.2)) roads.append(pyodrx.create_straight_road(6, 10)) roads[0].add_successor(pyodrx.ElementType.road, 1, pyodrx.ContactPoint.start) # roads[1].add_predecessor(pyodrx.ElementType.road,0,pyodrx.ContactPoint.end) roads[1].add_predecessor(pyodrx.ElementType.road, 0, pyodrx.ContactPoint.start) roads[1].add_successor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[2].add_predecessor(pyodrx.ElementType.road, 1, pyodrx.ContactPoint.end) roads[2].add_successor(pyodrx.ElementType.junction, 3) roads[3].add_predecessor(pyodrx.ElementType.road, 2, pyodrx.ContactPoint.start) roads[3].add_successor(pyodrx.ElementType.road, 4, pyodrx.ContactPoint.start) roads[4].add_predecessor(pyodrx.ElementType.junction, 3) roads[4].add_successor(pyodrx.ElementType.junction, 5) roads[5].add_predecessor(pyodrx.ElementType.road, 4, pyodrx.ContactPoint.start) roads[5].add_successor(pyodrx.ElementType.road, 6, pyodrx.ContactPoint.start) roads[6].add_predecessor(pyodrx.ElementType.junction, 5) junction = self.junctionBuilder.createJunctionForASeriesOfRoads(roads) odrName = "test_connectionRoad" odr = extensions.createOdr(odrName, roads, [junction]) lastConnection = self.harvester.junctionBuilder.createLastConnectionForLastAndFirstRoad( 7, roads, junction, cp1=pyodrx.ContactPoint.start) roads.append(lastConnection) odr.add_road(lastConnection) # randConnection = self.harvester.junctionBuilder.createConnectionFor2Roads(8, roads[0], roads[4], junction, cp1=pyodrx.ContactPoint.start) # roads.append(randConnection) # odr.add_road(randConnection) # randConnection2 = self.harvester.junctionBuilder.createConnectionFor2Roads(9, roads[2], roads[6], junction, cp1=pyodrx.ContactPoint.start) # roads.append(randConnection2) # odr.add_road(randConnection2) odr.resetAndReadjust() extensions.printRoadPositions(odr) extensions.view_road( odr, os.path.join('..', self.configuration.get("esminipath"))) pass
roads = [] incoming_roads = 4 angles = [] for i in range(incoming_roads): signal1 = pyodrx.Signal(s=10.0, t=2, dynamic="no", orientation="+", zOffset=0.00, country="US", Type="R1", subtype="1", value=0.00) signals = pyodrx.Signals() signals.add_signal(signal1) roads.append(pyodrx.create_straight_road(i, signals=signals)) # use this instead to change the number of lanes in the crossing # roads.append(pyodrx.generators.create_straight_road(i, length=100, junction=-1, n_lanes=2, lane_offset=3)) angles.append(i * 2 * np.pi / incoming_roads) # use this for a T-crossing instead # angles = [0,np.pi/2, 3*np.pi/2] print(roads) junc = pyodrx.create_junction_roads(roads, angles, 8) odr = pyodrx.OpenDrive('myroad') junction = pyodrx.create_junction(junc, 1, roads) odr.add_junction(junction) for r in roads: odr.add_road(r)
import numpy as np import os import pyodrx roads = [] numintersections = 4 # 3 or 4 angles = [] for i in range(numintersections): roads.append(pyodrx.create_straight_road(i)) # use this instead to change the number of lanes in the crossing #roads.append(pyodrx.generators.create_straight_road(i, length=100, junction=-1, n_lanes=2, lane_offset=3)) angles.append(i * 2*np.pi/numintersections) # use this for a T-crossing instead # angles = [0,np.pi/2, 3*np.pi/2] print(roads) junc = pyodrx.create_junction_roads(roads,angles,8) odr = pyodrx.OpenDrive('myroad') junction = pyodrx.create_junction(junc,1,roads) odr.add_junction(junction) for r in roads: odr.add_road(r) for j in junc: odr.add_road(j)