9static double matrix_error(
const double left[3][3],
const double right[3][3]) {
11 for (
int row = 0; row < 3; ++row) {
12 for (
int column = 0; column < 3; ++column) {
13 const double difference = left[row][column] - right[row][column];
14 sum += difference * difference;
20static uint32_t check_round_trip(
const EulerAngles *input) {
21 const double tolerance = 1e-12;
22 double expected[3][3];
24 double reconstructed[3][3];
28 uint32_t failures = 0;
41 if (matrix_error((
const double (*)[3])expected,
42 (
const double (*)[3])reconstructed) >= tolerance) {
51 if (matrix_error((
const double (*)[3])expected,
52 (
const double (*)[3])reconstructed) >= tolerance) {
62 matrix_error((
const double (*)[3])expected,
63 (
const double (*)[3])reconstructed) >= tolerance) {
71static uint32_t check_rejections(
void) {
74 const double reflection[3][3] = {
97 const double pi = 3.14159265358979323846;
107 uint32_t failures = 0;
109 for (
unsigned int index = 0; index <
sizeof(cases) /
sizeof(cases[0]); ++index) {
110 failures |= check_round_trip(&cases[index]);
112 failures |= check_rejections();
int dcm_to_euler_checked(const double dcm[3][3], double *roll, double *pitch, double *yaw)
Checked DCM-to-Euler conversion.
int dcm_to_quaternion_checked(const double dcm[3][3], double q[4])
Checked DCM-to-quaternion conversion.
int dcm_is_orthonormal(const double dcm[3][3], double tol)
Check whether a DCM is orthonormal within a tolerance.
int euler_to_quaternion_checked(const EulerAngles *e, double q[4])
Checked Euler-to-quaternion conversion.
@ EULER_ZYX
Standard aerospace yaw → pitch → roll sequence.
@ EULER_XYZ
Roll → pitch → yaw intrinsic sequence.
int euler_to_dcm_checked(const EulerAngles *e, double dcm[3][3])
Checked Euler-to-DCM conversion.
void quaternion_to_dcm(const double q[4], double dcm[3][3])
Convert a quaternion to a direction cosine matrix (DCM).
Storage for Euler angles with an associated rotation order.
uint32_t attitude_validation_run(void)
Run deterministic attitude conversion fixtures.
@ ATTITUDE_VALIDATION_EULER_TO_QUATERNION
@ ATTITUDE_VALIDATION_DCM_TO_EULER
@ ATTITUDE_VALIDATION_INVALID_INPUT
@ ATTITUDE_VALIDATION_EULER_TO_DCM
@ ATTITUDE_VALIDATION_QUATERNION_DCM
@ ATTITUDE_VALIDATION_DCM_TO_QUATERNION
@ ATTITUDE_VALIDATION_ORTHONORMAL