00001 /* 00002 * pen_gripper.h 00003 * 00004 * Created on: 15.12.2010 00005 * Author: Richard Schneider 00006 * 00007 */ 00008 #ifndef PEN_GRIPPER_H_ 00009 #include <ros/ros.h> 00010 #include <opencv/cv.h> 00011 00012 // communication 00013 #include <portrait_robot_msgs/alubsc_node_instr.h> 00014 #include <portrait_robot_msgs/alubsc_status_msg.h> 00015 00016 // pointcloud processing 00017 #include <pcl/point_types.h> 00018 #include <pcl/point_cloud.h> 00019 #include <sensor_msgs/point_cloud_conversion.h> 00020 #include <sensor_msgs/PointCloud2.h> 00021 #include <pcl/kdtree/kdtree_flann.h> 00022 #include <pcl/filters/passthrough.h> 00023 #include <pcl/surface/convex_hull.h> 00024 #include <pcl/ModelCoefficients.h> 00025 #include <pcl/common/vector_average.h> 00026 #include <pcl/features/normal_3d.h> 00027 #include <pcl/filters/extract_indices.h> 00028 #include <pcl/pcl_base.h> 00029 #include "pcl/filters/statistical_outlier_removal.h" 00030 #include <pcl/sample_consensus/method_types.h> 00031 #include <pcl/sample_consensus/model_types.h> 00032 #include <pcl/segmentation/sac_segmentation.h> 00033 00034 // frame transformation 00035 #include <tf/transform_datatypes.h> 00036 #include <tf/transform_listener.h> 00037 00038 // marker visualization 00039 #include <visualization_msgs/Marker.h> 00040 00041 // arm movement 00042 #include <actionlib/client/simple_action_client.h> 00043 #include <ee_cart_imped_action/ee_cart_imped_arm.hh> 00044 00045 // gripper control 00046 #include <pr2_controllers_msgs/Pr2GripperCommandAction.h> 00047 00048 // head control 00049 #include <pr2_controllers_msgs/PointHeadAction.h> 00050 00051 #include <iostream> 00052 #include <fstream> 00053 #include <algorithm> 00054 #include <string> 00055 using namespace std; 00056 00057 //#define PEN_GRIPPER_H_ 00058 00062 struct pen { 00063 pcl::PointXYZ middle; 00064 pcl::PointXYZ head; 00065 bool isReady; 00066 }; 00067 00068 class PenGripper { 00069 00070 private: 00071 00072 // nodehandle 00073 ros::NodeHandle *n; 00074 00075 // pointer to the gripper controller 00076 EECartImpedArm *arm_r, *arm_l; 00077 00078 // left and right gripper start position 00079 pcl::PointXYZ r_start_pos; 00080 pcl::PointXYZ l_start_pos; 00081 00082 // pointer to the head client 00083 actionlib::SimpleActionClient<pr2_controllers_msgs::PointHeadAction>* head; 00084 00085 //right and left gripperclient pointer 00086 actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction>* GripperRight; 00087 actionlib::SimpleActionClient<pr2_controllers_msgs::Pr2GripperCommandAction>* GripperLeft; 00088 00089 // incomming pen cloud 00090 pcl::PointCloud<pcl::PointXYZ> pen_cloud; 00091 00092 // pen reprasentation 00093 pen red_pen; 00094 00095 // pcl subscriber/ publisher for narrow_stereo_textured 00096 ros::Subscriber pcl_sub; 00097 ros::Publisher pcl_pub; 00098 00099 // visualization stuff for rviz 00100 ros::Publisher marker_middle_pub; 00101 00102 // frame transformer 00103 tf::TransformListener tflistener; 00104 00105 public: 00106 00108 bool success; 00109 00111 bool abort; 00112 00114 portrait_robot_msgs::alubsc_status_msg status; 00115 00117 ros::ServiceClient status_clt; 00118 00120 PenGripper(ros::NodeHandle& nh); 00121 00123 ~PenGripper(); 00124 00135 void narrow_stereo_cb(const sensor_msgs::PointCloud2ConstPtr& cloud_msg); 00136 00140 void grip_pen(); 00141 00147 void take_start_position(); 00148 00153 void open_gripper(const string gripper); 00154 00159 void close_gripper(const string gripper); 00160 00164 void reset(); 00165 00169 bool handle_req(portrait_robot_msgs::alubsc_node_instr::Request &req, 00170 portrait_robot_msgs::alubsc_node_instr::Response &res); 00171 }; 00172 00173 #endif /* PEN_GRIPPER_H_ */