ShadowHandUtilityLibrary
shadow_finger.hpp
Go to the documentation of this file.
1 //
2 // Created by kganguly on 4/30/19.
3 //
4 
5 #pragma once
7 
15 namespace shadow_finger {
16 
22 inline std::string getSavedStateName(std::string finger_name,
23  std::string saved_state) {
24  std::string saved_state_name;
25  // "open" or "pack"
26  std::size_t thumb_check = finger_name.find("thumb");
27  if (thumb_check != std::string::npos)
28  saved_state_name = finger_name + "_" + saved_state;
29  else
30  saved_state_name = finger_name + "_finger_" + saved_state;
31  return saved_state_name;
32 };
33 
38 inline std::string getMoveGroupName(std::string finger_name) {
39  std::string move_group_name;
40  std::size_t thumb_check = finger_name.find("thumb");
41  if (thumb_check != std::string::npos)
42  move_group_name = "rh_" + finger_name;
43  else
44  move_group_name = "rh_" + finger_name + "_finger";
45 
46  return move_group_name;
47 };
48 
53 inline std::vector<std::string> getJointNames(
54  moveit::planning_interface::MoveGroupInterface &move_group_interface) {
55  std::vector<std::string> joint_names;
56  joint_names = move_group_interface.getJointNames();
57  return joint_names;
58 };
59 
61 inline std::vector<std::string>
62 getJointNames(moveit::planning_interface::MoveGroupInterface::Plan &plan) {
63  // This is the trajectory generated by MoveIt plan
64  moveit_msgs::RobotTrajectory robotTrajectory = plan.trajectory_;
65  // Convert MoveIt to trajectory_msgs joint trajectory
66  trajectory_msgs::JointTrajectory planTrajectory =
67  robotTrajectory.joint_trajectory;
68  // Gives all the joint names in the planning group used when planning
69  std::vector<std::string> jointNames = planTrajectory.joint_names;
70  return jointNames;
71 };
72 
79 inline std::vector<double> getJointValues(
80  moveit::planning_interface::MoveGroupInterface &move_group_interface) {
81  std::vector<double> joint_vals;
82  joint_vals = move_group_interface.getCurrentJointValues();
83  return joint_vals;
84 }
85 
93 inline std::vector<std::tuple<float, float>>
94 getFingerJointLimits(std::vector<std::string> &joint_names) {
95  urdf::Model model;
96  if (!model.initParam("/robot_description")) {
97  ROS_ERROR("Failed to parse urdf file");
98  }
99  ROS_INFO("Successfully parsed urdf file");
100  std::vector<std::tuple<float, float>> joint_limits;
101  for (auto joint_name : joint_names) {
102  urdf::JointConstSharedPtr j = model.getJoint(joint_name);
103  joint_limits.push_back(std::make_tuple(j->limits->upper, j->limits->lower));
104  }
105  return joint_limits;
106 }
107 
111 const static std::vector<std::string> biotac_idx = {"first", "middle", "ring",
112  "little", "thumb"};
113 
120 inline int getBiotacIdx(std::string &finger_name) {
121  int idx = -1;
122  for (auto &each_idx : biotac_idx) {
123  idx += 1;
124  std::size_t found = finger_name.find(each_idx);
125  if (found != std::string::npos) {
126  return idx;
127  }
128  }
129  return idx;
130 }
131 
137 struct Finger {
142  ros::NodeHandle _node_handle;
147  std::string _finger_name;
157  std::vector<std::string> _joint_names;
162  std::vector<std::tuple<float, float>> _joint_limits;
167  moveit::planning_interface::MoveGroupInterface _finger_move_group;
172  moveit::planning_interface::MoveGroupInterface::Plan _plan;
183  std::vector<ros::Publisher> _joint_controller_publishers;
188  std::string _fsr_topic;
189 
196  Finger(std::string &finger_name, ros::NodeHandle &node_handle)
197  : _finger_name(finger_name),
198  _finger_move_group(shadow_finger::getMoveGroupName(finger_name)),
199  _node_handle(node_handle) {
200  _joint_names = shadow_finger::getJointNames(_finger_move_group);
201  _joint_controller_publishers =
203  _node_handle);
204  _biotac_id = shadow_finger::getBiotacIdx(_finger_name);
205  _joint_limits = shadow_finger::getFingerJointLimits(_joint_names);
206 
207  // Set FSR topic
208  if (_finger_name != "thumb") {
209  this->_fsr_topic = std::string(1, this->_finger_name.front()) + "f_fsr";
210  } else {
211  this->_fsr_topic = "th_fsr";
212  }
213 
214  ROS_INFO_STREAM("Initialized Finger: " << _finger_name);
215  };
216 
221  inline std::string getFingerName() { return _finger_name; }
222 
229  inline std::tuple<float, float> jointLimitsFromName(std::string &joint_name) {
230  std::vector<std::string>::iterator it =
231  std::find(_joint_names.begin(), _joint_names.end(), joint_name);
232  if (it != _joint_names.end()) {
233  int idx = std::distance(_joint_names.begin(), it);
234  return _joint_limits[idx];
235  } else {
236  ROS_ERROR_STREAM("Joint " << joint_name << " not found in "
237  << _finger_name << ".");
238  return std::make_tuple(0.0, 0.0);
239  }
240  }
241 
246  struct BioTac {
247  int16_t pressure;
248  std::vector<int16_t> impedance;
249  };
250 
256 
262 
268 
272  float getFSRValue();
273 };
274 
276 inline std::vector<std::string> getJointNames(shadow_finger::Finger &finger) {
277  std::vector<std::string> joint_names;
278  joint_names = finger._finger_move_group.getJointNames();
279  return joint_names;
280 };
281 
283 inline std::vector<double> getJointValues(shadow_finger::Finger &finger) {
284  std::vector<double> joint_vals;
285  joint_vals = finger._finger_move_group.getCurrentJointValues();
286  return joint_vals;
287 }
288 } // namespace shadow_finger
289 
290 inline std::ostream &operator<<(std::ostream &os,
291  const shadow_finger::Finger &finger) {
292  os << finger._finger_name << '\n';
293  return os;
294 }
shadow_planning::PlanningOptions _planning_options
Definition: shadow_finger.hpp:177
int _biotac_id
The index of the BioTac sensor.
Definition: shadow_finger.hpp:152
int16_t pressure
Definition: shadow_finger.hpp:247
std::vector< ros::Publisher > createJointControllerPublishers(std::vector< std::string > &joint_names, ros::NodeHandle &n)
Create a vector of publishers for each given joint name, using the ROS node handle.
Definition: shadow_utils.cpp:320
std::string _finger_name
The name of this finger instance.
Definition: shadow_finger.hpp:147
std::string getSavedStateName(std::string finger_name, std::string saved_state)
Get preloaded plan as string for open or close.
Definition: shadow_finger.hpp:22
int getBiotacIdx(std::string &finger_name)
Fetch BioTac index given name of finger.
Definition: shadow_finger.hpp:120
float getFSRValue()
Get FSR value.
Definition: shadow_finger.cpp:57
static const std::vector< std::string > biotac_idx
Lookup table that maps finger name to BioTac index.
Definition: shadow_finger.hpp:111
Utility struct for managing the BioTac sensor attached to each finger. Holds the pressure and impedan...
Definition: shadow_finger.hpp:246
Struct to set planning parameters for MoveIt planning.
Definition: shadow_planning_options.hpp:15
Utility functions for managing each finger of Shadow Hand. Contains struct to hold necessary data abo...
std::vector< std::tuple< float, float > > _joint_limits
Vector of tuples of joint limits of each joint in finger.
Definition: shadow_finger.hpp:162
Utility struct for managing each finger of Shadow Hand. Contains all the information about the Finger...
Definition: shadow_finger.hpp:137
shadow_finger::Finger::BioTac getBioTacPressure()
Get populated struct containing BioTac pressure data.
Definition: shadow_finger.cpp:7
ros::NodeHandle _node_handle
The ROS node handle.
Definition: shadow_finger.hpp:142
std::ostream & operator<<(std::ostream &os, const shadow_finger::Finger &finger)
Definition: shadow_finger.hpp:290
std::vector< std::string > _joint_names
Vector of strings of all joints in this finger.
Definition: shadow_finger.hpp:157
shadow_finger::Finger::BioTac getBioTacImpedancePressure()
Get populated struct containing BioTac pressure and impedance data.
Definition: shadow_finger.cpp:40
moveit::planning_interface::MoveGroupInterface _finger_move_group
MoveGroupInterface for this finger.
Definition: shadow_finger.hpp:167
moveit::planning_interface::MoveGroupInterface::Plan _plan
MoveIt plan generated for this finger.
Definition: shadow_finger.hpp:172
std::string getFingerName()
Getter function for finger name.
Definition: shadow_finger.hpp:221
std::vector< std::string > getJointNames(moveit::planning_interface::MoveGroupInterface &move_group_interface)
Get names of joints from given MoveGroupInterface.
Definition: shadow_finger.hpp:53
std::vector< std::tuple< float, float > > getFingerJointLimits(std::vector< std::string > &joint_names)
Get limits of each joint in given vector of joint names. This is obtained from the /robot_description...
Definition: shadow_finger.hpp:94
std::vector< double > getJointValues(moveit::planning_interface::MoveGroupInterface &move_group_interface)
Get current values of joints from given MoveGroupInterface, they are in the same order as the names o...
Definition: shadow_finger.hpp:79
std::tuple< float, float > jointLimitsFromName(std::string &joint_name)
Get joint limits from joint name, from vector of tuples populated by getFingerJointLimits() ...
Definition: shadow_finger.hpp:229
shadow_finger::Finger::BioTac getBioTacImpedance()
Get populated struct containing BioTac impedance data.
Definition: shadow_finger.cpp:23
Finger(std::string &finger_name, ros::NodeHandle &node_handle)
Constructor for each finger. Requires name of finger and a ROS node handle reference. Everything else is populated by constructor.
Definition: shadow_finger.hpp:196
std::string getMoveGroupName(std::string finger_name)
Get planning group names given common name for finger.
Definition: shadow_finger.hpp:38
std::vector< ros::Publisher > _joint_controller_publishers
Vector of ROS publishers, for sending control data for each joint in finger.
Definition: shadow_finger.hpp:183
std::vector< int16_t > impedance
Definition: shadow_finger.hpp:248
std::string _fsr_topic
Subscriber topic for getting FSR data for finger.
Definition: shadow_finger.hpp:188