Traffic-manager autopilot destroys the vehicle mid-drive on a non-CARLA map
Describe the bug
On a map that is not one of CARLA's own towns, a vehicle put on autopilot drives normally for a few seconds and is then destroyed by the server. There is no collision, nothing in the log, and the destruction is not requested by any client.
It is reproducible to the tick: spawned at get_spawn_points()[0] and given
set_autopilot(True), the same vehicle dies at tick 156 of a 20 Hz synchronous
run, every run, having travelled about 38 m at a normal 29 km/h.
What it is not
Each of these was measured and ruled out:
- Not a collision. A
sensor.other.collisionattached to the vehicle records zero events up to and including the tick it dies. - Not dormancy.
actor.actor_statereadsActiveon every tick until the actor is gone; it never passes throughDormant. The actor also disappears fromworld.get_actors()rather than remaining listed as a dormant actor would. - Not a client-side episode invalidation.
world.idis unchanged throughout, and the server logs exactly oneNew episodefor the whole run. - Not World Partition streaming. The vehicle is spawned with
role_name=heroand the server confirms it as a streaming source (WP streaming source on ... (role hero, radius 300000 cm)), and the spectator is moved onto it every tick. - Not movement or geometry. The decisive test: the same vehicle over the
same stretch of road under manual control —
apply_control(VehicleControl( throttle=0.45)), no traffic manager at all — survives 400 ticks and 54 m, further than the distance at which autopilot dies.
So the difference is the traffic manager itself.
Steps to reproduce
world = client.get_world()
s = world.get_settings(); s.synchronous_mode = True; s.fixed_delta_seconds = 0.05
world.apply_settings(s)
tm = client.get_trafficmanager(); tm.set_synchronous_mode(True)
bp = world.get_blueprint_library().filter("vehicle.*")[0]
bp.set_attribute("role_name", "hero")
v = world.try_spawn_actor(bp, world.get_map().get_spawn_points()[0])
v.set_autopilot(True, tm.get_port())
for i in range(1, 400):
world.tick()
if not v.is_alive:
print("destroyed at tick", i) # 156, reproducibly
breakReplace set_autopilot with a constant apply_control and the loop runs to
completion.
Expected
A vehicle on autopilot is not destroyed. If the traffic manager cannot route it — off the end of the network, no successor lane, a failed waypoint query — it should say so, not silently remove the actor.
Actual
Silently destroyed mid-drive. From the client this is indistinguishable from a
crash, and any script holding the actor then raises trying to operate on a destroyed actor.
Notes
The map here is Epic's City Sample driven from an OpenDRIVE file exported from
its lane graph: one road per lane, no <speed> elements, no sidewalk lanes.
Something about that network is likely the trigger, which is why this is
reported as "on a non-CARLA map" — but a network the traffic manager cannot
handle should degrade, not delete.
Environment
- CARLA
ue58-dev-carla@de3f38e64, running Epic's City Sample
Source: carla-simulator/carla