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 }