RViz学习笔记(五) - 交互式marker:写一个简单的交互式Marker服务

1 教程上的simple_marker解析

官方教程越写越不走心了
前面的教程,运行例子simple_marker,就是下面这个:

RViz学习笔记(五) - 交互式marker:写一个简单的交互式Marker服务_第1张图片
simple_marker

这个就像看起来一样简单,在你移动它时,还能在服务窗口看到它返回的位置信息:

the current position of the marker

下面是源码:

#include 

#include 

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.header.stamp=ros::Time::now();
  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();
}

这段程序主要做了以下事:

  • 定义了一个函数processFeedback ,它用来处理来自RViz的反馈消息,把它们打印出来。
  • 初始化roscpp
  • 创建一个交互式Marker 服务对象
  • 设置交互式Marker并且把它添加到服务
  • 进入ROS消息循环
    程序里也有比较详尽的注释。

你可能感兴趣的:(RViz学习笔记(五) - 交互式marker:写一个简单的交互式Marker服务)