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
00036 tf::Quaternion q2_left = tf::createQuaternionFromRPY(0, 0, -(M_PI - alpha));
00037
00038
00039
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
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
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
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
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
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
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
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
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 }