New in Electric

Note: This tutorial assumes that you have completed the previous tutorials: ROS Tutorials.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

インタラクティブマーカ: シンプルなインタラクティブマーカサーバを書く

Description: このチュートリアルは、単一のインタラクティブマーカを管理する最も単純なサーバをどのように作るかを説明します

Tutorial Level: BEGINNER

Next Tutorial: Interactive Markers: Basic Controls

Contents

もし、previous tutorialに書いてあるようにinteractive_marker_tutorialsからのsimple_markerのサンプルを実行すると、RVizで以下のようなものが見えます。:

The simple_marker example showing in RViz

サーバノードによって提供された単一のインタラクティブマーカを表示します。矢印をクリックして、箱を動かします。他には、サーバノードがRVizのマーカの位置を変えるたびにマーカの現在位置を表示します。

これは、サーバノードのコードです。:

https://raw.github.com/ros-visualization/visualization_tutorials/hydro-devel/interactive_marker_tutorials/src/simple_marker.cpp

  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 }

ここで行われているのは以下のことです:

  • 位置を表示することでRVizからのフィードバックメッセージを管理するprocessFeedbackを定義します。

  • roscppを初期化します。
  • インタラクティブマーカサーバオブジェクトを作成します。
  • インタラクティブマーカを準備し、サーバコレクションに追加します。
  • ROSのメッセージループに入ります。

insertを呼ぶときは、サーバオブジェクトが内部で、待機リストに新しいマーカをプッシュするだけであることに注意してください。applyChangesをいったん呼ぶと、インタラクティブマーカの見ることのできるセットに追加し、すべての接続されたクライアントに送ります。

これですべてです。あなたはこれで次のチュートリアルに行く準備ができています。: Interactive Markers: Basic Controls.

Wiki: ja/rviz/Tutorials/Interactive Markers: Writing a Simple Interactive Marker Server (last edited 2014-12-05 17:07:35 by Moirai)