LCOV - code coverage report
Current view: top level - include/ros_end_effector/GraspingActions - ActionPinchLoose.h (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 3 3 100.0 %
Date: 2021-10-05 16:55:17 Functions: 4 5 80.0 %

          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             : #ifndef __ROSEE_ACTIONPINCHLOOSE_H
      20             : #define __ROSEE_ACTIONPINCHLOOSE_H
      21             : 
      22             : #include <ros_end_effector/GraspingActions/ActionPrimitive.h>
      23             : #include <ros_end_effector/GraspingActions/ActionPinchGeneric.h>
      24             : #include <moveit/planning_scene/planning_scene.h>
      25             : #include <yaml-cpp/yaml.h>
      26             : #include <iostream>
      27             : 
      28             : namespace ROSEE {
      29             : 
      30             : /**
      31             :  * @brief The action of pinch with two tips. The two tips must not collide ever 
      32             :  * (otherwise we have a TightPinch). They only need to move towards each other moving the relative joints.
      33             :  * This PinchLoose is created because also if the tips do not collide (i.e. there is not a \ref ActionPinchTight)
      34             :  * we can have anyway a pinch at least to take object of a certain minimum size.
      35             :  * All the non involved fingers are set in the default state.
      36             :  * A pinchLoose is defined by:
      37             :  *  - 2 tips ( that are inside \ref fingersInvolved ), so \ref nFingersInvolved == 2 ( members of base class \ref Action )
      38             :  *  - JointStates position: where the collision happens (inside \ref actionStates )
      39             :  *  - Optional info (inside \ref actionStates ): the minimum distance found between the two tips.
      40             :  *    The distance is used to order, the actions in the \ref actionStates set (make sense if \ref maxStoredActionStates > 1 ): 
      41             :  *    the less the distance is, the more we say the pinchLoose is good
      42             :  */
      43        1721 : class ActionPinchLoose : public ActionPinchGeneric
      44             : {
      45             :     
      46             : public:
      47             :     
      48             :     typedef std::map < std::pair<std::string, std::string>, ActionPinchLoose > Map;
      49             :     
      50             :     /**
      51             :      * @brief A pair to "link" the JointPos with the optional info 'distance' 
      52             :      */
      53             :     typedef std::pair <JointPos, double> StateWithDistance; 
      54             :     
      55             :     ActionPinchLoose();
      56             :     ActionPinchLoose ( unsigned int maxStoredActionStates );
      57             :     ActionPinchLoose ( std::string tip1, std::string tip2);
      58             :     ActionPinchLoose ( std::pair <std::string, std::string>, JointPos, double distance );
      59             :     
      60             :     JointPos getJointPos () const override;
      61             :     JointPos getJointPos (unsigned int index) const;
      62             :     
      63             :     std::vector < ROSEE::JointPos > getAllJointPos () const override;    
      64             :     
      65             :     /** 
      66             :      * @brief Specific get for this action to return the state with distance info 
      67             :      * @return The vector (of size \ref maxStoredActionStates) containing all the StateWithDistance objects
      68             :      */
      69             :     std::vector < ROSEE::ActionPinchLoose::StateWithDistance > getActionStates() const;
      70             : 
      71             :     
      72             :     /** 
      73             :      * @brief function to insert a single action in the \ref actionStates set of possible action. 
      74             :      * If the action is not so good (based on distance) the action is not inserted and 
      75             :      * the function return false 
      76             :      * @param JointPos The joints position
      77             :      * @param distance the distance from the two tips.
      78             :      * @return TRUE if the action is good and is inserted in the setActionStates
      79             :      *         FALSE if the action given as param was not good as the others in the \ref actionStates
      80             :      *           and the set was already full (\ref maxStoredActionStates )
      81             :      */
      82             :     bool insertActionState (JointPos, double distance);
      83             : 
      84             :     /* For the pinch, we override these function to print, emit and parse the optional info Contact,
      85             :      which is specific of the pinch */
      86             :     void print () const override;
      87             :     void emitYaml ( YAML::Emitter&) const override;
      88             :     bool fillFromYaml( YAML::const_iterator yamlIt ) override;
      89             :     
      90             : private:
      91             :     
      92             :     /**
      93             :      * @brief struct to put in order the \ref actionStates set. The first elements are the ones with lesser distance 
      94             :      */
      95             :     struct distComp {
      96      339891 :         bool operator() (const StateWithDistance& a, const StateWithDistance& b) const
      97      339891 :         {return (std::abs(a.second) < std::abs(b.second) );}
      98             :     };
      99             :         
     100             :     /** 
     101             :      * @brief For each pair, we want a set of action because we want to store (in general) more possible way
     102             :      * to do that action. The PinchLoose among two tips can theoretically be done in infinite ways, we store 
     103             :      * the best ways found (ordering them by the distance between fingertips)
     104             :      */
     105             :     std::set < StateWithDistance, distComp > actionStates;
     106             : 
     107             : };
     108             : 
     109             : }
     110             : 
     111             : #endif // __ROSEE_ACTIONPINCHLOOSE_H

Generated by: LCOV version 1.13