@ -15,7 +15,6 @@ import os
sys . path . append ( os . path . dirname ( os . path . dirname ( os . path . abspath ( __file__ ) ) ) )
sys . path . append ( os . path . dirname ( os . path . dirname ( os . path . abspath ( __file__ ) ) ) )
import carla
import carla
import config
from scenarios.base import ScenarioBase
from scenarios.base import ScenarioBase
@ -29,8 +28,8 @@ class BrakingScenario(ScenarioBase):
Frame BRAKE_FRAME + : Lead vehicle applies emergency stop .
Frame BRAKE_FRAME + : Lead vehicle applies emergency stop .
"""
"""
LEAD_DISTANCE_M = getattr ( config , " SCENARIO_LEAD_DISTANCE " , 25 )
BRAKE_FRAME = getattr ( config , " SCENARIO_BRAKE_FRAME " , 80 )
LEAD_DISTANCE_M = 25 # metres ahead of ego for lead vehicle
BRAKE_FRAME = 80 # frame on which the lead vehicle emergency-brakes
CRUISE_SPEED = 30 # km/h, set via TM percentage of speed limit
CRUISE_SPEED = 30 # km/h, set via TM percentage of speed limit
def __init__ ( self ) :
def __init__ ( self ) :
@ -46,6 +45,11 @@ class BrakingScenario(ScenarioBase):
def name ( self ) - > str :
def name ( self ) - > str :
return " braking "
return " braking "
@property
def ego_spawn_point ( self ) :
# Using the known-working Town10 intersection point
return carla . Transform ( carla . Location ( x = 107.412 , y = 45.309 , z = 0.5 ) , carla . Rotation ( yaw = - 87.7 ) )
def setup ( self , world , ego_vehicle , traffic_manager ) - > None :
def setup ( self , world , ego_vehicle , traffic_manager ) - > None :
self . _world = world
self . _world = world
self . _ego = ego_vehicle
self . _ego = ego_vehicle
@ -67,11 +71,15 @@ class BrakingScenario(ScenarioBase):
" Ensure ego is on a driveable lane. "
" Ensure ego is on a driveable lane. "
)
)
self . _lead_vehicle = world . try_spawn_actor ( lead_bp , spawn_wp . transform )
# Lift actor slightly to avoid ground clipping
spawn_transform = spawn_wp . transform
spawn_transform . location . z + = 0.5
self . _lead_vehicle = world . try_spawn_actor ( lead_bp , spawn_transform )
if self . _lead_vehicle is None :
if self . _lead_vehicle is None :
raise RuntimeError (
raise RuntimeError (
" [BrakingScenario] Failed to spawn lead vehicle at waypoint "
" [BrakingScenario] Failed to spawn lead vehicle at waypoint "
f " {spawn_wp.transform.location}. Spot may be occupied. "
f " {spawn_transform.location}. Spot may be occupied. "
)
)
self . _actors . append ( self . _lead_vehicle )
self . _actors . append ( self . _lead_vehicle )
@ -90,7 +98,7 @@ class BrakingScenario(ScenarioBase):
)
)
def step ( self , frame_count : int , ego_vehicle , pbar = None ) - > None :
def step ( self , frame_count : int , ego_vehicle , pbar = None ) - > None :
if frame == self . BRAKE_FRAME and not self . _braked :
if frame_count == self . BRAKE_FRAME and not self . _braked :
if self . _lead_vehicle and self . _lead_vehicle . is_alive :
if self . _lead_vehicle and self . _lead_vehicle . is_alive :
# Disengage TM autopilot and apply full brake
# Disengage TM autopilot and apply full brake
self . _lead_vehicle . set_autopilot ( False )
self . _lead_vehicle . set_autopilot ( False )
@ -100,7 +108,7 @@ class BrakingScenario(ScenarioBase):
control . hand_brake = True
control . hand_brake = True
self . _lead_vehicle . apply_control ( control )
self . _lead_vehicle . apply_control ( control )
self . _braked = True
self . _braked = True
print ( f " [{self.name}] EMERGENCY BRAKE applied at frame {frame}. " )
print ( f " [{self.name}] EMERGENCY BRAKE applied at frame {frame_count }. " )
def cleanup ( self ) - > None :
def cleanup ( self ) - > None :
self . _destroy_actors ( )
self . _destroy_actors ( )