Use explicit flatbuffer IDs in y2017 and newer.

Non-explicit ids are risky.  We've seen backwards incompatible
changes...

Change-Id: Id6ceebe031ac80430191f367635d0e951c3d2cbc
diff --git a/y2017/control_loops/superstructure/superstructure_goal.fbs b/y2017/control_loops/superstructure/superstructure_goal.fbs
index 6681262..3cf6945 100644
--- a/y2017/control_loops/superstructure/superstructure_goal.fbs
+++ b/y2017/control_loops/superstructure/superstructure_goal.fbs
@@ -7,27 +7,27 @@
   // frame. Positive is out.
 
   // Goal distance of the intake.
-  distance:double;
+  distance:double (id: 0);
 
   // Caps on velocity/acceleration for profiling. 0 for the default.
-  profile_params:frc971.ProfileParameters;
+  profile_params:frc971.ProfileParameters (id: 1);
 
   // Voltage to send to the rollers. Positive is sucking in.
-  voltage_rollers:double;
+  voltage_rollers:double (id: 2);
 
   // If true, disable the intake so we can hang.
-  disable_intake:bool;
+  disable_intake:bool (id: 3);
 
   // The gear servo value.
-  gear_servo:double;
+  gear_servo:double (id: 4);
 }
 
 table IndexerGoal {
   // Indexer angular velocity goals in radians/second.
-  angular_velocity:double;
+  angular_velocity:double (id: 0);
 
   // Roller voltage. Positive is sucking in.
-  voltage_rollers:double;
+  voltage_rollers:double (id: 1);
 }
 
 table TurretGoal {
@@ -36,39 +36,39 @@
   // turns clockwise (towards right from the front), and decreases when
   // the turrent turns counter-clockwise (towards left from the front).
   // These are from a top view above the robot.
-  angle:double;
+  angle:double (id: 0);
 
   // If true, ignore the angle and track using vision.  If we don't see
   // anything, we'll use the turret goal above.
-  track:bool;
+  track:bool (id: 1);
 
   // Caps on velocity/acceleration for profiling. 0 for the default.
-  profile_params:frc971.ProfileParameters;
+  profile_params:frc971.ProfileParameters (id: 2);
 }
 
 table HoodGoal {
   // Angle the hood is currently at. An angle of zero is at the lower hard
   // stop, angle increases as hood rises.
-  angle:double;
+  angle:double (id: 0);
 
   // Caps on velocity/acceleration for profiling. 0 for the default.
-  profile_params:frc971.ProfileParameters;
+  profile_params:frc971.ProfileParameters (id: 1);
 }
 
 table ShooterGoal {
   // Angular velocity goals in radians/second. Positive is shooting out of the
   // robot.
-  angular_velocity:double;
+  angular_velocity:double (id: 0);
 }
 
 table Goal {
-  intake:IntakeGoal;
-  indexer:IndexerGoal;
-  turret:TurretGoal;
-  hood:HoodGoal;
-  shooter:ShooterGoal;
-  lights_on:bool;
-  use_vision_for_shots:bool;
+  intake:IntakeGoal (id: 0);
+  indexer:IndexerGoal (id: 1);
+  turret:TurretGoal (id: 2);
+  hood:HoodGoal (id: 3);
+  shooter:ShooterGoal (id: 4);
+  lights_on:bool (id: 5);
+  use_vision_for_shots:bool (id: 6);
 }
 
 root_type Goal;
diff --git a/y2017/control_loops/superstructure/superstructure_output.fbs b/y2017/control_loops/superstructure/superstructure_output.fbs
index 5301380..74f6129 100644
--- a/y2017/control_loops/superstructure/superstructure_output.fbs
+++ b/y2017/control_loops/superstructure/superstructure_output.fbs
@@ -2,26 +2,26 @@
 
 table Output {
   // Voltages for some of the subsystems.
-  voltage_intake:double;
-  voltage_indexer:double;
-  voltage_shooter:double;
+  voltage_intake:double (id: 0);
+  voltage_indexer:double (id: 1);
+  voltage_shooter:double (id: 2);
 
   // Rollers on the intake.
-  voltage_intake_rollers:double;
+  voltage_intake_rollers:double (id: 3);
   // Roller on the indexer
-  voltage_indexer_rollers:double;
+  voltage_indexer_rollers:double (id: 4);
 
-  voltage_turret:double;
-  voltage_hood:double;
+  voltage_turret:double (id: 5);
+  voltage_hood:double (id: 6);
 
-  gear_servo:double;
+  gear_servo:double (id: 7);
 
   // If true, the lights are on.
-  lights_on:bool;
+  lights_on:bool (id: 8);
 
-  red_light_on:bool;
-  green_light_on:bool;
-  blue_light_on:bool;
+  red_light_on:bool (id: 9);
+  green_light_on:bool (id: 10);
+  blue_light_on:bool (id: 11);
 }
 
 root_type Output;
diff --git a/y2017/control_loops/superstructure/superstructure_position.fbs b/y2017/control_loops/superstructure/superstructure_position.fbs
index 7f95462..5c70ff4 100644
--- a/y2017/control_loops/superstructure/superstructure_position.fbs
+++ b/y2017/control_loops/superstructure/superstructure_position.fbs
@@ -5,27 +5,27 @@
 table ColumnPosition {
   // Indexer angle in radians relative to the base.  Positive is according to
   // the right hand rule around +z.
-  indexer:frc971.HallEffectAndPosition;
+  indexer:frc971.HallEffectAndPosition (id: 0);
   // Turret angle in radians relative to the indexer.  Positive is the same as
   // the indexer.
-  turret:frc971.HallEffectAndPosition;
+  turret:frc971.HallEffectAndPosition (id: 1);
 }
 
 
 table Position {
   // Position of the intake, zero when the intake is in, positive when it is
   // out.
-  intake:frc971.PotAndAbsolutePosition;
+  intake:frc971.PotAndAbsolutePosition (id: 0);
 
   // The position of the column.
-  column:ColumnPosition;
+  column:ColumnPosition (id: 1);
 
   // The sensor readings for the hood. The units and sign are defined the
   // same as what's in the Goal message.
-  hood:frc971.IndexPosition;
+  hood:frc971.IndexPosition (id: 2);
 
   // Shooter wheel angle in radians.
-  theta_shooter:double;
+  theta_shooter:double (id: 3);
 }
 
 root_type Position;
