diff --git a/tests/test-so3-smooth.cpp b/tests/test-so3-smooth.cpp index ad0988185e02b998253b58cb0095548ca0473f8b..65248d37d5de43279e3296e7e51715d44b013b89 100644 --- a/tests/test-so3-smooth.cpp +++ b/tests/test-so3-smooth.cpp @@ -333,12 +333,12 @@ BOOST_AUTO_TEST_CASE(derivate_computation_check) { matrix3_t end_rot = end_quat.toRotationMatrix(); double t_min = generateRandomNumber(0.0, 100.0); double t_max = t_min + generateRandomNumber(0.1, 10.0); - std::vector<point3_t, Eigen::aligned_allocator<point3_t>> traj_vel_discr; - std::vector<point3_t, Eigen::aligned_allocator<point3_t>> traj_acc_discr; + Eigen::MatrixXd traj_vel_discr; + Eigen::MatrixXd traj_acc_discr; double dt = 1e-3; std::size_t nb_sample = static_cast<std::size_t>((t_max - t_min) / dt); - traj_vel_discr.resize(nb_sample, point3_t::Zero()); - traj_acc_discr.resize(nb_sample, point3_t::Zero()); + traj_vel_discr.resize(3, nb_sample); + traj_acc_discr.resize(3, nb_sample); // Create the object. SO3Smooth_t traj; @@ -350,10 +350,10 @@ BOOST_AUTO_TEST_CASE(derivate_computation_check) { traj.generate(init_rot, end_rot, t_min, t_max); // Evaluate the trajectory. - for (std::size_t i = 0; i < traj_vel_discr.size(); ++i) { + for (std::size_t i = 0; i < nb_sample; ++i) { double t = t_min + static_cast<double>(i) * dt; - traj_vel_discr[i] = traj.derivate(t, 1); - traj_acc_discr[i] = traj.derivate(t, 2); + traj_vel_discr.col(i) = traj.derivate(t, 1); + traj_acc_discr.col(i) = traj.derivate(t, 2); } // Test the object. @@ -363,31 +363,41 @@ BOOST_AUTO_TEST_CASE(derivate_computation_check) { BOOST_CHECK_EQUAL(traj.degree(), 5.0); BOOST_CHECK_EQUAL(traj.get_init_rotation(), init_rot); BOOST_CHECK_EQUAL(traj.get_end_rotation(), end_rot); - BOOST_CHECK(traj(traj.min()).isApprox(init_rot)); - BOOST_CHECK(traj(traj.max()).isApprox(end_rot)); + BOOST_CHECK((traj(traj.min()) - init_rot).isMuchSmallerThan(1, -1e-8)); + BOOST_CHECK((traj(traj.max()) - end_rot).isMuchSmallerThan(1, -1e-8)); BOOST_CHECK_EQUAL(traj.derivate(traj.min(), 1), point3_t::Zero()); BOOST_CHECK_LE(traj.derivate(traj.max(), 1).norm(), 1e-3); - BOOST_CHECK_LE(traj.derivate(traj.min(), 2).norm(), 1e-1); - BOOST_CHECK_LE(traj.derivate(traj.max(), 2).norm(), 1e-1); // Real-time critical Eigen::internal::set_is_malloc_allowed(true); + point3_t vel_max; + vel_max << traj_vel_discr.row(0).maxCoeff(), traj_vel_discr.row(1).maxCoeff(), + traj_vel_discr.row(2).maxCoeff(); + point3_t vel_min; + vel_min << traj_vel_discr.row(0).minCoeff(), traj_vel_discr.row(1).minCoeff(), + traj_vel_discr.row(2).minCoeff(); + point3_t vel_amplitude = (vel_max - vel_min).array().abs(); + point3_t acc_max; + acc_max << traj_acc_discr.row(0).maxCoeff(), traj_acc_discr.row(1).maxCoeff(), + traj_acc_discr.row(2).maxCoeff(); + point3_t acc_min; + acc_min << traj_acc_discr.row(0).minCoeff(), traj_acc_discr.row(1).minCoeff(), + traj_acc_discr.row(2).minCoeff(); + point3_t acc_amplitude = (acc_max - acc_min).array().abs(); + // Continuity test. - for (std::size_t i = 1; i < traj_vel_discr.size(); ++i) { - point3_t error = traj_vel_discr[i] - traj_vel_discr[i - 1]; - for (Eigen::Index row = 0; row < error.rows(); ++row) { - for (Eigen::Index col = 0; col < error.cols(); ++col) { - BOOST_CHECK_LE(std::abs(error(row, col)), 1); - } + for (std::size_t i = 1; i < nb_sample; ++i) { + point3_t error = traj_vel_discr.col(i) - traj_vel_discr.col(i - 1); + for (Eigen::Index j = 0; j < error.size(); ++j) { + BOOST_CHECK_LE(std::abs(error(j)), 1e-0 * vel_amplitude(j)); } } - for (std::size_t i = 1; i < traj_acc_discr.size(); ++i) { - point3_t error = traj_acc_discr[i] - traj_acc_discr[i - 1]; - for (Eigen::Index row = 0; row < error.rows(); ++row) { - for (Eigen::Index col = 0; col < error.cols(); ++col) { - BOOST_CHECK_LE(std::abs(error(row, col)), 1); - } + + for (std::size_t i = 1; i < nb_sample; ++i) { + point3_t error = traj_acc_discr.col(i) - traj_acc_discr.col(i - 1); + for (Eigen::Index j = 0; j < error.size(); ++j) { + BOOST_CHECK_LE(std::abs(error(j)), 1e-0 * acc_amplitude(j)); } } }