From c8d0ad0c2c1e679b7b65f70bc412f99c2f9d8898 Mon Sep 17 00:00:00 2001
From: Mathieu Geisert <mgeisert@laas.fr>
Date: Tue, 1 Jul 2014 18:04:56 +0200
Subject: [PATCH] Change graspsMap key from string to DifferentialFunction.

  add virtual function resetConstraints to deal with collisions.
  add virtual function addConstraintToConfigProjector to deal with gripper
  disable collisions in the ProblemSolver.
---
 include/hpp/manipulation/fwd.hh            |  5 +++
 include/hpp/manipulation/problem-solver.hh | 21 ++++++----
 include/hpp/manipulation/robot.hh          |  3 --
 src/problem-solver.cc                      | 49 +++++++++++++++++++++-
 4 files changed, 66 insertions(+), 12 deletions(-)

diff --git a/include/hpp/manipulation/fwd.hh b/include/hpp/manipulation/fwd.hh
index bf9bdf53..e0afbb2b 100644
--- a/include/hpp/manipulation/fwd.hh
+++ b/include/hpp/manipulation/fwd.hh
@@ -66,6 +66,11 @@ namespace hpp {
     typedef std::vector <ObjectPtr_t> Objects_t;
     typedef std::map <JointConstPtr_t, JointPtr_t> JointMap_t;
     typedef core::ConstraintPtr_t ConstraintPtr_t;
+    typedef core::ConstraintSet ConstraintSet;
+    
+    typedef std::pair< GripperPtr_t, HandlePtr_t> Grasp_t;
+    typedef boost::shared_ptr <Grasp_t> GraspPtr_t;
+    typedef std::map <DifferentiableFunctionPtr_t, GraspPtr_t> GraspsMap_t;
   } // namespace manipulation
 } // namespace hpp
 
