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 createCurveGeoAndLanes(self, roadId, isJunction, curvature, arcAngle, clothAngle, n_lanes, lane_offset, laneSides=LaneSides.BOTH, isLeftTurnLane=False, isRightTurnLane=False, isLeftMergeLane=False, isRightMergeLane=False): junction = extensions.getJunctionSelection(isJunction) pv = self.createPVForArcWithCloths(curvature, arcAngle, clothAngle) 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
def createWithRightTurnLanesOnLeft( self, roadId, length=100, junction=-1, n_lanes=1, lane_offset=3, laneSides=LaneSides.BOTH, isLeftTurnLane=False, isRightTurnLane=False, isLeftMergeLane=False, isRightMergeLane=False, numberOfRightTurnLanesOnLeft=1, mergeLaneOnTheOppositeSideForInternalTurn=True): # create geometry pv = self.createPVForLine(length) laneSections = self.laneBuilder.getStandardLanesWithInternalTurns( n_lanes, lane_offset, laneSides, roadLength=length, isLeftTurnLane=isLeftTurnLane, isRightTurnLane=isRightTurnLane, isLeftMergeLane=isLeftMergeLane, isRightMergeLane=isRightMergeLane, numberOfRightTurnLanesOnLeft=numberOfRightTurnLanesOnLeft, mergeLaneOnTheOppositeSideForInternalTurn= mergeLaneOnTheOppositeSideForInternalTurn) road = ExtendedRoad(roadId, pv, laneSections, road_type=junction) return road
def createWithLeftTurnLanesOnRight( self, roadId, length=100, junction=-1, n_lanes=1, lane_offset=3, laneSides=LaneSides.BOTH, isLeftTurnLane=False, isRightTurnLane=False, isLeftMergeLane=False, isRightMergeLane=False, numberOfLeftTurnLanesOnRight=1, mergeLaneOnTheOppositeSideForInternalTurn=True): """Will create numberOfLeftTurnLanesOnRight left turn lanes on the right side of the center line. Equal number of mergelanes will be created on the left side of the center lane, too. Args: roadId ([type]): [description] length (int, optional): [description]. Defaults to 100. junction (int, optional): [description]. Defaults to -1. n_lanes (int, optional): [description]. Defaults to 1. lane_offset (int, optional): [description]. Defaults to 3. laneSides ([type], optional): [description]. Defaults to LaneSides.BOTH. isLeftTurnLane (bool, optional): [description]. Defaults to False. isRightTurnLane (bool, optional): [description]. Defaults to False. isLeftMergeLane (bool, optional): [description]. Defaults to False. isRightMergeLane (bool, optional): [description]. Defaults to False. numberOfLeftTurnLanesOnRight (int, optional): [description]. Defaults to 1. Returns: [type]: [description] """ # create geometry pv = self.createPVForLine(length) laneSections = self.laneBuilder.getStandardLanesWithInternalTurns( n_lanes, lane_offset, laneSides, roadLength=length, isLeftTurnLane=isLeftTurnLane, isRightTurnLane=isRightTurnLane, isLeftMergeLane=isLeftMergeLane, isRightMergeLane=isRightMergeLane, numberOfLeftTurnLanesOnRight=numberOfLeftTurnLanesOnRight, mergeLaneOnTheOppositeSideForInternalTurn= mergeLaneOnTheOppositeSideForInternalTurn) road = ExtendedRoad(roadId, pv, laneSections, road_type=junction) return road
def createParamPoly3(self, roadId, isJunction=False, au=0, bu=20, cu=20, du=10, av=0, bv=2, cv=20, dv=10, prange='normalized', length=None, n_lanes=1, lane_offset=3, laneSides=LaneSides.BOTH, isLeftTurnLane=False, isRightTurnLane=False, isLeftMergeLane=False, isRightMergeLane=False): junction = self.getJunctionSelection(isJunction) pv = ExtendedPlanview() poly = pyodrx.ParamPoly3(au, bu, cu, du, av, bv, cv, dv, prange, length) # poly = extensions.IntertialParamPoly(au,bu,cu,du,av,bv,cv,dv,prange,length) pv.add_geometry(poly) length = pv.getTotalLength() laneSections = self.laneBuilder.getStandardLanes( n_lanes, lane_offset, laneSides, roadLength=length, isLeftTurnLane=isLeftTurnLane, isRightTurnLane=isRightTurnLane, isLeftMergeLane=isLeftMergeLane, isRightMergeLane=isRightMergeLane) # create lanes road = ExtendedRoad(roadId, pv, laneSections, road_type=junction, curveType=StandardCurveTypes.Poly) return road
def create(self, roadId, n_lanes_left=1, n_lanes_right=1, length=20, junction=-1, lane_offset=3, laneSides=LaneSides.BOTH, numLeftTurnsOnLeft=0, numRightTurnsOnRight=0, numLeftMergeOnLeft=0, numRightMergeOnRight=0, numberOfLeftTurnLanesOnRight=0, numberOfRightTurnLanesOnLeft=0, mergeLaneOnTheOppositeSideForInternalTurn=True, force3Section=False): # create geometry pv = self.createPVForLine(length) # laneSections = self.laneBuilder.getStandardLanes(n_lanes, lane_offset, laneSides, # roadLength=length, # isLeftTurnLane=isLeftTurnLane, isRightTurnLane=isRightTurnLane, # isLeftMergeLane=isLeftMergeLane, isRightMergeLane=isRightMergeLane) singleSide = False if laneSides != LaneSides.BOTH: singleSide = True laneSections = self.laneBuilder.getLanes( n_lanes_left, n_lanes_right, lane_offset=lane_offset, singleSide=singleSide, roadLength=length, numLeftTurnsOnLeft=numLeftTurnsOnLeft, numRightTurnsOnRight=numRightTurnsOnRight, numLeftMergeOnLeft=numLeftMergeOnLeft, numRightMergeOnRight=numRightMergeOnRight, numberOfLeftTurnLanesOnRight=numberOfLeftTurnLanesOnRight, numberOfRightTurnLanesOnLeft=numberOfRightTurnLanesOnLeft, mergeLaneOnTheOppositeSideForInternalTurn= mergeLaneOnTheOppositeSideForInternalTurn, force3Section=force3Section) road = ExtendedRoad(roadId, pv, laneSections, road_type=junction) return road
def createParamPoly3(self, roadId, isJunction=False, au=0, bu=20, cu=20, du=10, av=0, bv=2, cv=20, dv=10, prange='normalized', length=None): junction = self.getJunctionSelection(isJunction) n_lanes = 1 lane_offset = 3 pv = ExtendedPlanview() poly = pyodrx.ParamPoly3(au, bu, cu, du, av, bv, cv, dv, prange, length) pv.add_geometry(poly) # 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 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
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