def test_arc(): arc = pyodrx.Arc(1, length=1) p = arc.get_element() pyodrx.prettyprint(p) arc = pyodrx.Arc(1, angle=1) p = arc.get_element() pyodrx.prettyprint(p)
def createCurveByLength(self, roadId, length, isJunction=False, curvature=StandardCurvature.Medium.value): junction = self.getJunctionSelection(isJunction) n_lanes = 1 lane_offset = 3 pv = ExtendedPlanview() arc = pyodrx.Arc(curvature, length=length) pv.add_geometry(arc) # create lanes lsec = pyodrx.LaneSection(0, pyodrx.standard_lane()) for _ in range(1, n_lanes + 1, 1): lsec.add_right_lane(pyodrx.standard_lane(lane_offset)) lsec.add_left_lane(pyodrx.standard_lane(lane_offset)) laneSections = extensions.LaneSections() laneSections.add_lanesection(lsec) # create road road = ExtendedRoad(roadId, pv, laneSections, road_type=junction) road.curveType = StandardCurveTypes.S return road
def test_arc_calc_angle(data, expdata): arc = pyodrx.Arc(data[4], angle=data[0]) x, y, h, l = arc.get_end_data(data[1], data[2], data[3]) assert pytest.approx(x, 0.000001) == expdata[0] assert pytest.approx(y, 0.000001) == expdata[1] assert pytest.approx(h, 0.000001) == expdata[2] assert pytest.approx(l, 0.000001) == expdata[3]
def test_inverted_Arc(data): arc = pyodrx.Arc(data[0], angle=data[1]) end_x, end_y, end_h, end_l = arc.get_end_data(data[2], data[3], data[4]) end_h += np.pi start_x, start_y, start_h, start_l = arc.get_start_data( end_x, end_y, end_h) start_h -= np.pi assert pytest.approx(start_x, 0.000001) == data[2] assert pytest.approx(start_y, 0.000001) == data[3] assert pytest.approx(start_h, 0.00001) == data[4]
def createPVForArcWithCloths(self, arcCurvature, arcAngle, clothAngle, clothCurvatureStart=None, clothCurvatureEnd=None): """[summary] Args: arcCurvature ([type]): [description] arcAngle ([type]): [description] clothAngle ([type]): [description] clothCurvatureStart ([type], optional): [description]. Defaults to None. clothCurvatureEnd ([type], optional): [description]. Defaults to None. Returns: [type]: [description] """ if clothCurvatureStart is None: clothCurvatureStart = self.STD_START_CLOTH if clothCurvatureEnd is None: clothCurvatureEnd = self.STD_START_CLOTH pv = extensions.ExtendedPlanview() spiral1 = extensions.ExtendedSpiral(clothCurvatureStart, arcCurvature, angle=clothAngle) arc = pyodrx.Arc(arcCurvature, angle=arcAngle) spiral2 = extensions.ExtendedSpiral(arcCurvature, clothCurvatureEnd, angle=clothAngle) pv.add_geometry(spiral1) pv.add_geometry(arc) pv.add_geometry(spiral2) return pv
def createCurveByLength(self, roadId, length, isJunction=False, curvature=StandardCurvature.Medium.value, n_lanes=1, lane_offset=3, laneSides=LaneSides.BOTH, isLeftTurnLane=False, isRightTurnLane=False, isLeftMergeLane=False, isRightMergeLane=False): junction = self.getJunctionSelection(isJunction) pv = ExtendedPlanview() arc = pyodrx.Arc(curvature, length=length) pv.add_geometry(arc) length = pv.getTotalLength() laneSections = self.laneBuilder.getStandardLanes( n_lanes, lane_offset, laneSides, roadLength=length, isLeftTurnLane=isLeftTurnLane, isRightTurnLane=isRightTurnLane, isLeftMergeLane=isLeftMergeLane, isRightMergeLane=isRightMergeLane) road = ExtendedRoad(roadId, pv, laneSections, road_type=junction, curveType=StandardCurveTypes.LongArc) return road
import pyodrx import numpy as np import os planview = pyodrx.PlanView() # create some geometries and add to the planview line1 = pyodrx.Line(100) planview.add_geometry(line1) arc1 = pyodrx.Arc(0.05,angle=np.pi/2) planview.add_geometry(arc1) line2 = pyodrx.Line(100) planview.add_geometry(line2) arc2 = pyodrx.Arc(-0.05,angle=np.pi/2) planview.add_geometry(arc2) # create a solid roadmark rm = pyodrx.RoadMark(pyodrx.RoadMarkType.solid,0.2,rule=pyodrx.MarkRule.no_passing) # create centerlane centerlane = pyodrx.Lane(a=2)
def test_create_lane_links_normalroad1(): planview = [] lanec = [] lanel = [] laner = [] lanesec = [] lanes = [] rm = pyodrx.RoadMark(pyodrx.RoadMarkType.solid,0.2,rule=pyodrx.MarkRule.no_passing) geom= [] geom.append(pyodrx.Line(50)) geom.append(pyodrx.Arc(0.01,angle=np.pi/2)) geom.append(pyodrx.Line(50)) # create planviews for i in range(len(geom)): planview.append(pyodrx.PlanView()) planview[i].add_geometry(geom[i]) # create centerlanes for i in range(len(geom)): lanec.append(pyodrx.Lane(a=3)) lanel.append(pyodrx.Lane(a=3)) laner.append(pyodrx.Lane(a=3)) #add roadmarks for i in range(len(geom)): lanec[i].add_roadmark(rm) lanel[i].add_roadmark(rm) laner[i].add_roadmark(rm) # create lanesections for i in range(len(geom)): lanesec.append(pyodrx.LaneSection(0,lanec[i])) lanesec[i].add_right_lane(lanel[i]) lanesec[i].add_left_lane(laner[i]) #create lanes for i in range(len(geom)): lanes.append(pyodrx.Lanes()) lanes[i].add_lanesection(lanesec[i]) #create roads road1 = pyodrx.Road(1,planview[0],lanes[0]) road1.add_successor(pyodrx.ElementType.road,2, pyodrx.ContactPoint.start) road2 = pyodrx.Road(2,planview[1],lanes[1]) road2.add_predecessor(pyodrx.ElementType.road,1, pyodrx.ContactPoint.end) road2.add_successor(pyodrx.ElementType.road,3, pyodrx.ContactPoint.start) road3 = pyodrx.Road(3,planview[2],lanes[2]) road3.add_predecessor(pyodrx.ElementType.road,2, pyodrx.ContactPoint.end) # create the opendrive and add roads odr = pyodrx.OpenDrive('myroad') odr.add_road(road1) odr.add_road(road2) odr.add_road(road3) odr.adjust_roads_and_lanes() assert road1.lanes.lanesections[0].rightlanes[0].links.get_predecessor_id() == None assert int(road1.lanes.lanesections[0].rightlanes[0].links.get_successor_id() ) == -1 assert road1.lanes.lanesections[0].leftlanes[0].links.get_predecessor_id() == None assert int(road1.lanes.lanesections[0].leftlanes[0].links.get_successor_id() ) == 1 assert int(road2.lanes.lanesections[0].rightlanes[0].links.get_predecessor_id() ) == -1 assert int(road2.lanes.lanesections[0].rightlanes[0].links.get_successor_id() ) == -1 assert int(road2.lanes.lanesections[0].leftlanes[0].links.get_predecessor_id() ) == 1 assert int(road2.lanes.lanesections[0].leftlanes[0].links.get_successor_id() ) == 1 assert int(road3.lanes.lanesections[0].rightlanes[0].links.get_predecessor_id() ) == -1 assert road3.lanes.lanesections[0].rightlanes[0].links.get_successor_id() == None assert int(road3.lanes.lanesections[0].leftlanes[0].links.get_predecessor_id() ) == 1 assert road3.lanes.lanesections[0].leftlanes[0].links.get_successor_id() == None
import pyodrx import os # create some simple roads roads= [] # start road roads.append(pyodrx.create_road([pyodrx.Spiral(-0.004,0.00001,100), pyodrx.Spiral(0.00001,0.005,50), pyodrx.Arc(0.005,50)],id =0,left_lanes=3,right_lanes=4)) # intermittent road roads.append(pyodrx.create_road([pyodrx.Spiral(0.0001,0.003,65), pyodrx.Spiral(0.003,0.00001,50) ],id =1,left_lanes=3,right_lanes=3)) #exit road roads.append(pyodrx.create_road(pyodrx.Line(50),id =2,left_lanes=0,right_lanes=1)) # junctions for exit roads.append(pyodrx.create_road(pyodrx.Spiral(0.005,0.0001,50),id =3,left_lanes=3,right_lanes=3,road_type=1)) # continue roads.append(pyodrx.create_road(pyodrx.Spiral(0.005,-0.02,100),id =4,left_lanes=0,right_lanes=1,road_type=1)) # exit # final road roads.append(pyodrx.create_road([pyodrx.Spiral(-0.00001,-0.003,45),pyodrx.Arc(-0.003,60)],id =5,left_lanes=2,right_lanes=3)) # entry junction roads.append(pyodrx.create_road([pyodrx.Line(30) ],id =6,left_lanes=2,right_lanes=3,road_type=2)) # continue roads.append(pyodrx.create_road([pyodrx.Spiral(0.004,0.000001,50) ],id =7,left_lanes=1,right_lanes=0,road_type=2)) # entry # entry road roads.append(pyodrx.create_road(pyodrx.Arc(0.004,60),id =8,left_lanes=1,right_lanes=0)) # add predecessors and succesors to the non junction roads roads[0].add_successor(pyodrx.ElementType.junction,1) roads[1].add_predecessor(pyodrx.ElementType.junction,1)
def createS(self, roadId, angleBetweenEndpoints, isJunction=False, curvature=StandardCurvature.Medium.value, n_lanes=1, lane_offset=3, laneSides=LaneSides.BOTH, isLeftTurnLane=False, isRightTurnLane=False, isLeftMergeLane=False, isRightMergeLane=False): """Here the angleBetweenEndpoints are used for the first road and S mid point, and S mid point and Second road Args: roadId ([type]): [description] angleBetweenEndpoints ([type]): used for the first road and S mid point, and S mid point and Second road. Use negative angles for interesting Ss isJunction (bool, optional): [description]. Defaults to False. curvature ([type], optional): [description]. Defaults to StandardCurvature.Medium.value. Returns: [type]: [description] """ junction = extensions.getJunctionSelection(isJunction) totalRotation = np.pi - angleBetweenEndpoints # most of the angleBetweenEndpoints should be assigned to the Arc arcAngle = totalRotation * 0.9 clothAngle = (totalRotation * 0.1) / 2 # curve more. arc_curv = curvature arc_angle = arcAngle cloth_angle = clothAngle cloth_start = self.STD_START_CLOTH pv = ExtendedPlanview() # adjust sign if angle is negative if cloth_angle < 0 and arc_curv > 0: cloth_angle = -cloth_angle arc_curv = -arc_curv cloth_start = -cloth_start arc_angle = -arc_angle # we are changing the second half of the S to have different arc angle and curvature. multiplier = np.random.choice(9) / 10 arc_angle2 = arc_angle - arc_angle * multiplier arc_curv2 = -(arc_curv + arc_curv * multiplier ) # the angle needs to be opposite for the second half. # create geometries spiral1 = extensions.ExtendedSpiral(cloth_start, arc_curv, angle=cloth_angle) arc = pyodrx.Arc(arc_curv, angle=arc_angle) arc2 = pyodrx.Arc(arc_curv2, angle=-arc_angle2) spiral2 = extensions.ExtendedSpiral(-arc_curv, cloth_start, angle=-cloth_angle) pv.add_geometry(spiral1) pv.add_geometry(arc) pv.add_geometry(arc2) pv.add_geometry(spiral2) length = pv.getTotalLength() laneSections = self.laneBuilder.getStandardLanes( n_lanes, lane_offset, laneSides, roadLength=length, isLeftTurnLane=isLeftTurnLane, isRightTurnLane=isRightTurnLane, isLeftMergeLane=isLeftMergeLane, isRightMergeLane=isRightMergeLane) road = ExtendedRoad(roadId, pv, laneSections, road_type=junction, curveType=StandardCurveTypes.S) return road
def createS(self, connectionRoadId, angleBetweenEndpoints, isJunction=False, curvature=StandardCurvature.Medium.value): """Here the angleBetweenEndpoints are used for the first road and S mid point, and S mid point and Second road Args: connectionRoadId ([type]): [description] angleBetweenEndpoints ([type]): used for the first road and S mid point, and S mid point and Second road. Use negative angles for interesting Ss isJunction (bool, optional): [description]. Defaults to False. curvature ([type], optional): [description]. Defaults to StandardCurvature.Medium.value. Returns: [type]: [description] """ junction = self.getJunctionSelection(isJunction) totalRotation = np.pi - angleBetweenEndpoints # most of the angleBetweenEndpoints should be assigned to the Arc arcAngle = totalRotation * 0.9 clothAngle = (totalRotation * 0.1) / 2 # curve more. arc_curv = curvature arc_angle = arcAngle cloth_angle = clothAngle r_id = connectionRoadId cloth_start = self.STD_START_CLOTH n_lanes = 1 lane_offset = 3 pv = ExtendedPlanview() # adjust sign if angle is negative if cloth_angle < 0 and arc_curv > 0: cloth_angle = -cloth_angle arc_curv = -arc_curv cloth_start = -cloth_start arc_angle = -arc_angle # we are changing the second half of the S to have different arc angle and curvature. multiplier = np.random.choice(9) / 10 arc_angle2 = arc_angle - arc_angle * multiplier arc_curv2 = -(arc_curv + arc_curv * multiplier ) # the angle needs to be opposite for the second half. # create geometries spiral1 = extensions.ExtendedSpiral(cloth_start, arc_curv, angle=cloth_angle) arc = pyodrx.Arc(arc_curv, angle=arc_angle) arc2 = pyodrx.Arc(arc_curv2, angle=-arc_angle2) spiral2 = extensions.ExtendedSpiral(-arc_curv, cloth_start, angle=-cloth_angle) pv.add_geometry(spiral1) pv.add_geometry(arc) pv.add_geometry(arc2) pv.add_geometry(spiral2) # create lanes lsec = pyodrx.LaneSection(0, pyodrx.standard_lane()) for _ in range(1, n_lanes + 1, 1): lsec.add_right_lane(pyodrx.standard_lane(lane_offset)) lsec.add_left_lane(pyodrx.standard_lane(lane_offset)) laneSections = extensions.LaneSections() laneSections.add_lanesection(lsec) # create road road = ExtendedRoad(r_id, pv, laneSections, road_type=junction) road.curveType = StandardCurveTypes.S return road
import pyodrx import os # create some simple roads roads = [] # start road roads.append( pyodrx.create_road([ pyodrx.Spiral(-0.004, 0.00001, 100), pyodrx.Spiral(0.00001, 0.005, 50), pyodrx.Arc(0.005, 50) ], id=0, left_lanes=3, right_lanes=4)) # intermittent road roads.append( pyodrx.create_road( [pyodrx.Spiral(0.0001, 0.003, 65), pyodrx.Spiral(0.003, 0.00001, 50)], id=1, left_lanes=3, right_lanes=3)) #exit road roads.append( pyodrx.create_road(pyodrx.Line(50), id=2, left_lanes=0, right_lanes=1)) # junctions for exit roads.append( pyodrx.create_road(pyodrx.Spiral(0.005, 0.0001, 50), id=3,