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 #include <interactive_marker_helpers/interactive_marker_helpers.h>
00033 
00034 #include <tf/tf.h>
00035 #include <object_manipulator/tools/msg_helpers.h>
00036 
00037 namespace im_helpers {
00038 
00039 visualization_msgs::InteractiveMarker makeEmptyMarker( const char *frame_id )
00040 {
00041   visualization_msgs::InteractiveMarker int_marker;
00042   int_marker.header.frame_id = frame_id;
00043   int_marker.scale = 1;
00044 
00045   return int_marker;
00046 }
00047 
00048 visualization_msgs::Marker makeBox( float scale )
00049 {
00050   visualization_msgs::Marker marker;
00051 
00052   marker.type = visualization_msgs::Marker::CUBE;
00053   marker.scale.x = scale;
00054   marker.scale.y = scale;
00055   marker.scale.z = scale;
00056   marker.color.r = 1.0;
00057   marker.color.g = 1.0;
00058   marker.color.b = 1.0;
00059   marker.color.a = 1.0;
00060 
00061   return marker;
00062 }
00063 
00064 visualization_msgs::Marker makeSphere( float scale )
00065 {
00066   visualization_msgs::Marker marker;
00067 
00068   marker.type = visualization_msgs::Marker::SPHERE;
00069   marker.scale.x = scale;
00070   marker.scale.y = scale;
00071   marker.scale.z = scale;
00072   marker.color.r = 1.0;
00073   marker.color.g = 1.0;
00074   marker.color.b = 1.0;
00075   marker.color.a = 1.0;
00076 
00077   return marker;
00078 }
00079 
00080 void add6DofControl( visualization_msgs::InteractiveMarker &msg, bool fixed )
00081 {
00082   visualization_msgs::InteractiveMarkerControl control;
00083 
00084   if(fixed)
00085     control.orientation_mode = visualization_msgs::InteractiveMarkerControl::FIXED;
00086 
00087   control.orientation.w = 1;
00088   control.orientation.x = 1;
00089   control.orientation.y = 0;
00090   control.orientation.z = 0;
00091   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
00092   msg.controls.push_back(control);
00093   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;
00094   msg.controls.push_back(control);
00095 
00096   control.orientation.w = 1;
00097   control.orientation.x = 0;
00098   control.orientation.y = 1;
00099   control.orientation.z = 0;
00100   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
00101   msg.controls.push_back(control);
00102   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;
00103   msg.controls.push_back(control);
00104 
00105   control.orientation.w = 1;
00106   control.orientation.x = 0;
00107   control.orientation.y = 0;
00108   control.orientation.z = 1;
00109   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
00110   msg.controls.push_back(control);
00111   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;
00112   msg.controls.push_back(control);
00113 }
00114 
00115 
00116 visualization_msgs::InteractiveMarkerControl& makeBoxControl( visualization_msgs::InteractiveMarker &msg )
00117 {
00118   visualization_msgs::InteractiveMarkerControl control;
00119   control.always_visible = true;
00120   control.markers.push_back( makeBox(msg.scale) );
00121   msg.controls.push_back( control );
00122 
00123   return msg.controls.back();
00124 }
00125 
00126 visualization_msgs::InteractiveMarkerControl& makeSphereControl( visualization_msgs::InteractiveMarker &msg )
00127 {
00128   visualization_msgs::InteractiveMarkerControl control;
00129   control.always_visible = true;
00130   control.markers.push_back( makeSphere(msg.scale) );
00131   msg.controls.push_back( control );
00132 
00133   return msg.controls.back();
00134 }
00135 
00136 visualization_msgs::MenuEntry makeMenuEntry(const char *title)
00137 {
00138   visualization_msgs::MenuEntry m;
00139   m.title = title;
00140   m.command = title;
00141   return m;
00142 }
00143 
00144 visualization_msgs::MenuEntry makeMenuEntry(const char *title, const char *command, int type  )
00145 {
00146   visualization_msgs::MenuEntry m;
00147   m.title = title;
00148   m.command = command;
00149   m.command_type = type;
00150   return m;
00151 }
00152 
00153 visualization_msgs::InteractiveMarker makePostureMarker( const char *name, const geometry_msgs::PoseStamped &stamped,
00154                                                          float scale, bool fixed, bool view_facing )
00155 {
00156   visualization_msgs::InteractiveMarker int_marker;
00157   int_marker.header =  stamped.header;
00158   int_marker.name = name;
00159   int_marker.scale = scale;
00160   int_marker.pose = stamped.pose;
00161 
00162   visualization_msgs::InteractiveMarkerControl control;
00163   control.orientation.w = 1;
00164   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
00165   int_marker.controls.push_back(control);
00166 
00167   return int_marker;
00168 }
00169 
00170 visualization_msgs::InteractiveMarker makeHeadGoalMarker( const char *name, const geometry_msgs::PoseStamped &stamped,
00171                                                           float scale)
00172 {
00173   visualization_msgs::InteractiveMarker int_marker;
00174   int_marker.header =  stamped.header;
00175   int_marker.name = name;
00176   int_marker.scale = scale;
00177   int_marker.pose = stamped.pose;
00178 
00179   visualization_msgs::InteractiveMarkerControl control;
00180   control.orientation_mode = visualization_msgs::InteractiveMarkerControl::VIEW_FACING;
00181   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_PLANE;
00182   control.orientation.w = 1;
00183   control.markers.push_back( makeSphere(scale*0.7) );
00184   int_marker.controls.push_back(control);
00185   control.markers.clear();
00186 
00187   add6DofControl(int_marker);
00188 
00189   return int_marker;
00190 }
00191 
00192 visualization_msgs::InteractiveMarker makeMeshMarker( const std::string &name, const std::string &mesh_resource,
00193                                                       const geometry_msgs::PoseStamped &stamped, float scale, const std_msgs::ColorRGBA &color, bool use_color )
00194 {
00195   visualization_msgs::InteractiveMarker int_marker;
00196   int_marker.header =  stamped.header;
00197   int_marker.pose = stamped.pose;
00198   int_marker.name = name;
00199   int_marker.scale = scale;
00200 
00201   visualization_msgs::Marker mesh;
00202   if (use_color) mesh.color = color;
00203   mesh.mesh_resource = mesh_resource;
00204   mesh.mesh_use_embedded_materials = !use_color;
00205   mesh.type = visualization_msgs::Marker::MESH_RESOURCE;
00206   mesh.scale.x = scale;
00207   mesh.scale.y = scale;
00208   mesh.scale.z = scale;
00209 
00210   visualization_msgs::InteractiveMarkerControl control;
00211   control.markers.push_back( mesh );
00212   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00213   int_marker.controls.push_back( control );
00214 
00215   return int_marker;
00216 }
00217 
00218 visualization_msgs::InteractiveMarker makeMeshMarker( const std::string &name, const std::string &mesh_resource,
00219                                                       const geometry_msgs::PoseStamped &stamped, float scale)
00220 {
00221   std_msgs::ColorRGBA color;
00222   return makeMeshMarker( name, mesh_resource, stamped, scale, color, false);
00223 }
00224 
00225 visualization_msgs::InteractiveMarker makeMeshMarker( const std::string &name, const std::string &mesh_resource,
00226                                                       const geometry_msgs::PoseStamped &stamped, float scale, const std_msgs::ColorRGBA &color)
00227 {
00228   return makeMeshMarker( name, mesh_resource, stamped, scale, color, true);
00229 }
00230 
00231 visualization_msgs::InteractiveMarker makeButtonBox( const char *name, const geometry_msgs::PoseStamped &stamped, float scale, bool fixed, bool view_facing )
00232 {
00233   visualization_msgs::InteractiveMarker int_marker;
00234   int_marker.header =  stamped.header;
00235   int_marker.name = name;
00236   int_marker.scale = scale;
00237   int_marker.pose = stamped.pose;
00238   
00239 
00240   visualization_msgs::InteractiveMarkerControl &control = makeBoxControl(int_marker);
00241   
00242   control.always_visible = false;
00243   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00244 
00245   return int_marker;
00246 }
00247 
00248 visualization_msgs::InteractiveMarker makeButtonSphere( const char *name, const geometry_msgs::PoseStamped &stamped,
00249                                                         float scale, bool fixed, bool view_facing)
00250 {
00251   std_msgs::ColorRGBA color;
00252   return makeButtonSphere(name, stamped, scale, fixed, view_facing, color);
00253 }
00254 
00255 visualization_msgs::InteractiveMarker makeButtonSphere( const char *name, const geometry_msgs::PoseStamped &stamped,
00256                                                         float scale, bool fixed, bool view_facing,
00257                                                         std_msgs::ColorRGBA color)
00258 {
00259   visualization_msgs::InteractiveMarker int_marker;
00260   int_marker.header =  stamped.header;
00261   int_marker.name = name;
00262   int_marker.scale = scale;
00263   int_marker.pose = stamped.pose;
00264   
00265 
00266   visualization_msgs::InteractiveMarkerControl &control = makeSphereControl(int_marker);
00267   
00268   control.always_visible = false;
00269   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00270   control.markers.back().color = color;
00271 
00272   return int_marker;
00273 }
00274 
00275 visualization_msgs::InteractiveMarker makeListControl( const char *name, const geometry_msgs::PoseStamped &stamped, int num, int total, float scale)
00276 {
00277 
00278   visualization_msgs::InteractiveMarker int_marker;
00279   int_marker.header =  stamped.header;
00280   int_marker.name = name;
00281   int_marker.scale = scale;
00282   int_marker.pose = stamped.pose;
00283 
00284   visualization_msgs::InteractiveMarkerControl control;
00285 
00286 
00287   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00288   std::stringstream ss;
00289   ss << "pose(" << num << "/" << total << ")";
00290   interactive_markers::makeViewFacingButton(int_marker, control, ss.str());
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310   int_marker.controls.push_back(control);
00311 
00312   return int_marker;
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 }
00329 
00330 visualization_msgs::InteractiveMarker make6DofMarker( const char *name, const geometry_msgs::PoseStamped &stamped, float scale, bool fixed, bool view_facing )
00331 {
00332   visualization_msgs::InteractiveMarker int_marker;
00333   int_marker.header =  stamped.header;
00334   int_marker.name = name;
00335   int_marker.scale = scale;
00336   int_marker.pose = stamped.pose;
00337 
00338   if ( view_facing )
00339   {
00340     visualization_msgs::InteractiveMarkerControl control;
00341     control.orientation_mode = visualization_msgs::InteractiveMarkerControl::VIEW_FACING;
00342     
00343     control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
00344     control.orientation.w = 1;
00345     int_marker.controls.push_back(control);
00346 
00347     control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_PLANE;
00348     control.markers.push_back( makeSphere(scale*0.5) );
00349     int_marker.controls.push_back(control);
00350   }
00351   else
00352   {
00353     add6DofControl(int_marker, fixed);
00354   }
00355 
00356   return int_marker;
00357 }
00358 
00359 visualization_msgs::InteractiveMarker makePlanarMarker( const char *name, const geometry_msgs::PoseStamped &stamped, float scale, bool fixed )
00360 {
00361   visualization_msgs::InteractiveMarker int_marker;
00362   int_marker.header =  stamped.header;
00363   int_marker.name = name;
00364   int_marker.scale = scale;
00365   int_marker.pose = stamped.pose;
00366 
00367   visualization_msgs::InteractiveMarkerControl control;
00368   control.orientation_mode = fixed ? (uint8_t)visualization_msgs::InteractiveMarkerControl::FIXED : (uint8_t)visualization_msgs::InteractiveMarkerControl::INHERIT;
00369   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_ROTATE;
00370   control.orientation.w = 1;
00371   control.orientation.x = 0;
00372   control.orientation.y = 1;
00373   control.orientation.z = 0;
00374   int_marker.controls.push_back(control);
00375 
00376   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_PLANE;
00377   interactive_markers::makeArrow( int_marker, control, 0 );
00378   control.markers.back().pose.orientation.w = 0;
00379   control.markers.back().pose.orientation.x = 0;
00380   control.markers.back().pose.orientation.y = 1;
00381   control.markers.back().pose.orientation.z = 0;
00382   control.markers.back().color.r = 0.0;
00383   control.markers.back().color.g = 1.0;
00384   control.markers.back().color.b = 0.0;
00385   int_marker.controls.push_back(control);
00386 
00387   return int_marker;
00388 }
00389 
00390 visualization_msgs::InteractiveMarker makeElevatorMarker( const char *name, const geometry_msgs::PoseStamped &stamped, float scale, bool fixed)
00391 {
00392   visualization_msgs::InteractiveMarker int_marker;
00393   int_marker.header =  stamped.header;
00394   int_marker.name = name;
00395   int_marker.scale = scale;
00396   int_marker.pose = stamped.pose;
00397 
00398   visualization_msgs::InteractiveMarkerControl control;
00399 
00400   if(fixed)
00401     control.orientation_mode = visualization_msgs::InteractiveMarkerControl::FIXED;
00402 
00403   control.orientation.w = 1;
00404   control.orientation.x = 0;
00405   control.orientation.y = -1;
00406   control.orientation.z = 0;
00407   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00408 
00409   interactive_markers::makeArrow( int_marker, control, 0.3 );
00410   control.markers.back().color.r = 0.0;
00411   control.markers.back().color.g = 1.0;
00412   control.markers.back().color.b = 0.0;
00413   control.name = "up";
00414   int_marker.controls.push_back(control);
00415 
00416   control.markers.clear();
00417   interactive_markers::makeArrow( int_marker, control, -0.3 );
00418   control.markers.back().color.r = 1.0;
00419   control.markers.back().color.g = 0.0;
00420   control.markers.back().color.b = 0.0;
00421   control.name = "down";
00422   int_marker.controls.push_back(control);
00423 
00424   return int_marker;
00425 }
00426 
00427 visualization_msgs::InteractiveMarker makeProjectorMarker( const char *name, const geometry_msgs::PoseStamped &stamped, float scale)
00428 {
00429   visualization_msgs::InteractiveMarker int_marker;
00430   int_marker.header =  stamped.header;
00431   int_marker.name = name;
00432   int_marker.scale = scale;
00433   int_marker.pose = stamped.pose;
00434 
00435   visualization_msgs::InteractiveMarkerControl control;
00436   control.orientation.w = 1;
00437   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00438   visualization_msgs::Marker marker;
00439   marker.type = visualization_msgs::Marker::CYLINDER;
00440   marker.scale.x = 0.03;
00441   marker.scale.y = 0.03;
00442   marker.scale.z = 0.04;
00443   marker.color.r = 1.0;
00444   marker.color.a = 0.8;
00445   control.markers.push_back(marker);
00446   int_marker.controls.push_back(control);
00447 
00448   return int_marker;
00449 }
00450 
00451 
00452 visualization_msgs::InteractiveMarker makeBaseMarker( const char *name, const geometry_msgs::PoseStamped &stamped, float scale, bool fixed)
00453 {
00454   visualization_msgs::InteractiveMarker int_marker;
00455   int_marker.header =  stamped.header;
00456   int_marker.name = name;
00457   int_marker.scale = scale;
00458   int_marker.pose = stamped.pose;
00459 
00460   visualization_msgs::InteractiveMarkerControl control;
00461 
00462   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
00463   control.orientation.w = 1;
00464   control.orientation.y = -1;
00465   int_marker.controls.push_back(control);
00466 
00467 
00468   if(fixed)
00469     control.orientation_mode = visualization_msgs::InteractiveMarkerControl::FIXED;
00470 
00471   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00472   control.orientation.w = 1;
00473   control.orientation.y = 0;
00474 
00475   control.markers.clear();
00476   interactive_markers::makeArrow( int_marker, control, 0.9 );
00477   control.markers.back().color.r = 1.0;
00478   control.markers.back().color.g = 0.0;
00479   control.markers.back().color.b = 0.0;
00480   control.name = "forward";
00481   int_marker.controls.push_back(control);
00482 
00483   control.markers.clear();
00484   interactive_markers::makeArrow( int_marker, control, -0.9 );
00485   control.markers.back().color.r = 1.0;
00486   control.markers.back().color.g = 0.0;
00487   control.markers.back().color.b = 0.0;
00488   control.name = "back";
00489   int_marker.controls.push_back(control);
00490 
00491   control.orientation.z = 1;
00492   control.markers.clear();
00493   interactive_markers::makeArrow( int_marker, control, 0.9 );
00494   control.markers.back().color.r = 1.0;
00495   control.markers.back().color.g = 0.0;
00496   control.markers.back().color.b = 0.0;
00497   control.name = "left";
00498   int_marker.controls.push_back(control);
00499 
00500   control.markers.clear();
00501   interactive_markers::makeArrow( int_marker, control, -0.9 );
00502   control.markers.back().color.r = 1.0;
00503   control.markers.back().color.g = 0.0;
00504   control.markers.back().color.b = 0.0;
00505   control.name = "right";
00506   int_marker.controls.push_back(control);
00507 
00508   control.markers.clear();
00509   tf::quaternionTFToMsg( tf::Quaternion(tf::Vector3(0,0,1), 135*M_PI/180.0), control.orientation);
00510   interactive_markers::makeArrow( int_marker, control, 1.0 );
00511   control.markers.back().pose.position.x = 0.7;
00512   control.markers.back().color.r = 1.0;
00513   control.markers.back().color.g = 1.0;
00514   control.markers.back().color.b = 0.0;
00515   control.name = "rotate left";
00516   int_marker.controls.push_back(control);
00517 
00518   control.markers.clear();
00519   tf::quaternionTFToMsg( tf::Quaternion(tf::Vector3(0,0,1), -135*M_PI/180.0), control.orientation);
00520   interactive_markers::makeArrow( int_marker, control, 1.0 );
00521   control.markers.back().pose.position.x = 0.7;
00522   control.markers.back().color.r = 1.0;
00523   control.markers.back().color.g = 1.0;
00524   control.markers.back().color.b = 0.0;
00525   control.name = "rotate right";
00526   int_marker.controls.push_back(control);
00527   return int_marker;
00528 }
00529 
00530 visualization_msgs::InteractiveMarker makeGripperMarker( const char *name, const geometry_msgs::PoseStamped &stamped,
00531                                                          float scale, float angle, bool view_facing)
00532 {
00533   std_msgs::ColorRGBA color;
00534   return makeGripperMarker( name, stamped, scale, angle, view_facing, color, false);
00535 }
00536 
00537 visualization_msgs::InteractiveMarker makeGripperMarker( const char *name, const geometry_msgs::PoseStamped &stamped,
00538                                                          float scale, float angle, bool view_facing, std_msgs::ColorRGBA color )
00539 {
00540   return makeGripperMarker( name, stamped, scale, angle, view_facing, color, true);
00541 }
00542 
00543 
00544 visualization_msgs::InteractiveMarker makeGripperMarker( const char *name, const geometry_msgs::PoseStamped &stamped,
00545                                                          float scale, float angle, bool view_facing, std_msgs::ColorRGBA color, bool use_color )
00546 {
00547   visualization_msgs::InteractiveMarker int_marker;
00548   int_marker.header =  stamped.header;
00549   int_marker.name = name;
00550   int_marker.scale = 1.0; 
00551   int_marker.pose = stamped.pose;
00552 
00553 
00554 
00555   visualization_msgs::InteractiveMarkerControl control;
00556 
00557   visualization_msgs::Marker mesh;
00558   mesh.mesh_use_embedded_materials = !use_color;
00559   mesh.type = visualization_msgs::Marker::MESH_RESOURCE;
00560   mesh.scale.x = scale;
00561   mesh.scale.y = scale;
00562   mesh.scale.z = scale;
00563   mesh.color = color;
00564 
00565   tf::Transform T1, T2;
00566   tf::Transform T_proximal, T_distal;
00567 
00568   T1.setOrigin(tf::Vector3(0.07691, 0.01, 0));
00569   T1.setRotation(tf::Quaternion(tf::Vector3(0,0,1),  angle));
00570   T2.setOrigin(tf::Vector3(0.09137, 0.00495, 0));
00571   T2.setRotation(tf::Quaternion(tf::Vector3(0,0,1), -angle));
00572   T_proximal = T1;
00573   T_distal = T1 * T2;
00574 
00575   mesh.mesh_resource = "package://pr2_description/meshes/gripper_v0/gripper_palm.dae";
00576   mesh.pose.orientation.w = 1;
00577   control.markers.push_back( mesh );
00578   mesh.mesh_resource = "package://pr2_description/meshes/gripper_v0/l_finger.dae";
00579   mesh.pose = object_manipulator::msg::createPoseMsg(T_proximal);
00580   control.markers.push_back( mesh );
00581   mesh.mesh_resource = "package://pr2_description/meshes/gripper_v0/l_finger_tip.dae";
00582   mesh.pose = object_manipulator::msg::createPoseMsg(T_distal);
00583   control.markers.push_back( mesh );
00584 
00585   T1.setOrigin(tf::Vector3(0.07691, -0.01, 0));
00586   T1.setRotation(tf::Quaternion(tf::Vector3(1,0,0), M_PI)*tf::Quaternion(tf::Vector3(0,0,1),  angle));
00587   T2.setOrigin(tf::Vector3(0.09137, 0.00495, 0));
00588   T2.setRotation(tf::Quaternion(tf::Vector3(0,0,1), -angle));
00589   T_proximal = T1;
00590   T_distal = T1 * T2;
00591 
00592   mesh.mesh_resource = "package://pr2_description/meshes/gripper_v0/l_finger.dae";
00593   mesh.pose = object_manipulator::msg::createPoseMsg(T_proximal);
00594   control.markers.push_back( mesh );
00595   mesh.mesh_resource = "package://pr2_description/meshes/gripper_v0/l_finger_tip.dae";
00596   mesh.pose = object_manipulator::msg::createPoseMsg(T_distal);
00597   control.markers.push_back( mesh );
00598 
00599   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00600   control.always_visible = true;
00601   int_marker.controls.push_back( control );
00602 
00603   return int_marker;
00604 }
00605 
00606 
00607 visualization_msgs::InteractiveMarker makeGraspMarker( const char * name, const geometry_msgs::PoseStamped &stamped, float scale, PoseState pose_state)
00608 {
00609   visualization_msgs::InteractiveMarker int_marker;
00610   int_marker.header =  stamped.header;
00611   int_marker.header.stamp = ros::Time(0);
00612   int_marker.name = name;
00613   int_marker.scale = scale;
00614   int_marker.pose = stamped.pose;
00615 
00616   visualization_msgs::InteractiveMarkerControl control;
00617   control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00618   control.orientation.w = 1;
00619   visualization_msgs::Marker marker;
00620   marker.type = visualization_msgs::Marker::ARROW;
00621   
00622   
00623   marker.scale.x = 0.025*scale;
00624   marker.scale.y = 0.0025*scale;
00625   marker.scale.z = 0.0025*scale;
00626   marker.color.r = 1.0;
00627   marker.color.a = 1.0;
00628   control.markers.push_back(marker);
00629   marker.type = visualization_msgs::Marker::CUBE;
00630   marker.scale.x = 0.015*scale;
00631   marker.scale.y = 0.04*scale;
00632   marker.scale.z = 0.015*scale;
00633   switch (pose_state)
00634   {
00635   case UNTESTED:
00636     marker.color.g = 0.5;
00637     marker.color.b = 0.5;
00638     marker.color.r = 0.5;
00639     break;
00640   case VALID:
00641     marker.color.g = 1.0;
00642     marker.color.r = 0.0;
00643     break;
00644   case INVALID:
00645     marker.color.g = 0.0;
00646     marker.color.r = 1.0;
00647     break;
00648   }
00649   control.markers.push_back(marker);
00650 
00651 
00652 
00653 
00654 
00655 
00656   int_marker.controls.push_back(control);
00657 
00658   return int_marker;
00659 }
00660 
00661 
00662 visualization_msgs::InteractiveMarker makePosedMultiMeshMarker( const char * name, const geometry_msgs::PoseStamped &stamped,
00663                                                                 const std::vector< geometry_msgs::PoseStamped> &mesh_poses,
00664                                                                 const std::vector<std::string> &mesh_paths, const float &scale,
00665                                                                 const bool button_only)
00666 {
00667     
00668     visualization_msgs::InteractiveMarker int_marker;
00669     int_marker.header =  stamped.header;
00670     int_marker.name = name;
00671     int_marker.scale = scale;
00672     int_marker.pose = stamped.pose;
00673 
00674     bool fixed = false;
00675     visualization_msgs::InteractiveMarkerControl control;
00676     if( !button_only )
00677     {
00678         control.orientation_mode = fixed ? (uint8_t)visualization_msgs::InteractiveMarkerControl::FIXED : (uint8_t)visualization_msgs::InteractiveMarkerControl::INHERIT;
00679         control.interaction_mode = visualization_msgs::InteractiveMarkerControl::ROTATE_AXIS;
00680         control.orientation.w = 1;
00681         control.orientation.x = 0;
00682         control.orientation.y = 1;
00683         control.orientation.z = 0;
00684         int_marker.controls.push_back(control);
00685     }
00686 
00687     control.markers.clear();
00688     control.interaction_mode = button_only ? (visualization_msgs::InteractiveMarkerControl::BUTTON) : (visualization_msgs::InteractiveMarkerControl::MOVE_PLANE);
00689     control.always_visible = true;
00690     for(size_t i = 0; i < mesh_poses.size(); i++)
00691     {
00692         visualization_msgs::Marker mesh;
00693         mesh.color = std_msgs::ColorRGBA();
00694         mesh.mesh_resource = mesh_paths[i];
00695         mesh.mesh_use_embedded_materials = true;
00696         mesh.type = visualization_msgs::Marker::MESH_RESOURCE;
00697         mesh.scale.x = mesh.scale.y = mesh.scale.z = scale;
00698         mesh.pose = mesh_poses[i].pose;
00699         control.markers.push_back( mesh );
00700     }
00701     int_marker.controls.push_back( control );
00702 
00703     return int_marker;
00704 
00705 }
00706 
00707 visualization_msgs::InteractiveMarker makeFollowerMultiMeshMarker( const char * name, const geometry_msgs::PoseStamped &stamped,
00708                                                                    const std::vector<std::string> &mesh_frames,
00709                                                                    const std::vector<std::string> &mesh_paths,
00710                                                                    const float &scale)
00711 {
00712     visualization_msgs::InteractiveMarker int_marker;
00713     int_marker.header =  stamped.header;
00714     int_marker.name = name;
00715     int_marker.scale = scale;
00716     int_marker.pose = stamped.pose;
00717 
00718     if(mesh_frames.size() != mesh_paths.size())
00719     {
00720       ROS_ERROR("The number of mesh frames and mesh paths is not equal!");
00721       return int_marker;
00722     }
00723 
00724     visualization_msgs::InteractiveMarkerControl control;
00725 
00726     control.markers.clear();
00727     control.interaction_mode = visualization_msgs::InteractiveMarkerControl::BUTTON;
00728     control.always_visible = true;
00729     for(size_t i = 0; i < mesh_frames.size(); i++)
00730     {
00731         visualization_msgs::Marker mesh;
00732         mesh.color = std_msgs::ColorRGBA();
00733         mesh.mesh_resource = mesh_paths[i];
00734         mesh.mesh_use_embedded_materials = true;
00735         mesh.type = visualization_msgs::Marker::MESH_RESOURCE;
00736         mesh.scale.x = mesh.scale.y = mesh.scale.z = scale;
00737         mesh.pose.orientation.w = 1;
00738         mesh.header.frame_id = mesh_frames[i];
00739         control.markers.push_back( mesh );
00740         mesh.frame_locked = true;
00741     }
00742     int_marker.controls.push_back( control );
00743 
00744     return int_marker;
00745 }
00746 
00747 }