Switch Spline UI to use images

Change-Id: I6b537b2fd1d0a572e9fc2560065cd9f039974164
Signed-off-by: Ravago Jones <ravagojones@gmail.com>
diff --git a/frc971/control_loops/python/BUILD b/frc971/control_loops/python/BUILD
index a893ce1..b6290d4 100644
--- a/frc971/control_loops/python/BUILD
+++ b/frc971/control_loops/python/BUILD
@@ -160,6 +160,10 @@
         "spline_graph.py",
         "spline_writer.py",
     ],
+    data = glob([
+        "field_images/*.png",
+        "field_images/*.svg",
+    ]),
     legacy_create_init = False,
     target_compatible_with = ["@platforms//cpu:x86_64"],
     visibility = ["//visibility:public"],
diff --git a/frc971/control_loops/python/constants.py b/frc971/control_loops/python/constants.py
index aa1d280..10e6786 100644
--- a/frc971/control_loops/python/constants.py
+++ b/frc971/control_loops/python/constants.py
@@ -16,7 +16,7 @@
 HATCH_PANEL_WIDTH = 0.4826
 
 FieldType = namedtuple(
-    'Field', ['name', 'tags', 'year', 'width', 'length', 'robot', 'json_name'])
+    'Field', ['name', 'tags', 'year', 'width', 'length', 'robot', 'field_id'])
 RobotType = namedtuple(
         "Robot", ['width', 'length'])
 
@@ -43,7 +43,7 @@
         width=8.258302,
         length=8.258302,
         robot=Robot2019,
-        json_name="spline_2019.json"),
+        field_id="2019"),
     "2020 Field":
     FieldType(
         "2020 Field",
@@ -52,7 +52,7 @@
         width=15.98295,
         length=8.21055,
         robot=Robot2020,
-        json_name="spline_2020.json"),
+        field_id="2020"),
     "2021 Galactic Search BRed":
     FieldType(
         "2021 Galactic Search BRed",
@@ -61,7 +61,7 @@
         width=9.144,
         length=4.572,
         robot=Robot2021,
-        json_name="spline_red_b.json"),
+        field_id="red_b"),
     "2021 Galactic Search ARed":
     FieldType(
         "2021 Galactic Search ARed",
@@ -70,7 +70,7 @@
         width=9.144,
         length=4.572,
         robot=Robot2021,
-        json_name="spline_red_a.json"),
+        field_id="red_a"),
     "2021 Galactic Search BBlue":
     FieldType(
         "2021 Galactic Search BBlue",
@@ -79,7 +79,7 @@
         width=9.144,
         length=4.572,
         robot=Robot2021,
-        json_name="spline_blue_b.json"),
+        field_id="blue_b"),
     "2021 Galactic Search ABlue":
     FieldType(
         "2021 Galactic Search ABlue",
@@ -88,7 +88,7 @@
         width=9.144,
         length=4.572,
         robot=Robot2021,
-        json_name="spline_blue_a.json"),
+        field_id="blue_a"),
     "2021 AutoNav Barrel":
     FieldType(
         "2021 AutoNav Barrel",
@@ -97,7 +97,7 @@
         width=9.144,
         length=4.572,
         robot=Robot2021,
-        json_name="autonav_barrel.json"),
+        field_id="autonav_barrel"),
     "2021 AutoNav Slalom":
     FieldType(
         "2021 AutoNav Slalom",
@@ -106,7 +106,7 @@
         width=9.144,
         length=4.572,
         robot=Robot2021,
-        json_name="autonav_slalom.json"),
+        field_id="autonav_slalom"),
     "2021 AutoNav Bounce":
     FieldType(
         "2021 AutoNav Bounce",
@@ -115,7 +115,7 @@
         width=9.144,
         length=4.572,
         robot=Robot2021,
-        json_name="autonav_bounce.json"),
+        field_id="autonav_bounce"),
 }
 
 FIELD = FIELDS["2021 Galactic Search BRed"]
