diff --git a/src/algorithm/joint-configuration.hpp b/src/algorithm/joint-configuration.hpp index 5c9faad60084f4e92a1622e0810ee890749b540e..9bb6324b6e657cd2e1eb0b13789063d188b4e3b9 100644 --- a/src/algorithm/joint-configuration.hpp +++ b/src/algorithm/joint-configuration.hpp @@ -105,14 +105,13 @@ namespace se3 inline Eigen::VectorXd randomConfiguration(const Model & model); /** - * @brief Normalize a configuration + * @brief Normalize a configuration * - * @param[in] model Model - * @param[in] q Configuration to normalize - * @return The normalized configuration + * @param[in] model Model + * @param[in,out] q Configuration to normalize */ - inline Eigen::VectorXd normalized(const Model & model, - const Eigen::VectorXd & q); + inline void normalize(const Model & model, + Eigen::VectorXd & q); } // namespace se3 /* --- Details -------------------------------------------------------------------- */ @@ -307,35 +306,29 @@ namespace se3 return randomConfiguration(model, model.lowerPositionLimit, model.upperPositionLimit); } - struct NormalizedStep : public fusion::JointModelVisitor<NormalizedStep> + struct NormalizeStep : public fusion::JointModelVisitor<NormalizeStep> { - typedef boost::fusion::vector<const Eigen::VectorXd &, - Eigen::VectorXd & - > ArgsType; + typedef boost::fusion::vector<Eigen::VectorXd &> ArgsType; - JOINT_MODEL_VISITOR_INIT(NormalizedStep); + JOINT_MODEL_VISITOR_INIT(NormalizeStep); template<typename JointModel> static void algo(const se3::JointModelBase<JointModel> & jmodel, - const Eigen::VectorXd & q, - Eigen::VectorXd & result) + Eigen::VectorXd & q) { - jmodel.jointConfigSelector(result) = jmodel.normalized(q); + jmodel.normalize(q); } }; - inline Eigen::VectorXd - normalized(const Model & model, - const Eigen::VectorXd & q) + inline void + normalize(const Model & model, + Eigen::VectorXd & q) { - Eigen::VectorXd norma(model.nq); for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoint; ++i ) { - NormalizedStep::run(model.joints[i], - NormalizedStep::ArgsType (q, norma) - ); + NormalizeStep::run(model.joints[i], + NormalizeStep::ArgsType (q)); } - return norma; } diff --git a/src/multibody/joint/joint-base.hpp b/src/multibody/joint/joint-base.hpp index cff9e9fbd311077f2d20c2a3296853ada149b5fd..8f79fb2165162c93e57921a81bcc9b487deceb55 100644 --- a/src/multibody/joint/joint-base.hpp +++ b/src/multibody/joint/joint-base.hpp @@ -339,20 +339,15 @@ namespace se3 /** * @brief Normalize a configuration * - * @param[in] q Configuration to normalize (size full model.nq) - * - * @return The normalized configuration + * @param[in,out] q Configuration to normalize (size full model.nq) */ - ConfigVector_t normalized(const Eigen::VectorXd & q) const - { return derived().normalized_impl(q); } + void normalize(Eigen::VectorXd & q) const + { return derived().normalize_impl(q); } /** - * @brief Default implementation of normalized + * @brief Default implementation of normalize */ - ConfigVector_t normalized_impl(const Eigen::VectorXd & q) const - { - return q.segment<NQ>(idx_q()); - } + void normalize_impl(Eigen::VectorXd &) const { } JointIndex i_id; // ID of the joint in the multibody list. int i_q; // Index of the joint configuration in the joint configuration vector. diff --git a/src/multibody/joint/joint-basic-visitors.hpp b/src/multibody/joint/joint-basic-visitors.hpp index 919b543d6d503bc595c1254aab795cde38064a06..5cfec59b01bf9c506fe0771e7c1eee6948064aa6 100644 --- a/src/multibody/joint/joint-basic-visitors.hpp +++ b/src/multibody/joint/joint-basic-visitors.hpp @@ -157,16 +157,14 @@ namespace se3 inline Eigen::VectorXd neutralConfiguration(const JointModelVariant & jmodel); /** - * @brief Visit a JointModelVariant through JointNormalizedVisitor to compute + * @brief Visit a JointModelVariant through JointNormalizeVisitor to compute * the normalized configuration. * - * @param[in] jmodel The JointModelVariant - * @param[in] q configuration to normalize - * - * @return The normalized configuration + * @param[in] jmodel The JointModelVariant + * @param[in,out] q configuration to normalize */ - inline Eigen::VectorXd normalized(const JointModelVariant & jmodel, - const Eigen::VectorXd & q); + inline void normalize(const JointModelVariant & jmodel, + Eigen::VectorXd & q); /** * @brief Visit a JointModelVariant through JointNvVisitor to get the dimension of diff --git a/src/multibody/joint/joint-basic-visitors.hxx b/src/multibody/joint/joint-basic-visitors.hxx index 6a68be80fb0891be337a581e5ac0bc754841130d..c0faf57c8d2d649d229709052e55a86b35137a95 100644 --- a/src/multibody/joint/joint-basic-visitors.hxx +++ b/src/multibody/joint/joint-basic-visitors.hxx @@ -233,25 +233,25 @@ namespace se3 } /** - * @brief JointNormalizedVisitor visitor + * @brief JointNormalizeVisitor visitor */ - class JointNormalizedVisitor: public boost::static_visitor<Eigen::VectorXd> + class JointNormalizeVisitor: public boost::static_visitor<> { public: - const Eigen::VectorXd & q; + Eigen::VectorXd & q; - JointNormalizedVisitor(const Eigen::VectorXd & q) : q(q) {} + JointNormalizeVisitor(Eigen::VectorXd & q) : q(q) {} template<typename D> - Eigen::VectorXd operator()(const JointModelBase<D> & jmodel) const - { return jmodel.normalized(q); } + void operator()(const JointModelBase<D> & jmodel) const + { jmodel.normalize(q); } - static Eigen::VectorXd run(const JointModelVariant & jmodel, const Eigen::VectorXd & q) - { return boost::apply_visitor( JointNormalizedVisitor(q), jmodel ); } + static void run(const JointModelVariant & jmodel, Eigen::VectorXd & q) + { boost::apply_visitor( JointNormalizeVisitor(q), jmodel ); } }; - inline Eigen::VectorXd normalized(const JointModelVariant & jmodel, const Eigen::VectorXd & q) + inline void normalize(const JointModelVariant & jmodel, Eigen::VectorXd & q) { - return JointNormalizedVisitor::run(jmodel, q); + JointNormalizeVisitor::run(jmodel, q); } diff --git a/src/multibody/joint/joint-dense.hpp b/src/multibody/joint/joint-dense.hpp index cb86cbf3531df5530aafe5fa97a1f84129861607..5d970c15bf300fd5814db392cbdc7e07941fd03d 100644 --- a/src/multibody/joint/joint-dense.hpp +++ b/src/multibody/joint/joint-dense.hpp @@ -197,11 +197,9 @@ namespace se3 return result; } - ConfigVector_t normalized_impl(const Eigen::VectorXd &) const + void normalize_impl(Eigen::VectorXd &) const { - ConfigVector_t result; assert(false && "JointModelDense is read-only, should not perform any calc"); - return result; } JointModelDense() {} diff --git a/src/multibody/joint/joint-free-flyer.hpp b/src/multibody/joint/joint-free-flyer.hpp index c7bf15faf1f05d421ea95ed9538e6a8fe229130b..f6786bd90e79dd0b14decb703ce50288bf05e3c3 100644 --- a/src/multibody/joint/joint-free-flyer.hpp +++ b/src/multibody/joint/joint-free-flyer.hpp @@ -374,11 +374,9 @@ namespace se3 return q; } - ConfigVector_t normalized_impl(const Eigen::VectorXd& q) const + void normalize_impl(Eigen::VectorXd& q) const { - ConfigVector_t result (q.segment<NQ>(idx_q())); - result.tail<4>().normalize(); - return result; + q.segment<4>(idx_q()+3).normalize(); } JointModelDense<NQ, NV> toDense_impl() const diff --git a/src/multibody/joint/joint-spherical.hpp b/src/multibody/joint/joint-spherical.hpp index 15c7404e790d0643f8514f9b2d9a1a6b7541bd34..df7eaac16bf8a7c16952c484b3881a39749a3d7e 100644 --- a/src/multibody/joint/joint-spherical.hpp +++ b/src/multibody/joint/joint-spherical.hpp @@ -399,9 +399,9 @@ namespace se3 return q; } - ConfigVector_t normalized_impl(const Eigen::VectorXd& q) const + void normalize_impl(Eigen::VectorXd& q) const { - return q.segment<NQ>(idx_q()).normalized(); + q.segment<NQ>(idx_q()).normalize(); } JointModelDense<NQ, NV> toDense_impl() const diff --git a/src/multibody/joint/joint.hpp b/src/multibody/joint/joint.hpp index 8011527b1c409cfbdfa417563b6bb943b2c147bf..8e406a79e1c0518f5144d3b4a6e298476b3a5869 100644 --- a/src/multibody/joint/joint.hpp +++ b/src/multibody/joint/joint.hpp @@ -146,9 +146,9 @@ namespace se3 return ::se3::distance(*this, q0, q1); } - ConfigVector_t normalized_impl(const Eigen::VectorXd & q) const - { - return ::se3::normalized(*this, q); + void normalize_impl(Eigen::VectorXd & q) const + { + return ::se3::normalize(*this, q); } ConfigVector_t neutralConfiguration_impl() const diff --git a/unittest/joint-configurations.cpp b/unittest/joint-configurations.cpp index b135d8ef09b6d45c6970cd7858b3203e580e1a60..d7941f51fe0461bba990a24319821cf1552ec871 100644 --- a/unittest/joint-configurations.cpp +++ b/unittest/joint-configurations.cpp @@ -518,7 +518,7 @@ BOOST_AUTO_TEST_CASE ( integrate_difference_test ) } -BOOST_AUTO_TEST_CASE ( normalized_test ) +BOOST_AUTO_TEST_CASE ( normalize_test ) { using namespace se3; @@ -526,12 +526,14 @@ BOOST_AUTO_TEST_CASE ( normalized_test ) Model model = createModelWithAllJoints(); se3::Data data(model); - Eigen::VectorXd q = Eigen::VectorXd::Ones(model.nq); + Eigen::VectorXd q (Eigen::VectorXd::Ones(model.nq)); + se3::normalize(model, q); - Eigen::VectorXd qn = se3::normalized(model, q); - - BOOST_CHECK(fabs(qn.segment<4>(3).norm() - 1) < Eigen::NumTraits<double>::epsilon()); // quaternion of freeflyer - BOOST_CHECK(fabs(qn.segment<4>(7).norm() - 1) < Eigen::NumTraits<double>::epsilon()); // quaternion of spherical joint + BOOST_CHECK(q.head<3>().isApprox(Eigen::VectorXd::Ones(3))); + BOOST_CHECK(fabs(q.segment<4>(3).norm() - 1) < Eigen::NumTraits<double>::epsilon()); // quaternion of freeflyer + BOOST_CHECK(fabs(q.segment<4>(7).norm() - 1) < Eigen::NumTraits<double>::epsilon()); // quaternion of spherical joint + const int n = model.nq - 7 - 4; + BOOST_CHECK(q.tail(n).isApprox(Eigen::VectorXd::Ones(n))); } BOOST_AUTO_TEST_SUITE_END ()