diff --git a/GraspPlanning/CMakeLists.txt b/GraspPlanning/CMakeLists.txt index a8b50bee21b60835552b10e7a83d3d95a7fb8bf4..b54c4919e967cafabbec64c35b65e2aaebac2bc9 100644 --- a/GraspPlanning/CMakeLists.txt +++ b/GraspPlanning/CMakeLists.txt @@ -47,35 +47,43 @@ endif() SET(SOURCES -ConvexHullGenerator.cpp -ContactConeGenerator.cpp -ApproachMovementGenerator.cpp -ApproachMovementSurfaceNormal.cpp -MeshConverter.cpp -GraspPlanner/GraspPlanner.cpp -GraspPlanner/GenericGraspPlanner.cpp -GraspQuality/GraspEvaluationPoseUncertainty.cpp -GraspQuality/GraspQualityMeasure.cpp -GraspQuality/GraspQualityMeasureWrenchSpace.cpp -GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.cpp -Visualization/ConvexHullVisualization.cpp + ApproachMovementGenerator.cpp + ApproachMovementSurfaceNormal.cpp + ContactConeGenerator.cpp + ConvexHullGenerator.cpp + MeshConverter.cpp + + GraspPlanner/GenericGraspPlanner.cpp + GraspPlanner/GraspPlanner.cpp + GraspPlanner/GraspPlannerEvaluation.cpp + + GraspQuality/GraspEvaluationPoseUncertainty.cpp + GraspQuality/GraspQualityMeasure.cpp + GraspQuality/GraspQualityMeasureWrenchSpace.cpp + GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.cpp + + Visualization/ConvexHullVisualization.cpp ) SET(INCLUDES -GraspStudio.h -ConvexHullGenerator.h -ContactConeGenerator.h -ApproachMovementGenerator.h -ApproachMovementSurfaceNormal.h -MeshConverter.h -GraspPlanner/GraspPlanner.h -GraspPlanner/GenericGraspPlanner.h -GraspPlanner/GraspPlannerEvaluation.h -GraspQuality/GraspEvaluationPoseUncertainty.h -GraspQuality/GraspQualityMeasure.h -GraspQuality/GraspQualityMeasureWrenchSpace.h -GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.h -Visualization/ConvexHullVisualization.h + GraspStudio.h + + ApproachMovementGenerator.h + ApproachMovementSurfaceNormal.h + ContactConeGenerator.h + ConvexHullGenerator.h + MeshConverter.h + + GraspPlanner/GenericGraspPlanner.h + GraspPlanner/GraspPlanner.h + GraspPlanner/GraspPlannerEvaluation.h + + GraspQuality/GraspEvaluationPoseUncertainty.h + GraspQuality/GraspQualityMeasure.h + GraspQuality/GraspQualityMeasureWrenchSpace.h + GraspQuality/GraspQualityMeasureWrenchSpaceNotNormalized.h + + Visualization/ConvexHullVisualization.h ) diff --git a/GraspPlanning/GraspPlanner/GraspPlannerEvaluation.cpp b/GraspPlanning/GraspPlanner/GraspPlannerEvaluation.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3a24f3f6e4e2ea342d0296a6e9cdb7141a74d8c7 --- /dev/null +++ b/GraspPlanning/GraspPlanner/GraspPlannerEvaluation.cpp @@ -0,0 +1,183 @@ +/** +* This file is part of Simox. +* +* Simox is free software; you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* Simox is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* @package GraspStudio +* @author Nikolaus Vahrenkamp +* @copyright 2017 Nikolaus Vahrenkamp +* GNU Lesser General Public License +* +*/ +#include "GraspPlannerEvaluation.h" + +namespace GraspStudio +{ + +GraspPlannerEvaluation::GraspPlannerEvaluation() +{ + nrGraspsGenerated = 0; + nrGraspsValid = 0; + nrGraspsInvalidCollision = 0; + nrGraspsInvalidFC = 0; + nrGraspsInvalidContacts = 0; + nrGraspsValidPrecision = 0; + nrGraspsValidPower = 0; + fcCheck = false; + minQuality = 0.0f; +} + +void GraspPlannerEvaluation::print() +{ + std::cout << (*this) << std::endl; +} + +std::string GraspPlannerEvaluation::GetCSVHeader() +{ + std::stringstream fs; + fs << "minQuality" << "," + << "nrGraspsGenerated" << "," + << "nrGraspsValid" << "," + << "nrGraspsInValid" << "," + << "nrGraspsValidPrecision" << "," + << "nrGraspsValidPower" << "," + << "nrGraspsInvalidCollision" << "," + << "nrGraspsInvalidFC" << "," + << "nrGraspsInvalidContacts" << "," + << "AverageDurationMS" << "," + << "percPowerGrasps" << "," + << "percPrecGraps" << "," + << "avgScore"; + return fs.str(); +} + +std::string GraspPlannerEvaluation::toCSVString() const +{ + float timeAcc = 0; + float avgTime = 0; + float scoreAcc = 0; + int nrGrasps = static_cast<int>(timeGraspMS.size()); + int nrValid = 0; + int nrPower = 0; + int nrPrecision = 0; + for (size_t i = 0; i < timeGraspMS.size(); i++) + { + timeAcc+=timeGraspMS.at(i); + if (graspValid.at(i)) + { + nrValid++; + scoreAcc+=graspScore.at(i); + } + if (graspTypePower.at(i)) + nrPower++; + else + nrPrecision++; + } + float percPower = 0; + float percPrec = 0; + if (nrGrasps > 0) + { + percPower = static_cast<float>(nrPower) / static_cast<float>(nrGrasps); + percPrec = static_cast<float>(nrPrecision) / static_cast<float>(nrGrasps); + avgTime = timeAcc / static_cast<float>(nrGrasps); + } + float avgScore = 0; + if (nrValid > 0) + { + avgScore = scoreAcc / nrValid; + } + + + std::stringstream fs; + fs << minQuality << "," + << nrGraspsGenerated << "," + << nrGraspsValid << "," + << (nrGraspsInvalidCollision+nrGraspsInvalidFC+nrGraspsInvalidContacts) << "," + << nrGraspsValidPrecision << "," + << nrGraspsValidPower << "," + << nrGraspsInvalidCollision << "," + << nrGraspsInvalidFC << "," + << nrGraspsInvalidContacts << "," + << avgTime << "," + << percPower << "," + << percPrec << "," + << avgScore; + return fs.str(); +} + +std::ostream& operator<<(std::ostream& os, const GraspPlannerEvaluation& rhs) +{ + os << "---------------- GRASP PLANNER EVALUATION -----------" << std::endl; + if (rhs.fcCheck) + os << "ForceClosure check: true" << std::endl; + else + os << "ForceClosure check: false" << std::endl; + os << "Min Quality: " << rhs.minQuality << std::endl; + + os << "nrGraspsGenerated: " << rhs.nrGraspsGenerated << std::endl; + os << "nrGraspsValid: " << rhs.nrGraspsValid << std::endl; + os << "nrGraspsInValid: " << (rhs.nrGraspsInvalidCollision + rhs.nrGraspsInvalidFC + + rhs.nrGraspsInvalidContacts) << std::endl; + os << "nrGraspsValidPrecision: " << rhs.nrGraspsValidPrecision << std::endl; + os << "nrGraspsValidPower: " << rhs.nrGraspsValidPower << std::endl; + os << "nrGraspsInvalidCollision: " << rhs.nrGraspsInvalidCollision << std::endl; + os << "nrGraspsInvalidFC: " << rhs.nrGraspsInvalidFC << std::endl; + os << "nrGraspsInvalidContacts: " << rhs.nrGraspsInvalidContacts << std::endl; + VR_ASSERT (rhs.timeGraspMS.size() == rhs.graspScore.size()); + VR_ASSERT (rhs.timeGraspMS.size() == rhs.graspValid.size()); + VR_ASSERT (rhs.timeGraspMS.size() == rhs.graspTypePower.size()); + float timeAcc = 0; + float scoreAcc = 0; + int nrGrasps = static_cast<int>(rhs.timeGraspMS.size()); + int nrValid = 0; + int nrPower = 0; + int nrPrecision = 0; + for (size_t i = 0; i < rhs.timeGraspMS.size(); i++) + { + timeAcc += rhs.timeGraspMS.at(i); + if (rhs.graspValid.at(i)) + { + nrValid++; + scoreAcc += rhs.graspScore.at(i); + } + if (rhs.graspTypePower.at(i)) + nrPower++; + else + nrPrecision++; + } + os << "Time complete: " << timeAcc << " ms" << std::endl; + if (nrGrasps > 0) + { + os << "Avg time per grasp (valid&invalid): " << + static_cast<float>(timeAcc) / static_cast<float>(nrGrasps) << " ms" << std::endl; + float percPower = static_cast<float>(nrPower) / static_cast<float>(nrGrasps); + float percPrec = static_cast<float>(nrPrecision) / static_cast<float>(nrGrasps); + os << "Precision grasps: " << nrPrecision << " -> " << percPrec*100 << "%" << std::endl; + os << "Power grasps: " << nrPower << " -> " << percPower*100 << "%" << std::endl; + } + if (nrValid > 0) + { + os << "Avg score (valid):" << scoreAcc / nrValid << std::endl; + } + if (rhs.nrGraspsGenerated > 0) + os << "Percentage of valid grasps: " + << static_cast<float>(rhs.nrGraspsValid) / static_cast<float>(rhs.nrGraspsGenerated) * 100.0f + << "%" << std::endl; + + return os; +} + + +} + diff --git a/GraspPlanning/GraspPlanner/GraspPlannerEvaluation.h b/GraspPlanning/GraspPlanner/GraspPlannerEvaluation.h index b0b7cea85cc03b69559f996da54f5631c7c136b5..c57642688440e1adcab139fe63a6dedf16114b16 100644 --- a/GraspPlanning/GraspPlanner/GraspPlannerEvaluation.h +++ b/GraspPlanning/GraspPlanner/GraspPlannerEvaluation.h @@ -23,173 +23,45 @@ #pragma once #include "../GraspStudio.h" + #include <vector> -namespace GraspStudio -{ -struct GraspPlannerEvaluation +namespace GraspStudio { - GraspPlannerEvaluation() - { - nrGraspsGenerated = 0; - nrGraspsValid = 0; - nrGraspsInvalidCollision = 0; - nrGraspsInvalidFC = 0; - nrGraspsInvalidContacts = 0; - nrGraspsValidPrecision = 0; - nrGraspsValidPower = 0; - fcCheck = false; - minQuality = 0.0f; - } - void print() + struct GraspPlannerEvaluation { - std::cout << "---------------- GRASP PLANNER EVALUATION -----------" << std::endl; - if (fcCheck) - std::cout << "ForceClosure check: true" << std::endl; - else - std::cout << "ForceClosure check: false" << std::endl; - std::cout << "Min Quality: " << minQuality << std::endl; - - std::cout << "nrGraspsGenerated:" << nrGraspsGenerated << std::endl; - std::cout << "nrGraspsValid:" << nrGraspsValid << std::endl; - std::cout << "nrGraspsInValid:" << nrGraspsInvalidCollision+nrGraspsInvalidFC+nrGraspsInvalidContacts << std::endl; - std::cout << "nrGraspsValidPrecision:" << nrGraspsValidPrecision << std::endl; - std::cout << "nrGraspsValidPower:" << nrGraspsValidPower << std::endl; - std::cout << "nrGraspsInvalidCollision:" << nrGraspsInvalidCollision << std::endl; - std::cout << "nrGraspsInvalidFC:" << nrGraspsInvalidFC << std::endl; - std::cout << "nrGraspsInvalidContacts:" << nrGraspsInvalidContacts << std::endl; - VR_ASSERT (timeGraspMS.size() == graspScore.size()); - VR_ASSERT (timeGraspMS.size() == graspValid.size()); - VR_ASSERT (timeGraspMS.size() == graspTypePower.size()); - float timeAcc = 0; - float scoreAcc = 0; - int nrGrasps = (int)timeGraspMS.size(); - int nrValid = 0; - int nrPower = 0; - int nrPrecision = 0; - for (size_t i=0;i<timeGraspMS.size();i++) - { - timeAcc+=timeGraspMS.at(i); - if (graspValid.at(i)) - { - nrValid++; - scoreAcc+=graspScore.at(i); - } - if (graspTypePower.at(i)) - nrPower++; - else - nrPrecision++; - } - std::cout << "Time complete: " << timeAcc << " ms" << std::endl; - if (nrGrasps>0) - { - std::cout << "Avg time per grasp (valid&invalid):" << (float)timeAcc / (float)nrGrasps << " ms" << std::endl; - float percPower = (float)nrPower / (float)nrGrasps; - float percPrec = (float)nrPrecision / (float)nrGrasps; - std::cout << "Precision grasps:" << nrPrecision << " -> " << percPrec*100 << "%" << std::endl; - std::cout << "Power grasps:" << nrPower << " -> " << percPower*100 << "%" << std::endl; - } - if (nrValid>0) - { - std::cout << "Avg score (valid):" << scoreAcc / nrValid << std::endl; - } - if (nrGraspsGenerated>0) - std::cout << "Percentage of valid grasps:" << (float)nrGraspsValid / (float)nrGraspsGenerated * 100.0f << "%" << std::endl; - } - - static std::string GetCSVHeader() - { - std::stringstream fs; - fs << "minQuality" << "," - << "nrGraspsGenerated" << "," - << "nrGraspsValid" << "," - << "nrGraspsInValid" << "," - << "nrGraspsValidPrecision" << "," - << "nrGraspsValidPower" << "," - << "nrGraspsInvalidCollision" << "," - << "nrGraspsInvalidFC" << "," - << "nrGraspsInvalidContacts" << "," - << "AverageDurationMS" << "," - << "percPowerGrasps" << "," - << "percPrecGraps" << "," - << "avgScore"; - return fs.str(); - } - - std::string toCSVString() const - { - float timeAcc = 0; - float avgTime = 0; - float scoreAcc = 0; - int nrGrasps = (int)timeGraspMS.size(); - int nrValid = 0; - int nrPower = 0; - int nrPrecision = 0; - for (size_t i=0;i<timeGraspMS.size();i++) - { - timeAcc+=timeGraspMS.at(i); - if (graspValid.at(i)) - { - nrValid++; - scoreAcc+=graspScore.at(i); - } - if (graspTypePower.at(i)) - nrPower++; - else - nrPrecision++; - } - float percPower = 0; - float percPrec = 0; - if (nrGrasps>0) - { - percPower = (float)nrPower / (float)nrGrasps; - percPrec = (float)nrPrecision / (float)nrGrasps; - avgTime = timeAcc / (float)nrGrasps; - } - float avgScore = 0; - if (nrValid>0) - { - avgScore = scoreAcc / nrValid; - } - - - std::stringstream fs; - fs << minQuality << "," - << nrGraspsGenerated << "," - << nrGraspsValid << "," - << (nrGraspsInvalidCollision+nrGraspsInvalidFC+nrGraspsInvalidContacts) << "," - << nrGraspsValidPrecision << "," - << nrGraspsValidPower << "," - << nrGraspsInvalidCollision << "," - << nrGraspsInvalidFC << "," - << nrGraspsInvalidContacts << "," - << avgTime << "," - << percPower << "," - << percPrec << "," - << avgScore; - return fs.str(); - } - - - int nrGraspsGenerated; - int nrGraspsValid; - int nrGraspsInvalidCollision; - int nrGraspsInvalidFC; // or quality - int nrGraspsInvalidContacts; - - int nrGraspsValidPrecision; - int nrGraspsValidPower; - - std::vector<float> timeGraspMS; // time per grasp generation - std::vector<float> graspScore; //grasp quality - std::vector<bool> graspValid; //grasp valid - std::vector<bool> graspTypePower; //grasp type - - bool fcCheck; - float minQuality; -}; + GraspPlannerEvaluation(); + + void print(); + + static std::string GetCSVHeader(); + + std::string toCSVString() const; + + + int nrGraspsGenerated; + int nrGraspsValid; + int nrGraspsInvalidCollision; + int nrGraspsInvalidFC; // or quality + int nrGraspsInvalidContacts; + + int nrGraspsValidPrecision; + int nrGraspsValidPower; + + std::vector<float> timeGraspMS; // time per grasp generation + std::vector<float> graspScore; //grasp quality + std::vector<bool> graspValid; //grasp valid + std::vector<bool> graspTypePower; //grasp type + + bool fcCheck; + float minQuality; + + }; + + + std::ostream& operator<< (std::ostream& os, const GraspPlannerEvaluation& rhs); }