diff --git a/frc971/control_loops/python/field_images/2019.png b/frc971/control_loops/python/field_images/2019.png
new file mode 100644
index 0000000..860be2a
--- /dev/null
+++ b/frc971/control_loops/python/field_images/2019.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/2019.svg b/frc971/control_loops/python/field_images/2019.svg
new file mode 100644
index 0000000..deee29a
--- /dev/null
+++ b/frc971/control_loops/python/field_images/2019.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="844pt" viewBox="0 0 844 844" version="1.1">
+<g id="surface2">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 350.769531 L 61.320312 350.769531 M 28.71875 350.769531 L 33.71875 350.769531 C 33.71875 357.4375 23.71875 357.4375 23.71875 350.769531 C 23.71875 344.101562 33.71875 344.101562 33.71875 350.769531 M 0 -350.769531 L 61.320312 -350.769531 M 28.71875 -350.769531 L 33.71875 -350.769531 C 33.71875 -344.101562 23.71875 -344.101562 23.71875 -350.769531 C 23.71875 -357.4375 33.71875 -357.4375 33.71875 -350.769531 M 0 62.300781 L 124.601562 62.300781 L 124.601562 166.136719 L 0 166.136719 Z M 0 -62.300781 L 124.601562 -62.300781 L 124.601562 62.300781 L 0 62.300781 Z M 0 -166.136719 L 124.601562 -166.136719 L 124.601562 -62.300781 L 0 -62.300781 Z M 124.601562 0 L 217.40625 0 L 217.40625 166.136719 L 124.601562 166.136719 Z M 124.601562 -166.136719 L 217.40625 -166.136719 L 217.40625 0 L 124.601562 0 Z M 124.601562 166.136719 L 247.257812 166.136719 L 247.257812 195.066406 L 124.601562 195.066406 Z M 217.40625 -166.136719 L 247.257812 -166.136719 L 247.257812 166.136719 L 217.40625 166.136719 Z M 124.601562 -195.066406 L 247.257812 -195.066406 L 247.257812 -166.136719 L 124.601562 -166.136719 Z M 0 166.136719 L 124.601562 166.136719 L 124.601562 224.867188 L 0 224.867188 Z M 0 -224.867188 L 124.601562 -224.867188 L 124.601562 -166.136719 L 0 -166.136719 Z M 0 -224.867188 " transform="matrix(1,0,0,1,0,422)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0 0 L 0 420.535156 M 0 0 L 0 -420.535156 M 0 0 L 841.066406 0 " transform="matrix(1,0,0,1,0,422)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 556.351562 370.910156 L 485.546875 330.03125 M 522.632812 351.441406 L 527.632812 351.441406 C 527.632812 358.109375 517.632812 358.109375 517.632812 351.441406 C 517.632812 344.777344 527.632812 344.777344 527.632812 351.441406 M 593.910156 346.859375 L 593.910156 265.101562 M 593.910156 307.921875 L 598.910156 307.921875 C 598.910156 314.589844 588.910156 314.589844 588.910156 307.921875 C 588.910156 301.253906 598.910156 301.253906 598.910156 307.921875 M 631.898438 370.753906 L 702.703125 329.875 M 665.621094 351.285156 L 670.621094 351.285156 C 670.621094 357.949219 660.621094 357.949219 660.621094 351.285156 C 660.621094 344.617188 670.621094 344.617188 670.621094 351.285156 M 556.351562 -370.910156 L 485.546875 -330.03125 M 593.910156 -346.859375 L 593.910156 -265.101562 M 631.898438 -370.753906 L 702.703125 -329.875 M 543.234375 394.804688 L 569.46875 347.019531 M 569.46875 347.019531 L 618.351562 346.703125 M 618.351562 346.703125 L 645.449219 394.804688 M 543.234375 394.804688 L 645.449219 394.804688 M 543.234375 -394.804688 L 569.46875 -347.019531 M 569.46875 -347.019531 L 618.351562 -346.703125 M 618.351562 -346.703125 L 645.449219 -394.804688 M 543.234375 -394.804688 L 645.449219 -394.804688 " transform="matrix(1,0,0,1,0,422)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 571.742188 28.242188 L 489.984375 28.242188 M 571.742188 28.242188 L 548.023438 28.242188 C 548.023438 34.910156 538.023438 34.910156 538.023438 28.242188 C 538.023438 21.578125 548.023438 21.578125 548.023438 28.242188 M 571.742188 -28.242188 L 489.984375 -28.242188 M 571.742188 -28.242188 L 548.023438 -28.242188 C 548.023438 -21.578125 538.023438 -21.578125 538.023438 -28.242188 C 538.023438 -34.910156 548.023438 -34.910156 548.023438 -28.242188 M 689.15625 72.359375 L 689.15625 154.121094 M 689.15625 101.078125 L 694.15625 101.078125 C 694.15625 107.746094 684.15625 107.746094 684.15625 101.078125 C 684.15625 94.410156 694.15625 94.410156 694.15625 101.078125 M 745.617188 72.359375 L 745.617188 154.121094 M 745.617188 101.078125 L 750.617188 101.078125 C 750.617188 107.746094 740.617188 107.746094 740.617188 101.078125 C 740.617188 94.410156 750.617188 94.410156 750.617188 101.078125 M 802.078125 72.359375 L 802.078125 154.121094 M 802.078125 101.078125 L 807.078125 101.078125 C 807.078125 107.746094 797.078125 107.746094 797.078125 101.078125 C 797.078125 94.410156 807.078125 94.410156 807.078125 101.078125 M 689.15625 -72.359375 L 689.15625 -154.121094 M 689.15625 -101.078125 L 694.15625 -101.078125 C 694.15625 -94.410156 684.15625 -94.410156 684.15625 -101.078125 C 684.15625 -107.746094 694.15625 -107.746094 694.15625 -101.078125 M 745.617188 -72.359375 L 745.617188 -154.121094 M 745.617188 -101.078125 L 750.617188 -101.078125 C 750.617188 -94.410156 740.617188 -94.410156 740.617188 -101.078125 C 740.617188 -107.746094 750.617188 -107.746094 750.617188 -101.078125 M 802.078125 -72.359375 L 802.078125 -154.121094 M 802.078125 -101.078125 L 807.078125 -101.078125 C 807.078125 -94.410156 797.078125 -94.410156 797.078125 -101.078125 C 797.078125 -107.746094 807.078125 -107.746094 807.078125 -101.078125 M 571.742188 -72.359375 L 820.296875 -72.359375 L 820.296875 72.359375 L 571.742188 72.359375 Z M 571.742188 -72.359375 " transform="matrix(1,0,0,1,0,422)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/2020.png b/frc971/control_loops/python/field_images/2020.png
new file mode 100644
index 0000000..166a1bb
--- /dev/null
+++ b/frc971/control_loops/python/field_images/2020.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/2020.svg b/frc971/control_loops/python/field_images/2020.svg
new file mode 100644
index 0000000..eb47536
--- /dev/null
+++ b/frc971/control_loops/python/field_images/2020.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="433.568534pt" viewBox="0 0 844 433.568534" version="1.1">
+<g id="surface2">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M -64.132812 -140.893642 L 144.980469 -54.276454 L 64.136719 140.895421 L -144.976562 54.278233 Z M -64.132812 -140.893642 " transform="matrix(1,0,0,1,422,216.784267)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,100%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -144.859375 216.786046 L 144.855469 216.786046 L 144.855469 142.344639 L -144.859375 142.344639 Z M -144.859375 216.786046 " transform="matrix(1,0,0,1,422,216.784267)"/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:1;" d="M 330.707031 396.347656 C 330.707031 403.390625 320.148438 403.390625 320.148438 396.347656 C 320.148438 389.308594 330.707031 389.308594 330.707031 396.347656 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:1;" d="M 378.996094 396.347656 C 378.996094 403.390625 368.433594 403.390625 368.433594 396.347656 C 368.433594 389.308594 378.996094 389.308594 378.996094 396.347656 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:1;" d="M 427.28125 396.347656 C 427.28125 403.390625 416.71875 403.390625 416.71875 396.347656 C 416.71875 389.308594 427.28125 389.308594 427.28125 396.347656 "/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,100%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 144.859375 -216.784267 L -144.855469 -216.784267 L -144.855469 -142.342861 L 144.859375 -142.342861 Z M 144.859375 -216.784267 " transform="matrix(1,0,0,1,422,216.784267)"/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:1;" d="M 523.851562 37.21875 C 523.851562 44.261719 513.292969 44.261719 513.292969 37.21875 C 513.292969 30.179688 523.851562 30.179688 523.851562 37.21875 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:1;" d="M 475.566406 37.21875 C 475.566406 44.261719 465.003906 44.261719 465.003906 37.21875 C 465.003906 30.179688 475.566406 30.179688 475.566406 37.21875 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,0%);fill-opacity:1;" d="M 427.28125 37.21875 C 427.28125 44.261719 416.71875 44.261719 416.71875 37.21875 C 416.71875 30.179688 427.28125 30.179688 427.28125 37.21875 "/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(100%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 261.046875 -216.784267 L 261.046875 216.786046 M -261.046875 -216.784267 L -261.046875 216.786046 " transform="matrix(1,0,0,1,422,216.784267)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(75%,75%,75%);stroke-opacity:1;stroke-miterlimit:10;" d="M 80.429688 216.786046 L 40.191406 216.786046 L 40.191406 142.344639 L 80.429688 142.344639 Z M -80.429688 -216.784267 L -40.191406 -216.784267 L -40.191406 -142.342861 L -80.429688 -142.342861 Z M -80.429688 -216.784267 " transform="matrix(1,0,0,1,422,216.784267)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/autonav_barrel.png b/frc971/control_loops/python/field_images/autonav_barrel.png
new file mode 100644
index 0000000..ce84757
--- /dev/null
+++ b/frc971/control_loops/python/field_images/autonav_barrel.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/autonav_barrel.svg b/frc971/control_loops/python/field_images/autonav_barrel.svg
new file mode 100644
index 0000000..4ccbf9e
--- /dev/null
+++ b/frc971/control_loops/python/field_images/autonav_barrel.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="422pt" viewBox="0 0 844 422" version="1.1">
+<g id="surface1">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -74.476562 L -347.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -66.1875 L -347.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 -74.476562 L -277.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 -66.1875 L -277.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -74.476562 L -66.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -66.1875 L -66.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -74.476562 L 285.476562 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -66.1875 L 285.476562 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 66.1875 L -347.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 74.476562 L -347.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 66.1875 L -277.1875 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 74.476562 L -277.1875 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 66.1875 L 144.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 74.476562 L 144.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/autonav_bounce.png b/frc971/control_loops/python/field_images/autonav_bounce.png
new file mode 100644
index 0000000..6d8f08a
--- /dev/null
+++ b/frc971/control_loops/python/field_images/autonav_bounce.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/autonav_bounce.svg b/frc971/control_loops/python/field_images/autonav_bounce.svg
new file mode 100644
index 0000000..73f3ecc
--- /dev/null
+++ b/frc971/control_loops/python/field_images/autonav_bounce.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="422pt" viewBox="0 0 844 422" version="1.1">
+<g id="surface1">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -74.476562 L -347.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -66.1875 L -347.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 -74.476562 L -277.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 -66.1875 L -277.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 -74.476562 L -206.855469 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 -66.1875 L -206.855469 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -74.476562 L -66.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -66.1875 L -66.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 -74.476562 L 74.476562 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 -66.1875 L 74.476562 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 -74.476562 L 144.8125 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 -66.1875 L 144.8125 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -74.476562 L 285.476562 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -66.1875 L 285.476562 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -74.476562 L 355.8125 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -66.1875 L 355.8125 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 66.1875 L -347.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 74.476562 L -347.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 66.1875 L -277.1875 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 74.476562 L -277.1875 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -144.8125 66.1875 L -136.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -144.8125 74.476562 L -136.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 66.1875 L -66.1875 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 74.476562 L -66.1875 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 66.1875 L 74.476562 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 74.476562 L 74.476562 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 66.1875 L 144.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 74.476562 L 144.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 66.1875 L 285.476562 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 74.476562 L 285.476562 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 66.1875 L 355.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 74.476562 L 355.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 136.523438 L -206.855469 144.8125 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 144.8125 L -206.855469 136.523438 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 136.523438 L 4.144531 144.8125 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 144.8125 L 4.144531 136.523438 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 206.855469 136.523438 L 215.144531 144.8125 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 206.855469 144.8125 L 215.144531 136.523438 " transform="matrix(1,0,0,1,422,211)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/autonav_slalom.png b/frc971/control_loops/python/field_images/autonav_slalom.png
new file mode 100644
index 0000000..a8779ac
--- /dev/null
+++ b/frc971/control_loops/python/field_images/autonav_slalom.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/autonav_slalom.svg b/frc971/control_loops/python/field_images/autonav_slalom.svg
new file mode 100644
index 0000000..46ad49f
--- /dev/null
+++ b/frc971/control_loops/python/field_images/autonav_slalom.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="422pt" viewBox="0 0 844 422" version="1.1">
+<g id="surface2">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -74.476562 L -347.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -66.1875 L -347.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 -74.476562 L -277.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 -66.1875 L -277.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -144.8125 -74.476562 L -136.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -144.8125 -66.1875 L -136.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -74.476562 L -66.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -66.1875 L -66.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 -74.476562 L 4.144531 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 -66.1875 L 4.144531 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 -74.476562 L 74.476562 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 -66.1875 L 74.476562 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 -74.476562 L 144.8125 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 -66.1875 L 144.8125 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -74.476562 L 285.476562 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -66.1875 L 285.476562 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 66.1875 L -347.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 74.476562 L -347.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 66.1875 L -277.1875 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -285.476562 74.476562 L -277.1875 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/blue_a.png b/frc971/control_loops/python/field_images/blue_a.png
new file mode 100644
index 0000000..fad789b
--- /dev/null
+++ b/frc971/control_loops/python/field_images/blue_a.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/blue_a.svg b/frc971/control_loops/python/field_images/blue_a.svg
new file mode 100644
index 0000000..bc87285
--- /dev/null
+++ b/frc971/control_loops/python/field_images/blue_a.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="422pt" viewBox="0 0 844 422" version="1.1">
+<g id="surface1">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 -144.8125 L 4.144531 -136.523438 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 -136.523438 L 4.144531 -144.8125 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -74.476562 L -347.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -66.1875 L -347.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -74.476562 L 355.8125 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -66.1875 L 355.8125 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 206.855469 -4.144531 L 215.144531 4.144531 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 206.855469 4.144531 L 215.144531 -4.144531 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 66.1875 L -347.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 74.476562 L -347.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 66.1875 L 74.476562 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 74.476562 L 74.476562 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 66.1875 L 355.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 74.476562 L 355.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/blue_b.png b/frc971/control_loops/python/field_images/blue_b.png
new file mode 100644
index 0000000..a3c3de3
--- /dev/null
+++ b/frc971/control_loops/python/field_images/blue_b.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/blue_b.svg b/frc971/control_loops/python/field_images/blue_b.svg
new file mode 100644
index 0000000..9e1e8c9
--- /dev/null
+++ b/frc971/control_loops/python/field_images/blue_b.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="422pt" viewBox="0 0 844 422" version="1.1">
+<g id="surface1">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -74.476562 L -347.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -66.1875 L -347.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 -74.476562 L 4.144531 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 -66.1875 L 4.144531 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -74.476562 L 285.476562 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.1875 -66.1875 L 285.476562 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -74.476562 L 355.8125 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -66.1875 L 355.8125 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 66.1875 L -347.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 74.476562 L -347.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 66.1875 L 144.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.523438 74.476562 L 144.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 66.1875 L 355.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 74.476562 L 355.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/red_a.png b/frc971/control_loops/python/field_images/red_a.png
new file mode 100644
index 0000000..70fd9c8
--- /dev/null
+++ b/frc971/control_loops/python/field_images/red_a.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/red_a.svg b/frc971/control_loops/python/field_images/red_a.svg
new file mode 100644
index 0000000..8a50f66
--- /dev/null
+++ b/frc971/control_loops/python/field_images/red_a.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="422pt" viewBox="0 0 844 422" version="1.1">
+<g id="surface1">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -74.476562 L -347.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -66.1875 L -347.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -74.476562 L -66.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -66.1875 L -66.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -74.476562 L 355.8125 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -66.1875 L 355.8125 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 -4.144531 L -206.855469 4.144531 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 4.144531 L -206.855469 -4.144531 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 66.1875 L -347.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 74.476562 L -347.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 66.1875 L 355.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 74.476562 L 355.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 136.523438 L 4.144531 144.8125 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -4.144531 144.8125 L 4.144531 136.523438 " transform="matrix(1,0,0,1,422,211)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/field_images/red_b.png b/frc971/control_loops/python/field_images/red_b.png
new file mode 100644
index 0000000..0ae2703
--- /dev/null
+++ b/frc971/control_loops/python/field_images/red_b.png
Binary files differ
diff --git a/frc971/control_loops/python/field_images/red_b.svg b/frc971/control_loops/python/field_images/red_b.svg
new file mode 100644
index 0000000..c7dc84e
--- /dev/null
+++ b/frc971/control_loops/python/field_images/red_b.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="844pt" height="422pt" viewBox="0 0 844 422" version="1.1">
+<g id="surface1">
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -74.476562 L -347.523438 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 -66.1875 L -347.523438 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -74.476562 L -66.1875 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.476562 -66.1875 L -66.1875 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -74.476562 L 355.8125 -66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 -66.1875 L 355.8125 -74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 66.1875 L -347.523438 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -355.8125 74.476562 L -347.523438 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 66.1875 L -206.855469 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -215.144531 74.476562 L -206.855469 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 66.1875 L 74.476562 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 66.1875 74.476562 L 74.476562 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 66.1875 L 355.8125 74.476562 " transform="matrix(1,0,0,1,422,211)"/>
+<path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 347.523438 74.476562 L 355.8125 66.1875 " transform="matrix(1,0,0,1,422,211)"/>
+</g>
+</svg>
diff --git a/frc971/control_loops/python/path_edit.py b/frc971/control_loops/python/path_edit.py
index 3ecef40..6ddcb1c 100755
--- a/frc971/control_loops/python/path_edit.py
+++ b/frc971/control_loops/python/path_edit.py
@@ -61,6 +61,11 @@
 
         self.curves = []
 
+        try:
+            self.field_png = cairo.ImageSurface.create_from_png("frc971/control_loops/python/field_images/" + FIELD.field_id + ".png")
+        except cairo.Error:
+            self.field_png = None
+
         self.colors = []
 
         for c in palette:
@@ -234,9 +239,17 @@
                          mToPx(FIELD.width), mToPx(FIELD.length))
         cr.set_line_join(cairo.LINE_JOIN_ROUND)
         cr.stroke()
-        self.draw_field_elements(cr)
 
-        y = 0
+        if self.field_png:
+            cr.save()
+            cr.translate(-mToPx(FIELD.width) / 2, -mToPx(FIELD.length) / 2)
+            cr.scale(
+                    mToPx(FIELD.width) / self.field_png.get_width(),
+                    mToPx(FIELD.length) / self.field_png.get_height(),
+                    )
+            cr.set_source_surface(self.field_png)
+            cr.paint()
+            cr.restore()
 
         # update everything
 
diff --git a/frc971/control_loops/python/spline_graph.py b/frc971/control_loops/python/spline_graph.py
index e57b64a..347837b 100755
--- a/frc971/control_loops/python/spline_graph.py
+++ b/frc971/control_loops/python/spline_graph.py
@@ -119,7 +119,7 @@
         self.file_name_box = Gtk.Entry()
         self.file_name_box.set_size_request(200, 40)
 
-        self.file_name_box.set_text(FIELD.json_name)
+        self.file_name_box.set_text(FIELD.field_id + ".json")
         self.file_name_box.set_editable(True)
 
         container.put(self.file_name_box, 0, 0)