Skip to content

90. Foretellix object list format

The following Protobuf definition is used to encode log data for Evaluation Pipeline ingestion.

C/C++ code: Object list Protobuf definition
// Copyright (c) 2025 Foretellix Ltd. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
//                      http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing permissions and limitations under the
// License.

syntax = "proto3";
package ftx_re.proto.object_list;

message Data3d {
  double x = 1; 
  double y = 2; 
  double z = 3; 
}

// Rough classification of objects
// Detailed classification can be provided using the Object custom-data array

enum ObjectKind{
  KIND_OBJECT = 0;  // Unclassified object
  KIND_PERSON = 2;
  KIND_CYCLIST = 3;
  KIND_VEHICLE = 4;
  KIND_TRUCK = 5;
  KIND_TRAILER = 6;
  KIND_FOD = 7;
  KIND_ANIMAL = 8;
  KIND_SIGN = 10;
  KIND_BUS = 11;
  KIND_MOTORCYCLE = 12;
}

enum Utility{
  NONE = 0;
  EMERGENCY = 100; // Emergency actor like ambulance, fire truck, police car
  SCHOOL = 200; // School bus
}

message BoundingBox {
  // An 8 point vector
  // Order convention:
  //    bottom-front-left, bottom-front-right, bottom-back-right, bottom-back-left
  //    top-front-left, top-front-right, top-back-right, top-back-left
  repeated Data3d points = 1; // (x,y,z) coordinates in meters
}

message Pair {
  string key = 1;
  string value = 2;
}

message Object {
  // Object is anything detected by perception, except lane markings

  // tracking_id is a unique identifier for the object identity, not to be reused within a trace
  string tracking_id = 2;
  ObjectKind kind = 3;
  Data3d position = 4; // (x,y,z) coordinates in meters

  // Velocity, acceleration, jerk and angular_speed data are optional and can be omitted.
  // For moving objects these properties can be computed from position data
  Data3d velocity = 5;         //  in m/s
  Data3d acceleration = 6;     //  in m/s^2
  Data3d jerk = 7;             // in m/s^3
  Data3d angular_speed = 8;    // yaw rate of change in rad/s

  // Only yaw is mandatory for moving objects - all angles can be omitted for static objects
  double yaw = 10;             // in radians
  double pitch = 11;           // in radians
  double roll = 12;            // in radians

  // Lane number, if object on a road, optional
  // Lane numbering is relative to the ego:
  // 0 - same as ego
  // -1, -2 - slower than ego lane (right of ego in the US)
  // 1, 2 - faster than ego lane (left of ego in the US)
  // 100 represents uninitialized field
  int32 lane = 15;
  double position_in_lane = 16;  // in meters, measured from center line, positive direction is toward faster lane

  // In case bounding box data is omitted
  double length = 17; // in meters
  double width = 18;  // in meters
  double height = 19; // in meters

  // Bounding box data is optional
  // if present, length width and height are computed using bounding box data
  BoundingBox bbox = 20;

  // Custom data passes object specific information
  // Data used for checking, coverage collection and in support of custom modifiers
  repeated Pair custom_data = 21; // pair of key value strings. Key should be a string following variable name conventions
  string description = 22; // description of the object type, refinement of the object kind field
  bool is_stationary = 23; // true if the object remains stationary throughout all time slots
  bool is_emergency_mode = 24; // true if the object is in emergency mode, for e.g. lights flashing or siren on, also school bus stopping for passengers
  Utility utility = 25; // The utility of the object, for e.g. an emergency vehicle
}


enum LaneKind {
  // Provide kind if known from perception
  LANE_UNKNOWN = 0;
  LANE_FORWARD_DRIVING = 1;
  LANE_ONCOMING_DRIVING = 2;
  LANE_ANY_DRIVING = 3;       // E.g. lane in junction, parking lot
  LANE_SHOULDER = 4;          // Any non-drivable lane
}

enum LaneBoundaryKind {
  // Provide kind if known from perception
  BOUNDARY_UNKNOWN = 0;
  BOUNDARY_SOLID = 1;   // solid line or divider - no passing
  BOUNDARY_DASHED = 2;  // passing allowed
}

