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 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 #ifndef JSK_PCL_ROS_HINTED_HANDLE_ESTIMATOR_H_
00038 #define JSK_PCL_ROS_HINTED_HANDLE_ESTIMATOR_H_
00039 
00040 #include <jsk_topic_tools/diagnostic_nodelet.h>
00041 #include <jsk_recognition_msgs/ClusterPointIndices.h>
00042 #include <jsk_recognition_msgs/SimpleHandle.h>
00043 #include <geometry_msgs/PointStamped.h>
00044 #include <geometry_msgs/PoseStamped.h>
00045 #include <geometry_msgs/Pose.h>
00046 #include <std_msgs/Float64.h>
00047 #include <sensor_msgs/PointCloud2.h>
00048 #include <visualization_msgs/Marker.h>
00049 #include <visualization_msgs/MarkerArray.h>
00050 #include <message_filters/subscriber.h>
00051 #include <message_filters/time_synchronizer.h>
00052 #include <message_filters/synchronizer.h>
00053 #include <message_filters/sync_policies/approximate_time.h>
00054 #include <tf/transform_listener.h>
00055 #include <tf/tf.h>
00056 
00057 
00058 class handle_model
00059 {
00060 public:
00061   double finger_l;
00062   double finger_d;
00063   double finger_w;
00064   double arm_l;
00065   double arm_d;
00066   double arm_w;
00067   handle_model(){
00068   }
00069 };
00070 
00071 tf::Transform pose_to_tf(geometry_msgs::Pose pose){
00072   return tf::Transform(tf::Quaternion(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w), tf::Vector3(pose.position.x, pose.position.y, pose.position.z));
00073 }
00074 geometry_msgs::Pose tf_to_pose(tf::Transform transform){
00075   geometry_msgs::Pose pose;
00076   tf::Quaternion q;
00077   transform.getBasis().getRotation(q);
00078   pose.orientation.x = q.getX(); pose.orientation.y=q.getY(); pose.orientation.z=q.getZ(), pose.orientation.w=q.getW();
00079   pose.position.x=transform.getOrigin().getX(), pose.position.y=transform.getOrigin().getY(), pose.position.z=transform.getOrigin().getZ();
00080   return pose;
00081 }
00082 geometry_msgs::Pose change_pose(geometry_msgs::Pose base_pose, geometry_msgs::Pose child_pose){
00083   return tf_to_pose(pose_to_tf(base_pose)*pose_to_tf(child_pose));
00084 }
00085 
00086 visualization_msgs::Marker make_box(float s_x, float s_y, float s_z, float r, float g, float b, float x, float y, float z)
00087 {
00088   visualization_msgs::Marker marker;
00089   marker.type = visualization_msgs::Marker::CUBE;
00090   marker.scale.x = s_x;
00091   marker.scale.y = s_y;
00092   marker.scale.z = s_z;
00093   marker.color.r = r;
00094   marker.color.g = g;
00095   marker.color.b = b;
00096   marker.color.a = 1.0;
00097   marker.pose.position.x = x;
00098   marker.pose.position.y = y;
00099   marker.pose.position.z = z;
00100   marker.pose.orientation.x = marker.pose.orientation.y = marker.pose.orientation.z = 0;
00101   marker.pose.orientation.w = 1.0;
00102   return marker;
00103 }
00104 
00105 visualization_msgs::MarkerArray make_handle_array(geometry_msgs::PoseStamped pose, handle_model handle){
00106   visualization_msgs::MarkerArray markerArray_msg;
00107   visualization_msgs::Marker marker_msg = make_box(handle.finger_l, handle.finger_w, handle.finger_d, 1.0, 0, 0, handle.finger_l*0.5, handle.arm_w*0.5 -handle.finger_w*0.5, 0);
00108   marker_msg.pose = change_pose(pose.pose, marker_msg.pose);
00109   marker_msg.header = pose.header;
00110   marker_msg.ns = std::string("debug_grasp_model");
00111   marker_msg.id = 1;
00112   markerArray_msg.markers.push_back(marker_msg);
00113   marker_msg = make_box(handle.finger_l, handle.finger_w, handle.finger_d, 0, 1.0, 0, handle.finger_l*0.5, -handle.arm_w*0.5 +handle.finger_w*0.5, 0);
00114   marker_msg.pose = change_pose(pose.pose, marker_msg.pose);
00115   marker_msg.header = pose.header;
00116   marker_msg.ns = std::string("debug_grasp_model");
00117   marker_msg.id = 2;
00118   markerArray_msg.markers.push_back(marker_msg);
00119   marker_msg = make_box(handle.arm_l-handle.finger_l, handle.arm_w, handle.arm_d, 0, 0, 1.0, -(handle.arm_l-handle.finger_l)*0.5, 0, 0);
00120   marker_msg.pose = change_pose(pose.pose, marker_msg.pose);
00121   marker_msg.header = pose.header;
00122   marker_msg.ns = std::string("debug_grasp_model");
00123   marker_msg.id = 3;
00124   markerArray_msg.markers.push_back(marker_msg);
00125   return markerArray_msg;
00126 }
00127 
00128 namespace jsk_pcl_ros
00129 {
00130   class HintedHandleEstimator: public jsk_topic_tools::DiagnosticNodelet
00131   {
00132   public:
00133     HintedHandleEstimator(): DiagnosticNodelet("HintedHandleEstimator") {}
00134     typedef message_filters::sync_policies::ApproximateTime<
00135       sensor_msgs::PointCloud2,
00136       geometry_msgs::PointStamped 
00137       > SyncPolicy;
00138     tf::TransformListener listener_;
00139     handle_model handle;
00140   protected:
00141     virtual void onInit();
00142     virtual void subscribe();
00143     virtual void unsubscribe();
00144     virtual void estimate(
00145       const sensor_msgs::PointCloud2::ConstPtr& cloud_msg,
00146       const geometry_msgs::PointStampedConstPtr &point_msg);
00147 
00148     boost::mutex mutex_;
00149     ros::Publisher pub_pose_;
00150     ros::Publisher pub_length_;
00151     ros::Publisher pub_handle_;
00152     ros::Publisher pub_debug_marker_;
00153     ros::Publisher pub_debug_marker_array_;
00154     message_filters::Subscriber<sensor_msgs::PointCloud2> sub_cloud_;
00155     message_filters::Subscriber<geometry_msgs::PointStamped> sub_point_;
00156     boost::shared_ptr<message_filters::Synchronizer<SyncPolicy> >sync_;
00157   private:
00158     
00159   };
00160 }
00161 
00162 #endif