grasp_chair.cpp
Go to the documentation of this file.
00001 #include "grasp_chair.h"
00002 
00003 #include <boost/foreach.hpp>
00004 #include <pcl/io/pcd_io.h>
00005 #include <iostream>
00006 #include <fstream>
00007 #include <stdio.h>
00008 
00009 #include <tf/tf.h>
00010 
00011 #include <geometry_msgs/PointStamped.h>
00012 
00013 GraspChair::GraspChair(simple_robot_control::Robot* robot, Gripper* gripper)
00014 {  this->gripper = gripper;
00015    this->robot = robot;
00016    position_set = false;
00017 }
00018 
00019 bool GraspChair::grasp(std_srvs::Empty::Request& request, std_srvs::Empty::Response& response)
00020 {   assert(robot && gripper);
00021 
00022         if (!position_set)
00023         {     ROS_WARN("no position yet to grasp");
00024                                   return false;
00025         }
00026 
00027         float dy = left_Gripper.point.y - right_Gripper.point.y;
00028         float dx = left_Gripper.point.x - right_Gripper.point.x;
00029 
00030         float alpha = atan2(dy, dx);
00031 
00032         ROS_INFO("alpha: %.1f %.1f %.1f" , dx *100, dy * 100, alpha/M_PI * 180);
00033 
00034         tf::Quaternion q2_right = tf::createQuaternionFromRPY(0, 0, alpha);
00035         //tf::Quaternion q2_right2 = tf::createQuaternionFromRPY(0, M_PI / 2, alpha);
00036         tf::Quaternion q2_left = tf::createQuaternionFromRPY(0, 0, -(M_PI - alpha));
00037         //tf::Quaternion q2_left2 = tf::createQuaternionFromRPY(0, M_PI / 2, -(M_PI - alpha));
00038 
00039         //tf::Quaternion corr_left = tf::createQuaternionFromRPY(0, 0, M_PI);
00040         tf::Quaternion q2_start = tf::createQuaternionFromRPY(0, 0, 0);
00041 
00042         Eigen::Vector3f vector_right_to_left(left_Gripper.point.x - right_Gripper.point.x, left_Gripper.point.y - right_Gripper.point.y, left_Gripper.point.z - right_Gripper.point.z);
00043 
00044         vector_right_to_left.normalize();
00045 
00046         Eigen::Vector3f position_Right(right_Gripper.point.x, right_Gripper.point.y, right_Gripper.point.z);
00047         Eigen::Vector3f position_Left(left_Gripper.point.x, left_Gripper.point.y, left_Gripper.point.z);
00048 
00049         Eigen::Vector3f preposition_Right = position_Right - 0.1 * vector_right_to_left;
00050         Eigen::Vector3f preposition_Left = position_Left + 0.15 * vector_right_to_left;
00051 
00052         ROS_INFO("Position_right %.1f %.1f %.1f" , position_Right.x(), position_Right.y(), position_Right.z());
00053         ROS_INFO("Position_left %.1f %.1f %.1f" , position_Left.x(), position_Left.y(), position_Left.z());
00054 
00055         //------preGrasp_Positions----------------------------
00056         tf::StampedTransform preGrasp_Right (tf::Transform(q2_right,
00057                         tf::Vector3(preposition_Right.x() - 0.03, preposition_Right.y(), preposition_Right.z())),
00058                         ros::Time::now(),"torso_lift_link","doesnt_matter");
00059 
00060         tf::StampedTransform preGrasp_Left (tf::Transform(q2_left,
00061                         tf::Vector3(preposition_Left.x() - 0.03, preposition_Left.y(), preposition_Left.z())),
00062                         ros::Time::now(),"torso_lift_link","doesnt_matter");
00063 
00064         tf::StampedTransform goal_right (tf::Transform(q2_right,
00065                    tf::Vector3(right_Gripper.point.x ,right_Gripper.point.y + 0.05 ,right_Gripper.point.z)),
00066                    ros::Time::now(),"torso_lift_link","doesnt_matter");
00067 
00068         tf::StampedTransform goal_left (tf::Transform(q2_left,
00069                    tf::Vector3(left_Gripper.point.x ,left_Gripper.point.y - 0.06 ,left_Gripper.point.z)),
00070                    ros::Time::now(),"torso_lift_link","doesnt_matter");
00071 
00072         //-----correction poses----------------------
00073         tf::StampedTransform correction_left (tf::Transform(q2_left,
00074                         tf::Vector3(preposition_Left.x() + 0.1, preposition_Left.y(), preposition_Left.z())),
00075                         ros::Time::now(), "torso_lift_link", "doesnt_matter");
00076 
00077         tf::StampedTransform correction_right (tf::Transform(q2_right,
00078                         tf::Vector3(preposition_Right.x() + 0.05, preposition_Right.y(), preposition_Right.z())),
00079                         ros::Time::now(), "torso_lift_link", "doesnt_matter");
00080 
00081         //------start poses--------------------------
00082         tf::StampedTransform start_pose_right (tf::Transform(q2_start,
00083                         tf::Vector3(0.4, - 0.5, -0.2)),
00084                         ros::Time::now(),"torso_lift_link","doesnt_matter");
00085 
00086         tf::StampedTransform start_pose_left (tf::Transform(q2_start,
00087                         tf::Vector3(0.4, 0.5, -0.2)),
00088                         ros::Time::now(),"torso_lift_link","doesnt_matter");
00089 
00090         //------start_configuration------------------------
00091         gripper->open_gripper('r');
00092         gripper->open_gripper('l');
00093 
00094         robot->right_arm.moveGrippertoPose(start_pose_right);
00095         robot->left_arm.moveGrippertoPose(start_pose_left);
00096 
00097         //------grasp object ideally------------------------------------
00098         bool rsuccess = robot->right_arm.moveGrippertoPose(preGrasp_Right);
00099         bool lsuccess = robot->left_arm.moveGrippertoPose(preGrasp_Left);
00100 
00101         if (rsuccess && lsuccess)
00102         {       ROS_INFO("could grasp the chair with both arms");
00103                 robot->right_arm.moveGrippertoPose(goal_right);
00104                 robot->left_arm.moveGrippertoPose(goal_left);
00105                 gripper->close_gripper('l');
00106                 gripper->close_gripper('r');
00107         }
00108         else if(!rsuccess)
00109         {       if(right_Gripper.point.x > left_Gripper.point.x)
00110                 {       correction(robot->left_arm, 'l', correction_left, preGrasp_Left, goal_left);
00111                 }
00112                 return false;
00113         }
00114         else if(!lsuccess)
00115         {       if(left_Gripper.point.x > right_Gripper.point.x)
00116                 {       correction(robot->right_arm, 'r', correction_right, preGrasp_Right, goal_right);
00117                 }
00118                 return false;
00119         }
00120         else //-------couldn't reach a goal--------------------------
00121         {       ROS_INFO("couldn't grasp object");
00122                 return false;
00123         }
00124         return true;
00125 }
00126 
00127 bool GraspChair::release(std_srvs::Empty::Request& request, std_srvs::Empty::Response& response)
00128 {       assert(robot && gripper);
00129 
00130                 //------start pose--------------------------
00131                 tf::Quaternion q2_start = tf::createQuaternionFromRPY(0, 0, 0);
00132 
00133                 tf::StampedTransform start_pose_right (tf::Transform(q2_start,
00134                                 tf::Vector3(0.4, - 0.5, -0.2)),
00135                                 ros::Time::now(),"torso_lift_link","doesnt_matter");
00136 
00137                 tf::StampedTransform start_pose_left (tf::Transform(q2_start,
00138                                 tf::Vector3(0.4, 0.5, -0.2)),
00139                                 ros::Time::now(),"torso_lift_link","doesnt_matter");
00140 
00141                 //------start_pose------------------------
00142                 gripper->open_gripper('r');
00143                 gripper->open_gripper('l');
00144 
00145                 robot->right_arm.moveGrippertoPose(start_pose_right);
00146                 robot->left_arm.moveGrippertoPose(start_pose_left);
00147 
00148                 return true;
00149 }
00150 
00151 void GraspChair::correction(simple_robot_control::Arm& arm, char lr, tf::StampedTransform corrGrasp, tf::StampedTransform preGrasp, tf::StampedTransform goalGrasp)
00152 {               if(!arm.moveGrippertoPose(preGrasp))
00153                 {       ROS_INFO("can't grasp the chair");
00154                 }
00155                 arm.moveGrippertoPose(goalGrasp);
00156                 gripper->close_gripper(lr);
00157                 arm.moveGrippertoPose(corrGrasp);
00158                 gripper->open_gripper(lr);
00159 }
00160 
00161 void GraspChair::setGraspPositions_cb(const PointCloud::ConstPtr& msg)
00162 {
00163         assert(msg->points.size() > 1);
00164         right_Gripper.header.frame_id = msg->header.frame_id;
00165         right_Gripper.header.stamp = msg->header.stamp;
00166 
00167         left_Gripper.header.frame_id = msg->header.frame_id;
00168         left_Gripper.header.stamp = msg->header.stamp;
00169 
00170         right_Gripper.point.x = msg->points[1].x;
00171         right_Gripper.point.y = msg->points[1].y;
00172         right_Gripper.point.z = msg->points[1].z;
00173         left_Gripper.point.x = msg->points[0].x;
00174         left_Gripper.point.y = msg->points[0].y;
00175         left_Gripper.point.z = msg->points[0].z;
00176 
00177         ROS_INFO_STREAM("Gripper_Point right: " << right_Gripper.point.x << "; " << right_Gripper.point.y << "; " << right_Gripper.point.z);
00178         ROS_INFO_STREAM("Gripper_Point left: " << left_Gripper.point.x << "; " << left_Gripper.point.y << "; " << left_Gripper.point.z);
00179 
00180         position_set = true;
00181 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Properties Friends


grasp_motion
Author(s): Jan Metzger
autogenerated on Wed Dec 26 2012 16:32:25