Implementation:CARLA simulator Carla CollisionStage
| Knowledge Sources | |
|---|---|
| Domains | Traffic_Management, Autonomous_Driving |
| Last Updated | 2026-02-15 05:00 GMT |
Overview
The CollisionStage class detects potential collisions between traffic-managed vehicles and nearby actors (other vehicles and pedestrians) in the CARLA simulation.
Description
CollisionStage is one of the core pipeline stages in the Traffic Manager. It inherits from the Stage base class and implements the Update(const unsigned long index) method, which is called once per vehicle per tick. The stage performs the following operations:
- Overlapping Actor Filtering: For each ego vehicle, retrieves the set of actors with overlapping tracked paths from TrackTraffic. Filters candidates by a velocity-dependent collision radius and a vertical overlap threshold to discard actors on different elevation levels.
- Distance-based Sorting: Sorts collision candidates in ascending order of distance to the ego vehicle so the nearest threats are evaluated first.
- Collision Negotiation: For each candidate, calls NegotiateCollision which uses geodesic boundary projections and bounding box geometry (via Boost.Geometry polygons) to determine if the ego vehicle is on a collision path with the other actor. The negotiation considers boundary extensions based on velocity and existing collision locks.
- Collision Lock Mechanism: Maintains a CollisionLockMap that tracks lead vehicles. When a collision is detected, a lock is established to maintain consistent following distance and avoid oscillating brake/accelerate behavior.
- Stochastic Ignore: Applies user-configured percentage probabilities (GetPercentageIgnoreVehicles, GetPercentageIgnoreWalkers) to allow a configurable chance of ignoring detected collisions, enabling more varied traffic behavior.
- Bounding Box Extension: Computes velocity-dependent forward extensions of bounding boxes via GetBoundingBoxExtention to predict future positions of actors.
- Geodesic Boundary Construction: Builds boundary polygons along the vehicle's waypoint buffer path via GetGeodesicBoundary, providing more accurate path-following collision detection compared to simple bounding box overlap.
Usage
CollisionStage is used internally by TrafficManagerLocal as part of the per-tick pipeline. Each registered vehicle's collision result is written to a CollisionFrame output array, which is subsequently consumed by the MotionPlanStage to adjust velocity and braking.
Code Reference
Source Location
- Repository: CARLA
- File:
LibCarla/source/carla/trafficmanager/CollisionStage.cpp - Header:
LibCarla/source/carla/trafficmanager/CollisionStage.h
Signature
class CollisionStage : Stage {
public:
CollisionStage(const std::vector<ActorId> &vehicle_id_list,
const SimulationState &simulation_state,
const BufferMap &buffer_map,
const TrackTraffic &track_traffic,
const Parameters ¶meters,
CollisionFrame &output_array,
RandomGenerator &random_device);
void Update(const unsigned long index) override;
void RemoveActor(const ActorId actor_id);
void Reset();
};
Import
#include "carla/trafficmanager/CollisionStage.h"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| vehicle_id_list | const std::vector<ActorId>& | Yes | List of registered vehicle actor IDs to process |
| simulation_state | const SimulationState& | Yes | Cached kinematic state (location, velocity, heading, dimensions) for all actors |
| buffer_map | const BufferMap& | Yes | Waypoint buffers for constructing geodesic boundaries |
| track_traffic | const TrackTraffic& | Yes | Tracks overlapping vehicle paths for candidate detection |
| parameters | const Parameters& | Yes | Per-vehicle and global collision detection configuration |
| random_device | RandomGenerator& | Yes | Random number generator for stochastic ignore behavior |
Outputs
| Name | Type | Description |
|---|---|---|
| output_array | CollisionFrame& | Array of CollisionHazardData structs containing hazard flag, obstacle actor ID, and available distance margin for each vehicle |
Usage Examples
// CollisionStage is created inside TrafficManagerLocal constructor:
collision_stage(CollisionStage(vehicle_id_list,
simulation_state,
buffer_map,
track_traffic,
parameters,
collision_frame,
random_device));
// Called per vehicle in the parallel update loop:
collision_stage.Update(vehicle_index);
// Result consumed by MotionPlanStage:
const CollisionHazardData &collision_hazard = collision_frame.at(index);
bool has_collision = collision_hazard.hazard;
float margin = collision_hazard.available_distance_margin;