Tune shooter control loop

It converges much faster now.  To plot live, use:

  web_proxy_main.stripped --buffer_size 10000

Change-Id: I499b8cdac176e26b33fd6cbef2bc0b2a3b5e0c9a
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/y2020/control_loops/python/finisher.py b/y2020/control_loops/python/finisher.py
index 35ff48f..7ccccd6 100644
--- a/y2020/control_loops/python/finisher.py
+++ b/y2020/control_loops/python/finisher.py
@@ -33,7 +33,7 @@
 # The position and velocity are measured for the final wheel.
 kFinisher = flywheel.FlywheelParams(
     name='Finisher',
-    motor=AddResistance(control_loop.NMotor(control_loop.Falcon(), 2), 0.01),
+    motor=AddResistance(control_loop.NMotor(control_loop.Falcon(), 2), 0.03),
     G=G,
     J=J,
     q_pos=0.01,
diff --git a/y2020/control_loops/superstructure/accelerator_plotter.ts b/y2020/control_loops/superstructure/accelerator_plotter.ts
index eaca1b8..b625a1c 100644
--- a/y2020/control_loops/superstructure/accelerator_plotter.ts
+++ b/y2020/control_loops/superstructure/accelerator_plotter.ts
@@ -1,7 +1,7 @@
 // Provides a plot for debugging robot state-related issues.
 import {AosPlotter} from 'org_frc971/aos/network/www/aos_plotter';
 import * as proxy from 'org_frc971/aos/network/www/proxy';
-import {BLUE, BROWN, CYAN, GREEN, PINK, RED, WHITE} from 'org_frc971/aos/network/www/colors';
+import {BLUE, BROWN, CYAN, GREEN, PINK, RED, WHITE, BLACK} from 'org_frc971/aos/network/www/colors';
 
 import Connection = proxy.Connection;
 
@@ -26,13 +26,14 @@
   velocityPlot.plot.getAxisLabels().setTitle('Velocity');
   velocityPlot.plot.getAxisLabels().setXLabel(TIME);
   velocityPlot.plot.getAxisLabels().setYLabel('rad/s');
-  velocityPlot.plot.setDefaultYRange([0.0, 450.0]);
+  velocityPlot.plot.setDefaultYRange([0.0, 600.0]);
 
   velocityPlot.addMessageLine(goal, ['shooter', 'velocity_accelerator']).setColor(BLUE).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'accelerator_left', 'avg_angular_velocity']).setColor(RED).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'accelerator_right', 'avg_angular_velocity']).setColor(PINK).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'accelerator_left', 'angular_velocity']).setColor(GREEN).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'accelerator_right', 'angular_velocity']).setColor(CYAN).setPointSize(0.0);
+  velocityPlot.addMessageLine(status, ['shooter', 'ready']).setColor(BLACK).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'accelerator_left', 'dt_angular_velocity']).setColor(PINK).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'accelerator_right', 'dt_angular_velocity']).setColor(BLUE).setPointSize(0.0);
 
diff --git a/y2020/control_loops/superstructure/finisher_plotter.ts b/y2020/control_loops/superstructure/finisher_plotter.ts
index 18052cc..6ec4be4 100644
--- a/y2020/control_loops/superstructure/finisher_plotter.ts
+++ b/y2020/control_loops/superstructure/finisher_plotter.ts
@@ -1,7 +1,7 @@
 // Provides a plot for debugging robot state-related issues.
 import {AosPlotter} from 'org_frc971/aos/network/www/aos_plotter';
 import * as proxy from 'org_frc971/aos/network/www/proxy';
-import {BLUE, BROWN, CYAN, GREEN, PINK, RED, WHITE} from 'org_frc971/aos/network/www/colors';
+import {BLUE, BROWN, CYAN, GREEN, PINK, RED, WHITE, BLACK} from 'org_frc971/aos/network/www/colors';
 
 import Connection = proxy.Connection;
 
@@ -26,11 +26,12 @@
   velocityPlot.plot.getAxisLabels().setTitle('Velocity');
   velocityPlot.plot.getAxisLabels().setXLabel(TIME);
   velocityPlot.plot.getAxisLabels().setYLabel('rad/s');