enum TrafficLightState {
  TL_STATE_UNKNOWN = 0;      // Unknown state
  TL_STATE_INACTIVE = 1;      // Light is off
  TL_STATE_STOP_SIGN = 2;     // Light is flashing red (in US) - like a stop sign
  TL_STATE_YIELD_SIGN = 3;    // Light is flashing yellow (US) - like a yield sign, also flashing yellow arrow
  TL_STATE_GO = 4;            // Green light, unprotected (no arrow)
  TL_STATE_PROTECTED_GO = 5;  // Green arrow
  TL_STATE_STOP = 6;          // Red light
  TL_STATE_SLOW = 7;          // Yellow light
  TL_STATE_CHANGE_TO_GO = 8;  // Light is about to turn green (red and yellow together in IL)
  TL_STATE_CHANGE_TO_SLOW = 9; // Light is about to turn yellow (flashing green in IL)
}

enum TrafficLightDirection {
  TL_DIRECTION_UNKNOWN = 0;
  TL_DIRECTION_ALL = 1;
  TL_DIRECTION_STRAIGHT = 2;
  TL_DIRECTION_STRAIGHT_AND_LEFT = 3;
  TL_DIRECTION_STRAIGHT_AND_RIGHT = 4;
  TL_DIRECTION_LEFT = 5;
  TL_DIRECTION_RIGHT = 6;
  TL_DIRECTION_U_TURN = 7;
}

enum TrafficLightType {
  TL_TYPE_UNKNOWN = 0;
  TL_TYPE_VEHICLE = 1;
  TL_TYPE_PED = 2;
  TL_TYPE_BICYCLE = 3;
  TL_TYPE_RAILROAD = 4;
}

message LaneBoundary {
  LaneBoundaryKind kind = 1;
  Data3d boundary = 2; // x,y,z coordinate of the closest point on the boundary
  double distance = 3; // lateral distance in meters from the boundary
}

message Lane {
  // Lane data from marking
  // lane ID: 0 is ego lane,
  //          1 is adjacent faster lane, 2, 3 are faster still
  //          -1 is adjacent slower lane, -2, -3 are slower still
  int32 id = 1;
  LaneKind kind = 2;
  Data3d center = 3; // (x,y,z) coordinates in meters
  double width = 4;  // length in meters
  LaneBoundary boundary_fast = 5;   // Boundary with faster lane (left in LHS driving)
  LaneBoundary boundary_slow = 6;   // Boundary with slower lane (right in LHS driving)
}

message TrafficLight {
  // Traffic light state in specific time slot - same TL ID can show up multiple times, once for each direction
  // Traffic light ID needs to map to the lane the vehicle is on
  // Traffic light direction needs to match the direction vehicle is traveling to
  string id = 1;  // TL identifier on map
  TrafficLightDirection direction = 2;  // With respect to vehicle direction
  TrafficLightState state = 3;    // Current TL state
  TrafficLightType type = 4;
}

message TimeSlot {
  uint32 time = 1; // in milliseconds relative to start time
  Object ego = 2; // The ego object
  repeated Object objects = 3; // The objects in the time slot, not including ego
  repeated Lane lanes = 4; // Optional perception lane detection data
  repeated TrafficLight traffic_lights = 5;  // TL states for the time slot
}

message GlobalPosition {
  //  WGS84 LLA format (e.g. GPS)
  double latitude = 1;
  double longitude = 2;
  double altitude = 3;
}

message LocalFrameOriginPosition {
  // Used to position the local frame origin and rotation with respect to the global frame
  GlobalPosition lla = 1;
  double yaw = 2;
}

message Root {
  bool is_absolute = 1;   // When true - all coordinates are global, if false all coordinates are ego relative
  uint32 step_time = 2;   // time in milliseconds between cycles
  double start_time = 3;  // The absolute time in milliseconds in which the data starts
  repeated TimeSlot times = 4; // times start at time 0 and are relative to start_time
  LocalFrameOriginPosition local_frame = 5;  // localization data of the local frame in the world
  int32 version = 10;
  double origin_start_time = 11;  // DEPRECATED - use the custom_data array for all metadata
  repeated Pair custom_data = 12; // Global metadata that describes log level properties. Key should be a string following variable name conventions
}