def get_random_parking() -> ParkingArea:
    """Create a randomized parking area."""
    def get_spot(side=0):
        width = (0.5 + random.random()) * (0.2 + ROAD_WIDTH * side)
        obs_width = (random.random() / 2 + 0.5) * width
        return ParkingSpot(
            width=width,
            kind=random.choice([ParkingSpot.FREE, ParkingSpot.BLOCKED]),
            obstacle=random.choice([
                ParkingObstacle(
                    width=obs_width,
                    x=0.2,
                    y=-(width - random.random() / 2 * obs_width) / 2,
                ),
                ParkingObstacle(
                    width=obs_width,
                    x=0.2,
                    y=-(width - random.random() / 2 * obs_width) / 2,
                ),
                None,
            ]),
        )

    return ParkingArea(
        length=7,
        start_line=True,
        left_lots=[
            ParkingLot(
                start=random.random() * 2,
                spots=[get_spot(0) for _ in range(random.randint(1, 5))],
            )
        ],
        right_lots=[
            ParkingLot(
                start=random.random() * 2,
                spots=[get_spot(1) for _ in range(random.randint(1, 5))],
            )
        ],
    )
            ParkingSpot(width=0.4, kind=ParkingSpot.BLOCKED),
            ParkingSpot(width=1),
            ParkingSpot(width=0.3,
                        kind=ParkingSpot.OCCUPIED,
                        obstacle=ParkingObstacle()),
        ],
    )
] if PARKING_LOT_RIGHT else [])

left_lots = ([
    ParkingLot(
        start=1,
        spots=[
            ParkingSpot(kind=ParkingSpot.OCCUPIED, obstacle=ParkingObstacle()),
            ParkingSpot(kind=ParkingSpot.BLOCKED),
            ParkingSpot(),
            ParkingSpot(kind=ParkingSpot.OCCUPIED, obstacle=ParkingObstacle()),
        ],
    )
] if PARKING_LOT_LEFT else [])

road.append(
    ParkingArea(
        length=5,
        start_line=True,
        left_lots=left_lots,
        right_lots=right_lots,
    ))

road.append(StraightRoad(length=2))
    def test_parking_area(self):
        TF = Transform([1, 1], math.pi / 2)
        left_spot1 = ParkingSpot(width=0.4, kind=ParkingSpot.FREE)
        left_spot2 = ParkingSpot(width=0.4, kind=ParkingSpot.OCCUPIED)
        right_spot = ParkingSpot(width=0.6, kind=ParkingSpot.BLOCKED)

        # opening_angle 55 degrees
        OPENING_ANGLE = math.radians(55)
        LEFT_START = 2.25
        LEFT_DEPTH = 0.5
        RIGHT_START = 1.75
        RIGHT_DEPTH = 0.3
        LENGTH = 4

        left_lot = ParkingLot(
            start=LEFT_START,
            opening_angle=OPENING_ANGLE,
            depth=LEFT_DEPTH,
            spots=[left_spot1, left_spot2],
        )
        right_lot = ParkingLot(
            start=RIGHT_START,
            opening_angle=OPENING_ANGLE,
            depth=RIGHT_DEPTH,
            spots=[right_spot],
        )

        pa = ParkingArea(
            length=LENGTH,
            left_lots=[left_lot],
            right_lots=[right_lot],
            transform=TF,
        )
        self.assertEqual(pa.__class__.TYPE, road_section_type.PARKING_AREA)

        # test points for left_border calculated by hand
        # left_lot start at 2.25, depth 0.5
        # start_inner
        si = Point(LEFT_START, Config.road_width)
        # start_outer
        so = Point(
            si.x + LEFT_DEPTH / math.tan(OPENING_ANGLE),
            Config.road_width + LEFT_DEPTH,
        )
        # end outer, both lots have 0.4 width
        eo = Point(so.x + 0.8, so.y)
        # end inner
        ei = Point(eo.x + LEFT_DEPTH / math.tan(OPENING_ANGLE),
                   Config.road_width)
        self.assertLineAlmostEqual(pa.left_lots[0].border,
                                   TF * Line([si, so, eo, ei]))

        # check first parking spot on left side width: 0.4
        self.assertEqual(
            pa.left_lots[0].spots[0].frame,
            TF * Polygon([
                Point(so.x, si.y), so,
                Point(so.x + 0.4, so.y),
                Point(so.x + 0.4, si.y)
            ]),
        )
        self.assertEqual(pa.left_lots[0].spots[0].kind, ParkingSpot.FREE)
        # check second parking spot on left side width: 0.4
        self.assertEqual(
            pa.left_lots[0].spots[1].frame,
            TF * Polygon([
                Point(so.x + 0.4, si.y),
                Point(so.x + 0.4, so.y), eo,
                Point(eo.x, ei.y)
            ]),
        )
        self.assertEqual(pa.left_lots[0].spots[1].kind, ParkingSpot.OCCUPIED)

        # test points for right_border calculated by hand
        # left_lot start at 1.75, depth 0.3
        # start_inner
        si = Point(RIGHT_START, -Config.road_width)
        # start_outer
        so = Point(
            si.x + RIGHT_DEPTH / math.tan(OPENING_ANGLE),
            -Config.road_width - RIGHT_DEPTH,
        )
        # end outer, lot has 0.6 width
        eo = Point(so.x + 0.6, -Config.road_width - RIGHT_DEPTH)
        # end inner
        ei = Point(eo.x + RIGHT_DEPTH / math.tan(OPENING_ANGLE),
                   -Config.road_width)
        self.assertLineAlmostEqual(pa.right_lots[0].border,
                                   TF * Line([si, so, eo, ei]))
        # check first parking spot on right side width: 0.6
        # polygon points on right side are reversed
        self.assertEqual(
            pa.right_lots[0].spots[0].frame,
            TF * Polygon([Point(eo.x, ei.y), eo, so,
                          Point(so.x, si.y)]),
        )
        self.assertEqual(
            pa.right_lots[0].spots[0].kind,
            ParkingSpot.BLOCKED,
        )
