teleop_gripper_node.cpp
Go to the documentation of this file.
1 // Copyright (c) 2020 Franka Emika GmbH
2 // Use of this source code is governed by the Apache-2.0 license, see LICENSE
3 #include <franka/gripper.h>
4 #include <franka_example_controllers/teleop_gripper_paramConfig.h>
5 #include <franka_gripper/GraspAction.h>
6 #include <franka_gripper/HomingAction.h>
7 #include <franka_gripper/MoveAction.h>
8 #include <franka_gripper/StopAction.h>
9 
11 #include <dynamic_reconfigure/server.h>
12 #include <ros/init.h>
13 #include <ros/node_handle.h>
14 #include <sensor_msgs/JointState.h>
15 
16 #include <functional>
17 #include <memory>
18 #include <mutex>
19 
20 using franka_gripper::GraspAction;
21 using franka_gripper::HomingAction;
22 using franka_gripper::MoveAction;
23 using franka_gripper::StopAction;
28 
36  public:
38  : leader_homing_client_("leader/homing", true),
39  follower_homing_client_("follower/homing", true),
40  grasp_client_("follower/grasp", true),
41  move_client_("follower/move", true),
42  stop_client_("follower/stop", true){};
43 
44  bool init(const std::shared_ptr<ros::NodeHandle>& pnh) {
45  grasping_ = false;
46  gripper_homed_ = false;
47  if (!pnh->getParam("gripper_homed", gripper_homed_)) {
49  "teleop_gripper_node: Could not read parameter gripper_homed. "
50  "Defaulting to "
51  << std::boolalpha << gripper_homed_);
52  }
53 
54  // Init for dynamic reconfigure
56  ros::NodeHandle("dyn_reconf_teleop_gripper_param_node");
57  dynamic_server_teleop_gripper_param_ = std::make_unique<
58  dynamic_reconfigure::Server<franka_example_controllers::teleop_gripper_paramConfig>>(
61  boost::bind(&TeleopGripperClient::teleopGripperParamCallback, this, _1, _2));
62 
63  bool homing_success(false);
64  if (!gripper_homed_) {
65  ROS_INFO("teleop_gripper_node: Homing Gripper.");
66  homing_success = homingGripper();
67  }
68 
69  if (gripper_homed_ || homing_success) {
70  // Start action servers and subscriber for gripper
71  ros::Duration timeout(2.0);
72  if (grasp_client_.waitForServer(timeout) && move_client_.waitForServer(timeout) &&
73  stop_client_.waitForServer(timeout)) {
74  leader_sub_ = pnh->subscribe("leader/joint_states", 1,
76  } else {
77  ROS_ERROR(
78  "teleop_gripper_node: Action Server could not be started. Shutting "
79  "down node.");
80  return false;
81  }
82  } else {
83  return false;
84  }
85  return true;
86  };
87 
88  private:
89  double max_width_{0.07}; // Default value. It will be reset when gripper is homed [m]
90  bool grasping_;
92 
93  double grasp_force_; // [N]
94  double grasp_epsilon_inner_{0.001}; // [m]
96  double move_speed_; // [m/s]
97 
98  double start_pos_grasping_{0.5}; // Threshold position of leader gripper where to start grasping.
99  double start_pos_opening_{0.6}; // Threshold position of leader gripper where to open.
100 
106 
107  std::mutex subscriber_mutex_;
109 
112  std::unique_ptr<
113  dynamic_reconfigure::Server<franka_example_controllers::teleop_gripper_paramConfig>>
115 
117  const franka_example_controllers::teleop_gripper_paramConfig& config,
118  uint32_t /*level*/) {
119  if (dynamic_reconfigure_mutex_.try_lock()) {
120  grasp_force_ = config.grasp_force;
121  move_speed_ = config.move_speed;
122  ROS_INFO_STREAM("Dynamic Reconfigure: Gripper params set: grasp_force = "
123  << grasp_force_ << " N ; move_speed = " << move_speed_ << " m/s");
124  }
125  dynamic_reconfigure_mutex_.unlock();
126  };
127 
128  bool homingGripper() {
129  if (follower_homing_client_.waitForServer(ros::Duration(2.0)) &&
130  leader_homing_client_.waitForServer(ros::Duration(2.0))) {
131  leader_homing_client_.sendGoal(franka_gripper::HomingGoal());
132  follower_homing_client_.sendGoal(franka_gripper::HomingGoal());
133 
134  if (leader_homing_client_.waitForResult(ros::Duration(10.0)) &&
135  follower_homing_client_.waitForResult(ros::Duration(10.0))) {
136  return true;
137  }
138  }
139  ROS_ERROR("teleop_gripper_node: HomingAction has timed out.");
140  return false;
141  }
142 
143  void subscriberCallback(const sensor_msgs::JointState& msg) {
144  std::lock_guard<std::mutex> _(subscriber_mutex_);
145  if (!gripper_homed_) {
146  // If gripper had to be homed, reset max_width_.
147  max_width_ = 2 * msg.position[0];
148  gripper_homed_ = true;
149  }
150  double gripper_width = 2 * msg.position[0];
151  if (gripper_width < start_pos_grasping_ * max_width_ && !grasping_) {
152  // Grasp object
153  franka_gripper::GraspGoal grasp_goal;
154  grasp_goal.force = grasp_force_;
155  grasp_goal.speed = move_speed_;
156  grasp_goal.epsilon.inner = grasp_epsilon_inner_;
157  grasp_goal.epsilon.outer = grasp_epsilon_outer_scaling_ * max_width_;
158 
159  grasp_client_.sendGoal(grasp_goal);
160  if (grasp_client_.waitForResult(ros::Duration(5.0))) {
161  grasping_ = true;
162  } else {
163  ROS_INFO("teleop_gripper_node: GraspAction was not successful.");
164  stop_client_.sendGoal(franka_gripper::StopGoal());
165  }
166  } else if (gripper_width > start_pos_opening_ * max_width_ && grasping_) {
167  // Open gripper
168  franka_gripper::MoveGoal move_goal;
169  move_goal.speed = move_speed_;
170  move_goal.width = max_width_;
171  move_client_.sendGoal(move_goal);
172  if (move_client_.waitForResult(ros::Duration(5.0))) {
173  grasping_ = false;
174  } else {
175  ROS_ERROR("teleop_gripper_node: MoveAction was not successful.");
176  stop_client_.sendGoal(franka_gripper::StopGoal());
177  }
178  }
179  }
180 };
181 
182 int main(int argc, char** argv) {
183  ros::init(argc, argv, "teleop_gripper_node");
184  auto pnh = std::make_shared<ros::NodeHandle>("~");
185  TeleopGripperClient teleop_gripper_client;
186  if (teleop_gripper_client.init(pnh)) {
187  ros::spin();
188  }
189  return 0;
190 }
void teleopGripperParamCallback(const franka_example_controllers::teleop_gripper_paramConfig &config, uint32_t)
HomingClient leader_homing_client_
std::unique_ptr< dynamic_reconfigure::Server< franka_example_controllers::teleop_gripper_paramConfig > > dynamic_server_teleop_gripper_param_
bool waitForResult(const ros::Duration &timeout=ros::Duration(0, 0))
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
bool init(const std::shared_ptr< ros::NodeHandle > &pnh)
#define ROS_ERROR(...)
int main(int argc, char **argv)
HomingClient follower_homing_client_
bool waitForServer(const ros::Duration &timeout=ros::Duration(0, 0)) const
#define ROS_INFO(...)
Client class for teleoperating a follower gripper from a leader gripper.
ROSCPP_DECL void spin()
void sendGoal(const Goal &goal, SimpleDoneCallback done_cb=SimpleDoneCallback(), SimpleActiveCallback active_cb=SimpleActiveCallback(), SimpleFeedbackCallback feedback_cb=SimpleFeedbackCallback())
#define ROS_INFO_STREAM(args)
void subscriberCallback(const sensor_msgs::JointState &msg)
ros::NodeHandle dynamic_reconfigure_teleop_gripper_param_node_


franka_example_controllers
Author(s): Franka Emika GmbH
autogenerated on Mon Sep 19 2022 03:06:01