From 3cbcd0cb8dc80a9f4c2cc2e4e7b8c647507966be Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@student.kit.edu>
Date: Thu, 21 Feb 2019 16:02:54 +0100
Subject: [PATCH] Fixed style, reduced code duplication, use std::chrono
 instead of ctime

---
 .../GraspPlanner/GenericGraspPlanner.cpp      | 111 ++++++++++--------
 .../GraspPlanner/GenericGraspPlanner.h        |  29 +++--
 2 files changed, 81 insertions(+), 59 deletions(-)

diff --git a/GraspPlanning/GraspPlanner/GenericGraspPlanner.cpp b/GraspPlanning/GraspPlanner/GenericGraspPlanner.cpp
index b4753b431..2ef3d9de9 100644
--- a/GraspPlanning/GraspPlanner/GenericGraspPlanner.cpp
+++ b/GraspPlanning/GraspPlanner/GenericGraspPlanner.cpp
@@ -1,17 +1,19 @@
 #include "GenericGraspPlanner.h"
+
 #include <VirtualRobot/Grasping/Grasp.h>
 #include <VirtualRobot/Robot.h>
 #include <VirtualRobot/RobotConfig.h>
 #include <VirtualRobot/Nodes/RobotNode.h>
-#include <iostream>
-#include <sstream>
+#include <VirtualRobot/math/Helpers.h>
+
 #include "../GraspQuality/GraspQualityMeasureWrenchSpace.h"
 #include "../GraspQuality/GraspQualityMeasure.h"
 #include "../ApproachMovementGenerator.h"
 
-#include <chrono>
+
 using namespace std;
 
