57 const Eigen::Matrix3f& cameraMatrix,
58 const Eigen::Vector<float, 5>& distCoeffs,
59 const Eigen::Vector2f& visionSensorOffset = Eigen::Vector2f::Zero(),
60 float visionSensorYawOffset = 0.0f)
62 distCoeffs(distCoeffs), visionSensorOffset(visionSensorOffset),
63 visionSensorYawOffset(visionSensorYawOffset) {};
116 const float IPPE_SMALL = 1e-6f;
123 const float APRILTAG_SIZE = 2.0f;
124 static constexpr float RAD2DEG = 180.0f / M_PI;
125 const Eigen::Matrix3f cameraMatrix;
126 const Eigen::Vector<float, 5> distCoeffs;
127 const Eigen::Vector2f visionSensorOffset;
128 const float visionSensorYawOffset;
131 pros::Mutex poseMutex;
132 std::optional<pros::Task> m_task = std::nullopt;
144 std::array<float, 3> position;
147 static constexpr float PI = std::numbers::pi_v<float>;
149 static constexpr float YAW_POS_X = 0.0f;
150 static constexpr float YAW_POS_Y = PI / 2.0f;
151 static constexpr float YAW_NEG_X = PI;
152 static constexpr float YAW_NEG_Y = 3.0f * PI / 2.0f;
154 static constexpr std::array<FieldTag, 36> FIELD_TAGS{
157 {1, YAW_POS_Y, {46.640f, -21.455f, 4.355f}},
158 {1, YAW_NEG_X, {44.775f, -23.320f, 4.355f}},
159 {1, YAW_NEG_Y, {46.640f, -25.185f, 4.355f}},
160 {1, YAW_POS_X, {48.505f, -23.320f, 4.355f}},
163 {2, YAW_POS_Y, {46.640f, 25.185f, 4.355f}},
164 {2, YAW_NEG_X, {44.775f, 23.320f, 4.355f}},
165 {2, YAW_NEG_Y, {46.640f, 21.455f, 4.355f}},
166 {2, YAW_POS_X, {48.505f, 23.320f, 4.355f}},
169 {3, YAW_POS_Y, {23.320f, 48.505f, 4.355f}},
170 {3, YAW_NEG_X, {21.455f, 46.640f, 4.355f}},
171 {3, YAW_NEG_Y, {23.320f, 44.775f, 4.355f}},
172 {3, YAW_POS_X, {25.185f, 46.640f, 4.355f}},
175 {4, YAW_POS_Y, {-23.320f, 48.505f, 4.355f}},
176 {4, YAW_NEG_X, {-25.185f, 46.640f, 4.355f}},
177 {4, YAW_NEG_Y, {-23.320f, 44.775f, 4.355f}},
178 {4, YAW_POS_X, {-21.455f, 46.640f, 4.355f}},
181 {1, YAW_POS_Y, {-46.640f, 25.185f, 4.355f}},
182 {1, YAW_NEG_X, {-48.505f, 23.320f, 4.355f}},
183 {1, YAW_NEG_Y, {-46.640f, 21.455f, 4.355f}},
184 {1, YAW_POS_X, {-44.775f, 23.320f, 4.355f}},
187 {2, YAW_POS_Y, {-46.640f, -21.455f, 4.355f}},
188 {2, YAW_NEG_X, {-48.505f, -23.320f, 4.355f}},
189 {2, YAW_NEG_Y, {-46.640f, -25.185f, 4.355f}},
190 {2, YAW_POS_X, {-44.775f, -23.320f, 4.355f}},
193 {3, YAW_POS_Y, {-23.320f, -44.775f, 4.355f}},
194 {3, YAW_NEG_X, {-25.185f, -46.640f, 4.355f}},
195 {3, YAW_NEG_Y, {-23.320f, -48.505f, 4.355f}},
196 {3, YAW_POS_X, {-21.455f, -46.640f, 4.355f}},
199 {4, YAW_POS_Y, {23.320f, -44.775f, 4.355f}},
200 {4, YAW_NEG_X, {21.455f, -46.640f, 4.355f}},
201 {4, YAW_NEG_Y, {23.320f, -48.505f, 4.355f}},
202 {4, YAW_POS_X, {25.185f, -46.640f, 4.355f}},
205 {0, YAW_POS_Y, {0.000f, 1.865f, 4.355f}},
206 {0, YAW_NEG_X, {-1.865f, 0.000f, 4.355f}},
207 {0, YAW_NEG_Y, {0.000f, -1.865f, 4.355f}},
208 {0, YAW_POS_X, {1.865f, 0.000f, 4.355f}},
212 std::array<Eigen::Vector2f, 4> generateSquareObjectCorners2D(
float squareLength);
214 std::array<Eigen::Vector3f, 4> generateSquareObjectCorners3D(
float squareLength);
216 Eigen::Matrix3f rotateVec2ZAxis(
const Eigen::Vector3f& a);
218 Eigen::Vector3f rot2vec(
const Eigen::Matrix3f& R);
220 Eigen::Vector3f computeTranslation(
const std::array<Eigen::Vector2f, 4>& objectPoints,
221 const std::array<Eigen::Vector2f, 4>& normalizedImgPoints,
222 const Eigen::Matrix3f& R);
224 std::pair<Eigen::Matrix3f, Eigen::Matrix3f>
225 computeRotations(
float j00,
float j01,
float j10,
float j11,
float p,
float q);
227 std::pair<Eigen::Matrix4f, Eigen::Matrix4f>
228 solveCanonicalForm(
const std::array<Eigen::Vector2f, 4>& canonicalObjPoints,
229 const std::array<Eigen::Vector2f, 4>& normalizedInputPoints,
230 const Eigen::Matrix3f& H);
232 Eigen::Matrix3f homographyFromSquarePoints(
const std::array<Eigen::Vector2f, 4>& targetPoints,
float halfLength);
234 std::array<Eigen::Vector2f, 4> projectPoints(
const std::array<Eigen::Vector3f, 4>& objectPoints,
235 const Eigen::Matrix3f& R,
236 const Eigen::Vector3f& t,
237 const Eigen::Matrix3f& cameraMatrix,
238 const Eigen::Vector<float, 5>& distCoeffs);
240 float evalReprojError(
const std::array<Eigen::Vector3f, 4>& objectPoints,
241 const std::array<Eigen::Vector2f, 4>& imagePoints,
242 const Eigen::Matrix3f& cameraMatrix,
243 const Eigen::Vector<float, 5>& distCoeffs,
244 const Eigen::Matrix4f& M);
246 SortedPoses sortPosesByReprojError(
const std::array<Eigen::Vector3f, 4>& objectPoints,
247 const std::array<Eigen::Vector2f, 4>& imagePoints,
248 const Eigen::Matrix3f& cameraMatrix,
249 const Eigen::Vector<float, 5>& distCoeffs,
250 const Eigen::Matrix4f& Ma,
251 const Eigen::Matrix4f& Mb);
253 std::array<Eigen::Vector2f, 4> undistortPoints5Coeffs(
const std::array<Eigen::Vector2f, 4>& src,
254 const Eigen::Matrix3f& cameraMatrix,
255 const Eigen::Vector<float, 5>& distCoeffs,
256 int maxIterations = 5,
257 float epsilon = 0.01f);
259 IPPEOutput IPPESquare(
const std::array<Eigen::Vector2f, 4>& imagePoints,
260 const Eigen::Matrix3f& cameraMatrix,
261 const Eigen::Vector<float, 5>& distCoeffs,
264 std::pair<Eigen::Vector3f, Eigen::Vector3f> selectBestIPPESolution(
const IPPEOutput& ippeOutput,
265 const Eigen::Quaternionf& imuQuat,
266 const Eigen::Quaternionf& cameraToImuRotation);