Go to the documentation of this file.00001 #ifndef __TRANSFORMABLE_INTERACTIVE_SERVER_H__
00002 #define __TRANSFORMABLE_INTERACTIVE_SERVER_H__
00003
00004 #include <ros/ros.h>
00005 #include <interactive_markers/interactive_marker_server.h>
00006 #include <jsk_interactive_marker/transformable_object.h>
00007 #include <std_msgs/Float32.h>
00008 #include <std_msgs/String.h>
00009 #include <std_srvs/Empty.h>
00010 #include <geometry_msgs/PoseStamped.h>
00011 #include <map>
00012 #include <jsk_rviz_plugins/OverlayText.h>
00013 #include <iostream>
00014 #include <sstream>
00015 #include <tf/transform_listener.h>
00016 #include <dynamic_reconfigure/server.h>
00017 #include <jsk_interactive_marker/InteractiveSettingConfig.h>
00018 #include <jsk_interactive_marker/GetTransformableMarkerPose.h>
00019 #include <jsk_interactive_marker/SetTransformableMarkerPose.h>
00020 #include <jsk_interactive_marker/GetTransformableMarkerColor.h>
00021 #include <jsk_interactive_marker/SetTransformableMarkerColor.h>
00022 #include <jsk_interactive_marker/GetTransformableMarkerFocus.h>
00023 #include <jsk_interactive_marker/SetTransformableMarkerFocus.h>
00024 #include <jsk_interactive_marker/GetMarkerDimensions.h>
00025 #include <jsk_interactive_marker/SetMarkerDimensions.h>
00026 #include <jsk_interactive_marker/GetType.h>
00027 #include <jsk_interactive_marker/GetTransformableMarkerExistence.h>
00028 #include <jsk_interactive_marker/MarkerDimensions.h>
00029 #include <jsk_interactive_marker/PoseStampedWithName.h>
00030
00031 using namespace std;
00032
00033 namespace jsk_interactive_marker
00034 {
00035 class TransformableInteractiveServer{
00036 public:
00037 TransformableInteractiveServer();
00038 ~TransformableInteractiveServer();
00039
00040 void processFeedback( const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback );
00041 void setRadius(std_msgs::Float32 msg);
00042 void setSmallRadius(std_msgs::Float32 msg);
00043 void setX(std_msgs::Float32 msg);
00044 void setY(std_msgs::Float32 msg);
00045 void setZ(std_msgs::Float32 msg);
00046
00047 void setPose( const geometry_msgs::PoseStampedConstPtr &msg_ptr , bool for_interactive_control=false);
00048 void addPose(geometry_msgs::Pose msg);
00049 void addPoseRelative(geometry_msgs::Pose msg);
00050
00051 void setControlRelativePose(geometry_msgs::Pose msg);
00052
00053 void setColor(std_msgs::ColorRGBA msg);
00054
00055 void insertNewBox( std::string frame_id, std::string name, std::string description );
00056 void insertNewCylinder( std::string frame_id, std::string name, std::string description );
00057 void insertNewTorus( std::string frame_id, std::string name, std::string description );
00058 void insertNewMesh( std::string frame_id, std::string name, std::string description , std::string mesh_resource, bool mesh_use_embedded_materials);
00059
00060 void insertNewObject(TransformableObject* tobject, std::string name);
00061 void eraseObject(std::string name);
00062 void eraseAllObject();
00063 void eraseFocusObject();
00064
00065 void run();
00066 void focusTextPublish();
00067 void focusPosePublish();
00068 void focusObjectMarkerNamePublish();
00069
00070 void updateTransformableObject(TransformableObject* tobject);
00071
00072 bool getPoseService(jsk_interactive_marker::GetTransformableMarkerPose::Request &req,jsk_interactive_marker::GetTransformableMarkerPose::Response &res, bool for_interactive_control);
00073 bool setPoseService(jsk_interactive_marker::SetTransformableMarkerPose::Request &req,jsk_interactive_marker::SetTransformableMarkerPose::Response &res, bool for_interactive_control);
00074 bool getColorService(jsk_interactive_marker::GetTransformableMarkerColor::Request &req,jsk_interactive_marker::GetTransformableMarkerColor::Response &res);
00075 bool setColorService(jsk_interactive_marker::SetTransformableMarkerColor::Request &req,jsk_interactive_marker::SetTransformableMarkerColor::Response &res);
00076 bool getFocusService(jsk_interactive_marker::GetTransformableMarkerFocus::Request &req,jsk_interactive_marker::GetTransformableMarkerFocus::Response &res);
00077 bool setFocusService(jsk_interactive_marker::SetTransformableMarkerFocus::Request &req,jsk_interactive_marker::SetTransformableMarkerFocus::Response &res);
00078 bool getTypeService(jsk_interactive_marker::GetType::Request &req,jsk_interactive_marker::GetType::Response &res);
00079 bool getExistenceService(jsk_interactive_marker::GetTransformableMarkerExistence::Request &req,jsk_interactive_marker::GetTransformableMarkerExistence::Response &res);
00080 bool setDimensionsService(jsk_interactive_marker::SetMarkerDimensions::Request &req,jsk_interactive_marker::SetMarkerDimensions::Response &res);
00081 bool getDimensionsService(jsk_interactive_marker::GetMarkerDimensions::Request &req,jsk_interactive_marker::GetMarkerDimensions::Response &res);
00082 bool hideService(std_srvs::Empty::Request& req,
00083 std_srvs::Empty::Response& res);
00084 bool showService(std_srvs::Empty::Request& req,
00085 std_srvs::Empty::Response& res);
00086 void publishMarkerDimensions();
00087
00088 bool requestMarkerOperateService(jsk_rviz_plugins::RequestMarkerOperate::Request &req,jsk_rviz_plugins::RequestMarkerOperate::Response &res);
00089 virtual void configCallback(InteractiveSettingConfig &config, uint32_t level);
00090 void SetInitialInteractiveMarkerConfig( TransformableObject* tobject );
00091
00092 void tfTimerCallback(const ros::TimerEvent&);
00093 bool setPoseWithTfTransformation(TransformableObject* tobject, geometry_msgs::PoseStamped pose_stamped, bool for_interactive_control=false);
00094
00095 std::string focus_object_marker_name_;
00096 ros::NodeHandle* n_;
00097
00098 boost::mutex mutex_;
00099
00100 ros::Subscriber setcolor_sub_;
00101 ros::Subscriber setpose_sub_;
00102 ros::Subscriber setcontrolpose_sub_;
00103 ros::Subscriber addpose_sub_;
00104 ros::Subscriber addpose_relative_sub_;
00105
00106 ros::Subscriber setcontrol_relative_sub_;
00107
00108 ros::Subscriber set_r_sub_;
00109 ros::Subscriber set_sm_r_sub_;
00110 ros::Subscriber set_h_sub_;
00111 ros::Subscriber set_x_sub_;
00112 ros::Subscriber set_y_sub_;
00113 ros::Subscriber set_z_sub_;
00114
00115 ros::ServiceServer hide_srv_;
00116 ros::ServiceServer show_srv_;
00117 ros::ServiceServer get_pose_srv_;
00118 ros::ServiceServer get_control_pose_srv_;
00119 ros::ServiceServer set_pose_srv_;
00120 ros::ServiceServer set_control_pose_srv_;
00121 ros::ServiceServer get_color_srv_;
00122 ros::ServiceServer set_color_srv_;
00123 ros::ServiceServer get_focus_srv_;
00124 ros::ServiceServer set_focus_srv_;
00125 ros::ServiceServer get_type_srv_;
00126 ros::ServiceServer get_exist_srv_;
00127 ros::ServiceServer set_dimensions_srv;
00128 ros::ServiceServer get_dimensions_srv;
00129 ros::Publisher marker_dimensions_pub_;
00130 ros::ServiceServer request_marker_operate_srv_;
00131
00132 boost::shared_ptr <dynamic_reconfigure::Server<InteractiveSettingConfig> > config_srv_;
00133
00134 ros::Subscriber setrad_sub_;
00135 ros::Publisher focus_name_text_pub_;
00136 ros::Publisher focus_pose_text_pub_;
00137 ros::Publisher focus_object_marker_name_pub_;
00138 ros::Publisher pose_pub_;
00139 ros::Publisher pose_with_name_pub_;
00140 interactive_markers::InteractiveMarkerServer* server_;
00141 map<string, TransformableObject*> transformable_objects_map_;
00142 boost::shared_ptr<tf::TransformListener> tf_listener_;
00143 int torus_udiv_;
00144 int torus_vdiv_;
00145 bool display_interactive_manipulator_;
00146 bool strict_tf_;
00147 int interactive_manipulator_orientation_;
00148 ros::Timer tf_timer;
00149 };
00150 }
00151
00152 #endif