diff --git a/src/problem-solver.cc b/src/problem-solver.cc index dc271a8c70b401bde4c3d690d9ab9a06cdb4a3a5..0acd556f5d5c5aaa0e64be660a57be4811e72cec 100644 --- a/src/problem-solver.cc +++ b/src/problem-solver.cc @@ -244,6 +244,7 @@ namespace hpp { (const std::string& name, const StringList_t& surface1, const StringList_t& surface2, const value_type& margin) { + bool explicit_(true); if (!robot_) throw std::runtime_error ("No robot loaded"); JointAndShapes_t floorSurfaces, objectSurfaces, l; for (StringList_t::const_iterator it1 = surface1.begin (); @@ -251,7 +252,19 @@ namespace hpp { if (!robot_->jointAndShapes.has (*it1)) throw std::runtime_error ("First list of triangles not found."); l = robot_->jointAndShapes.get (*it1); - objectSurfaces.insert(objectSurfaces.end(), l.begin(), l.end()); + for(auto js : l){ + JointPtr_t j(js.first); + // If one robot contact surface is not on a freeflying object, + // The contact constraint cannot be expressed by an explicit + // constraint. + if ((j->parentJoint()) || + ((*j->configurationSpace()!=*pinocchio::LiegroupSpace::SE3()) && + (*j->configurationSpace()!=*pinocchio::LiegroupSpace::R3xSO3()))) + { + explicit_ = false; + } + objectSurfaces.insert(objectSurfaces.end(), l.begin(), l.end()); + } } for (StringList_t::const_iterator it2 = surface2.begin (); @@ -266,28 +279,45 @@ namespace hpp { floorSurfaces.insert(floorSurfaces.end(), l.begin(), l.end()); } - typedef hpp::constraints::explicit_::ConvexShapeContact Constraint_t; - Constraint_t::Constraints_t constraints - (Constraint_t::createConstraintAndComplement - (name, robot_, floorSurfaces, objectSurfaces, margin)); - - addNumericalConstraint(std::get<0>(constraints)->function().name(), - std::get<0>(constraints)); - addNumericalConstraint(std::get<1>(constraints)->function().name(), - std::get<1>(constraints)); - addNumericalConstraint(std::get<2>(constraints)->function().name(), - std::get<2>(constraints)); - // Set security margin to contact constraint - assert(HPP_DYNAMIC_PTR_CAST(constraints::ConvexShapeContact, - std::get<0>(constraints)->functionPtr())); - constraints::ConvexShapeContactPtr_t contactFunction - (HPP_STATIC_PTR_CAST(constraints::ConvexShapeContact, - std::get<0>(constraints)->functionPtr())); - contactFunction->setNormalMargin(margin); - constraintsAndComplements.push_back ( - ConstraintAndComplement_t (std::get<0>(constraints), - std::get<1>(constraints), - std::get<2>(constraints))); + if (explicit_){ + typedef hpp::constraints::explicit_::ConvexShapeContact Constraint_t; + Constraint_t::Constraints_t constraints + (Constraint_t::createConstraintAndComplement + (name, robot_, floorSurfaces, objectSurfaces, margin)); + + addNumericalConstraint(std::get<0>(constraints)->function().name(), + std::get<0>(constraints)); + addNumericalConstraint(std::get<1>(constraints)->function().name(), + std::get<1>(constraints)); + addNumericalConstraint(std::get<2>(constraints)->function().name(), + std::get<2>(constraints)); + // Set security margin to contact constraint + assert(HPP_DYNAMIC_PTR_CAST(constraints::ConvexShapeContact, + std::get<0>(constraints)->functionPtr())); + constraints::ConvexShapeContactPtr_t contactFunction + (HPP_STATIC_PTR_CAST(constraints::ConvexShapeContact, + std::get<0>(constraints)->functionPtr())); + contactFunction->setNormalMargin(margin); + constraintsAndComplements.push_back ( + ConstraintAndComplement_t (std::get<0>(constraints), + std::get<1>(constraints), + std::get<2>(constraints))); + } else{ + using constraints::ComparisonTypes_t; + using constraints::Implicit; + using constraints::Equality; + using constraints::EqualToZero; + std::pair<hpp::constraints::ConvexShapeContactPtr_t, + hpp::constraints::ConvexShapeContactComplementPtr_t> + functions(constraints::ConvexShapeContactComplement::createPair + (name, robot_, floorSurfaces, objectSurfaces)); + functions.first->setNormalMargin(margin); + addNumericalConstraint(functions.first->name(), + Implicit::create(functions.first, 5*EqualToZero)); + addNumericalConstraint(functions.second->name(), + Implicit::create(functions.second, ComparisonTypes_t + (functions.second->outputSize(), Equality))); + } } void ProblemSolver::createPrePlacementConstraint