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_simple_grasp_planner/grasp_planner.h>
00026 #include <math.h>
00027 
00028 namespace katana_simple_grasp_planner
00029 {
00030 
00031 GraspPlanner::GraspPlanner() :
00032     kinematics_loader_("kinematics_base", "kinematics::KinematicsBase"),
00033     as_(nh_, "/plan_point_cluster_grasp", boost::bind(&GraspPlanner::execute_cb, this, _1), false)
00034 {
00035   as_.start();
00036 
00037   
00038   pre_grasp_joint_state_.name.push_back("katana_l_finger_joint");
00039   pre_grasp_joint_state_.name.push_back("katana_r_finger_joint");
00040   pre_grasp_joint_state_.position.push_back(0.30);
00041   pre_grasp_joint_state_.position.push_back(0.30);
00042   pre_grasp_joint_state_.effort.push_back(100.0);
00043   pre_grasp_joint_state_.effort.push_back(100.0);
00044 
00045   grasp_joint_state_.name = pre_grasp_joint_state_.name;
00046   grasp_joint_state_.position.push_back(-0.44);
00047   grasp_joint_state_.position.push_back(-0.44);
00048   grasp_joint_state_.effort.push_back(50.0);
00049   grasp_joint_state_.effort.push_back(50.0);
00050 
00051   
00052   try
00053   {
00054       kinematics_solver_ = kinematics_loader_.createInstance("arm_kinematics_constraint_aware/KDLArmKinematicsPlugin");
00055   }
00056   catch(pluginlib::PluginlibException& ex)
00057   {
00058       ROS_ERROR("The plugin failed to load. Error1: %s", ex.what());    
00059       return;
00060   }
00061 
00062   std::string group_name = "arm";
00063   std::string base_name = "katana_base_link";
00064   std::string tip_name = "katana_motor5_wrist_roll_link";
00065 
00066   if(kinematics_solver_->initialize(group_name,
00067                                     base_name,
00068                                     tip_name,
00069                                     .025)) {
00070   } else {
00071     ROS_ERROR_STREAM("Initialize is failing for " << group_name);
00072     return;
00073   }
00074 
00075   ROS_INFO("katana_simple_grasp_planner initialized.");
00076 }
00077 
00078 GraspPlanner::~GraspPlanner()
00079 {
00080 }
00081 
00085 std::vector<tf::Transform> GraspPlanner::generate_grasps(double x, double y, double z)
00086 {
00087   static const double ANGLE_INC = M_PI / 16;
00088   static const double STRAIGHT_ANGLE_MIN = 0.0 + ANGLE_INC;  
00089   static const double ANGLE_MAX = M_PI / 2;
00090 
00091   
00092   static const double STANDOFF = -0.12;
00093 
00094   std::vector<tf::Transform> grasps;
00095 
00096   tf::Transform transform;
00097 
00098   tf::Transform standoff_trans;
00099   standoff_trans.setOrigin(tf::Vector3(STANDOFF, 0.0, 0.0));
00100   standoff_trans.setRotation(tf::createIdentityQuaternion());
00101 
00102 
00103   
00104   
00105   
00106   
00107   
00108   transform.setOrigin(tf::Vector3(x, y, z));
00109 
00110   for (double roll = 0.0; roll <= M_PI; roll += M_PI)
00111   {
00112     double pitch = 0.0;
00113 
00114     
00115     
00116     
00117     
00118     for (double yaw = ANGLE_INC; yaw <= ANGLE_MAX; yaw += ANGLE_INC)
00119     {
00120       
00121       transform.setRotation(tf::createQuaternionFromRPY(roll, pitch, yaw + atan2(y, x)));
00122       grasps.push_back(transform * standoff_trans);
00123 
00124       if (yaw != 0.0)
00125       {
00126         transform.setRotation(tf::createQuaternionFromRPY(roll, pitch, -yaw + atan2(y, x)));
00127         grasps.push_back(transform * standoff_trans);
00128       }
00129     }
00130   }
00131 
00132   
00133   
00134   
00135   
00136   
00137   for (double roll = 0.0; roll <= M_PI; roll += M_PI)
00138   {
00139     for (double pitch = STRAIGHT_ANGLE_MIN; pitch <= ANGLE_MAX; pitch += ANGLE_INC)
00140     {
00141       double yaw = atan2(y, x);
00142       transform.setOrigin(tf::Vector3(x, y, z));
00143       transform.setRotation(tf::createQuaternionFromRPY(roll, pitch, yaw));
00144 
00145       grasps.push_back(transform * standoff_trans);
00146     }
00147   }
00148 
00149   return grasps;
00150 }
00151 
00152 std::vector<double> GraspPlanner::get_ik(tf::Transform grasp_tf)
00153 {
00154   geometry_msgs::Pose ik_pose;
00155   tf::poseTFToMsg(grasp_tf, ik_pose);
00156 
00157   std::vector<double> ik_seed_state;
00158   ik_seed_state.resize(5, 0.0);
00159 
00160   std::vector<double> solution;
00161   int error_code;   
00162 
00163   kinematics_solver_->getPositionIK(ik_pose, ik_seed_state, solution, error_code);
00164 
00165   if (error_code == 1)
00166     ROS_DEBUG("IK solution: %f %f %f %f %f", solution[0], solution[1], solution[2], solution[3], solution[4]);
00167   else
00168     ROS_INFO("no IK found (error %d)", error_code);
00169 
00170   return solution;
00171 }
00172 
00173 void GraspPlanner::execute_cb(const object_manipulation_msgs::GraspPlanningGoalConstPtr &goal)
00174 {
00175   object_manipulation_msgs::GraspPlanningFeedback feedback;
00176   object_manipulation_msgs::GraspPlanningResult result;
00177 
00178 
00179   
00180   
00181   sensor_msgs::PointCloud cloud = goal->target.cluster;
00182   float x = 0.0, y = 0.0, z = 0.0;
00183   for (size_t i = 0; i < cloud.points.size(); ++i)
00184   {
00185     x += cloud.points[i].x;
00186     y += cloud.points[i].y;
00187     z += cloud.points[i].z;
00188   }
00189   x /= cloud.points.size();
00190   y /= cloud.points.size();
00191   z /= cloud.points.size();
00192 
00193   std::vector<tf::Transform> grasp_tfs = generate_grasps(x, y, z);
00194 
00195   for (std::vector<tf::Transform>::iterator it = grasp_tfs.begin(); it != grasp_tfs.end(); ++it)
00196   {
00197     
00198     if (get_ik(*it).size() == 0)
00199       continue;
00200 
00201     object_manipulation_msgs::Grasp grasp;
00202 
00203     
00204     
00205     
00206     grasp.pre_grasp_posture = pre_grasp_joint_state_;
00207 
00208     
00209     
00210     
00211     grasp.grasp_posture = grasp_joint_state_;
00212 
00213     
00214     
00215     
00216     tf::poseTFToMsg(*it, grasp.grasp_pose);
00217 
00218     
00219     
00220     grasp.success_probability = 0.5;
00221 
00222     
00223     
00224     
00225     
00226     
00227     grasp.desired_approach_distance = 0.10;
00228 
00229     
00230     
00231     
00232     grasp.min_approach_distance = 0.05;
00233 
00234     
00235     
00236 
00237 
00238     feedback.grasps.push_back(grasp);
00239 
00240     
00241     
00242   }
00243 
00244   result.grasps = feedback.grasps;
00245   if (result.grasps.size() == 0)
00246     result.error_code.value = result.error_code.OTHER_ERROR;
00247   else
00248     result.error_code.value = result.error_code.SUCCESS;
00249 
00250   ROS_INFO("Returning %zu grasps.", result.grasps.size());
00251 
00252   as_.setSucceeded(result);
00253 }
00254 
00255 
00256 
00257 void GraspPlanner::main_loop() {
00258   ros::Rate loop_rate(0.5);
00259 
00260   std::vector<tf::Transform> grasps = generate_grasps(0.30, 0.20, 0.0);
00261 
00262   
00263   for (std::vector<tf::Transform>::iterator it = grasps.begin(); it != grasps.end(); ++it)
00264   {
00265     std::vector<double> ik_sol = get_ik(*it);
00266 
00267     if (ik_sol.size() > 0)
00268       tf_broadcaster_.sendTransform(tf::StampedTransform(*it, ros::Time::now(), "katana_base_link", "wrist_link"));
00269 
00270     if (!ros::ok())
00271       break;
00272 
00273     ros::spinOnce();
00274     loop_rate.sleep();
00275   }
00276 }
00277 
00278 } 
00279 
00280 
00281 int main(int argc, char** argv)
00282 {
00283   ros::init(argc, argv, "katana_simple_grasp_planner");
00284   katana_simple_grasp_planner::GraspPlanner grasp_planner_node;
00285 
00286   
00287   ros::spin();
00288   return 0;
00289 }