//============================================================================== /* ROTGEN - Runtime Overlay for Eigen Copyright : CODE RECKONS SPDX-License-Identifier: BSL-1.0 */ //============================================================================== #include #include "unit/common/references.hpp" #include "unit/tests.hpp" #include TTS_CASE_TPL("Test quaternion::angleAxis", float, double)(tts::type) { // Eigen Eigen::Quaternion eigen_result; eigen_result = Eigen::AngleAxis(13, Eigen::Matrix{1, 2, 3}); // Rotgen rotgen::quaternion rotgen_result; rotgen_result = rotgen::angleAxis(13, rotgen::matrix{1, 2, 3}); TTS_EQUAL(rotgen_result.w(), eigen_result.w()); TTS_EQUAL(rotgen_result.x(), eigen_result.x()); TTS_EQUAL(rotgen_result.y(), eigen_result.y()); TTS_EQUAL(rotgen_result.z(), eigen_result.z()); }; TTS_CASE_TPL("Test quaternion::operator* with rotgen::matrix", float, double)(tts::type) { // Eigen Eigen::Quaternion eigen_quat; eigen_quat = Eigen::AngleAxis(13, Eigen::Matrix{1, 2, 3}); Eigen::Matrix eigen_other{3, 2, 1}; auto eigen_result = eigen_quat * eigen_other; // Rotgen rotgen::quaternion rotgen_quat; rotgen_quat = rotgen::angleAxis(13, rotgen::matrix{1, 2, 3}); rotgen::matrix rotgen_other{3, 2, 1}; auto rotgen_result = rotgen_quat * rotgen_other; for (auto i = 0; i < eigen_result.size(); i++) TTS_ULP_EQUAL(rotgen_result(i), eigen_result(i), 2); }; TTS_CASE_TPL("Test quaternion::operator* with rotgen::map", float, double)(tts::type) { Scalar data[] = {3, 2, 1}; // Eigen Eigen::Quaternion eigen_quat; eigen_quat = Eigen::AngleAxis(13, Eigen::Matrix{1, 2, 3}); Eigen::Map> eigen_other{data}; auto eigen_result = eigen_quat * eigen_other; // Rotgen rotgen::quaternion rotgen_quat; rotgen_quat = rotgen::angleAxis(13, rotgen::matrix{1, 2, 3}); rotgen::map> rotgen_other{data}; auto rotgen_result = rotgen_quat * rotgen_other; for (auto i = 0; i < eigen_result.size(); i++) TTS_ULP_EQUAL(rotgen_result(i), eigen_result(i), 2); }; TTS_CASE_TPL("Test quaternion::operator* with rotgen::block", float, double)(tts::type) { // Eigen Eigen::Quaternion eigen_quat; eigen_quat = Eigen::AngleAxis(13, Eigen::Matrix{1, 2, 3}); Eigen::Matrix eigen_original_mat; rotgen::tests::prepare(16, 16, rotgen::tests::default_init_function, eigen_original_mat); auto eigen_other = eigen_original_mat.template block<3, 1>(0, 0); auto eigen_result = eigen_quat * eigen_other; // Rotgen rotgen::quaternion rotgen_quat; rotgen_quat = rotgen::angleAxis(13, rotgen::matrix{1, 2, 3}); rotgen::matrix rotgen_original_mat; rotgen::tests::prepare(16, 16, rotgen::tests::default_init_function, rotgen_original_mat); auto rotgen_other = rotgen::extract<3, 1>(rotgen_original_mat, 0, 0); auto rotgen_result = rotgen_quat * rotgen_other; for (auto i = 0; i < eigen_result.size(); i++) TTS_ULP_EQUAL(rotgen_result(i), eigen_result(i), 2); };