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_lanesection(): centerlane = pyodrx.Lane() ls = pyodrx.LaneSection(0, centerlane) pyodrx.prettyprint(ls.get_element()) right_lane = pyodrx.Lane() ls.add_right_lane(right_lane) pyodrx.prettyprint(ls.get_element()) left_lane = pyodrx.Lane(a=2) ls.add_left_lane(left_lane) pyodrx.prettyprint(ls.get_element())
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
planview.add_geometry(pyodrx.Line(200)) # create two different roadmarkings rm_solid = pyodrx.RoadMark(pyodrx.RoadMarkType.solid, 0.2, rule=pyodrx.MarkRule.no_passing) rm_dashed = pyodrx.RoadMark(pyodrx.RoadMarkType.broken, 0.2, rule=pyodrx.MarkRule.no_passing) # create a centerlane (same centerlane can be used since no linking is needed for this) centerlane = pyodrx.Lane(a=2) centerlane.add_roadmark(rm_solid) # create the first lanesection with three lanes lanesec1 = pyodrx.LaneSection(0, centerlane) lane1 = pyodrx.Lane(a=3) lane1.add_roadmark(rm_dashed) lane2 = pyodrx.Lane(a=3) lane2.add_roadmark(rm_dashed) lane3 = pyodrx.Lane(a=3) lane3.add_roadmark(rm_solid) lanesec1.add_right_lane(lane1) lanesec1.add_right_lane(lane2) lanesec1.add_right_lane(lane3) # create the second lanesection with one lane merging lanesec2 = pyodrx.LaneSection(70, centerlane)
# create lanes rightlanes = [] leftlanes = [] for i in range(numberofroads): right = pyodrx.Lane(a=3) right.add_roadmark(rm) rightlanes.append(right) left = pyodrx.Lane(a=3) left.add_roadmark(rm) leftlanes.append(left) # create lanesections lanesections = [] for i in range(numberofroads): lsec = pyodrx.LaneSection(0,lanecenters[i]) lsec.add_right_lane(rightlanes[i]) lsec.add_left_lane(leftlanes[i]) lanesections.append(lsec) ## create lanes lanes = [] for l in lanesections: lanes1 = pyodrx.Lanes() lanes1.add_lanesection(l) lanes.append(lanes1) # finally create the roads roads = [] roadtypes = [-1,1,-1,1,-1,1,-1]
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) centerlane.add_roadmark(rm) lanesec = pyodrx.LaneSection(0,centerlane) # add a driving lane lane2 = pyodrx.Lane(a=3) lane2.add_roadmark(rm) lanesec.add_left_lane(lane2) lane3 = pyodrx.Lane(a=3) lane3.add_roadmark(rm) lanesec.add_right_lane(lane3) ## finalize the road lanes = pyodrx.Lanes()
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
odr = pyodrx.OpenDrive('myroad') #---------------- Road 1 planview = pyodrx.PlanView(0, 0, 0) # create some geometries and add to the planview planview.add_geometry(pyodrx.Line(100)) # create a solid roadmark rm = pyodrx.RoadMark(pyodrx.RoadMarkType.solid, 0.2) # create centerlane centerlane_1 = pyodrx.Lane(a=2) centerlane_1.add_roadmark(rm) lanesec_1 = pyodrx.LaneSection(0, centerlane_1) # add a driving lane lane2_1 = pyodrx.Lane(a=3.1) lane2_1.add_roadmark(rm) lanesec_1.add_left_lane(lane2_1) lane3_1 = pyodrx.Lane(a=3.1) lane3_1.add_roadmark(rm) lanesec_1.add_right_lane(lane3_1) ## finalize the road lanes_1 = pyodrx.Lanes() lanes_1.add_lanesection(lanesec_1) road = pyodrx.Road(1, planview, lanes_1)
line2 = pyodrx.Line(100) arc2 = pyodrx.Arc(-0.05, angle=3 * np.pi / 4) cloth = pyodrx.Spiral(0.001, 0.009, 100) planview = pyodrx.PlanView() planview.add_geometry(line1) rm = pyodrx.RoadMark(pyodrx.RoadMarkType.solid, 0.2, rule=pyodrx.MarkRule.no_passing) lane1 = pyodrx.Lane(a=2) lane1.add_roadmark(rm) lanesec = pyodrx.LaneSection(0, lane1) lane2 = pyodrx.Lane(a=4) lane2.add_roadmark(rm) lane3 = pyodrx.Lane(a=3) lane3.add_roadmark(rm) lane4 = pyodrx.Lane(a=3) lane4.add_roadmark(rm) lane5 = pyodrx.Lane(a=3) lane5.add_roadmark(rm) lanesec.add_left_lane(lane2) lanesec.add_left_lane(lane3) lanesec.add_right_lane(lane4) lanesec.add_right_lane(lane5)
def test_lanes(): centerlane = pyodrx.Lane() ls = pyodrx.LaneSection(0, centerlane) lanes = pyodrx.Lanes() lanes.add_lanesection(ls) pyodrx.prettyprint(lanes.get_element())
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
planview.add_geometry(pyodrx.Line(500)) # create two different roadmarkings rm_solid = pyodrx.RoadMark(pyodrx.RoadMarkType.solid, 0.2, rule=pyodrx.MarkRule.no_passing) rm_dashed = pyodrx.RoadMark(pyodrx.RoadMarkType.broken, 0.2, rule=pyodrx.MarkRule.no_passing) # create a centerlane (same centerlane can be used since no linking is needed for this) centerlane = pyodrx.Lane(a=2) centerlane.add_roadmark(rm_solid) # create the first lanesection with two lanes lanesec1 = pyodrx.LaneSection(0, centerlane) lane1 = pyodrx.Lane(a=3) lane1.add_roadmark(rm_dashed) lane2 = pyodrx.Lane(a=3) lane2.add_roadmark(rm_solid) lanesec1.add_right_lane(lane1) lanesec1.add_right_lane(lane2) # create the second lanesection with one lane merging lanesec2 = pyodrx.LaneSection(250, centerlane) lane3 = pyodrx.Lane(a=3) lane3.add_roadmark(rm_dashed) lane4 = pyodrx.Lane(a=3, b=-0.1)