@@ -431,4 +431,32 @@ TEST(average_quaternions, test_degeneracy) {
431431 EXPECT_THROW (average_quaternions ({q0, q180}), std::runtime_error);
432432}
433433
434+ TEST (enu_ned_rotation, explicit_matrix_values) {
435+ Eigen::Quaterniond q_enu = euler_to_quat (0 , 0 , M_PI / 2 );
436+ Eigen::Quaterniond q_ned = enu_ned_rotation (q_enu);
437+
438+ Eigen::Matrix3d R_frame;
439+ R_frame << 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , -1 ;
440+
441+ Eigen::Matrix3d R_expected = R_frame * q_enu.toRotationMatrix ();
442+ Eigen::Matrix3d R_actual = q_ned.toRotationMatrix ();
443+
444+ EXPECT_TRUE (R_actual.isApprox (R_expected, 1e-12 ));
445+ }
446+
447+ TEST (enu_ned_rotation, test_symmetry) {
448+ Eigen::Quaterniond q_enu = Eigen::Quaterniond (
449+ Eigen::AngleAxisd (M_PI / 4 , Eigen::Vector3d::UnitZ ()));
450+
451+ Eigen::Quaterniond q_ned = enu_ned_rotation (q_enu);
452+ Eigen::Quaterniond q_enu_converted_back = enu_ned_rotation (q_ned);
453+
454+ EXPECT_TRUE (q_enu.isApprox (q_enu_converted_back, 1e-12 ) ||
455+ q_enu.isApprox (Eigen::Quaterniond (-q_enu_converted_back.w (),
456+ -q_enu_converted_back.x (),
457+ -q_enu_converted_back.y (),
458+ -q_enu_converted_back.z ()),
459+ 1e-12 ));
460+ }
461+
434462} // namespace vortex::utils::math
0 commit comments