(c)
| 663 | |
| 664 | ''' ========== MAIN LOGIC FUNCTIONS ========== ''' |
| 665 | def do_spawn(c): |
| 666 | |
| 667 | c.crowd_service.acquire_new_cars() |
| 668 | spawn_car = c.crowd_service.spawn_car |
| 669 | c.crowd_service.release_new_cars() |
| 670 | |
| 671 | c.crowd_service.acquire_new_bikes() |
| 672 | spawn_bike = c.crowd_service.spawn_bike |
| 673 | c.crowd_service.release_new_bikes() |
| 674 | |
| 675 | c.crowd_service.acquire_new_pedestrians() |
| 676 | spawn_pedestrian = c.crowd_service.spawn_pedestrian |
| 677 | c.crowd_service.release_new_pedestrians() |
| 678 | |
| 679 | if not spawn_car and not spawn_bike and not spawn_pedestrian: |
| 680 | return |
| 681 | |
| 682 | # Find car spawn point. |
| 683 | if spawn_car: |
| 684 | aabb_occupancy = carla.OccupancyMap() if c.forbidden_bounds_occupancy is None else c.forbidden_bounds_occupancy |
| 685 | for actor in c.world.get_actors(): |
| 686 | if isinstance(actor, carla.Vehicle) or isinstance(actor, carla.Walker): |
| 687 | aabb = get_aabb(actor) |
| 688 | aabb_occupancy = aabb_occupancy.union(carla.OccupancyMap( |
| 689 | carla.Vector2D(aabb.bounds_min.x - c.args.clearance_car, aabb.bounds_min.y - c.args.clearance_car), |
| 690 | carla.Vector2D(aabb.bounds_max.x + c.args.clearance_car, aabb.bounds_max.y + c.args.clearance_car))) |
| 691 | |
| 692 | for _ in range(SPAWN_DESTROY_REPETITIONS): |
| 693 | spawn_segments = c.sumo_network_spawn_segments.difference(aabb_occupancy) |
| 694 | spawn_segments.seed_rand(c.rng.getrandbits(32)) |
| 695 | |
| 696 | path = SumoNetworkAgentPath.rand_path(c.sumo_network, PATH_MIN_POINTS, PATH_INTERVAL, spawn_segments, rng=c.rng) |
| 697 | position = path.get_position(c.sumo_network, 0) |
| 698 | trans = carla.Transform() |
| 699 | trans.location.x = position.x |
| 700 | trans.location.y = position.y |
| 701 | trans.location.z = 0.2 |
| 702 | trans.rotation.yaw = path.get_yaw(c.sumo_network, 0) |
| 703 | |
| 704 | actor = c.world.try_spawn_actor(c.rng.choice(c.car_blueprints), trans) |
| 705 | if actor: |
| 706 | actor.set_collision_enabled(c.args.collision) |
| 707 | c.world.wait_for_tick(1.0) # For actor to update pos and bounds, and for collision to apply. |
| 708 | c.crowd_service.acquire_new_cars() |
| 709 | c.crowd_service.append_new_cars(( |
| 710 | actor.id, |
| 711 | [p for p in path.route_points], # Convert to python list. |
| 712 | get_steer_angle_range(actor))) |
| 713 | c.crowd_service.release_new_cars() |
| 714 | aabb = get_aabb(actor) |
| 715 | aabb_occupancy = aabb_occupancy.union(carla.OccupancyMap( |
| 716 | carla.Vector2D(aabb.bounds_min.x - c.args.clearance_car, aabb.bounds_min.y - c.args.clearance_car), |
| 717 | carla.Vector2D(aabb.bounds_max.x + c.args.clearance_car, aabb.bounds_max.y + c.args.clearance_car))) |
| 718 | |
| 719 | |
| 720 | # Find bike spawn point. |
| 721 | if spawn_bike: |
| 722 | aabb_occupancy = carla.OccupancyMap() if c.forbidden_bounds_occupancy is None else c.forbidden_bounds_occupancy |
no test coverage detected