# Revision history [back]

### PR2 + Hydro - Easiest way to close a gripper?

Hi all,

After interacting with some objects on a table, the grasp of the PR2 opens. I need to close it after each iteration, to be able to compare the changes in the scene before and after the interaction.

I look for something fast. So I guess the solution must be very simple. Something as setting a number to a joint, but I am not able to find it by myself...

I can close the gripper using Pr2GripperCommandAction but it is quite slow:

#include <ros/ros.h>
#include <pr2_controllers_msgs/Pr2GripperCommandAction.h>
#include <actionlib/client/simple_action_client.h>
#include <unistd.h>

// Our Action interface type, provided as a typedef for convenience
typedef actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction> GripperClient;
GripperClient* gripper_clientr_;
GripperClient* gripper_clientl_;

//Open the gripper
void open(GripperClient* gripper_client_){
pr2_controllers_msgs::Pr2GripperCommandGoal open;
open.command.position = 0.10;
open.command.max_effort = -1.0;  // Do not limit effort (negative)

ROS_INFO("Sending open goal");
gripper_client_->sendGoal(open);
gripper_client_->waitForResult();
if(gripper_client_->getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
ROS_INFO("The gripper opened!");
else
ROS_INFO("The gripper failed to open.");
}

//Close the gripper
void close(GripperClient* gripper_client_){
pr2_controllers_msgs::Pr2GripperCommandGoal squeeze;
squeeze.command.position = 0.0;
//     squeeze.command.max_effort = 50.0;  // Close gently
squeeze.command.max_effort = -1.0;  // Close gently

ROS_INFO("Sending squeeze goal");
gripper_client_->sendGoal(squeeze);
gripper_client_->waitForResult();
if(gripper_client_->getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
ROS_INFO("The gripper closed!");
else
ROS_INFO("The gripper failed to close.");

gripper_client_->cancelAllGoals();

}

int main(int argc, char** argv){
ros::init(argc, argv, "simple_gripper");

gripper_clientr_ = new GripperClient("r_gripper_controller/gripper_action", true);
while(!gripper_clientr_->waitForServer(ros::Duration(5.0))){
ROS_INFO("Waiting for the r_gripper_controller/gripper_action action server to come up");
}

open(gripper_clientr_);
close(gripper_clientr_);

return 0;
}


Thanks

Carlos

 2 retagged

### PR2 + Hydro - Easiest way to close a gripper?

Hi all,

After interacting with some objects on a table, the grasp of the PR2 opens. I need to close it after each iteration, to be able to compare the changes in the scene before and after the interaction.

I look for something fast. So I guess the solution must be very simple. Something as setting a number to a joint, but I am not able to find it by myself...

I can close the gripper using Pr2GripperCommandAction but it is quite slow:

#include <ros/ros.h>
#include <pr2_controllers_msgs/Pr2GripperCommandAction.h>
#include <actionlib/client/simple_action_client.h>
#include <unistd.h>

// Our Action interface type, provided as a typedef for convenience
typedef actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction> GripperClient;
GripperClient* gripper_clientr_;
GripperClient* gripper_clientl_;

//Open the gripper
void open(GripperClient* gripper_client_){
pr2_controllers_msgs::Pr2GripperCommandGoal open;
open.command.position = 0.10;
open.command.max_effort = -1.0;  // Do not limit effort (negative)

ROS_INFO("Sending open goal");
gripper_client_->sendGoal(open);
gripper_client_->waitForResult();
if(gripper_client_->getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
ROS_INFO("The gripper opened!");
else
ROS_INFO("The gripper failed to open.");
}

//Close the gripper
void close(GripperClient* gripper_client_){
pr2_controllers_msgs::Pr2GripperCommandGoal squeeze;
squeeze.command.position = 0.0;
//     squeeze.command.max_effort = 50.0;  // Close gently
squeeze.command.max_effort = -1.0;  // Close gently

ROS_INFO("Sending squeeze goal");
gripper_client_->sendGoal(squeeze);
gripper_client_->waitForResult();
if(gripper_client_->getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
ROS_INFO("The gripper closed!");
else
ROS_INFO("The gripper failed to close.");

gripper_client_->cancelAllGoals();

}

int main(int argc, char** argv){
ros::init(argc, argv, "simple_gripper");

gripper_clientr_ = new GripperClient("r_gripper_controller/gripper_action", true);
while(!gripper_clientr_->waitForServer(ros::Duration(5.0))){
ROS_INFO("Waiting for the r_gripper_controller/gripper_action action server to come up");
}

open(gripper_clientr_);
close(gripper_clientr_);

return 0;
}


Thanks

Carlos