+
 namespace GraspStudio
 {
 
@@ -38,15 +40,16 @@ namespace GraspStudio
 
     int GenericGraspPlanner::plan(int nrGrasps, int timeOutMS, VirtualRobot::SceneObjectSetPtr obstacles)
     {
-        startTime = clock();
-        this->timeOutMS = timeOutMS;
+        startTime = std::chrono::system_clock::now();
+        this->timeOutDuration = std::chrono::milliseconds(timeOutMS);
 
         int nLoop = 0;
         int nGraspsCreated = 0;
 
         if (verbose)
         {
-            GRASPSTUDIO_INFO << ": Searching " << nrGrasps << " grasps for EEF:" << approach->getEEF()->getName() << " and object:" << graspQuality->getObject()->getName() << ".\n";
+            GRASPSTUDIO_INFO << ": Searching " << nrGrasps << " grasps for EEF '" << approach->getEEF()->getName() 
+                             << "' and object '" << graspQuality->getObject()->getName() << "'.\n";
             GRASPSTUDIO_INFO << ": Approach movements are generated with " << approach->getName() << endl;
             GRASPSTUDIO_INFO << ": Grasps are evaluated with " << graspQuality->getName() << endl;
         }
@@ -119,19 +122,21 @@ namespace GraspStudio
     VirtualRobot::GraspPtr GenericGraspPlanner::planGrasp(VirtualRobot::SceneObjectSetPtr obstacles)
     {
         auto start_time = chrono::high_resolution_clock::now();
-        std::string sGraspPlanner("Simox - GraspStudio - ");
-        sGraspPlanner += graspQuality->getName();
-        std::string sGraspNameBase = "Grasp ";
+        std::string graspPlannerName = "Simox - GraspStudio - " + graspQuality->getName();
+        std::string graspNameBase = "Grasp ";
 
         VirtualRobot::RobotPtr robot = approach->getEEFOriginal()->getRobot();
         VirtualRobot::RobotNodePtr tcp = eef->getTcp();
 
         VR_ASSERT(robot);
         VR_ASSERT(tcp);
-
-
+        
         // GENERATE APPROACH POSE
+        // Eigen::Matrix4f pose = approach->createNewApproachPose();
+        // bRes = approach->setEEFPose(pose);
+        
         bool bRes = approach->setEEFToRandomApproachPose();
+        
         if (bRes && obstacles)
         {
             // CHECK VALID APPROACH POSE
@@ -147,6 +152,8 @@ namespace GraspStudio
             }
         }
 
+        contacts.clear();
+        
         // CHECK CONTACTS
         if (bRes)
         {
@@ -155,10 +162,10 @@ namespace GraspStudio
             eef->addStaticPartContacts(object, contacts, approach->getApproachDirGlobal());
 
             // low number of contacts: check if it helps to move away (small object)
-            if (retreatOnLowContacts && contacts.size()<2)
+            if (retreatOnLowContacts && contacts.size() < 2)
             {
-                VR_INFO << "Low number of contacts, retreating hand (small object)" << endl;
-                if (moveEEFAway(approach->getApproachDirGlobal(),5.0f,10))
+                VR_INFO << "Low number of contacts, retreating hand (might be useful for a small object)" << endl;
+                if (moveEEFAway(approach->getApproachDirGlobal(), 5.0f, 10))
                 {
                     contacts = eef->closeActors(object);
                     eef->addStaticPartContacts(object, contacts, approach->getApproachDirGlobal());
@@ -180,21 +187,43 @@ namespace GraspStudio
             }
         }
 
+        // construct grasp
+        std::stringstream graspName;
+        graspName << graspNameBase << (graspSet->getSize() + 1);
+        
+        Eigen::Matrix4f poseObject = object->getGlobalPose();
+        Eigen::Matrix4f poseTcp = tcp->toLocalCoordinateSystem(poseObject);
+        
+        VirtualRobot::GraspPtr grasp(new VirtualRobot::Grasp(
+                        graspName.str(), robot->getType(), eef->getName(), poseTcp,
+                        graspPlannerName, 0 /*score*/ ));
+        
+        // set joint config
+        grasp->setConfiguration(eef->getConfiguration()->getRobotNodeJointValueMap());
+        
+        bool returnNullWhenInvalid = true;
+        
         // eval data
         eval.graspTypePower.push_back(true);
         eval.nrGraspsGenerated++;
 
+        auto getTimeMS = [&start_time]()
+        {
+            auto end_time = chrono::high_resolution_clock::now();
+            float ms = chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count();
+            return ms;
+        };
+        
         if (!bRes)
         {
             // result not valid due to collision
-            auto end_time = chrono::high_resolution_clock::now();
-            float ms = float(chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count());
+            float ms = getTimeMS();
             eval.graspScore.push_back(0.0f);
             eval.graspValid.push_back(false);
             eval.nrGraspsInvalidCollision++;
             eval.timeGraspMS.push_back(ms);
 
-            return VirtualRobot::GraspPtr();
+            return returnNullWhenInvalid ? nullptr : grasp;
         }
 
         if (contacts.size() < 2)
@@ -204,40 +233,41 @@ namespace GraspStudio
                 GRASPSTUDIO_INFO << ": ignoring grasp hypothesis, low number of contacts" << endl;
             }
             // result not valid due to low number of contacts
-            auto end_time = chrono::high_resolution_clock::now();
-            float ms = float(chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count());
+            float ms = getTimeMS();
             eval.graspScore.push_back(0.0f);
             eval.graspValid.push_back(false);
             eval.nrGraspsInvalidContacts++;
             eval.timeGraspMS.push_back(ms);
-            return VirtualRobot::GraspPtr();
+            
+            return returnNullWhenInvalid ? nullptr : grasp;
         }
 
         graspQuality->setContactPoints(contacts);
         float score = graspQuality->getGraspQuality();
-
+        grasp->setQuality(score);
+        
         if (forceClosure && !graspQuality->isGraspForceClosure())
         {
             // not force closure
-            auto end_time = chrono::high_resolution_clock::now();
-            float ms = float(chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count());
+            float ms = getTimeMS();
             eval.graspScore.push_back(0.0f);
             eval.graspValid.push_back(false);
             eval.nrGraspsInvalidFC++;
             eval.timeGraspMS.push_back(ms);
-            return VirtualRobot::GraspPtr();
+            
+            return returnNullWhenInvalid ? nullptr : grasp;
         }
 
         if (score < minQuality)
         {
             // min quality not reached
-            auto end_time = chrono::high_resolution_clock::now();
-            float ms = float(chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count());
+            float ms = getTimeMS();
             eval.graspScore.push_back(score);
             eval.graspValid.push_back(false);
             eval.nrGraspsInvalidFC++;
             eval.timeGraspMS.push_back(ms);
-            return VirtualRobot::GraspPtr();
+            
+            return returnNullWhenInvalid ? nullptr : grasp;
         }
 
         // found valid grasp
@@ -246,8 +276,8 @@ namespace GraspStudio
             GRASPSTUDIO_INFO << ": Found grasp with " << contacts.size() << " contacts, score: " << score << endl;
         }
 
-        auto end_time = chrono::high_resolution_clock::now();
-        float ms = float(chrono::duration_cast<chrono::milliseconds>(end_time - start_time).count());
+        float ms = getTimeMS();
+        
         eval.graspScore.push_back(score);
         eval.graspValid.push_back(true);
         eval.nrGraspsValid++;
@@ -255,17 +285,7 @@ namespace GraspStudio
         eval.nrGraspsValidPower++;
         eval.timeGraspMS.push_back(ms);
 
