Skip to content
Snippets Groups Projects
example_controller3.py 1.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • from enum import Enum, auto
    import copy
    
    li213's avatar
    li213 committed
    from dryvr_plus_plus.scene_verifier.map.lane_map import LaneMap
    
    
    class VehicleMode(Enum):
        Normal = auto()
        SwitchLeft = auto()
        SwitchRight = auto()
        Brake = auto()
    
    class LaneMode(Enum):
        Lane0 = auto()
        Lane1 = auto()
        Lane2 = auto()
    
    
    li213's avatar
    li213 committed
    class LaneObjectMode(Enum):
        Vehicle = auto()
        Ped = auto()        # Pedestrians
        Sign = auto()       # Signs, stop signs, merge, yield etc.
        Signal = auto()     # Traffic lights
        Obstacle = auto()   # Static (to road/lane) obstacles
    
    
    class State:
        x = 0.0
        y = 0.0
        theta = 0.0
        v = 0.0
        vehicle_mode: VehicleMode = VehicleMode.Normal
        lane_mode: LaneMode = LaneMode.Lane0
    
        type: LaneObjectMode
    
        def __init__(self, x, y, theta, v, vehicle_mode: VehicleMode, lane_mode: LaneMode, type: LaneObjectMode):
    
            self.data = []
    
    def controller(ego:State, other:State, sign:State, lane_map:LaneMap):
        output = copy.deepcopy(ego)
        if ego.vehicle_mode == VehicleMode.Normal:
            if sign.x - ego.x < 3 and sign.x - ego.x > 0 and ego.lane_mode == sign.lane_mode:
                output.vehicle_mode = VehicleMode.Brake
                return output
        
            if lane_map.get_longitudinal_position(other.lane_mode, [other.x,other.y]) - lane_map.get_longitudinal_position(ego.lane_mode, [ego.x,ego.y]) > 0 \
            and lane_map.get_longitudinal_position(other.lane_mode, [other.x,other.y]) - lane_map.get_longitudinal_position(ego.lane_mode, [ego.x,ego.y]) < 3 \
            and ego.lane_mode == other.lane_mode:
                output.vehicle_mode = VehicleMode.Brake
        elif ego.vehicle_mode == VehicleMode.Brake:
            if lane_map.get_longitudinal_position(other.lane_mode, [other.x,other.y]) - lane_map.get_longitudinal_position(ego.lane_mode, [ego.x,ego.y]) > 10 \
                or ego.lane_mode != other.lane_mode:
                output.vehicle_mode = VehicleMode.Normal
    
        return output