LCOV - code coverage report
Current view: top level - src/GraspingActions - ActionPinchLoose.cpp (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 103 127 81.1 %
Date: 2021-10-05 16:55:17 Functions: 11 14 78.6 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2020 IIT-HHCM
       3             :  * Author: Davide Torielli
       4             :  * email:  davide.torielli@iit.it
       5             :  *
       6             :  * Licensed under the Apache License, Version 2.0 (the "License");
       7             :  * you may not use this file except in compliance with the License.
       8             :  * You may obtain a copy of the License at
       9             :  *
      10             :  *     http://www.apache.org/licenses/LICENSE-2.0
      11             :  *
      12             :  * Unless required by applicable law or agreed to in writing, software
      13             :  * distributed under the License is distributed on an "AS IS" BASIS,
      14             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      15             :  * See the License for the specific language governing permissions and
      16             :  * limitations under the License.
      17             :  */
      18             : 
      19             : #include <ros_end_effector/GraspingActions/ActionPinchLoose.h>
      20             : 
      21          19 : ROSEE::ActionPinchLoose::ActionPinchLoose() : 
      22          19 :     ActionPinchGeneric ("pinchLoose", 2, 3, ActionPrimitive::Type::PinchLoose) { }
      23             : 
      24           0 : ROSEE::ActionPinchLoose::ActionPinchLoose (unsigned int maxStoredActionStates) : 
      25           0 :     ActionPinchGeneric ("pinchLoose", 2, maxStoredActionStates, ActionPrimitive::Type::PinchLoose) { }
      26             : 
      27         272 : ROSEE::ActionPinchLoose::ActionPinchLoose (std::string tip1, std::string tip2) : 
      28         272 :     ActionPinchGeneric ("pinchLoose", 2, 3, ActionPrimitive::Type::PinchLoose) {
      29         272 :         fingersInvolved.insert (tip1);
      30         272 :         fingersInvolved.insert (tip2);
      31         272 : }
      32             :     
      33           0 : ROSEE::ActionPinchLoose::ActionPinchLoose (std::pair <std::string, std::string> tipNames, 
      34           0 :     JointPos jp, double distance) :
      35           0 :     ActionPinchGeneric ("pinchLoose", 2, 3, ActionPrimitive::Type::PinchLoose )  {
      36             : 
      37           0 :     fingersInvolved.insert (tipNames.first);
      38           0 :     fingersInvolved.insert (tipNames.second);
      39             :     
      40             :     //different from insertState, here we are sure the set is empty (we are in costructor)
      41           0 :     actionStates.insert (std::make_pair (jp, distance) );
      42           0 : }
      43             : 
      44           7 : std::vector < ROSEE::ActionPinchLoose::StateWithDistance > ROSEE::ActionPinchLoose::getActionStates() const {
      45             :     
      46           7 :     std::vector < ROSEE::ActionPinchLoose::StateWithDistance > retVect;
      47           7 :     retVect.reserve ( actionStates.size() );
      48             :     
      49          28 :     for (auto it : actionStates ) {
      50          21 :         retVect.push_back(it);
      51             :     }
      52             :     
      53           7 :     return retVect;
      54             : }
      55             : 
      56           5 : ROSEE::JointPos ROSEE::ActionPinchLoose::getJointPos() const {
      57           5 :     return (actionStates.begin()->first);
      58             : }
      59             : 
      60           0 : ROSEE::JointPos ROSEE::ActionPinchLoose::getJointPos(unsigned int index) const {
      61           0 :     auto it = actionStates.begin();
      62           0 :     unsigned int i = 1;
      63           0 :     while (i < index ) {
      64           0 :         ++ it;
      65           0 :         ++ i;
      66             :     }
      67           0 :     return (it->first);
      68             : }
      69             : 
      70          14 : std::vector < ROSEE::JointPos > ROSEE::ActionPinchLoose::getAllJointPos() const {
      71             :     
      72          14 :     std::vector < JointPos > retVect;
      73          14 :     retVect.reserve(actionStates.size());
      74             :     
      75          56 :     for (auto it : actionStates ) {
      76          42 :         retVect.push_back(it.first);
      77             :     }
      78             :     
      79          14 :     return retVect;
      80             : }
      81             : 
      82       85000 : bool ROSEE::ActionPinchLoose::insertActionState (ROSEE::JointPos jp, double dist) {
      83             : 
      84       85000 :     auto pairRet = actionStates.insert ( std::make_pair (jp, dist) ) ;
      85             :     
      86       85000 :     if (actionStates.size() > maxStoredActionStates) { 
      87             :         //max capacity reached, we have to delete the last one
      88       84949 :         auto it = pairRet.first;        
      89             :         
      90       84949 :         if (++(it) == actionStates.end() ){
      91             :            // the new inserted is the last one and has to be erased
      92       84582 :             actionStates.erase(pairRet.first);
      93       84582 :             return false;
      94             :         }
      95             :         
      96             :         // the new inserted is not the last one that has to be erased
      97         367 :         auto lastElem = actionStates.end();
      98         367 :         --lastElem;
      99         367 :         actionStates.erase(lastElem);
     100             :     }
     101             :     
     102         418 :     return true;
     103             : }
     104             : 
     105             : 
     106           8 : void ROSEE::ActionPinchLoose::print () const {
     107             :     
     108          16 :     std::stringstream output;
     109             :     
     110           8 :     output << "ActionName: " << name << std::endl;
     111             :     
     112           8 :     output << "FingersInvolved: [";
     113          24 :     for (auto fingName : fingersInvolved){
     114          16 :         output << fingName << ", " ;
     115             :     }
     116           8 :     output.seekp (-2, output.cur); //to remove the last comma (and space)
     117           8 :     output << "]" << std::endl;
     118             :     
     119           8 :     output << "JointsInvolvedCount: " << std::endl;;
     120           8 :     output << jointsInvolvedCount << std::endl;
     121             : 
     122           8 :     unsigned int nActState = 1;
     123          32 :     for (auto itemSet : actionStates) {  //the element in the set
     124          24 :         output << "Action_State_" << nActState << " :" << std::endl;
     125             : 
     126          24 :         output << "\t" << "JointStates:" << std::endl;
     127          24 :         output << itemSet.first;
     128          24 :         output << "\t" << "Distance:" << std::endl;
     129          24 :         output << "\t\tdistance " << itemSet.second << std::endl;
     130             :             
     131          24 :         nActState++;
     132             :     }
     133           8 :     output << std::endl;
     134             :     
     135           8 :     std::cout << output.str();
     136             : 
     137           8 : }
     138             : 
     139             : 
     140          17 : void ROSEE::ActionPinchLoose::emitYaml ( YAML::Emitter& out ) const {
     141             :     
     142          17 :     out << YAML::Key << YAML::Flow << fingersInvolved;
     143             : 
     144          17 :     unsigned int nCont = 1;
     145          17 :     out << YAML::Value << YAML::BeginMap;
     146          17 :     out << YAML::Key << "PrimitiveType" << YAML::Value << primitiveType;
     147          17 :     out << YAML::Key << "ActionName" << YAML::Value << name;
     148          17 :     out << YAML::Key << "JointsInvolvedCount" << YAML::Value << YAML::BeginMap;
     149          34 :     for (const auto &jointCount : jointsInvolvedCount ) {
     150          17 :         out << YAML::Key << jointCount.first;
     151          17 :         out << YAML::Value << jointCount.second;
     152             :     }
     153          17 :     out << YAML::EndMap;
     154             :     
     155          68 :     for (const auto & actionState : actionStates) { //.second is the set of ActionState
     156             :         
     157         102 :         std::string contSeq = "ActionState_" + std::to_string(nCont);
     158          51 :         out << YAML::Key << contSeq; 
     159             :         
     160          51 :         out << YAML::Value << YAML::BeginMap;
     161             :             //actionState.first, the jointstates map
     162          51 :             out << YAML::Key << "JointStates" << YAML::Value << YAML::BeginMap;
     163         102 :             for (const auto &joint : actionState.first) {
     164          51 :                 out << YAML::Key << joint.first;
     165          51 :                 out << YAML::Value << YAML::Flow << joint.second; //vector of double is emitted like Seq
     166             :             }
     167          51 :             out << YAML::EndMap;
     168             :             
     169             :             //actionState.second, the optional
     170          51 :             out << YAML::Key << "Optional" << YAML::Value << YAML::BeginMap;
     171          51 :                 out << YAML::Key << "distance" << YAML::Value << actionState.second;
     172          51 :             out << YAML::EndMap;
     173             :             
     174          51 :         out << YAML::EndMap;
     175          51 :         nCont++;
     176             :     }
     177          17 :     out << YAML::EndMap;
     178             : 
     179          17 : }
     180             : 
     181             : 
     182          19 : bool ROSEE::ActionPinchLoose::fillFromYaml ( YAML::const_iterator yamlIt ) {
     183             :         
     184          38 :     std::vector <std::string> fingInvolvedVect = yamlIt->first.as <std::vector < std::string >> ();
     185          57 :     for (const auto &it : fingInvolvedVect) {
     186          38 :         fingersInvolved.insert(it);
     187             :     }
     188             : 
     189         133 :     for ( YAML::const_iterator keyValue = yamlIt->second.begin(); keyValue != yamlIt->second.end(); ++keyValue) {        
     190             :         
     191         228 :         std::string key = keyValue->first.as<std::string>();
     192         114 :         if ( key.compare("JointsInvolvedCount") == 0 ) {
     193          19 :             jointsInvolvedCount = keyValue->second.as < JointsInvolvedCount > ();
     194             :             
     195          95 :         } else if (key.compare ("ActionName") == 0 ) {
     196          19 :             name = keyValue->second.as <std::string> ();
     197             :         
     198          76 :         } else if (key.compare ("PrimitiveType") == 0) {
     199             :             ROSEE::ActionPrimitive::Type parsedType = static_cast<ROSEE::ActionPrimitive::Type> ( 
     200          19 :                 keyValue->second.as <unsigned int>() );
     201          19 :             if (parsedType != primitiveType ) {
     202           0 :                 std::cerr << "[ERROR ActionPinchLoose::" << __func__ << " parsed a type " << parsedType << 
     203           0 :                     " but this object has primitive type " << primitiveType << std::endl; 
     204           0 :                 return false;
     205             :             }
     206             :             
     207          57 :         } else if (key.compare(0, 12, "ActionState_") == 0) { //compare 12 caracters from index 0 of key
     208             : 
     209         114 :             JointPos jointPos;
     210             :             double distance;
     211         171 :             for(YAML::const_iterator asEl = keyValue->second.begin(); asEl != keyValue->second.end(); ++asEl) {
     212             : 
     213             :                 //asEl can be the map JointStates or the map Optional
     214         114 :                 if (asEl->first.as<std::string>().compare ("JointStates") == 0 ) {
     215          57 :                     jointPos = asEl->second.as < JointPos >(); 
     216             :                     
     217          57 :                 } else if (asEl->first.as<std::string>().compare ("Optional") == 0 ) {
     218          57 :                     distance = asEl->second["distance"].as < double >();
     219             :                     
     220             :                 } else {
     221             :                     //ERRROr, only joinstates and optional at this level
     222             :                     std::cerr << "[ERROR ActionPinchLoose::" << __func__ << "not know key " 
     223           0 :                         << asEl->first.as<std::string>() << 
     224           0 :                         " found in the yaml file at this level" << std::endl; 
     225           0 :                     return false;
     226             :                 }
     227             :             }  
     228          57 :             actionStates.insert ( std::make_pair (jointPos, distance));
     229             :             
     230             :         } else {
     231             :             std::cerr << "[ERROR ActionPinchLoose::" << __func__ << "not know key " << key << 
     232           0 :                 " found in the yaml file" << std::endl; 
     233           0 :             return false;
     234             :         }
     235             :     }
     236             :     
     237          19 :     return true;
     238         183 : }
     239             : 
     240             : 

Generated by: LCOV version 1.13