From bf37463188e01397bf997fe28211e173c699d996 Mon Sep 17 00:00:00 2001
From: Valenza Florian <fvalenza@laas.fr>
Date: Thu, 7 Jul 2016 19:24:44 +0200
Subject: [PATCH] [C++][unittest] Added neutralConfiguration vector in Model,
 and fill it when adding joints + test on neutralConfiguration

---
 src/multibody/model.hpp           |  3 +++
 src/multibody/model.hxx           |  2 ++
 unittest/joint-configurations.cpp | 40 +++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+)

diff --git a/src/multibody/model.hpp b/src/multibody/model.hpp
index a1ef547b4..2f7c56ace 100644
--- a/src/multibody/model.hpp
+++ b/src/multibody/model.hpp
@@ -83,6 +83,9 @@ namespace se3
     /// \brief Name of joint <i>
     std::vector<std::string> names;
     
+    /// \brief Vector of joint's neutral configurations
+    Eigen::VectorXd neutralConfigurations;
+
     /// \brief Vector of maximal joint torques
     Eigen::VectorXd effortLimit;
     /// \brief Vector of maximal joint velocities
diff --git a/src/multibody/model.hxx b/src/multibody/model.hxx
index 935109258..9ed02774f 100644
--- a/src/multibody/model.hxx
+++ b/src/multibody/model.hxx
@@ -93,6 +93,7 @@ namespace se3
     nq += j.nq();
     nv += j.nv();
 
+    neutralConfigurations.conservativeResize(nq);neutralConfigurations.bottomRows<D::NQ>() = j.neutralConfiguration();
     effortLimit.conservativeResize(nv);effortLimit.bottomRows<D::NV>().fill(std::numeric_limits<double>::infinity());
     velocityLimit.conservativeResize(nv);velocityLimit.bottomRows<D::NV>().fill(std::numeric_limits<double>::infinity());
     lowerPositionLimit.conservativeResize(nq);lowerPositionLimit.bottomRows<D::NQ>().fill(-std::numeric_limits<double>::infinity());
@@ -125,6 +126,7 @@ namespace se3
     nq += j.nq();
     nv += j.nv();
 
+    neutralConfigurations.conservativeResize(nq);neutralConfigurations.bottomRows<D::NQ>() = j.neutralConfiguration();
     effortLimit.conservativeResize(nv);effortLimit.bottomRows<D::NV>() = effort;
     velocityLimit.conservativeResize(nv);velocityLimit.bottomRows<D::NV>() = velocity;
     lowerPositionLimit.conservativeResize(nq);lowerPositionLimit.bottomRows<D::NQ>() = lowPos;
diff --git a/unittest/joint-configurations.cpp b/unittest/joint-configurations.cpp
index a782be0bf..8c3542ca0 100644
--- a/unittest/joint-configurations.cpp
+++ b/unittest/joint-configurations.cpp
@@ -385,6 +385,46 @@ BOOST_AUTO_TEST_CASE ( distance_computation_test )
   BOOST_CHECK_MESSAGE(result.isApprox(expected, 1e-12), "Distance between two configs of full model - wrong results");
 }
 
+BOOST_AUTO_TEST_CASE ( neutral_configuration_test )
+{
+  se3::Model model;
+  
+  using namespace se3;
+
+  model.addJointAndBody(model.getJointId("universe"),JointModelFreeFlyer(),SE3::Identity(),Inertia::Random(),
+                "freeflyer_joint", "freeflyer_body");
+  model.addJointAndBody(model.getJointId("freeflyer_joint"),JointModelSpherical(),SE3::Identity(),Inertia::Random(),
+                "spherical_joint", "spherical_body");
+  model.addJointAndBody(model.getJointId("spherical_joint"),JointModelRX(),SE3::Identity(),Inertia::Random(),
+                "revolute_joint", "revolute_body");
+  model.addJointAndBody(model.getJointId("revolute_joint"),JointModelPX(),SE3::Identity(),Inertia::Random(),
+                "px_joint", "px_body");
+  model.addJointAndBody(model.getJointId("px_joint"),JointModelPrismaticUnaligned(Eigen::Vector3d(1,0,0)),SE3::Identity(),Inertia::Random(),
+                "pu_joint", "pu_body");
+  model.addJointAndBody(model.getJointId("pu_joint"),JointModelRevoluteUnaligned(Eigen::Vector3d(0,0,1)),SE3::Identity(),Inertia::Random(),
+                "ru_joint", "ru_body");
+  model.addJointAndBody(model.getJointId("ru_joint"),JointModelSphericalZYX(),SE3::Identity(),Inertia::Random(),
+                "sphericalZYX_joint", "sphericalZYX_body");
+  model.addJointAndBody(model.getJointId("sphericalZYX_joint"),JointModelTranslation(),SE3::Identity(),Inertia::Random(),
+                "translation_joint", "translation_body");
+  model.addJointAndBody(model.getJointId("translation_joint"),JointModelPlanar(),SE3::Identity(),Inertia::Random(),
+                "planar_joint", "planar_body");
+  
+
+  Eigen::VectorXd expected(model.nq);
+  expected << 0,0,0,0,0,0,1,
+              0,0,0,1,
+              0,
+              0,
+              0,
+              0,
+              0,0,0,
+              0,0,0,
+              0,0,0;
+
+
+  BOOST_CHECK_MESSAGE(model.neutralConfigurations.isApprox(expected, 1e-12), "neutral configurations - wrong results");
+}
 
 BOOST_AUTO_TEST_CASE ( uniform_sampling_test )
 {
-- 
GitLab