-  velocityPlot.plot.setDefaultYRange([0.0, 450.0]);
+  velocityPlot.plot.setDefaultYRange([0.0, 600.0]);
 
   velocityPlot.addMessageLine(goal, ['shooter', 'velocity_finisher']).setColor(BLUE).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'finisher', 'avg_angular_velocity']).setColor(RED).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'finisher', 'angular_velocity']).setColor(GREEN).setPointSize(0.0);
+  velocityPlot.addMessageLine(status, ['shooter', 'ready']).setColor(BLACK).setPointSize(0.0);
   velocityPlot.addMessageLine(status, ['shooter', 'finisher', 'dt_angular_velocity']).setColor(PINK).setPointSize(0.0);
 
   const voltagePlot =
diff --git a/y2020/control_loops/superstructure/shooter/flywheel_controller.cc b/y2020/control_loops/superstructure/shooter/flywheel_controller.cc
index d94573b..f7ab223 100644
--- a/y2020/control_loops/superstructure/shooter/flywheel_controller.cc
+++ b/y2020/control_loops/superstructure/shooter/flywheel_controller.cc
@@ -41,7 +41,7 @@
     // And we have a quadratic!
     const double a = 1;
     const double b = -bemf_voltage;
-    const double c = -60.0 * 12.0 * resistance_;
+    const double c = -70.0 * 12.0 * resistance_;
 
     // Root is always positive.
     const double root = std::sqrt(b * b - 4.0 * a * c);
diff --git a/y2020/control_loops/superstructure/shooter/shooter.cc b/y2020/control_loops/superstructure/shooter/shooter.cc
index 9db79b0..900d0f1 100644
--- a/y2020/control_loops/superstructure/shooter/shooter.cc
+++ b/y2020/control_loops/superstructure/shooter/shooter.cc
@@ -12,7 +12,7 @@
 namespace shooter {
 
 namespace {
-const double kVelocityTolerance = 20.0;
+const double kVelocityTolerance = 2.0;
 }  // namespace
 
 Shooter::Shooter()
@@ -86,6 +86,7 @@
   status_builder.add_finisher(finisher_status_offset);
   status_builder.add_accelerator_left(accelerator_left_status_offset);
   status_builder.add_accelerator_right(accelerator_right_status_offset);
+  status_builder.add_ready(ready());
 
   if (output) {
     output->finisher_voltage = finisher_.voltage();
diff --git a/y2020/control_loops/superstructure/superstructure_lib_test.cc b/y2020/control_loops/superstructure/superstructure_lib_test.cc
index 112780a..f71fe17 100644
--- a/y2020/control_loops/superstructure/superstructure_lib_test.cc
+++ b/y2020/control_loops/superstructure/superstructure_lib_test.cc
@@ -286,7 +286,7 @@
 
     // Confirm that we aren't drawing too much current.
     CHECK_NEAR(accelerator_left_plant_->battery_current(accelerator_left_U),
-               0.0, 70.0);
+               0.0, 75.0);
 
     ::Eigen::Matrix<double, 1, 1> accelerator_right_U;
     accelerator_right_U
@@ -295,7 +295,7 @@
 
     // Confirm that we aren't drawing too much current.
     CHECK_NEAR(accelerator_right_plant_->battery_current(accelerator_right_U),
-               0.0, 70.0);
+               0.0, 75.0);
 
     ::Eigen::Matrix<double, 1, 1> finisher_U;
     finisher_U << superstructure_output_fetcher_->finisher_voltage() +
@@ -819,7 +819,7 @@
   }
 
   // Give it a lot of time to get there.
-  RunFor(chrono::seconds(15));
+  RunFor(chrono::seconds(25));
 
   VerifyNearGoal();
 }
diff --git a/y2020/control_loops/superstructure/superstructure_status.fbs b/y2020/control_loops/superstructure/superstructure_status.fbs
index adca326..e55e19b 100644
--- a/y2020/control_loops/superstructure/superstructure_status.fbs
+++ b/y2020/control_loops/superstructure/superstructure_status.fbs
@@ -33,6 +33,10 @@
   // Velocity is the fastest (top) wheel
   accelerator_left:FlywheelControllerStatus (id: 1);
   accelerator_right:FlywheelControllerStatus (id: 2);
+
+  // If the shooter is ready, this is true.  Note: don't use this for status
+  // checking, only for plotting.  Changes in goal take time to impact this.
+  ready:bool (id: 3);
 }
 
 table AimerStatus {