Add basic line-following drivetrain

Works by drawing a Nth degree polynomial to guide us to the target and
guiding a lateral controller to follow it given a speed provided by the
driver.

Change-Id: I94fd31666769ca398b66f04665f39e01cee00627
diff --git a/frc971/control_loops/drivetrain/BUILD b/frc971/control_loops/drivetrain/BUILD
index e332cfe..7dedc71 100644
--- a/frc971/control_loops/drivetrain/BUILD
+++ b/frc971/control_loops/drivetrain/BUILD
@@ -101,6 +101,43 @@
 )
 
 cc_library(
+    name = "line_follow_drivetrain",
+    srcs = [
+        "line_follow_drivetrain.cc",
+    ],
+    hdrs = [
+        "line_follow_drivetrain.h",
+    ],
+    deps = [
+        ":drivetrain_config",
+        ":drivetrain_queue",
+        "//aos:math",
+        "//aos/util:math",
+        "//frc971/control_loops:c2d",
+        "//frc971/control_loops:dlqr",
+        "//frc971/control_loops:pose",
+        "//third_party/eigen",
+    ],
+)
+
+cc_test(
+    name = "line_follow_drivetrain_test",
+    srcs = ["line_follow_drivetrain_test.cc"],
+    linkstatic = True,
+    restricted_to = ["//tools:k8"],
+    deps = [
+        ":drivetrain_config",
+        ":drivetrain_test_lib",
+        ":line_follow_drivetrain",
+        ":trajectory",
+        "//aos/testing:googletest",
+        "//aos/testing:test_shm",
+        "//third_party/matplotlib-cpp",
+        "@com_github_gflags_gflags//:gflags",
+    ],
+)
+
+cc_library(
     name = "ssdrivetrain",
     srcs = [
         "ssdrivetrain.cc",
@@ -221,6 +258,7 @@
         ":down_estimator",
         ":drivetrain_queue",
         ":gear",
+        ":line_follow_drivetrain",
         ":localizer",
         ":polydrivetrain",
         ":splinedrivetrain",