diff --git a/include/hpp/manipulation/graph/helper.hh b/include/hpp/manipulation/graph/helper.hh index d806f00d8f3996a0858aeba418eff373364cacaa..eadb13177404ef13530aec1c9ebfc374a5795615 100644 --- a/include/hpp/manipulation/graph/helper.hh +++ b/include/hpp/manipulation/graph/helper.hh @@ -29,8 +29,7 @@ namespace hpp { namespace manipulation { namespace graph { - namespace helper - { + namespace helper { /// \defgroup helper Helpers to build the graph of constraints /// \addtogroup helper /// \{ @@ -169,6 +168,20 @@ namespace hpp { const Objects_t& objects, const Grippers_t& grippers, GraphPtr_t graph); + + struct ObjectDef_t { + std::string name; + JointPtr_t lastJoint; + StringList_t handles, shapes; + }; + + GraphPtr_t graphBuilder ( + const ProblemSolverPtr_t& ps, + const std::string& graphName, + const StringList_t& griNames, + const std::list <ObjectDef_t>& objs, + const StringList_t& envNames, + const value_type& prePlaceWidth = 0.05); /// \} } // namespace helper } // namespace graph diff --git a/src/graph/helper.cc b/src/graph/helper.cc index edec1423828ae84bf3e74bc6e15e182578850450..c25f8a94f2d1b423e161cc8f9a204345089d9704 100644 --- a/src/graph/helper.cc +++ b/src/graph/helper.cc @@ -24,11 +24,11 @@ #include <hpp/constraints/differentiable-function.hh> +#include <hpp/manipulation/handle.hh> #include <hpp/manipulation/graph/node.hh> #include <hpp/manipulation/graph/edge.hh> #include <hpp/manipulation/graph/node-selector.hh> - -#include <hpp/manipulation/handle.hh> +#include <hpp/manipulation/problem-solver.hh> namespace hpp { namespace manipulation { @@ -828,6 +828,66 @@ namespace hpp { recurseGrippers (r, availG, availOH, iG); } + + GraphPtr_t graphBuilder ( + const ProblemSolverPtr_t& ps, + const std::string& graphName, + const StringList_t& griNames, + const std::list <ObjectDef_t>& objs, + const StringList_t& envNames, + const value_type& prePlaceWidth) + { + const Device& robot = *(ps->robot ()); + Grippers_t grippers (griNames.size()); + index_t i = 0; + BOOST_FOREACH (const std::string& gn, griNames) { + grippers[i] = robot.get <GripperPtr_t> (gn); + ++i; + } + Objects_t objects (objs.size()); + i = 0; + const value_type margin = 1e-3; + bool prePlace = (prePlaceWidth > 0); + BOOST_FOREACH (const ObjectDef_t& od, objs) { + // Create handles + objects[i].get<1> ().resize (od.handles.size()); + Handles_t::iterator it = objects[i].get<1> ().begin(); + BOOST_FOREACH (const std::string hn, od.handles) { + *it = robot.get <HandlePtr_t> (hn); + ++it; + } + // Create placement + if (!od.shapes.empty ()) { + const std::string placeN = "place_" + od.name; + ps->createPlacementConstraint (placeN, + od.shapes, envNames, margin); + objects[i].get<0> ().get<0> () = + ps->get <NumericalConstraintPtr_t> (placeN); + if (prePlace) { + ps->createPrePlacementConstraint ("pre" + placeN, + od.shapes, envNames, margin, prePlaceWidth); + objects[i].get<0> ().get<1> () = + ps->get <NumericalConstraintPtr_t> ("pre" + placeN); + } + } + // Create object lock + for (JointPtr_t oj = od.lastJoint; + oj != NULL; oj = oj->parentJoint ()) { + LockedJointPtr_t lj = core::LockedJoint::create (oj, + robot.currentConfiguration() + .segment (oj->rankInConfiguration (), oj->configSize ())); + ps->add <LockedJointPtr_t> ("lock_" + oj->name (), lj); + objects[i].get<0> ().get<2> ().push_back (lj); + } + ++i; + } + GraphPtr_t graph = Graph::create (graphName, + ps->robot(), ps->problem()); + graph->createNodeSelector ("nodeSelector"); + graphBuilder (objects, grippers, graph); + ps->constraintGraph (graph); + return graph; + } } // namespace helper } // namespace graph } // namespace manipulation