diff --git a/y2017/control_loops/superstructure/superstructure_status.fbs b/y2017/control_loops/superstructure/superstructure_status.fbs
index 217eb5b..88c335b 100644
--- a/y2017/control_loops/superstructure/superstructure_status.fbs
+++ b/y2017/control_loops/superstructure/superstructure_status.fbs
@@ -6,124 +6,124 @@
 table IndexerStatus {
   // The current average velocity in radians/second. Positive is moving balls up
   // towards the shooter. This is the angular velocity of the inner piece.
-  avg_angular_velocity:double;
+  avg_angular_velocity:double (id: 0);
 
   // The current instantaneous filtered velocity in radians/second.
-  angular_velocity:double;
+  angular_velocity:double (id: 1);
 
   // True if the indexer is ready.  It is better to compare the velocities
   // directly so there isn't confusion on if the goal is up to date.
-  ready:bool;
+  ready:bool (id: 2);
 
   // True if the indexer is stuck.
-  stuck:bool;
-  stuck_voltage:float;
+  stuck:bool (id: 3);
+  stuck_voltage:float (id: 4);
 
   // The state of the indexer state machine.
-  state:int;
+  state:int32 (id: 5);
 
   // The estimated voltage error from the kalman filter in volts.
-  voltage_error:double;
+  voltage_error:double (id: 6);
   // The estimated voltage error from the stuck indexer kalman filter.
-  stuck_voltage_error:double;
+  stuck_voltage_error:double (id: 7);
 
   // The current velocity measured as delta x / delta t in radians/sec.
-  instantaneous_velocity:double;
+  instantaneous_velocity:double (id: 8);
 
   // The error between our measurement and expected measurement in radians.
-  position_error:double;
+  position_error:double (id: 9);
 }
 
 table ShooterStatus {
   // The current average velocity in radians/second.
-  avg_angular_velocity:double;
+  avg_angular_velocity:double (id: 0);
 
   // The current instantaneous filtered velocity in radians/second.
-  angular_velocity:double;
+  angular_velocity:double (id: 1);
 
   // True if the shooter is ready.  It is better to compare the velocities
   // directly so there isn't confusion on if the goal is up to date.
-  ready:bool;
+  ready:bool (id: 2);
 
   // The estimated voltage error from the kalman filter in volts.
-  voltage_error:double;
+  voltage_error:double (id: 3);
 
   // The current velocity measured as delta x / delta t in radians/sec.
-  instantaneous_velocity:double;
-  filtered_velocity:double;
-  fixed_instantaneous_velocity:double;
+  instantaneous_velocity:double (id: 4);
+  filtered_velocity:double (id: 5);
+  fixed_instantaneous_velocity:double (id: 6);
 
   // The error between our measurement and expected measurement in radians.
-  position_error:double;
+  position_error:double (id: 7);
 }
 
 table ColumnEstimatorState {
-  error:bool;
-  zeroed:bool;
-  indexer:frc971.HallEffectAndPositionEstimatorState;
-  turret:frc971.HallEffectAndPositionEstimatorState;
+  error:bool (id: 0);
+  zeroed:bool (id: 1);
+  indexer:frc971.HallEffectAndPositionEstimatorState (id: 2);
+  turret:frc971.HallEffectAndPositionEstimatorState (id: 3);
 }
 
