14constexpr float kEps = 1e-5f;
15constexpr float kSqrtHalf = 0.70710678118654752440f;
18 const std::array<float, 3> &actual,
19 const std::array<float, 3> &expected,
21 EXPECT_NEAR(actual[0], expected[0], eps);
22 EXPECT_NEAR(actual[1], expected[1], eps);
23 EXPECT_NEAR(actual[2], expected[2], eps);
27 const std::array<float, 4> &actual,
28 const std::array<float, 4> &expected,
30 EXPECT_NEAR(actual[0], expected[0], eps);
31 EXPECT_NEAR(actual[1], expected[1], eps);
32 EXPECT_NEAR(actual[2], expected[2], eps);
33 EXPECT_NEAR(actual[3], expected[3], eps);
38TEST(TransformQuaternion, identity_rotation_is_w_one) {
42 ExpectNearArray3(tf.translation, {0.0f, 0.0f, 0.0f});
43 ExpectNearArray4(tf.rotation, {1.0f, 0.0f, 0.0f, 0.0f});
46TEST(TransformQuaternion, translation_y_axis_is_mirrored) {
50 ExpectNearArray3(tf.translation, {3.0f, -4.0f, 5.0f});
53TEST(TransformQuaternion, pure_pitch_ninety_lands_on_minus_y_half) {
59 ExpectNearArray4(tf.rotation, {kSqrtHalf, 0.0f, -kSqrtHalf, 0.0f});
62TEST(TransformQuaternion, pure_yaw_ninety_lands_on_minus_z_half) {
68 ExpectNearArray4(tf.rotation, {kSqrtHalf, 0.0f, 0.0f, -kSqrtHalf});
71TEST(TransformQuaternion, pure_roll_ninety_lands_on_plus_x_half) {
76 ExpectNearArray4(tf.rotation, {kSqrtHalf, kSqrtHalf, 0.0f, 0.0f});
79TEST(TransformQuaternion, quaternion_stays_unit_norm) {
80 for (
float pitch : {-180.0f, -45.0f, 0.0f, 30.0f, 90.0f, 175.0f}) {
81 for (
float yaw : {-90.0f, 0.0f, 60.0f}) {
82 for (
float roll : {-30.0f, 0.0f, 45.0f}) {
87 tf.rotation[0] * tf.rotation[0]
88 + tf.rotation[1] * tf.rotation[1]
89 + tf.rotation[2] * tf.rotation[2]
90 + tf.rotation[3] * tf.rotation[3];
91 EXPECT_NEAR(norm, 1.0f, 1e-4f)
92 <<
"pitch=" << pitch <<
" yaw=" << yaw <<
" roll=" << roll;
98TEST(TransformQuaternion, regression_guard_against_halved_deg_to_rad) {
106 EXPECT_NEAR(tf.rotation[0], 0.0f, 1e-3f);
107 EXPECT_GT(std::abs(tf.rotation[2]), 0.9f);
TransformQuaternion TransformFromCarlaRotation(float tx, float ty, float tz, float pitch_deg, float yaw_deg, float roll_deg) noexcept