New in Electric
| Note: This tutorial assumes that you have completed the previous tutorials: ROS Tutorials. |
Interactive Markers: Writing a Simple Interactive Marker Server
Description: This tutorial explains how to setup a minimalist server which manages a single interactive marker.Tutorial Level: BEGINNER
Next Tutorial: Interactive Markers: Basic Controls
Contents
If you run the simple_marker example from interactive_marker_tutorials as described in the previous tutorial, you will see this in RViz:
It shows the single interactive marker provided by the server node. Click on the arrow to move the box. What you will also see is that the server node prints out the current position of the marker each time you change it in RViz.
This is the code of the server node:
96 #include <ros/ros.h>
97
98 #include <interactive_markers/interactive_marker_server.h>
99
100 void processFeedback(
101 const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
102 {
103 ROS_INFO_STREAM( feedback->marker_name << " is now at "
104 << feedback->pose.position.x << ", " << feedback->pose.position.y
105 << ", " << feedback->pose.position.z );
106 }
107
108 int main(int argc, char** argv)
109 {
110 ros::init(argc, argv, "simple_marker");
111
112 // create an interactive marker server on the topic namespace simple_marker
113 interactive_markers::InteractiveMarkerServer server("simple_marker");
114
115 // create an interactive marker for our server
116 visualization_msgs::InteractiveMarker int_marker;
117 int_marker.header.frame_id = "/base_link";
118 int_marker.name = "my_marker";
119 int_marker.description = "Simple 1-DOF Control";
120
121 // create a grey box marker
122 visualization_msgs::Marker box_marker;
123 box_marker.type = visualization_msgs::Marker::CUBE;
124 box_marker.scale.x = 0.45;
125 box_marker.scale.y = 0.45;
126 box_marker.scale.z = 0.45;
127 box_marker.color.r = 0.5;
128 box_marker.color.g = 0.5;
129 box_marker.color.b = 0.5;
130 box_marker.color.a = 1.0;
131
132 // create a non-interactive control which contains the box
133 visualization_msgs::InteractiveMarkerControl box_control;
134 box_control.always_visible = true;
135 box_control.markers.push_back( box_marker );
136
137 // add the control to the interactive marker
138 int_marker.controls.push_back( box_control );
139
140 // create a control which will move the box
141 // this control does not contain any markers,
142 // which will cause RViz to insert two arrows
143 visualization_msgs::InteractiveMarkerControl rotate_control;
144 rotate_control.name = "move_x";
145 rotate_control.interaction_mode =
146 visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;
147
148 // add the control to the interactive marker
149 int_marker.controls.push_back(rotate_control);
150
151 // add the interactive marker to our collection &
152 // tell the server to call processFeedback() when feedback arrives for it
153 server.insert(int_marker, &processFeedback);
154
155 // 'commit' changes and send to all clients
156 server.applyChanges();
157
158 // start the ROS main loop
159 ros::spin();
160 }
What this does is the following:
Define a function processFeedback which handles feedback messages from RViz by printing out the position.
- Initialize roscpp.
- Create an interactive marker server object.
- Setup the interactive marker and add it to the server's collection.
- Enter the ROS message loop.
Note that when calling insert, the server object will internally only push the new marker onto a waiting list. Once you call applyChanges, it will incorporate it into it's publicly visible set of interactive markers and send it to all connected clients.
That's all there is. You are now ready to go on to the next tutorial: Interactive Markers: Basic Controls.