-table TurretProfiledSubsystemStatus {
+table TurretProfiledSubsystemStatus  {
   // Is the subsystem zeroed?
-  zeroed:bool;
+  zeroed:bool (id: 0);
 
   // The state of the subsystem, if applicable.  -1 otherwise.
-  state:int;
+  state:int (id: 1);
 
   // If true, we have aborted.
-  estopped:bool;
+  estopped:bool (id: 2);
 
   // Position of the joint.
-  position:float;
+  position:float (id: 3);
   // Velocity of the joint in units/second.
-  velocity:float;
+  velocity:float (id: 4);
   // Profiled goal position of the joint.
-  goal_position:float;
+  goal_position:float (id: 5);
   // Profiled goal velocity of the joint in units/second.
-  goal_velocity:float;
+  goal_velocity:float (id: 6);
   // Unprofiled goal position from absoulte zero of the joint.
-  unprofiled_goal_position:float;
+  unprofiled_goal_position:float (id: 7);
   // Unprofiled goal velocity of the joint in units/second.
-  unprofiled_goal_velocity:float;
+  unprofiled_goal_velocity:float (id: 8);
 
   // The estimated voltage error.
-  voltage_error:float;
+  voltage_error:float (id: 9);
 
   // The calculated velocity with delta x/delta t
-  calculated_velocity:float;
+  calculated_velocity:float (id: 10);
 
   // Components of the control loop output
-  position_power:float;
-  velocity_power:float;
-  feedforwards_power:float;
+  position_power:float (id: 11);
+  velocity_power:float (id: 12);
+  feedforwards_power:float (id: 13);
 
   // State of the estimator.
-  estimator_state:ColumnEstimatorState;
+  estimator_state:ColumnEstimatorState (id: 14);
 
-  raw_vision_angle:double;
-  vision_angle:double;
-  vision_tracking:bool;
+  raw_vision_angle:double (id: 15);
+  vision_angle:double (id: 16);
+  vision_tracking:bool (id: 17);
 
-  turret_encoder_angle:double;
+  turret_encoder_angle:double (id: 18);
 }
 
 table Status {
   // Are all the subsystems zeroed?
-  zeroed:bool;
+  zeroed:bool (id: 0);
 
   // If true, we have aborted. This is the or of all subsystem estops.
-  estopped:bool;
+  estopped:bool (id: 1);
 
   // Each subsystems status.
-  intake:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus;
-  hood:frc971.control_loops.IndexProfiledJointStatus;
-  shooter:ShooterStatus;
+  intake:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus (id: 2);
+  hood:frc971.control_loops.IndexProfiledJointStatus (id: 3);
+  shooter:ShooterStatus (id: 4);
 
-  turret:TurretProfiledSubsystemStatus;
-  indexer:IndexerStatus;
+  turret:TurretProfiledSubsystemStatus (id: 5);
+  indexer:IndexerStatus (id: 6);
 
-  vision_distance:float;
+  vision_distance:float (id: 7);
 }
 
 root_type Status;
diff --git a/y2017/vision/vision.fbs b/y2017/vision/vision.fbs
index f1bc013..7516af1 100644
--- a/y2017/vision/vision.fbs
+++ b/y2017/vision/vision.fbs
@@ -2,15 +2,15 @@
 
 // Published on ".y2017.vision.vision_status"
 table VisionStatus {
-  image_valid:bool;
+  image_valid:bool (id: 0);
 
   // Distance to the target in meters.
-  distance:double;
+  distance:double (id: 1);
   // The angle in radians of the bottom of the target.
-  angle:double;
+  angle:double (id: 2);
 
   // Capture time of the angle using the clock behind monotonic_clock::now().
-  target_time:long;
+  target_time:int64 (id: 3);
 }
 
 root_type VisionStatus;
diff --git a/y2018/control_loops/superstructure/superstructure_goal.fbs b/y2018/control_loops/superstructure/superstructure_goal.fbs
index b618c1b..dbef25a 100644
--- a/y2018/control_loops/superstructure/superstructure_goal.fbs
+++ b/y2018/control_loops/superstructure/superstructure_goal.fbs
@@ -3,37 +3,37 @@
 namespace y2018.control_loops.superstructure;
 
 table IntakeGoal {
-  roller_voltage:double;
+  roller_voltage:double (id: 0);
 
   // Goal angle in radians of the intake.
   // Zero radians is where the intake is pointing straight out, with positive
   // radians inward towards the cube.
-  left_intake_angle:double;
-  right_intake_angle:double;
+  left_intake_angle:double (id: 1);
+  right_intake_angle:double (id: 2);
 }
 
 table Goal {
-  intake:IntakeGoal;
+  intake:IntakeGoal (id: 0);
 
   // Used to identiy a position in the planned set of positions on the arm.
-  arm_goal_position:uint;
+  arm_goal_position:uint32 (id: 1);
   // If true, start the grab box sequence.
-  grab_box:bool;
+  grab_box:bool (id: 2);
 
-  open_claw:bool;
-  close_claw:bool;
+  open_claw:bool (id: 3);
+  close_claw:bool (id: 4);
 
-  deploy_fork:bool;
+  deploy_fork:bool (id: 5);
 
-  hook_release:bool;
+  hook_release:bool (id: 6);
 
-  voltage_winch:double;
+  voltage_winch:double (id: 7);
 
-  open_threshold:double;
+  open_threshold:double (id: 8);
 
-  disable_box_correct:bool;
+  disable_box_correct:bool (id: 9);
 
-  trajectory_override:bool;
+  trajectory_override:bool (id: 10);
 }
 
 root_type Goal;
diff --git a/y2018/control_loops/superstructure/superstructure_output.fbs b/y2018/control_loops/superstructure/superstructure_output.fbs
index f4d62da..1055222 100644
--- a/y2018/control_loops/superstructure/superstructure_output.fbs
+++ b/y2018/control_loops/superstructure/superstructure_output.fbs
@@ -3,38 +3,38 @@
 table IntakeVoltage {
   // Voltage of the motors on the series elastic on one side (left or right) of
   // the intake.
-  voltage_elastic:double;
+  voltage_elastic:double (id: 0);
 
   // Voltage of the rollers on one side (left or right) of the intake.
-  voltage_rollers:double;
+  voltage_rollers:double (id: 1);
 }
 
 table Output {
   // Voltage sent to the parts on the left side of the intake.
-  left_intake:IntakeVoltage;
+  left_intake:IntakeVoltage (id: 0);
 
   // Voltage sent to the parts on the right side of the intake.
-  right_intake:IntakeVoltage;
+  right_intake:IntakeVoltage (id: 1);
 
   // Voltage sent to the motors on the proximal joint of the arm.
-  voltage_proximal:double;
+  voltage_proximal:double (id: 2);
 
   // Voltage sent to the motors on the distal joint of the arm.
-  voltage_distal:double;
+  voltage_distal:double (id: 3);
 
   // Voltage sent to the hanger.  Positive pulls the robot up.
-  voltage_winch:double;
+  voltage_winch:double (id: 4);
 
   // Clamped (when true) or unclamped (when false) status sent to the
   // pneumatic claw on the arm.
-  claw_grabbed:bool;
+  claw_grabbed:bool (id: 5);
 
   // If true, release the arm brakes.
-  release_arm_brake:bool;
+  release_arm_brake:bool (id: 6);
   // If true, release the hook
-  hook_release:bool;
+  hook_release:bool (id: 7);
   // If true, release the forks
-  forks_release:bool;
+  forks_release:bool (id: 8);
 }
 
 root_type Output;
diff --git a/y2018/control_loops/superstructure/superstructure_position.fbs b/y2018/control_loops/superstructure/superstructure_position.fbs
index 0323b78..87c4b0e 100644
--- a/y2018/control_loops/superstructure/superstructure_position.fbs
+++ b/y2018/control_loops/superstructure/superstructure_position.fbs
@@ -4,47 +4,47 @@
 
 table IntakeElasticSensors {
   // Position of the motor end of the series elastic in radians.
-  motor_position:frc971.PotAndAbsolutePosition;
+  motor_position:frc971.PotAndAbsolutePosition (id: 0);
 
   // Displacement of the spring in radians.
-  spring_angle:double;
+  spring_angle:double (id: 1);
 
   // False if the beam break sensor isn't triggered, true if the beam breaker is
   // triggered.
-  beam_break:bool;
+  beam_break:bool (id: 2);
 }
 
 table ArmPosition {
   // Values of the encoder and potentiometer at the base of the proximal
   // (connected to drivebase) arm in radians.
-  proximal:frc971.PotAndAbsolutePosition;
+  proximal:frc971.PotAndAbsolutePosition (id: 0);
 
   // Values of the encoder and potentiometer at the base of the distal
   // (connected to proximal) arm in radians.
-  distal:frc971.PotAndAbsolutePosition;
+  distal:frc971.PotAndAbsolutePosition (id: 1);
 }
 
 
 table Position {
   // Values of the series elastic encoders on the left side of the robot from
   // the rear perspective in radians.
-  left_intake:IntakeElasticSensors;
+  left_intake:IntakeElasticSensors (id: 0);
 
   // Values of the series elastic encoders on the right side of the robot from
   // the rear perspective in radians.
-  right_intake:IntakeElasticSensors;
+  right_intake:IntakeElasticSensors (id: 1);
 
-  arm:ArmPosition;
+  arm:ArmPosition (id: 2);
 
   // Value of the beam breaker sensor. This value is true if the beam is
   // broken, false if the beam isn't broken.
-  claw_beambreak_triggered:bool;
+  claw_beambreak_triggered:bool (id: 3);
   // Value of the beambreak sensor detecting when the box has hit the frame
   // cutout.
-  box_back_beambreak_triggered:bool;
+  box_back_beambreak_triggered:bool (id: 4);
 
   // Distance to the box in meters.
-  box_distance:double;
+  box_distance:double (id: 5);
 }
 
 root_type Position;
diff --git a/y2018/control_loops/superstructure/superstructure_status.fbs b/y2018/control_loops/superstructure/superstructure_status.fbs
index 8baf40e..9f53a82 100644
--- a/y2018/control_loops/superstructure/superstructure_status.fbs
+++ b/y2018/control_loops/superstructure/superstructure_status.fbs
@@ -4,97 +4,97 @@
 
 table IntakeSideStatus {
   // Is the subsystem zeroed?
-  zeroed:bool;
+  zeroed:bool (id: 0);
 
   // The state of the subsystem, if applicable.
-  state:int;
+  state:int32 (id: 1);
 
   // If true, we have aborted.
-  estopped:bool;
+  estopped:bool (id: 2);
 
   // Estimated position of the spring.
-  spring_position:float;
+  spring_position:float (id: 3);
   // Estimated velocity of the spring in units/second.
-  spring_velocity:float;
+  spring_velocity:float (id: 4);
   // Reported wrapping of the spring
-  spring_wrapped:int;
+  spring_wrapped:int (id: 5);
 
   // Estimated position of the joint.
-  motor_position:float;
+  motor_position:float (id: 6);
   // Estimated velocity of the joint in units/second.
-  motor_velocity:float;
+  motor_velocity:float (id: 7);
 
   // Goal position of the joint.
-  goal_position:float;
+  goal_position:float (id: 8);
   // Goal velocity of the joint in units/second.
-  goal_velocity:float;
+  goal_velocity:float (id: 9);
 
   // The calculated velocity with delta x/delta t
-  calculated_velocity:float;
+  calculated_velocity:float (id: 10);
 
   // The voltage given last cycle;
-  delayed_voltage:float;
+  delayed_voltage:float (id: 11);
 
   // State of the estimator.
-  estimator_state:frc971.PotAndAbsoluteEncoderEstimatorState;
+  estimator_state:frc971.PotAndAbsoluteEncoderEstimatorState (id: 12);
 }
 
 table ArmStatus {
   // State of the estimators.
-  proximal_estimator_state:frc971.PotAndAbsoluteEncoderEstimatorState;
-  distal_estimator_state:frc971.PotAndAbsoluteEncoderEstimatorState;
+  proximal_estimator_state:frc971.PotAndAbsoluteEncoderEstimatorState (id: 0);
+  distal_estimator_state:frc971.PotAndAbsoluteEncoderEstimatorState (id: 1);
 
   // The node we are currently going to.
-  current_node:uint;
+  current_node:uint32 (id: 2);
   // Distance (in radians) to the end of the path.
-  path_distance_to_go:float;
+  path_distance_to_go:float (id: 3);
   // Goal position and velocity (radians)
-  goal_theta0:float;
-  goal_theta1:float;
-  goal_omega0:float;
-  goal_omega1:float;
+  goal_theta0:float (id: 4);
+  goal_theta1:float (id: 5);
+  goal_omega0:float (id: 6);
+  goal_omega1:float (id: 7);
 
   // Current position and velocity (radians)
-  theta0:float;
-  theta1:float;
+  theta0:float (id: 8);
+  theta1:float (id: 9);
 
-  omega0:float;
-  omega1:float;
+  omega0:float (id: 10);
+  omega1:float (id: 11);
 
   // Estimated voltage error for the two joints.
-  voltage_error0:float;
-  voltage_error1:float;
+  voltage_error0:float (id: 12);
+  voltage_error1:float (id: 13);
 
   // True if we are zeroed.
-  zeroed:bool;
+  zeroed:bool (id: 14);
 
   // True if the arm is zeroed.
-  estopped:bool;
+  estopped:bool (id: 15);
 
   // The current state machine state.
-  state:uint;
+  state:uint32 (id: 16);
 
-  grab_state:uint;
+  grab_state:uint32 (id: 17);
 
   // The number of times the LQR solver failed.
-  failed_solutions:uint;
+  failed_solutions:uint32 (id: 18);
 }
 
 table Status {
   // Are all the subsystems zeroed?
-  zeroed:bool;
+  zeroed:bool (id: 0);
 
   // If true, any of the subsystems have aborted.
-  estopped:bool;
+  estopped:bool (id: 1);
 
   // Status of both intake sides.
-  left_intake:IntakeSideStatus;
-  right_intake:IntakeSideStatus;
+  left_intake:IntakeSideStatus (id: 2);
+  right_intake:IntakeSideStatus (id: 3);
 
-  arm:ArmStatus;
+  arm:ArmStatus (id: 4);
 
-  filtered_box_velocity:double;
-  rotation_state:uint;
+  filtered_box_velocity:double (id: 5);
+  rotation_state:uint (id: 6);
 }
 
 root_type Status;
diff --git a/y2018/status_light.fbs b/y2018/status_light.fbs
index e51decb..118a3dc 100644
--- a/y2018/status_light.fbs
+++ b/y2018/status_light.fbs
@@ -2,9 +2,9 @@
 
 table StatusLight {
   // How bright to make each one. 0 is off, 1 is full on.
-  red:float;
-  green:float;
-  blue:float;
+  red:float (id: 0);
+  green:float (id: 1);
+  blue:float (id: 2);
 }
 
 root_type StatusLight;
diff --git a/y2018/vision/vision.fbs b/y2018/vision/vision.fbs
index 14f8a45..5337f2b 100644
--- a/y2018/vision/vision.fbs
+++ b/y2018/vision/vision.fbs
@@ -2,8 +2,8 @@
 
 // Published on ".y2018.vision.vision_status"
 table VisionStatus {
-  high_frame_count:uint;
-  low_frame_count:uint;
+  high_frame_count:uint (id: 0);
+  low_frame_count:uint (id: 1);
 }
 
 root_type VisionStatus;
diff --git a/y2019/camera_log.fbs b/y2019/camera_log.fbs
index 0ef7c04..11faf2d 100644
--- a/y2019/camera_log.fbs
+++ b/y2019/camera_log.fbs
@@ -1,7 +1,7 @@
 namespace y2019;
 
 table CameraLog {
-  log:bool;
+  log:bool (id: 0);
 }
 
 root_type CameraLog;
diff --git a/y2019/control_loops/drivetrain/camera.fbs b/y2019/control_loops/drivetrain/camera.fbs
index 154dd2e..74117d9 100644
--- a/y2019/control_loops/drivetrain/camera.fbs
+++ b/y2019/control_loops/drivetrain/camera.fbs
@@ -2,23 +2,23 @@
 
 // See the Target structure in //y2019/jevois:structures.h for documentation.
 table CameraTarget {
-  distance:float;
-  height:float;
-  heading:float;
-  skew:float;
+  distance:float (id: 0);
+  height:float (id: 1);
+  heading:float (id: 2);
+  skew:float (id: 3);
 }
 
 // Frames from a camera.
 table CameraFrame {
   // Number of nanoseconds since the aos::monotonic_clock epoch at which this
   // frame was captured.
-  timestamp:long;
+  timestamp:long (id: 0);
 
   // Buffer for the 3 targets.
-  targets:[CameraTarget];
+  targets:[CameraTarget] (id: 1);
 
   // Index of the camera position (not serial number) which this frame is from.
-  camera:ubyte;
+  camera:ubyte (id: 2);
 }
 
 root_type CameraFrame;
diff --git a/y2019/control_loops/drivetrain/target_selector.fbs b/y2019/control_loops/drivetrain/target_selector.fbs
index f7a3291..b997bdb 100644
--- a/y2019/control_loops/drivetrain/target_selector.fbs
+++ b/y2019/control_loops/drivetrain/target_selector.fbs
@@ -17,7 +17,7 @@
 // The drivetrain listens on ".y2019.control_loops.drivetrain.target_selector_hint"
 table TargetSelectorHint {
   // Which target we should go for:
-  suggested_target:SelectionHint;
+  suggested_target:SelectionHint (id: 0);
 }
 
 root_type TargetSelectorHint;
diff --git a/y2019/control_loops/superstructure/superstructure_goal.fbs b/y2019/control_loops/superstructure/superstructure_goal.fbs
index 77e7c8d..93c31cd 100644
--- a/y2019/control_loops/superstructure/superstructure_goal.fbs
+++ b/y2019/control_loops/superstructure/superstructure_goal.fbs
@@ -4,34 +4,34 @@
 
 table SuctionGoal {
   // True = apply suction
-  grab_piece:bool;
+  grab_piece:bool (id: 0);
 
   // 0 = ball mode
   // 1 = disk mode
 
-  gamepiece_mode:int;
+  gamepiece_mode:int (id: 1);
 }
 
 table Goal {
   // Meters, 0 = lowest position - mechanical hard stop,
   // positive = upward
-  elevator:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal;
+  elevator:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal (id: 0);
   // 0 = linkage on the sprocket is pointing straight up,
   // positive = forward
-  intake:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal;
+  intake:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal (id: 1);
   // 0 = Straight up parallel to elevator
   // Positive rotates toward intake from 0
-  wrist:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal;
+  wrist:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal (id: 2);
 
   // Distance stilts extended out of the bottom of the robot. Positive = down.
   // 0 is the height such that the bottom of the stilts is tangent to the
   // bottom of the middle wheels.
-  stilts:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal;
+  stilts:frc971.control_loops.StaticZeroingSingleDOFProfiledSubsystemGoal (id: 3);
 
   // Positive is rollers intaking inward.
-  roller_voltage:float;
+  roller_voltage:float (id: 4);
 
-  suction:SuctionGoal;
+  suction:SuctionGoal (id: 5);
 }
 
 root_type Goal;
diff --git a/y2019/control_loops/superstructure/superstructure_output.fbs b/y2019/control_loops/superstructure/superstructure_output.fbs
index b679347..42ba6b2 100644
--- a/y2019/control_loops/superstructure/superstructure_output.fbs
+++ b/y2019/control_loops/superstructure/superstructure_output.fbs
@@ -2,29 +2,29 @@
 
 table Output {
   // Voltage sent to motors moving elevator up/down. Positive is up.
-  elevator_voltage:double;
+  elevator_voltage:double (id: 0);
 
   // Voltage sent to wrist motors on elevator to rotate.
   // Positive rotates over the top towards the front of the robot.
-  wrist_voltage:double;
+  wrist_voltage:double (id: 1);
 
   // Voltage sent to motors on intake joint. Positive extends rollers.
-  intake_joint_voltage:double;
+  intake_joint_voltage:double (id: 2);
 
   // Voltage sent to rollers on intake. Positive rolls inward.
-  intake_roller_voltage:double;
+  intake_roller_voltage:double (id: 3);
 
   // Voltage sent to motors to move stilts height. Positive moves robot
   // upward.
-  stilts_voltage:double;
+  stilts_voltage:double (id: 4);
 
   // True opens solenoid (applies suction)
   // Top/bottom are when wrist is toward the front of the robot
-  intake_suction_top:bool;
-  intake_suction_bottom:bool;
+  intake_suction_top:bool (id: 5);
+  intake_suction_bottom:bool (id: 6);
 
   // Voltage sent to the vacuum pump motors.
-  pump_voltage:double;
+  pump_voltage:double (id: 7);
 }
 
 root_type Output;
diff --git a/y2019/control_loops/superstructure/superstructure_position.fbs b/y2019/control_loops/superstructure/superstructure_position.fbs
index 80a851e..86a615d 100644
--- a/y2019/control_loops/superstructure/superstructure_position.fbs
+++ b/y2019/control_loops/superstructure/superstructure_position.fbs
@@ -5,26 +5,26 @@
 table Position {
   // Input from pressure sensor in bar
   // 1 = 1 atm, 0 = full vacuum
-  suction_pressure:float;
+  suction_pressure:float (id: 0);
 
   // Position of the elevator, 0 at lowest position, positive when up.
-  elevator:frc971.PotAndAbsolutePosition;
+  elevator:frc971.PotAndAbsolutePosition (id: 1);
 
   // Position of wrist, 0 when up, positive is rotating toward the front,
   // over the top.
-  wrist:frc971.PotAndAbsolutePosition;
+  wrist:frc971.PotAndAbsolutePosition (id: 2);
 
   // Position of the intake. 0 when rollers are retracted, positive extended.
-  intake_joint:frc971.AbsolutePosition;
+  intake_joint:frc971.AbsolutePosition (id: 3);
 
   // Position of the stilts, 0 when retracted (defualt), positive lifts robot.
-  stilts:frc971.PotAndAbsolutePosition;
+  stilts:frc971.PotAndAbsolutePosition (id: 4);
 
   // True if the platform detection sensors detect the platform directly
   // below the robot right behind the left and right wheels.  Useful for
   // determining when the robot is all the way on the platform.
-  platform_left_detect:bool;
-  platform_right_detect:bool;
+  platform_left_detect:bool (id: 5);
+  platform_right_detect:bool (id: 6);
 }
 
 root_type Position;
diff --git a/y2019/control_loops/superstructure/superstructure_status.fbs b/y2019/control_loops/superstructure/superstructure_status.fbs
index 9d3f44e..98fe483 100644
--- a/y2019/control_loops/superstructure/superstructure_status.fbs
+++ b/y2019/control_loops/superstructure/superstructure_status.fbs
@@ -5,19 +5,19 @@
 
 table Status {
   // All subsystems know their location.
-  zeroed:bool;
+  zeroed:bool (id: 0);
 
   // If true, we have aborted. This is the or of all subsystem estops.
-  estopped:bool;
+  estopped:bool (id: 1);
 
   // Whether suction_pressure indicates cargo is held
-  has_piece:bool;
+  has_piece:bool (id: 2);
 
   // Status of each subsystem.
-  elevator:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus;
-  wrist:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus;
-  intake:frc971.control_loops.AbsoluteEncoderProfiledJointStatus;
-  stilts:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus;
+  elevator:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus (id: 3);
+  wrist:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus (id: 4);
+  intake:frc971.control_loops.AbsoluteEncoderProfiledJointStatus (id: 5);
+  stilts:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus (id: 6);
 }
 
 root_type Status;
diff --git a/y2019/status_light.fbs b/y2019/status_light.fbs
index 665b3f8..cbc65b3 100644
--- a/y2019/status_light.fbs
+++ b/y2019/status_light.fbs
@@ -2,9 +2,9 @@
 
 table StatusLight {
   // How bright to make each one. 0 is off, 1 is full on.
-  red:float;
-  green:float;
-  blue:float;
+  red:float (id: 0);
+  green:float (id: 1);
+  blue:float (id: 2);
 }
 
 root_type StatusLight;
diff --git a/y2020/control_loops/superstructure/superstructure_goal.fbs b/y2020/control_loops/superstructure/superstructure_goal.fbs
index 9200082..792b6b4 100644
--- a/y2020/control_loops/superstructure/superstructure_goal.fbs
+++ b/y2020/control_loops/superstructure/superstructure_goal.fbs
@@ -5,10 +5,10 @@
 table ShooterGoal {
   // Angular velocity in rad/s of the slowest (lowest) wheel in the kicker.
   // Positive is shooting the ball.
-  velocity_accelerator:double;
+  velocity_accelerator:double (id: 0);
 
   // Angular velocity in rad/s of the flywheel. Positive is shooting.
-  velocity_finisher:double;
+  velocity_finisher:double (id: 1);
 }
 
 table Goal {
diff --git a/y2020/control_loops/superstructure/superstructure_output.fbs b/y2020/control_loops/superstructure/superstructure_output.fbs
index fd57825..005d930 100644
--- a/y2020/control_loops/superstructure/superstructure_output.fbs
+++ b/y2020/control_loops/superstructure/superstructure_output.fbs
@@ -2,35 +2,35 @@
 
 table Output {
   // Votage sent to the hood. Positive moves up.
-  hood_voltage:double;
+  hood_voltage:double (id: 0);
 
   // Voltage sent to motors on intake joint. Positive extends rollers.
-  intake_joint_voltage:double;
+  intake_joint_voltage:double (id: 1);
 
   // Voltage sent to rollers on intake. Positive rolls inward.
-  intake_roller_voltage:double;
+  intake_roller_voltage:double (id: 2);
 
-  //Voltage sent to the motors.
-  //Positive rotates counterclockwise from a birds eye view.
-  turret_voltage:double;
+  // Voltage sent to the motors.
+  // Positive rotates counterclockwise from a birds eye view.
+  turret_voltage:double (id: 3);
 
   // Voltage sent to the feeder belt. Positive is feeding.
-  feeder_voltage:double;
+  feeder_voltage:double (id: 4);
 
   // Voltage sent to the washing_machine and control panel spinner.
   // Positive runs the washing machine CCW facing the front of the robot, and
   // the spinner runs CCW from a top down view.
-  washing_machine_spinner_voltage:double;
+  washing_machine_spinner_voltage:double (id: 5);
 
   // Voltage sent to the kicker. Positive is shooting.
-  accelerator_left_voltage:double;
-  accelerator_right_voltage:double;
+  accelerator_left_voltage:double (id: 6);
+  accelerator_right_voltage:double (id: 7);
 
   // Voltage sent to the flywheel. Positive is shooting.
-  finisher_voltage:double;
+  finisher_voltage:double (id: 8);
 
   // Positive is deploying climber and to climb; cannot run in reverse
-  climber_voltage:double;
+  climber_voltage:double (id: 9);
 }
 
 root_type Output;
diff --git a/y2020/control_loops/superstructure/superstructure_position.fbs b/y2020/control_loops/superstructure/superstructure_position.fbs
index ed4ba18..f139381 100644
--- a/y2020/control_loops/superstructure/superstructure_position.fbs
+++ b/y2020/control_loops/superstructure/superstructure_position.fbs
@@ -4,29 +4,29 @@
 
 table ShooterPosition {
   // Flywheel angle in radians, positive is shooting.
-  theta_finisher:double;
+  theta_finisher:double (id: 0);
 
   // Kicker angle in radians of the slowest (lowest) wheel, positive is
   // accelerating the ball toward the shooter.
-  theta_accelerator_left:double;
-  theta_accelerator_right:double;
+  theta_accelerator_left:double (id: 1);
+  theta_accelerator_right:double (id: 2);
 }
 
 table Position {
   // Zero is at the horizontal, positive towards the front (radians).
-  hood:frc971.AbsolutePosition;
+  hood:frc971.AbsolutePosition (id: 0);
 
   // Position of the intake. 0 when four-bar is vertical, positive extended.
-  intake_joint:frc971.AbsolutePosition;
+  intake_joint:frc971.AbsolutePosition (id: 1);
 
   // See goal for definition of 0
-  turret:frc971.PotAndAbsolutePosition;
+  turret:frc971.PotAndAbsolutePosition (id: 2);
 
   // Position of the kicker and flywheel
-  shooter:ShooterPosition;
+  shooter:ShooterPosition (id: 3);
 
    // Position of the control panel, relative to start, positive counterclockwise from above.
-  control_panel:frc971.RelativePosition;
+  control_panel:frc971.RelativePosition (id: 4);
 }
 
 root_type Position;
diff --git a/y2020/control_loops/superstructure/superstructure_status.fbs b/y2020/control_loops/superstructure/superstructure_status.fbs
index dc6116c..fb94d32 100644
--- a/y2020/control_loops/superstructure/superstructure_status.fbs
+++ b/y2020/control_loops/superstructure/superstructure_status.fbs
@@ -6,63 +6,63 @@
 table FlywheelControllerStatus {
   // The current average velocity in radians/second over the last kHistoryLength
   // in shooter.h
-  avg_angular_velocity:double;
+  avg_angular_velocity:double (id: 0);
 
   // The current instantaneous filtered velocity in radians/second.
-  angular_velocity:double;
+  angular_velocity:double (id: 1);
 
   // The target speed selected by the lookup table or from manual override
   // Can be compared to velocity to determine if ready.
-  angular_velocity_goal:double;
+  angular_velocity_goal:double (id: 2);
 
   // Voltage error.
-  voltage_error:double;
+  voltage_error:double (id: 3);
 }
 
 table ShooterStatus {
   // The final wheel shooting the ball
-  finisher:FlywheelControllerStatus;
+  finisher:FlywheelControllerStatus (id: 0);
 
   // The subsystem to accelerate the ball before the finisher
   // Velocity is the fastest (top) wheel
-  accelerator_left:FlywheelControllerStatus;
-  accelerator_right:FlywheelControllerStatus;
+  accelerator_left:FlywheelControllerStatus (id: 1);
+  accelerator_right:FlywheelControllerStatus (id: 2);
 }
 
 table AimerStatus {
   // The current goal angle for the turret auto-tracking, in radians.
-  turret_position:double;
+  turret_position:double (id: 0);
   // The current goal velocity for the turret, in radians / sec.
-  turret_velocity:double;
+  turret_velocity:double (id: 1);
   // Whether we are currently aiming for the inner port.
-  aiming_for_inner_port:bool;
+  aiming_for_inner_port:bool (id: 2);
   // The current distance to the target, in meters.
-  target_distance:double;
+  target_distance:double (id: 3);
   // The current "shot distance." When shooting on the fly, this may be
   // different from the static distance to the target.
-  shot_distance:double;
+  shot_distance:double (id: 4);
 }
 
 table Status {
   // All subsystems know their location.
-  zeroed:bool;
+  zeroed:bool (id: 0);
 
   // If true, we have aborted. This is if one or all subsystem estops.
-  estopped:bool;
+  estopped:bool (id: 1);
 
   // Subsystem status.
-  hood:frc971.control_loops.AbsoluteEncoderProfiledJointStatus;
-  intake:frc971.control_loops.AbsoluteEncoderProfiledJointStatus;
-  turret:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus;
+  hood:frc971.control_loops.AbsoluteEncoderProfiledJointStatus (id: 2);
+  intake:frc971.control_loops.AbsoluteEncoderProfiledJointStatus (id: 3);
+  turret:frc971.control_loops.PotAndAbsoluteEncoderProfiledJointStatus (id: 4);
 
   // Shooter subsystem status.
-  shooter:ShooterStatus;
+  shooter:ShooterStatus (id: 5);
 
   // Status of the control_panel
-  control_panel:frc971.control_loops.RelativeEncoderProfiledJointStatus;
+  control_panel:frc971.control_loops.RelativeEncoderProfiledJointStatus (id: 6);
 
   // Status of the vision auto-tracking.
-  aimer:AimerStatus;
+  aimer:AimerStatus (id: 7);
 }
 
 root_type Status;
diff --git a/y2020/setpoint.fbs b/y2020/setpoint.fbs
index 5f1af72..74164e5 100644
--- a/y2020/setpoint.fbs
+++ b/y2020/setpoint.fbs
@@ -1,11 +1,11 @@
 namespace y2020.joysticks;
 
 table Setpoint {
-  accelerator:double;
+  accelerator:double (id: 0);
 
-  finisher:double;
+  finisher:double (id: 1);
 
-  hood:double;
+  hood:double (id: 2);
 }
 
 root_type Setpoint;
diff --git a/y2020/vision/sift/sift.fbs b/y2020/vision/sift/sift.fbs
index f38e0fe..5c44858 100644
--- a/y2020/vision/sift/sift.fbs
+++ b/y2020/vision/sift/sift.fbs
@@ -2,9 +2,9 @@
 
 // Represents the location of a keypoint in field coordinates.
 struct KeypointFieldLocation {
-  x:float;
-  y:float;
-  z:float;
+  x:float (id: 0);
+  y:float (id: 1);
+  z:float (id: 2);
 }
 
 // Represents a single feature extracted from an image.
@@ -18,70 +18,70 @@
   // The size of this depends on the parameters. It is width*width*hist_bins.
   // Currently we have width=4 and hist_bins=8, which results in a size of
   // 4*4*8=128.
-  descriptor:[ubyte];
+  descriptor:[ubyte] (id: 0);
 
   // Location of the keypoint.
-  x:float;
-  y:float;
+  x:float (id: 1);
+  y:float (id: 2);
 
   // Size of the keypoint neighborhood.
-  size:float;
+  size:float (id: 3);
 
   // Angle of the keypoint.
   // This is in [0,360) clockwise.
-  angle:float;
+  angle:float (id: 4);
 
   // How good of a keypoint this is.
-  response:float;
+  response:float (id: 5);
 
   // Which octave this keypoint is from.
-  octave:int;
+  octave:int (id: 6);
 
   // Where this feature's keypoint is on the field. This will only be filled out
   // for training features, not ones extracted from query images.
-  field_location:KeypointFieldLocation;
+  field_location:KeypointFieldLocation (id: 7);
 }
 
 // Represents a single match between a training image and a query image.
 struct Match {
   // The index of the feature for the query image.
-  query_feature:int;
+  query_feature:int (id: 0);
   // The index of the feature for the training image.
-  train_feature:int;
+  train_feature:int (id: 1);
   // How "good" the match is.
-  distance:float;
+  distance:float (id: 2);
 }
 
 // Represents all the matches between a single training image and a query
 // image.
 table ImageMatch {
-  matches:[Match];
+  matches:[Match] (id: 0);
   // The index of the training image within all the training images.
-  train_image:int;
+  train_image:int (id: 1);
 }
 
 table TransformationMatrix {
   // The matrix data for a row-major 4x4 homogeneous transformation matrix.
   // This implies the bottom row is (0, 0, 0, 1).
-  data:[float];
+  data:[float] (id: 0);
 }
 
 // Calibration information for a given camera on a given robot.
 table CameraCalibration {
   // The name of the camera node which this calibration data applies to.
-  node_name:string;
+  node_name:string (id: 0);
   // The team number of the robot which this calibration data applies to.
-  team_number:int;
+  team_number:int (id: 1);
 
   // Intrinsics for the camera.
   //
   // This is the standard OpenCV intrinsics matrix in row major order (3x3).
-  intrinsics:[float];
+  intrinsics:[float] (id: 2);
 
   // Fixed extrinsics for the camera. This transforms from camera coordinates to
   // robot coordinates. For example: multiplying (0, 0, 0, 1) by this results in
   // the position of the camera aperature in robot coordinates.
-  fixed_extrinsics:TransformationMatrix;
+  fixed_extrinsics:TransformationMatrix (id: 3);
 
   // Extrinsics for a camera on a turret. This will only be filled out for
   // applicable cameras. For turret-mounted cameras, fixed_extrinsics defines
@@ -97,13 +97,13 @@
   //   fixed_extrinsics
   //   rotation around the Z axis by the turret angle
   //   turret_extrinsics
-  turret_extrinsics:TransformationMatrix;
+  turret_extrinsics:TransformationMatrix (id: 4);
 
   // This is the standard OpenCV 5 parameter distortion coefficients
-  dist_coeffs:[float];
+  dist_coeffs:[float] (id: 5);
 
   // Timestamp for when the calibration was taken on the realtime clock.
-  calibration_timestamp:int64;
+  calibration_timestamp:int64 (id: 6);
 }
 
 // Contains the information the EKF wants from an image matched against a single
@@ -120,7 +120,7 @@
   // (0, 0, 0) is the aperture of the camera (we pretend it's an ideal pinhole
   // camera). Positive Z is out of the camera. Positive X and Y are right
   // handed, but which way they face depends on the camera extrinsics.
-  camera_to_target:TransformationMatrix;
+  camera_to_target:TransformationMatrix (id: 0);
 
   // Field coordinates of the target, represented as a transformation matrix
   // from the field to the target.
@@ -133,36 +133,36 @@
   //
   // The value here will be selected from a small, static set of targets we
   // train images on.
-  field_to_target:TransformationMatrix;
+  field_to_target:TransformationMatrix (id: 1);
 
   // The pose of the camera in the field coordinate frame
-  field_to_camera:TransformationMatrix;
+  field_to_camera:TransformationMatrix (id: 2);
 
   // 2D image coordinate representing target location on the matched image
-  query_target_point_x:float;
-  query_target_point_y:float;
+  query_target_point_x:float (id: 3);
+  query_target_point_y:float (id: 4);
   // Perceived radius of target circle
-  query_target_point_radius:float;
+  query_target_point_radius:float (id: 5);
 }
 
 table ImageMatchResult {
   // The matches from this image to each of the training images which matched.
   // Each member is against the same captured image.
-  image_matches:[ImageMatch];
+  image_matches:[ImageMatch] (id: 0);
 
   // The transformations for this image for each of the training images which
   // matched.
   // TODO(Brian): Include some kind of covariance information for these.
-  camera_poses:[CameraPose];
+  camera_poses:[CameraPose] (id: 1);
 
   // The features for this image.
-  features:[Feature];
+  features:[Feature] (id: 2);
 
   // Timestamp when the frame was captured.
-  image_monotonic_timestamp_ns:long;
+  image_monotonic_timestamp_ns:long (id: 3);
 
   // Information about the camera which took this image.
-  camera_calibration:CameraCalibration;
+  camera_calibration:CameraCalibration (id: 4);
 }
 
 root_type ImageMatchResult;
