diff --git a/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.cpp b/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.cpp index e822ef4fccf474aad6867531ba9ce7387724f17c..1d7b1191814046a2a6e5aa0d43a66d96b4203f1c 100644 --- a/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.cpp +++ b/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.cpp @@ -196,7 +196,8 @@ namespace GraspStudio GraspEvaluationPoseUncertainty::PoseEvalResult GraspEvaluationPoseUncertainty::evaluatePose( EndEffectorPtr eef, ObstaclePtr object, const Matrix4f& objectPose, - GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape) + GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape, + float closingStepSize, float stepSizeSpeedFactor) { PoseEvalResult result; result.forceClosure = false; @@ -217,7 +218,7 @@ namespace GraspStudio } else { - eef->openActors(); + eef->openActors(nullptr, closingStepSize, stepSizeSpeedFactor); } object->setGlobalPose(objectPose); @@ -229,7 +230,7 @@ namespace GraspStudio } // collision free - EndEffector::ContactInfoVector cont = eef->closeActors(object); + EndEffector::ContactInfoVector cont = eef->closeActors(object, closingStepSize, stepSizeSpeedFactor); qm->setContactPoints(cont); result.quality = qm->getGraspQuality(); @@ -240,28 +241,24 @@ namespace GraspStudio GraspEvaluationPoseUncertainty::PoseEvalResults GraspEvaluationPoseUncertainty::evaluatePoses( EndEffectorPtr eef, ObstaclePtr object, const std::vector<Eigen::Matrix4f>& objectPoses, - GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape) + GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape, + float closingStepSize, float stepSizeSpeedFactor) { - PoseEvalResults res; - res.avgQuality = 0.0f; - res.forceClosureRate = 0.0f; - res.avgQualityCol = 0.0f; - res.forceClosureRateCol = 0.0f; - res.numPosesTested = 0; - res.numValidPoses = 0; - res.numColPoses = 0; - + if (objectPoses.empty()) + { + return {}; + } if (!eef || !qm) { VR_ERROR << "Missing parameters" << endl; - return res; + return {}; } if (!eef->getRobot()) { VR_WARNING << "missing eef->robot" << endl; - return res; + return {}; } Eigen::Matrix4f eefRobotPoseInit = eef->getRobot()->getGlobalPose(); @@ -269,16 +266,13 @@ namespace GraspStudio VirtualRobot::RobotConfigPtr initialConf = eef->getConfiguration(); std::vector<PoseEvalResult> results; + results.reserve(objectPoses.size()); for (const auto& objectPose : objectPoses) { - results.push_back(evaluatePose(eef, object, objectPose, qm, preshape)); - } - - if (results.empty()) - { - return res; + results.emplace_back(evaluatePose(eef, object, objectPose, qm, preshape, closingStepSize, stepSizeSpeedFactor)); } + PoseEvalResults res; res.numPosesTested = static_cast<int>(results.size()); for (const auto& result : results) { @@ -321,7 +315,8 @@ namespace GraspStudio GraspEvaluationPoseUncertainty::PoseEvalResults GraspEvaluationPoseUncertainty::evaluateGrasp( VirtualRobot::GraspPtr grasp, VirtualRobot::EndEffectorPtr eef, VirtualRobot::ObstaclePtr object, - GraspQualityMeasurePtr qm, int numPoses) + GraspQualityMeasurePtr qm, int numPoses, + float closingStepSize, float stepSizeSpeedFactor) { PoseEvalResults res; res.avgQuality = 0.0f; @@ -363,12 +358,12 @@ namespace GraspStudio } else { - eef->openActors(); + eef->openActors(nullptr, closingStepSize, stepSizeSpeedFactor); } - auto contacts = eef->closeActors(object); + auto contacts = eef->closeActors(object, closingStepSize, stepSizeSpeedFactor); if (contacts.empty()) { VR_INFO << "No contacts for grasp " << grasp->getName() << " found" << std::endl; @@ -381,7 +376,7 @@ namespace GraspStudio VR_INFO << "No poses for grasp found" << std::endl; return res; } - res = evaluatePoses(eef, object, poses, qm, graspPS); + res = evaluatePoses(eef, object, poses, qm, graspPS, closingStepSize, stepSizeSpeedFactor); // restore setup eef->getRobot()->setGlobalPose(eefRobotPoseInit); diff --git a/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h b/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h index 6ae74d6867317c9b32ca3fcc15de0e52c9b07172..649fb95bccff9d0b02a71321eea5701e3c637d55 100644 --- a/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h +++ b/GraspPlanning/GraspQuality/GraspEvaluationPoseUncertainty.h @@ -156,15 +156,16 @@ namespace GraspStudio PoseEvalResult evaluatePose( VirtualRobot::EndEffectorPtr eef, VirtualRobot::ObstaclePtr object, const Eigen::Matrix4f& objectPose, - GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape = {}); + GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape = {}, float closingStepSize = 0.02f, float stepSizeSpeedFactor = 1); PoseEvalResults evaluatePoses( VirtualRobot::EndEffectorPtr eef, VirtualRobot::ObstaclePtr object, const std::vector<Eigen::Matrix4f>& objectPoses, - GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape = {}); + GraspQualityMeasurePtr qm, VirtualRobot::RobotConfigPtr preshape = {}, float closingStepSize = 0.02f, float stepSizeSpeedFactor = 1); PoseEvalResults evaluateGrasp( VirtualRobot::GraspPtr grasp, VirtualRobot::EndEffectorPtr eef, VirtualRobot::ObstaclePtr object, - GraspQualityMeasurePtr qm, int numPoses); + GraspQualityMeasurePtr qm, int numPoses, + float closingStepSize = 0.02f, float stepSizeSpeedFactor = 1); protected: diff --git a/VirtualRobot/EndEffector/EndEffector.cpp b/VirtualRobot/EndEffector/EndEffector.cpp index ae403354f8eb38a9ede5a93be13e47b7b38f815c..6eecb5dbc5d630a3bf548ae4872943a7bca8787d 100644 --- a/VirtualRobot/EndEffector/EndEffector.cpp +++ b/VirtualRobot/EndEffector/EndEffector.cpp @@ -105,10 +105,21 @@ namespace VirtualRobot { actors = this->actors; } + + + const std::vector<EndEffectorActorPtr>& EndEffector::getActors() + { + return actors; + } + void EndEffector::getStatics(std::vector<RobotNodePtr>& statics) { statics = this->statics; } + const std::vector<RobotNodePtr>& EndEffector::getStatics() + { + return statics; + } EndEffector::ContactInfoVector EndEffector::closeActors(SceneObjectSetPtr obstacles, float stepSize, float stepSizeSpeedFactor, std::uint64_t steps) { diff --git a/VirtualRobot/EndEffector/EndEffector.h b/VirtualRobot/EndEffector/EndEffector.h index b45a1d1e8f6125a5e83edf3e04269b2e85cb53c3..63d36f08daf279b7748aa465f498009e0bda23c6 100644 --- a/VirtualRobot/EndEffector/EndEffector.h +++ b/VirtualRobot/EndEffector/EndEffector.h @@ -100,7 +100,10 @@ namespace VirtualRobot std::string getRobotType(); void getActors(std::vector<EndEffectorActorPtr>& actors); + const std::vector<EndEffectorActorPtr>& getActors(); + void getStatics(std::vector<RobotNodePtr>& statics); + const std::vector<RobotNodePtr>& getStatics(); /*! Closes each actor until a joint limit is hit or a collision occurred. diff --git a/VirtualRobot/EndEffector/EndEffectorActor.cpp b/VirtualRobot/EndEffector/EndEffectorActor.cpp index 834a7a57226774ccdd73f3995e46e96654a43e9e..3637834f4cdc34ae1a199fe43942a425553e3332 100644 --- a/VirtualRobot/EndEffector/EndEffectorActor.cpp +++ b/VirtualRobot/EndEffector/EndEffectorActor.cpp @@ -92,31 +92,19 @@ namespace VirtualRobot bool EndEffectorActor::moveActorCheckCollision(EndEffectorPtr eef, EndEffector::ContactInfoVector& storeContacts, SceneObjectSetPtr obstacles /*= SceneObjectSetPtr()*/, float angle /*= 0.02*/) { VR_ASSERT(eef); - RobotPtr robot = eef->getRobot(); + const RobotPtr& robot = eef->getRobot(); VR_ASSERT(robot); //bool res = true; - std::vector<EndEffectorActorPtr> eefActors; - eef->getActors(eefActors); - std::vector<RobotNodePtr> eefStatic; - eef->getStatics(eefStatic); EndEffector::ContactInfoVector newContacts; - enum ActorStatus - { - eFinished, - eCollision, - eMoving - }; - std::map<RobotNodePtr, ActorStatus> actorStatus; - - + bool allActorsHaveStopped = true; for (auto& actor : actors) { float oldV = actor.robotNode->getJointValue(); float v = oldV + angle * actor.directionAndSpeed; - actorStatus[actor.robotNode] = eMoving; + bool isMoving = true; if (v <= actor.robotNode->getJointLimitHi() && v >= actor.robotNode->getJointLimitLo()) { @@ -135,7 +123,7 @@ namespace VirtualRobot // actors (don't store contacts) if (!collision) { - for (auto& eefActor : eefActors) + for (auto& eefActor : eef->getActors()) { // Don't check for collisions with the actor itself (don't store contacts) if ((eefActor->getName() != name) && isColliding(eefActor)) //isColliding(eef,*a,newContacts) ) @@ -148,7 +136,7 @@ namespace VirtualRobot // static (don't store contacts) if (!collision) { - for (auto& node : eefStatic) + for (auto& node : eef->getStatics()) { SceneObjectPtr so = boost::dynamic_pointer_cast<SceneObject>(node); @@ -161,22 +149,22 @@ namespace VirtualRobot } } - if (!collision) - { - //res = false; - } - else + if (collision) { // reset last position //n->robotNode->setJointValue(oldV); robot->setJointValue(actor.robotNode, oldV); - actorStatus[actor.robotNode] = eCollision; + isMoving = false; } } else { - actorStatus[actor.robotNode] = eFinished; + isMoving = false; + } + if (isMoving) + { + allActorsHaveStopped = false; } } @@ -217,18 +205,7 @@ namespace VirtualRobot } } - // check what we should return - bool res = true; - for (auto& actor : actors) - { - // if at least one actor is not in collision and not at its joint limits, we are still in the process of closing the fingers - if (actorStatus[actor.robotNode] == eMoving) - { - res = false; - } - } - - return res; + return allActorsHaveStopped; } diff --git a/VirtualRobot/Robot.cpp b/VirtualRobot/Robot.cpp index 09b435c34332ad5a2a48aaa5fb39eff5a0f124bc..3a909da3e70d9a03fe7587dc4b85ad398aad13d9 100644 --- a/VirtualRobot/Robot.cpp +++ b/VirtualRobot/Robot.cpp @@ -11,6 +11,7 @@ namespace VirtualRobot { + const RobotPtr Robot::NullPtr{nullptr}; Robot::Robot(const std::string& name, const std::string& type) : SceneObject(name) , scaling(1.0f) diff --git a/VirtualRobot/Robot.h b/VirtualRobot/Robot.h index 274ce8ecb30d9fe02199ab2e7078745d6b841543..37f212272b2cb16f46dadc5fcc68645ddbd29bf0 100644 --- a/VirtualRobot/Robot.h +++ b/VirtualRobot/Robot.h @@ -51,6 +51,8 @@ namespace VirtualRobot { friend class RobotIO; public: + static const RobotPtr NullPtr; + EIGEN_MAKE_ALIGNED_OPERATOR_NEW /*! @@ -205,7 +207,7 @@ namespace VirtualRobot virtual Eigen::Matrix4f getGlobalPoseForRobotNode(const RobotNodePtr& node, const Eigen::Matrix4f& globalPoseNode) const; //! Set the global pose of this robot so that the RobotNode node is at pose globalPoseNode. virtual void setGlobalPoseForRobotNode(const RobotNodePtr& node, const Eigen::Matrix4f& globalPoseNode); - + //! Get the global position of this robot so that the RobotNode node is at position globalPoseNode virtual Eigen::Matrix4f getGlobalPositionForRobotNode(const RobotNodePtr& node, const Eigen::Vector3f& globalPositionNode) const; //! Set the global position of this robot so that the RobotNode node is at position globalPoseNode @@ -213,7 +215,7 @@ namespace VirtualRobot //virtual Eigen::Matrix4f getGlobalPose() = 0; - + //! Return center of mass of this robot in local coordinate frame. All RobotNodes of this robot are considered according to their mass. Eigen::Vector3f getCoMLocal() override; @@ -223,7 +225,7 @@ namespace VirtualRobot //! Return accumulated mass of this robot. virtual float getMass(); - + /*! Extract a sub kinematic from this robot and create a new robot instance. \param startJoint The kinematic starts with this RobotNode