Пример #4
0
import math

from simulation.utils.road.road import Road
from simulation.utils.road.sections import (
    Intersection,
    LeftCircularArc,
    ParkingArea,
    ParkingLot,
    ParkingObstacle,
    ParkingSpot,
    RightCircularArc,
    StraightRoad,
)

road = Road()
road.append(ParkingArea(length=0.06, start_line=True))
road.append(StraightRoad(length=0.62))
road.append(
    ParkingArea(
        length=2.9,
        right_lots=[
            ParkingLot(
                depth=0.32,
                spots=[
                    ParkingSpot(width=1.15),
                    ParkingSpot(
                        width=0.25, kind=ParkingSpot.OCCUPIED, obstacle=ParkingObstacle()
                    ),
                    ParkingSpot(width=0.045),
                    ParkingSpot(width=0.56, kind=ParkingSpot.BLOCKED),
                    ParkingSpot(width=0.32),
Пример #5
0
parking_area = ParkingArea(
    length=4,
    start_line=True,
    left_lots=[
        ParkingLot(spots=[
            ParkingSpot(kind=ParkingSpot.OCCUPIED, obstacle=ParkingObstacle()),
            ParkingSpot(kind=ParkingSpot.BLOCKED),
        ], ),
        ParkingLot(
            start=2,
            opening_angle=math.radians(40),
            spots=[
                ParkingSpot(),
                ParkingSpot(kind=ParkingSpot.OCCUPIED,
                            obstacle=ParkingObstacle()),
            ],
        ),
    ],
    right_lots=[
        ParkingLot(
            start=1,
            depth=0.4,
            spots=[
                ParkingSpot(kind=ParkingSpot.FREE, width=0.5),
                ParkingSpot(kind=ParkingSpot.OCCUPIED,
                            width=0.7,
                            obstacle=ParkingObstacle()),
                ParkingSpot(kind=ParkingSpot.BLOCKED),
            ],
        )
    ],
)
Пример #6
0
road = Road()
road.append(StraightRoad())
parking_area = ParkingArea(
    length=3.5,
    start_line=True,
    left_lots=[
        ParkingLot(
            start=0.5,
            depth=0.5,
            spots=[
                ParkingSpot(kind=ParkingSpot.BLOCKED),
                ParkingSpot(),
                ParkingSpot(kind=ParkingSpot.OCCUPIED,
                            obstacle=ParkingObstacle()),
            ],
        ),
    ],
    right_lots=[
        ParkingLot(
            start=1.5,
            spots=[
                ParkingSpot(width=0.7, kind=ParkingSpot.BLOCKED),
                ParkingSpot(width=0.7),
            ],
        )
    ],
)
road.append(parking_area)
road.append(LeftCircularArc(radius=2, angle=math.radians(90)))
road.append(LeftCircularArc(radius=1.5, angle=math.radians(90)))
Пример #7
0
# Create a parking area with different kinds of parking spots
road.append(
    ParkingArea(
        length=4,
        start_line=True,
        left_lots=[
            ParkingLot(
                start=1,
                spots=[ParkingSpot(),
                       ParkingSpot(kind=ParkingSpot.BLOCKED)])
        ],
        right_lots=[
            ParkingLot(
                start=0.2,
                spots=[
                    ParkingSpot(
                        kind=ParkingSpot.OCCUPIED,
                        width=0.7,
                        obstacle=ParkingObstacle(x=0.15,
                                                 y=-0.2,
                                                 width=0.3,
                                                 depth=0.25),
                    ),
                    ParkingSpot(kind=ParkingSpot.BLOCKED),
                ],
            )
        ],
    ))
road.append(
    LeftCircularArc(radius=2,
                    angle=math.pi / 2,
Пример #8
0
can_park = [False for _ in range(NUM_PARKING_LOTS_RIGHT)]
if CAN_PARK_RIGHT:
    can_park[random.randint(0, NUM_PARKING_LOTS_RIGHT - 1)] = True
right_lots = [
    ParkingLot(
        start=1 + i * 5,
        spots=get_spots(right_side=True, can_park=can_park[i]),
    ) for i in range(NUM_PARKING_LOTS_RIGHT)
]

can_park = [False for _ in range(NUM_PARKING_LOTS_LEFT)]
if CAN_PARK_LEFT:
    can_park[random.randint(0, NUM_PARKING_LOTS_LEFT - 1)] = True
left_lots = [
    ParkingLot(
        start=1 + i * 5,
        spots=get_spots(right_side=False, can_park=can_park[i]),
    ) for i in range(NUM_PARKING_LOTS_LEFT)
]

road.append(
    ParkingArea(
        length=5 * max(NUM_PARKING_LOTS_LEFT, NUM_PARKING_LOTS_RIGHT),
        start_line=True,
        left_lots=left_lots,
        right_lots=right_lots,
    ))

road.append(StraightRoad(length=2))