diff --git a/y2020/vision/sift/sift_training.fbs b/y2020/vision/sift/sift_training.fbs
index 12ad9b4..c093e3b 100644
--- a/y2020/vision/sift/sift_training.fbs
+++ b/y2020/vision/sift/sift_training.fbs
@@ -4,26 +4,26 @@
 
 // Represents a single image we train against.
 table TrainingImage {
-  features:[Feature];
+  features:[Feature] (id: 0);
 
   // Field coordinates of the target, represented as a transformation matrix
   // from the target to the field. See CameraPose in :sift_fbs for details of
   // the conventions of this.
-  field_to_target:TransformationMatrix;
+  field_to_target:TransformationMatrix (id: 1);
 
   // 2D image coordinate representing target location on the training image
-  target_point_x:float;
-  target_point_y:float;
+  target_point_x:float (id: 2);
+  target_point_y:float (id: 3);
   // Radius of target circle
-  target_point_radius:float;
+  target_point_radius:float (id: 4);
 }
 
 // Represents the information used to match incoming images against.
 table TrainingData {
-  images:[TrainingImage];
+  images:[TrainingImage] (id: 0);
 
   // Calibration information for all the cameras we know about.
-  camera_calibrations:[CameraCalibration];
+  camera_calibrations:[CameraCalibration] (id: 1);
 }
 
 root_type TrainingData;
diff --git a/y2020/vision/vision.fbs b/y2020/vision/vision.fbs
index 17dc4a4..e89a181 100644
--- a/y2020/vision/vision.fbs
+++ b/y2020/vision/vision.fbs
@@ -10,13 +10,13 @@
 //   * Order: row major (index 0 is upper left, index 1 is to its right)
 table CameraImage {
   // The number of rows in the image.
-  rows:int;
+  rows:int32 (id: 0);
   // The number of columns in the image.
-  cols:int;
+  cols:int32 (id: 1);
   // The image data.
-  data:[ubyte];
+  data:[ubyte] (id: 2);
   // Timestamp when the frame was captured. This is the end-of-frame timestamp.
-  monotonic_timestamp_ns:long;
+  monotonic_timestamp_ns:int64 (id: 3);
 }
 
 root_type CameraImage;