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, )
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),
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), ], ) ], )
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)))
# 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,
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))