Пример #1
0
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)
Пример #2
0
    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
Пример #3
0
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]
Пример #4
0
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)
Пример #8
0
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
Пример #9
0
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
Пример #11
0
    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
Пример #12
0
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,