blob: de9f65d699212c003fe296b489b552a351b12278 [file] [log] [blame]
Jim Ostrowski007e2ea2022-01-30 13:13:26 -08001#!/usr/bin/python3
2
3import camera_definition
4import cv2
5import flatbuffers
6import glog
7import numpy as np
8import sys
9
10import frc971.vision.calibration.CalibrationData as CalibrationData
11import frc971.vision.calibration.CameraCalibration as CameraCalibration
12import frc971.vision.calibration.TransformationMatrix as TransformationMatrix
13
14import gflags
15import glog
16
17FLAGS = gflags.FLAGS
18
19
20# Takes a 3x3 rotation matrix and 3x1 translation vector, and outputs 12
21# element list, suitable for outputing to flatbuffer
22def rot_and_trans_to_list(R, T):
23 output_list = []
24 for row in range(3):
25 for col in range(3):
26 output_list.append(R[row][col])
27 output_list.append(T[row])
28
29 output_list = output_list + [0., 0., 0., 1.]
30 return output_list
31
32
33def list_to_transformation_matrix(values, fbb):
34 """Puts a list of values into an FBB TransformationMatrix."""
35
36 TransformationMatrix.TransformationMatrixStartDataVector(fbb, len(values))
37 for n in reversed(values):
38 fbb.PrependFloat32(n)
39 list_offset = fbb.EndVector(len(values))
40
41 TransformationMatrix.TransformationMatrixStart(fbb)
42 TransformationMatrix.TransformationMatrixAddData(fbb, list_offset)
43 return TransformationMatrix.TransformationMatrixEnd(fbb)
44
45
46def main():
47
48 camera_calib_list = None
49
50 output_path = sys.argv[1]
51
52 camera_calib_list = camera_definition.load_camera_definitions()
53
54 glog.debug("Writing file to %s", output_path)
55
56 fbb = flatbuffers.Builder(0)
57
58 images_vector = []
59
60 # Create camera calibration data
61 camera_calibration_vector = []
62 for camera_calib in camera_calib_list:
63 fixed_extrinsics_list = rot_and_trans_to_list(
64 camera_calib.camera_ext.R, camera_calib.camera_ext.T)
65 fixed_extrinsics_vector = list_to_transformation_matrix(
66 fixed_extrinsics_list, fbb)
67
68 turret_extrinsics_vector = None
69 if camera_calib.turret_ext is not None:
70 turret_extrinsics_list = rot_and_trans_to_list(
71 camera_calib.turret_ext.R, camera_calib.turret_ext.T)
72 turret_extrinsics_vector = list_to_transformation_matrix(
73 turret_extrinsics_list, fbb)
74
75 camera_int_list = camera_calib.camera_int.camera_matrix.ravel().tolist(
76 )
77 CameraCalibration.CameraCalibrationStartIntrinsicsVector(
78 fbb, len(camera_int_list))
79 for n in reversed(camera_int_list):
80 fbb.PrependFloat32(n)
81 intrinsics_vector = fbb.EndVector(len(camera_int_list))
82
83 dist_coeffs_list = camera_calib.camera_int.dist_coeffs.ravel().tolist()
84 CameraCalibration.CameraCalibrationStartDistCoeffsVector(
85 fbb, len(dist_coeffs_list))
86 for n in reversed(dist_coeffs_list):
87 fbb.PrependFloat32(n)
88 dist_coeffs_vector = fbb.EndVector(len(dist_coeffs_list))
89
90 node_name_offset = fbb.CreateString(camera_calib.node_name)
91 CameraCalibration.CameraCalibrationStart(fbb)
92 CameraCalibration.CameraCalibrationAddNodeName(fbb, node_name_offset)
93 CameraCalibration.CameraCalibrationAddTeamNumber(
94 fbb, camera_calib.team_number)
95 CameraCalibration.CameraCalibrationAddIntrinsics(
96 fbb, intrinsics_vector)
97 CameraCalibration.CameraCalibrationAddDistCoeffs(
98 fbb, dist_coeffs_vector)
99 CameraCalibration.CameraCalibrationAddFixedExtrinsics(
100 fbb, fixed_extrinsics_vector)
101 if turret_extrinsics_vector is not None:
102 CameraCalibration.CameraCalibrationAddTurretExtrinsics(
103 fbb, turret_extrinsics_vector)
104 camera_calibration_vector.append(
105 CameraCalibration.CameraCalibrationEnd(fbb))
106
107 CalibrationData.CalibrationDataStartCameraCalibrationsVector(
108 fbb, len(camera_calibration_vector))
109 for camera_calibration in reversed(camera_calibration_vector):
110 fbb.PrependUOffsetTRelative(camera_calibration)
111 camera_calibration_vector_table = fbb.EndVector(
112 len(camera_calibration_vector))
113
114 # Fill out TrainingData
115 CalibrationData.CalibrationDataStart(fbb)
116 CalibrationData.CalibrationDataAddCameraCalibrations(
117 fbb, camera_calibration_vector_table)
118 fbb.Finish(CalibrationData.CalibrationDataEnd(fbb))
119
120 bfbs = fbb.Output()
121
122 output_prefix = [
123 b'#ifndef Y2022_VISION_CALIBRATION_DATA_H_',
124 b'#define Y2022_VISION_CALIBRATION_DATA_H_',
125 b'#include <stdint.h>',
126 b'#include "absl/types/span.h"',
127 b'namespace frc971 {',
128 b'namespace vision {',
129 b'inline absl::Span<const uint8_t> CalibrationData() {',
130 ]
131 output_suffix = [
132 b' return absl::Span<const uint8_t>(reinterpret_cast<const uint8_t *>(kData), sizeof(kData));',
133 b'}',
134 b'} // namespace vision',
135 b'} // namespace frc971',
136 b'#endif // Y2022_VISION_CALIBRATION_DATA_H_',
137 ]
138
139 # Write out the header file
140 with open(output_path, 'wb') as output:
141 for line in output_prefix:
142 output.write(line)
143 output.write(b'\n')
144 output.write(b'alignas(64) static constexpr char kData[] = "')
145 for byte in fbb.Output():
146 output.write(b'\\x' + (b'%x' % byte).zfill(2))
147 output.write(b'";\n')
148 for line in output_suffix:
149 output.write(line)
150 output.write(b'\n')
151
152
153if __name__ == '__main__':
154 argv = FLAGS(sys.argv)
155 glog.init()
156 main()