Merge changes I07cddd54,Ib68aa460,I68643447,I37406f09,Ia0f9d41c

* changes:
  Increase number of senders on timing report
  Use the second catapult motor in pwm
  Add climber zeroing
  Add intake zeroing constants
  Update sensor numbers in wpilib_interface
diff --git a/y2024/constants.h b/y2024/constants.h
index 0dce685..9923660 100644
--- a/y2024/constants.h
+++ b/y2024/constants.h
@@ -81,8 +81,9 @@
     return 16 * 0.25 * 0.0254;
   }
 
-  static constexpr double kClimberEncoderMetersPerRevolution() {
-    return kClimberEncoderRatio() * kClimberPotMetersPerRevolution();
+  static constexpr double kClimberEncoderMetersPerRadian() {
+    return kClimberEncoderRatio() * kClimberPotMetersPerRevolution() / 2.0 /
+           M_PI;
   }
 
   static constexpr double kClimberPotMetersPerVolt() {
@@ -121,8 +122,8 @@
   static constexpr double kExtendPotMetersPerRevolution() {
     return 36 * 0.005 * kExtendEncoderRatio();
   }
-  static constexpr double kExtendEncoderMetersPerRevolution() {
-    return kExtendPotMetersPerRevolution();
+  static constexpr double kExtendEncoderMetersPerRadian() {
+    return kExtendPotMetersPerRevolution() / 2.0 / M_PI;
   }
   static constexpr double kExtendPotMetersPerVolt() {
     return kExtendPotMetersPerRevolution() * (5.0 /*turns*/ / 5.0 /*volts*/);
diff --git a/y2024/constants/971.json b/y2024/constants/971.json
index ec59033..34962af 100644
--- a/y2024/constants/971.json
+++ b/y2024/constants/971.json
@@ -14,18 +14,18 @@
   "robot": {
     {% set _ = intake_pivot_zero.update(
       {
-          "measured_absolute_position" : 0.0
+          "measured_absolute_position" : 2.99648178674155
       }
     ) %}
     "intake_constants":  {{ intake_pivot_zero | tojson(indent=2)}},
     "climber_constants": {
       {% set _ = climber_zero.update(
           {
-              "measured_absolute_position" : 0.0
+              "measured_absolute_position" : 0.0102739460232857
           }
       ) %}
       "zeroing_constants": {{ climber_zero | tojson(indent=2)}},
-      "potentiometer_offset": 0.0
+      "potentiometer_offset": {{ -0.935529777248618 + 1.83632555414775 }}
     },
     "catapult_constants": {
       {% set _ = catapult_zero.update(
diff --git a/y2024/constants/common.jinja2 b/y2024/constants/common.jinja2
index e132993..2d36c78 100644
--- a/y2024/constants/common.jinja2
+++ b/y2024/constants/common.jinja2
@@ -4,12 +4,16 @@
 
 {# Intake #}
 {# we do this here so we keep the encoder ratio in plaintext and also keep the math we're using. #}
-{% set intake_pivot_encoder_ratio = (24.0 / 15.0) %}
+{% set intake_pivot_encoder_ratio = (15.0 / 24.0) %}
+
+{% set intake_upper = 2.1 %}
+{% set intake_lower = 0.1 %}
 
 {%
 set intake_pivot_zero = {
     "average_filter_size": zeroing_sample_size,
     "one_revolution_distance": pi * 2.0 * intake_pivot_encoder_ratio,
+    "middle_position": (intake_upper + intake_lower) / 2,
     "zeroing_threshold": 0.0005,
     "moving_buffer_size": 20,
     "allowable_encoder_error": 0.9
@@ -29,7 +33,7 @@
 %}
 
 {% set climber_encoder_ratio = (16.0 / 60.0) %}
-{% set climber_radius = 16.0 * 0.25 / 2.0 / pi %}
+{% set climber_radius = 16.0 * 0.25 * 0.0254 %}
 {%
 set climber_zero = {
     "average_filter_size": zeroing_sample_size,
diff --git a/y2024/constants/common.json b/y2024/constants/common.json
index 6117c93..282b3c7 100644
--- a/y2024/constants/common.json
+++ b/y2024/constants/common.json
@@ -1,3 +1,5 @@
+{% from 'y2024/constants/common.jinja2' import intake_upper, intake_lower %}
+
 "common": {
   "target_map": {% include 'y2024/vision/maps/target_map.json' %},
   "shooter_interpolation_table": [
@@ -25,8 +27,8 @@
     "intaking": 12.0
   },
   "intake_pivot_set_points": {
-    "extended": 1.5,
-    "retracted": 0.5
+    "extended": 0.1,
+    "retracted": 2.0
   },
   "intake_pivot": {
     "zeroing_voltage": 3.0,
@@ -40,10 +42,10 @@
       "max_acceleration": 30.0
     },
     "range": {
-        "lower_hard": -0.85,
-        "upper_hard": 1.85,
-        "lower": -0.400,
-        "upper": 1.57
+        "lower_hard": 0.0,
+        "upper_hard": 2.1,
+        "lower": {{ intake_lower }},
+        "upper": {{ intake_upper }}
     },
     "loop": {% include 'y2024/control_loops/superstructure/intake_pivot/integral_intake_pivot_plant.json' %}
   },
diff --git a/y2024/wpilib_interface.cc b/y2024/wpilib_interface.cc
index 6e75387..16fb182 100644
--- a/y2024/wpilib_interface.cc
+++ b/y2024/wpilib_interface.cc
@@ -78,7 +78,7 @@
 constexpr double kMaxBringupPower = 12.0;
 
 double climber_pot_translate(double voltage) {
-  return voltage * Values::kClimberPotMetersPerVolt();
+  return -1 * voltage * Values::kClimberPotMetersPerVolt();
 }
 
 double extend_pot_translate(double voltage) {
@@ -166,15 +166,15 @@
 
       CopyPosition(climber_encoder_, builder->add_climber(),
                    Values::kClimberEncoderCountsPerRevolution(),
-                   Values::kClimberEncoderMetersPerRevolution(),
-                   climber_pot_translate, true,
+                   Values::kClimberEncoderMetersPerRadian(),
+                   climber_pot_translate, false,
                    robot_constants_->robot()
                        ->climber_constants()
                        ->potentiometer_offset());
 
       CopyPosition(extend_encoder_, builder->add_extend(),
-                   Values::kClimberEncoderCountsPerRevolution(),
-                   Values::kClimberEncoderMetersPerRevolution(),
+                   Values::kExtendEncoderCountsPerRevolution(),
+                   Values::kExtendEncoderMetersPerRadian(),
                    extend_pot_translate, true,
                    robot_constants_->robot()
                        ->extend_constants()
@@ -209,7 +209,7 @@
 
     SendDrivetrainPosition(drivetrain_position_sender_.MakeStaticBuilder(),
                            drivetrain_velocity_translate,
-                           constants::Values::DrivetrainEncoderToMeters, false,
+                           constants::Values::DrivetrainEncoderToMeters, true,
                            false);
 
     {
@@ -363,7 +363,7 @@
 
   void Write(const superstructure::Output &output) override {
     WritePwm(output.catapult_voltage(), catapult_kraken_one_.get());
-    WritePwm(output.catapult_voltage(), catapult_kraken_one_.get());
+    WritePwm(output.catapult_voltage(), catapult_kraken_two_.get());
   }
 
   template <typename T>
@@ -392,6 +392,8 @@
         &constant_fetcher_event_loop);
     const Constants *robot_constants = &constants_fetcher.constants();
 
+    AddLoop(&constant_fetcher_event_loop);
+
     // Thread 1.
     ::aos::ShmEventLoop joystick_sender_event_loop(&config.message());
     ::frc971::wpilib::JoystickSender joystick_sender(
@@ -407,27 +409,28 @@
     ::aos::ShmEventLoop sensor_reader_event_loop(&config.message());
     SensorReader sensor_reader(&sensor_reader_event_loop, robot_constants);
     sensor_reader.set_pwm_trigger(true);
-    sensor_reader.set_drivetrain_left_encoder(make_encoder(1));
-    sensor_reader.set_drivetrain_right_encoder(make_encoder(0));
-    sensor_reader.set_yaw_rate_input(make_unique<frc::DigitalInput>(0));
-    // TODO: (niko) change values once robot is wired
-    sensor_reader.set_intake_pivot(make_encoder(4),
-                                   make_unique<frc::DigitalInput>(4));
-    sensor_reader.set_transfer_beambreak(make_unique<frc::DigitalInput>(7));
+    sensor_reader.set_drivetrain_left_encoder(
+        std::make_unique<frc::Encoder>(6, 7));
+    sensor_reader.set_drivetrain_right_encoder(
+        std::make_unique<frc::Encoder>(8, 9));
+    sensor_reader.set_yaw_rate_input(make_unique<frc::DigitalInput>(25));
+    sensor_reader.set_intake_pivot(make_encoder(3),
+                                   make_unique<frc::DigitalInput>(3));
+    sensor_reader.set_transfer_beambreak(make_unique<frc::DigitalInput>(23));
 
     sensor_reader.set_climber(make_encoder(5),
                               make_unique<frc::DigitalInput>(5),
                               make_unique<frc::AnalogInput>(5));
-    sensor_reader.set_extend(make_encoder(7), make_unique<frc::DigitalInput>(7),
-                             make_unique<frc::AnalogInput>(7));
-    sensor_reader.set_catapult(make_encoder(2),
-                               make_unique<frc::DigitalInput>(2),
-                               make_unique<frc::AnalogInput>(2));
-    sensor_reader.set_turret(make_encoder(3), make_unique<frc::DigitalInput>(3),
-                             make_unique<frc::AnalogInput>(3));
-    sensor_reader.set_altitude(make_encoder(6),
-                               make_unique<frc::DigitalInput>(6),
-                               make_unique<frc::AnalogInput>(6));
+    sensor_reader.set_extend(make_encoder(4), make_unique<frc::DigitalInput>(4),
+                             make_unique<frc::AnalogInput>(4));
+    sensor_reader.set_catapult(make_encoder(0),
+                               make_unique<frc::DigitalInput>(0),
+                               make_unique<frc::AnalogInput>(0));
+    sensor_reader.set_turret(make_encoder(2), make_unique<frc::DigitalInput>(2),
+                             make_unique<frc::AnalogInput>(2));
+    sensor_reader.set_altitude(make_encoder(1),
+                               make_unique<frc::DigitalInput>(1),
+                               make_unique<frc::AnalogInput>(1));
 
     AddLoop(&sensor_reader_event_loop);
 
@@ -678,7 +681,7 @@
     SuperstructurePWMWriter superstructure_pwm_writer(&pwm_event_loop);
     superstructure_pwm_writer.set_catapult_kraken_one(
         make_unique<frc::TalonFX>(0));
-    superstructure_pwm_writer.set_catapult_kraken_one(
+    superstructure_pwm_writer.set_catapult_kraken_two(
         make_unique<frc::TalonFX>(1));
 
     AddLoop(&pwm_event_loop);
diff --git a/y2024/y2024_roborio.json b/y2024/y2024_roborio.json
index b78daef..5ddb254 100644
--- a/y2024/y2024_roborio.json
+++ b/y2024/y2024_roborio.json
@@ -35,7 +35,7 @@
       "type": "aos.timing.Report",
       "source_node": "roborio",
       "frequency": 50,
-      "num_senders": 20,
+      "num_senders": 30,
       "max_size": 8192
     },
     {