diff --git a/VirtualRobot/Grasping/ChainedGrasp.cpp b/VirtualRobot/Grasping/ChainedGrasp.cpp index afe386b60b02bf81adf9b1c1c4fccd2ae40fae24..e97f6625e244606977558ed318bbed9aa392f9ea 100644 --- a/VirtualRobot/Grasping/ChainedGrasp.cpp +++ b/VirtualRobot/Grasping/ChainedGrasp.cpp @@ -150,7 +150,7 @@ bool ChainedGrasp::update(VirtualJoint joint, RobotPtr robot) { return true; } -void ChainedGrasp::sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, RobotPtr robot, int grid) +void ChainedGrasp::sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, RobotPtr robot, unsigned int grid) { if (getObjectNode(robot)) { auto tcp = getTCP(robot); @@ -160,13 +160,14 @@ void ChainedGrasp::sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, Rob } } -void ChainedGrasp::sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, const std::string &rootName, RobotNodePtr robotNode, int grid) +void ChainedGrasp::sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, const std::string &rootName, RobotNodePtr robotNode, unsigned int grid) { float low = robotNode->getJointLimitLo(); float high = robotNode->getJointLimitHigh(); VR_INFO << robotNode->getName() << " " << low << " " << high << std::endl; auto children = robotNode->getChildren(); - for (auto value = low; value <= high; value += (high - low) / grid) + unsigned int joint_grid = abs(high - low) > 1e-6 ? grid : 1; + for (unsigned int i = 0; i < joint_grid; i++) { if (children.empty()) { @@ -178,7 +179,8 @@ void ChainedGrasp::sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, con } else { - robotNode->setJointValue(value); + double percentage = joint_grid == 1 ? 0.5 : ((double)i / (joint_grid - 1)); + robotNode->setJointValue(low + (high - low) * percentage); sampleGraspsUniform(grasps, rootName, std::dynamic_pointer_cast<RobotNode>(children[0]), grid); } } @@ -188,7 +190,7 @@ Eigen::Matrix4f ChainedGrasp::getLocalPose() const { return simox::math::pos_rpy_to_mat4f(getPositionXYZ(), getOrientationRPY()); } -std::vector<RobotPtr> ChainedGrasp::sampleHandsUniform(RobotPtr robot, int grid) { +std::vector<RobotPtr> ChainedGrasp::sampleHandsUniform(RobotPtr robot, unsigned int grid) { std::vector<RobotPtr> hands; auto virtualObject = getObjectNode(robot); auto endEffector = getEndEffector(robot); @@ -198,7 +200,7 @@ std::vector<RobotPtr> ChainedGrasp::sampleHandsUniform(RobotPtr robot, int grid) auto exampleHand = endEffector->createEefRobot(name, name); detachChain(exampleHand); int i = 0; - for (auto grasp : grasps) { + for (const auto& grasp : grasps) { auto name = "grasp" + std::to_string(i++); auto hand = exampleHand->clone(); auto globalPose = virtualObject->toGlobalCoordinateSystem(grasp); diff --git a/VirtualRobot/Grasping/ChainedGrasp.h b/VirtualRobot/Grasping/ChainedGrasp.h index 4667b0e72f6c4fbc73089675f8d5d54c80dd4c29..045be595ca0bcb97f0fad1b1cb19e13859861a5b 100644 --- a/VirtualRobot/Grasping/ChainedGrasp.h +++ b/VirtualRobot/Grasping/ChainedGrasp.h @@ -92,8 +92,8 @@ public: void detachChain(RobotPtr robot); - void sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, RobotPtr robot, int grid); - std::vector<RobotPtr> sampleHandsUniform(RobotPtr robot, int grid); + void sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, RobotPtr robot, unsigned int grid); + std::vector<RobotPtr> sampleHandsUniform(RobotPtr robot, unsigned int grid); VirtualJoint x; VirtualJoint y; @@ -141,7 +141,7 @@ private: RobotNodePtr attachChain(RobotNodePtr robotNode, GraspableSensorizedObjectPtr object, bool addObjectVisualization = false); RobotNodePtr attach(VirtualJoint joint, RobotNodePtr robotNode); bool update(VirtualJoint joint, RobotPtr robot); - void sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, const std::string &rootName, RobotNodePtr robotNode, int grid); + void sampleGraspsUniform(std::vector<Eigen::Matrix4f> &grasps, const std::string &rootName, RobotNodePtr robotNode, unsigned int grid); Eigen::Matrix4f getLocalPose() const; };