syntax = "proto2";

package commonroad;

import "util.proto";

message ObstacleTypeEnum {
    enum ObstacleType {
        UNKNOWN = 0;
        CAR = 1;
        TRUCK = 2;
        BUS = 3;
        BICYCLE = 4;
        PEDESTRIAN = 5;
        PRIORITY_VEHICLE = 6;
        PARKED_VEHICLE = 7;
        CONSTRUCTION_ZONE = 8;
        TRAIN = 9;
        ROAD_BOUNDARY = 10;
        MOTORCYCLE = 11;
        TAXI = 12;
        BUILDING = 13;
        PILLAR = 14;
        MEDIAN_STRIP = 15;
    }
}

message State {
    oneof position {
        Point point = 1;
        Shape shape = 2;
    }
    optional FloatExactOrInterval orientation = 3;
    optional FloatExactOrInterval velocity = 4;
    optional FloatExactOrInterval steering_angle = 5;
    optional FloatExactOrInterval steering_angle_speed = 6;
    optional FloatExactOrInterval yaw_rate = 7;
    optional FloatExactOrInterval slip_angle = 8;
    optional FloatExactOrInterval roll_angle = 9;
    optional FloatExactOrInterval roll_rate = 10;
    optional FloatExactOrInterval pitch_angle = 11;
    optional FloatExactOrInterval pitch_rate = 12;
    optional FloatExactOrInterval velocity_y = 13;
    optional FloatExactOrInterval position_z = 14;
    optional FloatExactOrInterval velocity_z = 15;
    optional FloatExactOrInterval roll_angle_front = 16;
    optional FloatExactOrInterval roll_rate_front = 17;
    optional FloatExactOrInterval velocity_y_front = 18;
    optional FloatExactOrInterval position_z_front = 19;
    optional FloatExactOrInterval velocity_z_front = 20;
    optional FloatExactOrInterval roll_angle_rear = 21;
    optional FloatExactOrInterval roll_rate_rear = 22;
    optional FloatExactOrInterval velocity_y_rear = 23;
    optional FloatExactOrInterval position_z_rear = 24;
    optional FloatExactOrInterval velocity_z_rear = 25;
    optional FloatExactOrInterval front_wheel_angular_speed = 26;
    optional FloatExactOrInterval rear_wheel_angular_speed = 27;
    optional FloatExactOrInterval left_front_wheel_angular_speed = 28;
    optional FloatExactOrInterval right_front_wheel_angular_speed = 29;
    optional FloatExactOrInterval left_rear_wheel_angular_speed = 30;
    optional FloatExactOrInterval right_rear_wheel_angular_speed = 31;
    optional FloatExactOrInterval delta_y_f = 32;
    optional FloatExactOrInterval delta_y_r = 33;
    optional FloatExactOrInterval acceleration = 34;
    optional FloatExactOrInterval acceleration_y = 35;
    optional FloatExactOrInterval jerk = 36;
    optional FloatExactOrInterval curvature = 37;
    optional FloatExactOrInterval curvature_rate = 38;
    required IntegerExactOrInterval time_step = 39;
}

message SignalState {
    optional IntegerExactOrInterval time_step = 1;
    optional bool horn = 2;
    optional bool indicator_left = 3;
    optional bool indicator_right = 4;
    optional bool braking_lights = 5;
    optional bool hazard_warning_lights = 6;
    optional bool flashing_blue_lights = 7;
}

message Occupancy {
    required IntegerExactOrInterval time_step = 1;
    required Shape shape = 2;
}

message OccupancySet {
    repeated Occupancy occupancies = 1;
}

message Trajectory {
    required uint32 initial_time_step = 1;
    repeated State states = 2;
}

message TrajectoryPrediction {
    required Trajectory trajectory = 1;
    required Shape shape = 2;
}

message SetBasedPrediction {
    required uint32 initial_time_step = 1;
    required OccupancySet occupancy_set = 2;
}