2012年11月19日月曜日

Interactive Markersを使おう(2):作って仕組みを理解する

では引き続きInteractive Markersです。

今回は簡単なサンプルを書いて、仕組みを理解しましょう。

http://www.ros.org/wiki/rviz/Tutorials/Interactive%20Markers%3A%20Writing%20a%20Simple%20Interactive%20Marker%20Server


roscreate-pkg im_tutorials roscpp interactive_markers
cd im_tutorials
以下をsrc/simple_marker.cppとして保存。


#include <ros/ros.h>

#include <interactive_markers/interactive_marker_server.h>

void processFeedback(
    const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
{
  ROS_INFO_STREAM( feedback->marker_name << " is now at "
      << feedback->pose.position.x << ", " << feedback->pose.position.y
      << ", " << feedback->pose.position.z );
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "simple_marker");

  // create an interactive marker server on the topic namespace simple_marker
  interactive_markers::InteractiveMarkerServer server("simple_marker");

  // create an interactive marker for our server
  visualization_msgs::InteractiveMarker int_marker;
  int_marker.header.frame_id = "/base_link";
  int_marker.name = "my_marker";
  int_marker.description = "Simple 1-DOF Control";

  // create a grey box marker
  visualization_msgs::Marker box_marker;
  box_marker.type = visualization_msgs::Marker::CUBE;
  box_marker.scale.x = 0.45;
  box_marker.scale.y = 0.45;
  box_marker.scale.z = 0.45;
  box_marker.color.r = 0.5;
  box_marker.color.g = 0.5;
  box_marker.color.b = 0.5;
  box_marker.color.a = 1.0;

  // create a non-interactive control which contains the box
  visualization_msgs::InteractiveMarkerControl box_control;
  box_control.always_visible = true;
  box_control.markers.push_back( box_marker );

  // add the control to the interactive marker
  int_marker.controls.push_back( box_control );

  // create a control which will move the box
  // this control does not contain any markers,
  // which will cause RViz to insert two arrows
  visualization_msgs::InteractiveMarkerControl rotate_control;
  rotate_control.name = "move_x";
  rotate_control.interaction_mode =
      visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;

  // add the control to the interactive marker
  int_marker.controls.push_back(rotate_control);

  // add the interactive marker to our collection &
  // tell the server to call processFeedback() when feedback arrives for it
  server.insert(int_marker, &processFeedback);

  // 'commit' changes and send to all clients
  server.applyChanges();

  // start the ROS main loop
  ros::spin();
}



CMakeLists.txtに


rosbuild_add_executable(simple_marker src/simple_marker.cpp)

を追加。

で、
make
bin/simple_marker

roscore

rosrun rviz rviz

前回のチュートリアルでやった、Interactive MarkersのUpdate Topicを/simple_marker/updateにセット。
で、トップメニューのInteractを選択すると以下のように矢印が出るはず。


矢印をドラッグするとマーカーが動いて、コンソールにメッセージが出ます。

visualization_msgs::InteractiveMarkerControl::MOVE_AXISをvisualization_msgs::InteractiveMarkerControl::ROTATE_AXISに変えて、コンパイル&実行してみましょう。

矢印が輪っかに変わりました。


ここでソースをおさらいします。
やっていることは、
  • InteractiveMarkerServerを作る
  • InteractiveMarkerを作り、そこにMarker(見た目)とコントローラをセットする
  • InteractiveMarkerをInteractiveMarkerServerにコールバックと共に登録する。
コールバックにはvisualization_msgs::InteractiveMarkerFeedbackConstPtrが渡されるのでこれを使ってやりたいことを実現する。コールバックにはboost::functionが渡せるようです。

0 件のコメント:

コメントを投稿

コメントを投稿