Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <katana_openloop_grasping/pick_and_place_demo.h>
00026
00027 namespace katana_openloop_grasping
00028 {
00029
00030 PickAndPlaceDemo::PickAndPlaceDemo() :
00031 move_arm_("move_arm", true), gripper_("gripper_grasp_posture_controller", true),
00032 make_static_collision_map_("make_static_collision_map", true)
00033 {
00034 ros::NodeHandle nh;
00035
00036 move_arm_.waitForServer();
00037 ROS_INFO("Connected to move arm action server");
00038
00039 gripper_.waitForServer();
00040 ROS_INFO("Connected to gripper action server");
00041
00042
00043
00044
00045 grasp_status_client_ = nh.serviceClient<object_manipulation_msgs::GraspStatus> ("gripper_grasp_status");
00046 if (!grasp_status_client_.waitForExistence(ros::Duration(10.0)))
00047 {
00048 ROS_FATAL("Could not connect to gripper grasp status service");
00049 return;
00050 }
00051 else
00052 {
00053 ROS_INFO("Connected to gripper grasp status service");
00054 }
00055
00056 }
00057
00058 PickAndPlaceDemo::~PickAndPlaceDemo()
00059 {
00060 }
00061
00062 void PickAndPlaceDemo::loop()
00063 {
00064
00065 std::vector<std::string> names(NUM_JOINTS);
00066 names[0] = "katana_motor1_pan_joint";
00067 names[1] = "katana_motor2_lift_joint";
00068 names[2] = "katana_motor3_lift_joint";
00069 names[3] = "katana_motor4_lift_joint";
00070 names[4] = "katana_motor5_wrist_roll_joint";
00071
00072 std::vector<motion_planning_msgs::JointConstraint> joint_constraints(NUM_JOINTS);
00073
00074 for (size_t i = 0; i < NUM_JOINTS; ++i)
00075 {
00076 joint_constraints[i].joint_name = names[i];
00077 joint_constraints[i].tolerance_below = 0.1;
00078 joint_constraints[i].tolerance_above = 0.1;
00079 }
00080
00081 while (nh_.ok())
00082 {
00083 bool success;
00084
00085
00086
00087
00088 ROS_INFO("Sending PRE_GRASP");
00089 success = send_gripper_action(GHPEG::PRE_GRASP);
00090 success &= query_grasp_status();
00091 if (!success)
00092 break;
00093
00094
00095
00096
00097
00098
00099 joint_constraints[0].position = 0.029225487499999758;
00100 joint_constraints[1].position = 0.11312164000000005;
00101 joint_constraints[2].position = -0.61444545070000012;
00102 joint_constraints[3].position = 1.3272473432000003;
00103 joint_constraints[4].position = 0.13708330500000043;
00104
00105 ROS_INFO("Moving to goal 1");
00106 success = move_to_joint_goal(joint_constraints);
00107 if (!success)
00108 break;
00109
00110 ros::Duration(1.0).sleep();
00111 ROS_INFO("Sending GRASP");
00112 success = send_gripper_action(GHPEG::GRASP);
00113 success &= query_grasp_status();
00114 if (!success)
00115 break;
00116
00117
00118
00119
00120
00121
00122 joint_constraints[0].position = 1.0;
00123 joint_constraints[1].position = 0.11312164000000005;
00124 joint_constraints[2].position = -0.61444545070000012;
00125 joint_constraints[3].position = 1.3272473432000003;
00126 joint_constraints[4].position = -0.038843444999999921;
00127
00128 ROS_INFO("Moving to goal 2");
00129 success = move_to_joint_goal(joint_constraints);
00130 if (!success)
00131 break;
00132
00133 ros::Duration(1.0).sleep();
00134 ROS_INFO("Sending RELEASE");
00135 success = send_gripper_action(GHPEG::RELEASE);
00136 success &= query_grasp_status();
00137 if (!success)
00138 break;
00139 }
00140 }
00141
00142 bool PickAndPlaceDemo::move_to_joint_goal(std::vector<motion_planning_msgs::JointConstraint> joint_constraints)
00143 {
00144 move_arm_msgs::MoveArmGoal goal;
00145
00146 goal.motion_plan_request.group_name = "arm";
00147 goal.motion_plan_request.num_planning_attempts = 1;
00148 goal.motion_plan_request.allowed_planning_time = ros::Duration(5.0);
00149
00150 goal.motion_plan_request.planner_id = std::string("");
00151 goal.planner_service_name = std::string("ompl_planning/plan_kinematic_path");
00152
00153 goal.motion_plan_request.goal_constraints.joint_constraints = joint_constraints;
00154
00155 bool finished_within_time = false;
00156 move_arm_.sendGoal(goal);
00157 finished_within_time = move_arm_.waitForResult(ros::Duration(40.0));
00158 if (!finished_within_time)
00159 {
00160 move_arm_.cancelGoal();
00161 ROS_INFO("Timed out achieving goal!");
00162 return false;
00163 }
00164 else
00165 {
00166 actionlib::SimpleClientGoalState state = move_arm_.getState();
00167 bool success = (state == actionlib::SimpleClientGoalState::SUCCEEDED);
00168 if (success)
00169 ROS_INFO("Action finished: %s", state.toString().c_str());
00170 else
00171 ROS_INFO("Action failed: %s", state.toString().c_str());
00172
00173 return success;
00174 }
00175 }
00176
00177 bool PickAndPlaceDemo::send_gripper_action(int32_t goal_type)
00178 {
00179
00180 GHPEG goal;
00181
00182 switch (goal_type)
00183 {
00184 case GHPEG::GRASP:
00185 goal.grasp.grasp_posture.name.push_back("dummy_name");
00186 goal.grasp.grasp_posture.position.push_back(GRIPPER_CLOSED_ANGLE);
00187
00188 break;
00189
00190 case GHPEG::PRE_GRASP:
00191 goal.grasp.pre_grasp_posture.name.push_back("dummy_name");
00192 goal.grasp.pre_grasp_posture.position.push_back(GRIPPER_OPEN_ANGLE);
00193
00194 break;
00195
00196 case GHPEG::RELEASE:
00197 break;
00198
00199 default:
00200 ROS_ERROR("unknown goal code (%d)", goal_type);
00201 return false;
00202 }
00203
00204 goal.goal = goal_type;
00205
00206 bool finished_within_time = false;
00207 gripper_.sendGoal(goal);
00208 finished_within_time = gripper_.waitForResult(ros::Duration(40.0));
00209 if (!finished_within_time)
00210 {
00211 gripper_.cancelGoal();
00212 ROS_WARN("Timed out achieving goal!");
00213 return false;
00214 }
00215 else
00216 {
00217 actionlib::SimpleClientGoalState state = gripper_.getState();
00218 bool success = (state == actionlib::SimpleClientGoalState::SUCCEEDED);
00219 if (success)
00220 ROS_INFO("Action finished: %s",state.toString().c_str());
00221 else
00222 ROS_WARN("Action failed: %s",state.toString().c_str());
00223
00224 return success;
00225 }
00226 }
00227
00228 bool PickAndPlaceDemo::make_static_collision_map() {
00229 ROS_INFO("Making static collision map");
00230
00231 collision_environment_msgs::MakeStaticCollisionMapGoal goal;
00232 goal.cloud_source = "tilt_scan_cloud_filtered";
00233 goal.number_of_clouds = 1;
00234
00235 make_static_collision_map_.sendGoal(goal);
00236
00237 if (!make_static_collision_map_.waitForResult(ros::Duration(30.0)))
00238 {
00239 ROS_ERROR("Timeout when waiting on make_static_collision_map");
00240 return false;
00241 }
00242
00243 if (make_static_collision_map_.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
00244 {
00245 return true;
00246 }else {
00247 ROS_ERROR("make_static_collision_map action failed!");
00248 return false;
00249 }
00250 }
00251
00252
00253 bool PickAndPlaceDemo::query_grasp_status()
00254 {
00255 object_manipulation_msgs::GraspStatus srv;
00256
00257 bool success = grasp_status_client_.call(srv);
00258 if (success)
00259 if (srv.response.is_hand_occupied)
00260 ROS_INFO("Gripper is holding something");
00261 else
00262 ROS_INFO("Gripper is empty");
00263 else
00264 ROS_ERROR("Failed to call service gripper_grasp_status");
00265
00266 return success;
00267 }
00268
00269 }
00270
00271 int main(int argc, char **argv)
00272 {
00273
00274
00275 ros::init(argc, argv, "pick_and_place_demo");
00276 katana_openloop_grasping::PickAndPlaceDemo demo;
00277
00278 demo.loop();
00279
00280 ros::shutdown();
00281 }