-        std::stringstream ss;
-        ss << sGraspNameBase << (graspSet->getSize() + 1);
-        std::string sGraspName = ss.str();
-        Eigen::Matrix4f objP = object->getGlobalPose();
-        Eigen::Matrix4f pLocal = tcp->toLocalCoordinateSystem(objP);
-        VirtualRobot::GraspPtr g(new VirtualRobot::Grasp(sGraspName, robot->getType(), eef->getName(), pLocal, sGraspPlanner, score));
-        // set joint config
-        VirtualRobot::RobotConfigPtr config = eef->getConfiguration();
-        std::map< std::string, float > configValues = config->getRobotNodeJointValueMap();
-        g->setConfiguration(configValues);
-        return g;
+        return grasp;
     }
 
     VirtualRobot::EndEffector::ContactInfoVector GenericGraspPlanner::getContacts() const
@@ -284,17 +304,10 @@ namespace GraspStudio
         retreatOnLowContacts = enable;
     }
 
-
     bool GenericGraspPlanner::timeout()
     {
-        if (timeOutMS <= 0)
-        {
-            return false;
-        }
-
-        clock_t endTime = clock();
-        int timeMS = (int)(((float)(endTime - startTime) / (float)CLOCKS_PER_SEC) * 1000.0);
-        return (timeMS > timeOutMS);
+        return timeOutDuration.count() <= 0
+               || std::chrono::system_clock::now() > (startTime + timeOutDuration);
     }
 
 } // namespace
diff --git a/GraspPlanning/GraspPlanner/GenericGraspPlanner.h b/GraspPlanning/GraspPlanner/GenericGraspPlanner.h
index 6d8e8408b..7e426ab20 100644
--- a/GraspPlanning/GraspPlanner/GenericGraspPlanner.h
+++ b/GraspPlanning/GraspPlanner/GenericGraspPlanner.h
@@ -22,10 +22,13 @@
 */
 #pragma once
 
+#include <chrono>
+
 #include "../GraspStudio.h"
-#include "GraspPlanner.h"
 #include "../ApproachMovementGenerator.h"
 #include "../GraspQuality/GraspQualityMeasure.h"
+#include "GraspPlanner.h"
+
 
 namespace GraspStudio
 {
@@ -48,10 +51,13 @@ namespace GraspStudio
             \param minQuality The quality that must be achieved at minimum by the GraspQualityMesurement module
             \param forceClosure When true, only force closure grasps are generated.
         */
-        GenericGraspPlanner(VirtualRobot::GraspSetPtr graspSet, GraspStudio::GraspQualityMeasurePtr graspQuality, GraspStudio::ApproachMovementGeneratorPtr approach, float minQuality = 0.0f, bool forceClosure = true);
+        GenericGraspPlanner(VirtualRobot::GraspSetPtr graspSet,
+                            GraspStudio::GraspQualityMeasurePtr graspQuality,
+                            GraspStudio::ApproachMovementGeneratorPtr approach,
+                            float minQuality = 0.0f, bool forceClosure = true);
 
         // destructor
-        ~GenericGraspPlanner() override;
+        virtual ~GenericGraspPlanner() override;
 
         /*!
             Creates new grasps.
@@ -59,17 +65,19 @@ namespace GraspStudio
             \param timeOutMS The time out in milliseconds. Planning is stopped when this time is exceeded. Disabled when zero.
             \return Number of generated grasps.
         */
-        int plan(int nrGrasps, int timeOutMS = 0, VirtualRobot::SceneObjectSetPtr obstacles = VirtualRobot::SceneObjectSetPtr()) override;
+        int plan(int nrGrasps, int timeOutDuration = 0, VirtualRobot::SceneObjectSetPtr obstacles = {}) override;
 
-        VirtualRobot::GraspPtr planGrasp(VirtualRobot::SceneObjectSetPtr obstacles = VirtualRobot::SceneObjectSetPtr());
+        VirtualRobot::GraspPtr planGrasp(VirtualRobot::SceneObjectSetPtr obstacles = {});
 
         VirtualRobot::EndEffector::ContactInfoVector getContacts() const;
 
         void setParameters(float minQuality, bool forceClosure);
 
-        //! if enabled (default), the planner retreates the hand if the number of contacts is <2.
-        //! During retreat, the contacts are checked if a better situation can be achieved.
-        //! This procedure helps in case the object is small.
+        /** 
+         * if enabled (default), the planner retreates the hand if the number of contacts is <2.
+         * During retreat, the contacts are checked if a better situation can be achieved.
+         * This procedure helps in case the object is small.
+         */
         void setRetreatOnLowContacts(bool enable);
 
     protected:
@@ -82,8 +90,9 @@ namespace GraspStudio
         VirtualRobot::SceneObjectPtr object;
         VirtualRobot::EndEffectorPtr eef;
 
-        clock_t startTime;
-        int timeOutMS;
+        std::chrono::system_clock::time_point startTime;
+        std::chrono::milliseconds timeOutDuration;
+        
         VirtualRobot::EndEffector::ContactInfoVector contacts;
         GraspStudio::GraspQualityMeasurePtr graspQuality;
         GraspStudio::ApproachMovementGeneratorPtr approach;
-- 
GitLab