Unify source of camera geometry data
Due to parallel development, camera pose information ended up being
populated in two constants files. This makes //y2019/vision:constants
the source for all of the constants.
Also, because the camera 19 calibration was done as if it was a front
camera, I had to negate its x/y position and offset the angle by 180
degrees.
This commit also adds validation for //y2019/vision:constants.cc to
ensure that it is not accidentally changed in a way that the codegen
cannot account for.
Change-Id: I85654d973e15ae7bf76589be63c3d0eaf72c3a45
diff --git a/y2019/vision/BUILD b/y2019/vision/BUILD
index 2bdfd9c..90c7dff 100644
--- a/y2019/vision/BUILD
+++ b/y2019/vision/BUILD
@@ -12,12 +12,41 @@
cc_library(
name = "constants",
- srcs = ["constants.cc"],
+ srcs = [
+ "constants.cc",
+ "constants_formatting.cc",
+ ],
hdrs = ["constants.h"],
compatible_with = mcu_cpus,
visibility = ["//visibility:public"],
)
+cc_binary(
+ name = "constants_formatting",
+ srcs = ["constants_formatting_main.cc"],
+ deps = [":constants"],
+)
+
+genrule(
+ name = "generate_constants",
+ outs = ["validate_constants.cc"],
+ cmd = "$(location :constants_formatting) $(OUTS)",
+ tools = [":constants_formatting"],
+)
+
+sh_test(
+ name = "constants_formatting_test",
+ srcs = ["constants_formatting_test.sh"],
+ args = [
+ "$(location :constants.cc)",
+ "$(location :validate_constants.cc)",
+ ],
+ data = [
+ ":constants.cc",
+ ":validate_constants.cc",
+ ],
+)
+
cc_library(
name = "target_finder",
srcs = [
@@ -104,7 +133,6 @@
cc_binary(
name = "global_calibration",
srcs = [
- "constants_formatting.cc",
"global_calibration.cc",
],
restricted_to = VISION_TARGETS,
diff --git a/y2019/vision/constants.cc b/y2019/vision/constants.cc
index bc8a56d..e41a53b 100644
--- a/y2019/vision/constants.cc
+++ b/y2019/vision/constants.cc
@@ -82,9 +82,9 @@
-0.341036 / 180.0 * M_PI, 324.626, 1.2545 / 180.0 * M_PI,
},
{
- {{6.93309 * kInchesToMeters, -2.64735 * kInchesToMeters,
+ {{-6.93309 * kInchesToMeters, 2.64735 * kInchesToMeters,
32.8758 * kInchesToMeters}},
- 2.58102 / 180.0 * M_PI,
+ -177.419 / 180.0 * M_PI,
},
{
19,
diff --git a/y2019/vision/constants.h b/y2019/vision/constants.h
index cc6775e..3f07f87 100644
--- a/y2019/vision/constants.h
+++ b/y2019/vision/constants.h
@@ -79,7 +79,26 @@
const CameraCalibration *GetCamera(int camera_id);
-void DumpCameraConstants(int camera_id, const CameraCalibration &value);
+// Serial number of the teensy for each robot.
+constexpr uint32_t CodeBotTeensyId() { return 0xffff322e; }
+
+// Get the IDs of the cameras in each port for a particular teensy board.
+// inlined so that we don't have to deal with including it in the autogenerated
+// constants.cc.
+inline std::array<int, 5> CameraSerialNumbers(uint32_t processor_id) {
+ switch (processor_id) {
+ case CodeBotTeensyId():
+ return {{0, 0, 0, 16, 19}};
+ default:
+ return {{0, 0, 0, 0, 0}};
+ }
+}
+
+// Rewrites constants.cc, adding camera calibration constants for the camera_id
+// specified. If camera_id is less than zero, just rewrites the file without
+// changing anything.
+void DumpCameraConstants(const char *fname, int camera_id,
+ const CameraCalibration &value);
} // namespace vision
} // namespace y2019
diff --git a/y2019/vision/constants_formatting.cc b/y2019/vision/constants_formatting.cc
index 272246e..a2922a0 100644
--- a/y2019/vision/constants_formatting.cc
+++ b/y2019/vision/constants_formatting.cc
@@ -51,8 +51,9 @@
<< "\"" << filename_prefix << "\",\n " << num_images << ",\n }";
}
-void DumpCameraConstants(int camera_id, const CameraCalibration &value) {
- std::ofstream o("y2019/vision/constants.cc");
+void DumpCameraConstants(const char *fname, int camera_id,
+ const CameraCalibration &value) {
+ std::ofstream o(fname);
o << R"(#include "y2019/vision/constants.h"
namespace y2019 {
diff --git a/y2019/vision/constants_formatting_main.cc b/y2019/vision/constants_formatting_main.cc
new file mode 100644
index 0000000..fd0bb22
--- /dev/null
+++ b/y2019/vision/constants_formatting_main.cc
@@ -0,0 +1,11 @@
+#include "y2019/vision/constants.h"
+#include <iostream>
+
+int main(int argc, char *argv[]) {
+ if (argc != 2) {
+ ::std::cout << "Expected a command line argument specifying the file name "
+ "to write to.\n";
+ return 1;
+ }
+ ::y2019::vision::DumpCameraConstants(argv[1], -1, {});
+}
diff --git a/y2019/vision/constants_formatting_test.sh b/y2019/vision/constants_formatting_test.sh
new file mode 100755
index 0000000..a74a988
--- /dev/null
+++ b/y2019/vision/constants_formatting_test.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+# The constants file should not have changed in a way that will not be preserved
+# when we rerun the codegen.
+diff $1 $2
diff --git a/y2019/vision/global_calibration.cc b/y2019/vision/global_calibration.cc
index 94048ad..186e025 100644
--- a/y2019/vision/global_calibration.cc
+++ b/y2019/vision/global_calibration.cc
@@ -247,7 +247,7 @@
results.dataset = info;
results.intrinsics = IntrinsicParams::get(&intrinsics[0]);
results.geometry = CameraGeometry::get(&geometry[0]);
- DumpCameraConstants(info.camera_id, results);
+ DumpCameraConstants("y2019/vision/constants.cc", info.camera_id, results);
}
} // namespace y2019