diff --git a/include/hpp/manipulation/problem-solver.hh b/include/hpp/manipulation/problem-solver.hh
index 337dd61f..33dda8ae 100644
--- a/include/hpp/manipulation/problem-solver.hh
+++ b/include/hpp/manipulation/problem-solver.hh
@@ -31,9 +31,6 @@ namespace hpp {
     public:
       typedef core::ProblemSolver parent_t;
       typedef std::vector <std::string> Names_t;
-      typedef std::pair< model::GripperPtr_t, HandlePtr_t> Grasp_t;
-      typedef boost::shared_ptr <Grasp_t> GraspPtr_t;
-      typedef std::map <const std::string, GraspPtr_t> GraspsMap_t;
       /// Destructor
       virtual ~ProblemSolver ()
       {
@@ -88,12 +85,13 @@ namespace hpp {
       /// \}
 
       /// Add grasp
-      void addGrasp( std::string graspName, model::GripperPtr_t gripper,
-                       HandlePtr_t handle) 
+      void addGrasp( const DifferentiableFunctionPtr_t& constraint,
+                     const model::GripperPtr_t& gripper,
+                     const HandlePtr_t& handle) 
       {
         Grasp_t* ptr = new Grasp_t (gripper, handle);
 	GraspPtr_t shPtr (ptr);
-        graspsMap_[graspName] = shPtr;
+        graspsMap_[constraint] = shPtr;
       }
    
       /// get grapsMap
@@ -105,8 +103,17 @@ namespace hpp {
       /// get graps by name
       ///
       /// return NULL if no grasp named graspName
-      GraspPtr_t grasp(const std::string& graspName) const;
+      GraspPtr_t grasp(const DifferentiableFunctionPtr_t& constraint) const;
 
+      /// Reset constraint set and put back the disable collisions
+      /// between gripper and handle
+      virtual void resetConstraints ();
+
+      /// Add differentialFunction to the config projector
+      /// Build the config projector if not constructed
+      virtual void addConstraintToConfigProjector(
+                          const std::string& constraintName,
+                          const DifferentiableFunctionPtr_t& constraint);
 
       /// Build a composite robot from several robots and objects
       /// \param robotName Name of the composite robot,
diff --git a/include/hpp/manipulation/robot.hh b/include/hpp/manipulation/robot.hh
index 39aadb3d..3643b8fd 100644
--- a/include/hpp/manipulation/robot.hh
+++ b/include/hpp/manipulation/robot.hh
@@ -160,9 +160,6 @@ namespace hpp {
       /// Add Collision pairs between the robots
       void addCollisions(const DeviceConstPtr_t& device);
 
-      /// Check if joint1 joint2 is a couple gripper-handle 
-      bool isCollisionPairDisabled(JointPtr_t& joint1, JointPtr_t& joint2);
-
       Devices_t robots_;
       /// Set of objects
       Objects_t objects_;
diff --git a/src/problem-solver.cc b/src/problem-solver.cc
index 7de4c9e3..501b9ea2 100644
--- a/src/problem-solver.cc
+++ b/src/problem-solver.cc
@@ -20,6 +20,8 @@
 #include <hpp/manipulation/object.hh>
 #include <hpp/manipulation/problem-solver.hh>
 #include <hpp/manipulation/robot.hh>
+#include <hpp/model/gripper.hh>
+
 
 namespace hpp {
   namespace manipulation {
@@ -67,15 +69,58 @@ namespace hpp {
       return object;
     }
 
-    ProblemSolver::GraspPtr_t ProblemSolver::grasp (const std::string& graspName) const
+    GraspPtr_t ProblemSolver::grasp (
+                      const DifferentiableFunctionPtr_t& constraint) const
     {
       GraspsMap_t::const_iterator it =
-	graspsMap_.find (graspName);
+	graspsMap_.find (constraint);
       if (it == graspsMap_.end ()) {
         GraspPtr_t grasp;
 	return grasp;
       }
       return it->second;
     }
+
+    void ProblemSolver::resetConstraints ()
+    {
+      if (robot_)
+	constraints_ = ConstraintSet::create (robot_, 
+                                              "Default constraint set");    
+      GraspsMap_t graspsMap = grasps();
+      for (GraspsMap_t::const_iterator itGrasp = graspsMap.begin() ;  
+             itGrasp != graspsMap.end() ; itGrasp++) {
+        GraspPtr_t grasp = itGrasp->second;
+        GripperPtr_t gripper = grasp->first;
+        HandlePtr_t handle = grasp->second;
+        JointPtr_t joint = handle->joint();
+        model::JointVector_t joints = gripper->getDisabledCollisions();
+        for (model::JointVector_t::iterator itJoint = joints.begin() ;
+               itJoint != joints.end() ; itJoint++ ) {
+          robot()->addCollisionPairs(joint, *itJoint, hpp::model::COLLISION);
+          robot()->addCollisionPairs(joint, *itJoint, hpp::model::DISTANCE);
+        }
+      }
+    }
+   
+    void ProblemSolver::addConstraintToConfigProjector (
+                          const std::string& constraintName,
+                          const DifferentiableFunctionPtr_t& constraint)
+    {
+      core::ProblemSolver::addConstraintToConfigProjector(constraintName,
+                                                          constraint);
+      if ( grasp(constraint) ) {
+        GripperPtr_t gripper = grasp(constraint)->first;
+        HandlePtr_t handle = grasp(constraint)->second;
+        JointPtr_t joint1 = handle->joint();
+        model::JointVector_t joints = gripper->getDisabledCollisions();
+        for (model::JointVector_t::iterator itJoint = joints.begin() ;
+               itJoint != joints.end() ; itJoint++ ) {
+          robot()->removeCollisionPairs(joint1, *itJoint,
+                                        hpp::model::COLLISION);
+          robot()->removeCollisionPairs(joint1, *itJoint,
+                                        hpp::model::DISTANCE);
+        }
+      }
+    }
   } // namespace manipulation
 } // namespace hpp
-- 
GitLab