transformable_interactive_server.cpp
Go to the documentation of this file.
00001 #include <jsk_interactive_marker/transformable_interactive_server.h>
00002 
00003 using namespace jsk_interactive_marker;
00004 
00005 TransformableInteractiveServer::TransformableInteractiveServer():n_(new ros::NodeHandle){
00006   n_->param("torus_udiv", torus_udiv_, 20);
00007   n_->param("torus_vdiv", torus_vdiv_, 20);
00008 
00009   setpose_sub_ = n_->subscribe("set_pose", 1, &TransformableInteractiveServer::setPose, this);
00010  setcolor_sub_ = n_->subscribe("set_color", 1, &TransformableInteractiveServer::setColor, this);
00011 
00012   set_r_sub_ = n_->subscribe("set_radius", 1, &TransformableInteractiveServer::setRadius, this);
00013   set_sm_r_sub_ = n_->subscribe("set_small_radius", 1, &TransformableInteractiveServer::setSmallRadius, this);
00014   set_x_sub_ = n_->subscribe("set_x", 1, &TransformableInteractiveServer::setX, this);
00015   set_y_sub_ = n_->subscribe("set_y", 1, &TransformableInteractiveServer::setY, this);
00016   set_z_sub_ = n_->subscribe("set_z", 1, &TransformableInteractiveServer::setZ, this);
00017 
00018   addpose_sub_ = n_->subscribe("add_pose", 1, &TransformableInteractiveServer::addPose, this);
00019 
00020   setrad_sub_ = n_->subscribe("set_radius", 1, &TransformableInteractiveServer::setRadius, this);
00021 
00022   focus_text_pub_ = n_->advertise<jsk_rviz_plugins::OverlayText>("focus_marker_name", 1);
00023   focus_pose_pub_ = n_->advertise<jsk_rviz_plugins::OverlayText>("focus_marker_pose", 1);
00024 
00025   get_pose_srv_ = n_->advertiseService("get_pose", &TransformableInteractiveServer::getPoseService, this);
00026 
00027   server_ = new interactive_markers::InteractiveMarkerServer("simple_marker");
00028 
00029   insertNewBox(std::string("/map"), std::string("my_marker"), std::string("my_marker"));
00030   insertNewCylinder(std::string("/map"), std::string("my_marker2"), std::string("my_marker2"));
00031   insertNewTorus(std::string("/map"), std::string("my_marker3"), std::string("my_marker3"));
00032 }
00033 
00034 TransformableInteractiveServer::~TransformableInteractiveServer()
00035 {
00036   for (std::map<string, TransformableObject* >::iterator itpairstri = transformable_objects_map_.begin(); itpairstri != transformable_objects_map_.end(); itpairstri++) {
00037     delete itpairstri->second;
00038   }
00039   transformable_objects_map_.clear();
00040 }
00041 
00042 void TransformableInteractiveServer::processFeedback(
00043                                                      const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
00044 {
00045   switch ( feedback->event_type )
00046     {
00047     case visualization_msgs::InteractiveMarkerFeedback::MOUSE_DOWN:
00048       focus_object_marker_name_ = feedback->marker_name;
00049       focusTextPublish();
00050       focusPosePublish();
00051       break;
00052 
00053     case visualization_msgs::InteractiveMarkerFeedback::POSE_UPDATE:
00054       TransformableObject* tobject = transformable_objects_map_[feedback->marker_name.c_str()];
00055       if(tobject){
00056         tobject->setPose(feedback->pose);
00057       }else
00058         ROS_ERROR("Invalid ObjectId Request Received %s", feedback->marker_name.c_str());
00059       break;
00060     }
00061 }
00062 
00063 void TransformableInteractiveServer::setColor(std_msgs::ColorRGBA msg)
00064 {
00065   TransformableObject* tobject = transformable_objects_map_[focus_object_marker_name_];
00066   tobject->setRGBA(msg.r, msg.g, msg.b, msg.a);
00067   updateTransformableObject(tobject);
00068 }
00069 
00070 void TransformableInteractiveServer::setRadius(std_msgs::Float32 msg)
00071 {
00072   TransformableObject* tobject = transformable_objects_map_[focus_object_marker_name_];
00073   if(tobject->setRadius(msg)){
00074     updateTransformableObject(tobject);
00075   }
00076 }
00077 
00078 void TransformableInteractiveServer::setSmallRadius(std_msgs::Float32 msg)
00079 {
00080   TransformableObject* tobject = transformable_objects_map_[focus_object_marker_name_];
00081   if(tobject->setSmallRadius(msg)){
00082     updateTransformableObject(tobject);
00083   }
00084 }
00085 
00086 void TransformableInteractiveServer::setX(std_msgs::Float32 msg)
00087 {
00088   TransformableObject* tobject = transformable_objects_map_[focus_object_marker_name_];
00089   if(tobject->setX(msg)){
00090     updateTransformableObject(tobject);
00091   }
00092 }
00093 
00094 void TransformableInteractiveServer::setY(std_msgs::Float32 msg)
00095 {
00096   TransformableObject* tobject = transformable_objects_map_[focus_object_marker_name_];
00097   if(tobject->setY(msg)){
00098     updateTransformableObject(tobject);
00099   }
00100 }
00101 
00102 void TransformableInteractiveServer::setZ(std_msgs::Float32 msg)
00103 {
00104   TransformableObject* tobject = transformable_objects_map_[focus_object_marker_name_];
00105   if(tobject->setZ(msg)){
00106     updateTransformableObject(tobject);
00107   }
00108 }
00109 
00110 void TransformableInteractiveServer::updateTransformableObject(TransformableObject* tobject)
00111 {
00112   visualization_msgs::InteractiveMarker int_marker = tobject->getInteractiveMarker();
00113   server_->insert(int_marker, boost::bind( &TransformableInteractiveServer::processFeedback,this, _1));
00114   server_->applyChanges();
00115 }
00116 
00117 void TransformableInteractiveServer::setPose(geometry_msgs::PoseStamped msg){
00118   TransformableObject* tobject =  transformable_objects_map_[focus_object_marker_name_];
00119   tobject->setPose(msg.pose);
00120   server_->setPose(focus_object_marker_name_, msg.pose, msg.header);
00121   server_->applyChanges();
00122 }
00123 
00124 bool TransformableInteractiveServer::getPoseService(jsk_interactive_marker::GetPose::Request &req,jsk_interactive_marker::GetPose::Response &res)
00125 {
00126   TransformableObject* tobject;
00127   if(req.target_name.empty()){
00128     if(tobject = transformable_objects_map_[focus_object_marker_name_])
00129       res.pose = tobject->getPose();
00130   }else{
00131     if(tobject = transformable_objects_map_[req.target_name])
00132       res.pose = tobject->getPose();
00133   }
00134 }
00135 
00136 
00137 void TransformableInteractiveServer::addPose(geometry_msgs::Pose msg){
00138   TransformableObject* tobject = transformable_objects_map_[focus_object_marker_name_];
00139   tobject->addPose(msg);
00140   updateTransformableObject(tobject);
00141 }
00142 
00143 void TransformableInteractiveServer::focusTextPublish(){
00144   jsk_rviz_plugins::OverlayText focus_text;
00145   focus_text.text = focus_object_marker_name_;
00146   focus_text.top = 0;
00147   focus_text.left = 0;
00148   focus_text.width = 300;
00149   focus_text.height = 50;
00150   focus_text.bg_color.r = 0.9;
00151   focus_text.bg_color.b = 0.9;
00152   focus_text.bg_color.g = 0.9;
00153   focus_text.bg_color.a = 0.1;
00154   focus_text.fg_color.r = 0.3;
00155   focus_text.fg_color.g = 0.3;
00156   focus_text.fg_color.b = 0.8;
00157   focus_text.fg_color.a = 1;
00158   focus_text.line_width = 1;
00159   focus_text.text_size = 30;
00160   focus_text_pub_.publish(focus_text);
00161 }
00162 
00163 void TransformableInteractiveServer::focusPosePublish(){
00164   geometry_msgs::Pose target_pose = transformable_objects_map_[focus_object_marker_name_]->getPose();
00165   std::stringstream ss;
00166   ss << "Pos x: " << target_pose.position.x  << " y: " << target_pose.position.y << " z: " << target_pose.position.z
00167      << std::endl
00168      << "Ori x: " << target_pose.orientation.x << " y: " << target_pose.orientation.y << " z: " << target_pose.orientation.z << " w: " << target_pose.orientation.w;
00169 
00170   jsk_rviz_plugins::OverlayText focus_pose;
00171   focus_pose.text = ss.str();
00172   focus_pose.top = 50;
00173   focus_pose.left = 0;
00174   focus_pose.width = 500;
00175   focus_pose.height = 50;
00176   focus_pose.bg_color.r = 0.9;
00177   focus_pose.bg_color.b = 0.9;
00178   focus_pose.bg_color.g = 0.9;
00179   focus_pose.bg_color.a = 0.1;
00180   focus_pose.fg_color.r = 0.8;
00181   focus_pose.fg_color.g = 0.3;
00182   focus_pose.fg_color.b = 0.3;
00183   focus_pose.fg_color.a = 1;
00184   focus_pose.line_width = 1;
00185   focus_pose.text_size = 15;
00186   focus_pose_pub_.publish(focus_pose);
00187 }
00188 
00189 void TransformableInteractiveServer::insertNewBox(std::string frame_id, std::string name, std::string description)
00190 {
00191   TransformableBox* transformable_box = new TransformableBox(0.45, 0.45, 0.45, 0.5, 0.5, 0.5, 1.0, frame_id, name, description);
00192   insertNewObject(transformable_box, name);
00193 }
00194 
00195 void TransformableInteractiveServer::insertNewCylinder( std::string frame_id, std::string name, std::string description)
00196 {
00197   TransformableCylinder* transformable_cylinder = new TransformableCylinder(0.45, 0.45, 0.5, 0.5, 0.5, 1.0, frame_id, name, description);
00198   insertNewObject(transformable_cylinder, name);
00199 }
00200 
00201 void TransformableInteractiveServer::insertNewTorus( std::string frame_id, std::string name, std::string description)
00202 {
00203   TransformableTorus* transformable_torus = new TransformableTorus(0.45, 0.2, torus_udiv_, torus_vdiv_, 0.5, 0.5, 0.5, 1.0, frame_id, name, description);
00204   insertNewObject(transformable_torus, name);
00205 }
00206 
00207 void TransformableInteractiveServer::insertNewObject( TransformableObject* tobject , std::string name )
00208 {
00209   visualization_msgs::InteractiveMarker int_marker = tobject->getInteractiveMarker();
00210   transformable_objects_map_[name] = tobject;
00211   server_->insert(int_marker, boost::bind( &TransformableInteractiveServer::processFeedback,this, _1));
00212   server_->applyChanges();
00213 
00214   focus_object_marker_name_ = name;
00215 }
00216 
00217 void TransformableInteractiveServer::run(){
00218   ros::spin();
00219 }


jsk_interactive_marker
Author(s): furuta
autogenerated on Mon Oct 6 2014 01:19:15