ros中和RVIZ交互显示的InteractiveMarker简单例子

cpp 复制代码
#include <ros/ros.h>
#include <visualization_msgs/InteractiveMarkerFeedback.h>
#include <interactive_markers/interactive_marker_server.h>
#include <sstream>  // 包含 stringstream

// 回调函数,用于处理用户的互动反馈
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节点
  ros::init(argc, argv, "multiple_markers");
  ros::NodeHandle n;

  // 创建一个交互式标记服务器
  interactive_markers::InteractiveMarkerServer server("multiple_markers");

  // 定义要创建的方块数量
  const int num_cubes = 3;

  // 为每个方块创建交互式标记
  for (int i = 0; i < num_cubes; ++i) {
    // 创建一个交互式标记
    visualization_msgs::InteractiveMarker int_marker;
    int_marker.header.frame_id = "base_link";
    std::stringstream ss;
    ss << "cube_" << i;
    int_marker.name = ss.str();
    int_marker.description = "Simple 3-DOF Control";

    // 设置方块的位置
    int_marker.pose.position.x = i * 1.0;  // 沿X轴放置方块
    int_marker.pose.orientation.w = 1.0;

    // 创建一个灰色立方体作为可视化元素
    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;

    // 创建一个总是可见的控制项,包含上面的立方体
    visualization_msgs::InteractiveMarkerControl box_control;
    box_control.always_visible = true;
    box_control.markers.push_back(box_marker);

    // 将控制项添加到交互式标记
    int_marker.controls.push_back(box_control);

    // 创建三个可以沿X、Y、Z轴移动的控制项
    for (int j = 0; j < 3; ++j) {
      visualization_msgs::InteractiveMarkerControl control;
      control.orientation.w = 1;
      control.orientation.x = 0;
      control.orientation.y = 0;
      control.orientation.z = 0;

      // 使用 stringstream 来格式化名称
      std::stringstream ss_control;
      ss_control << "move_" << j;
      control.name = ss_control.str();

      control.interaction_mode = visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;
      if (j == 0) {
        control.orientation.y = 1;
        control.orientation.w = 0;
      } else if (j == 1) {
        control.orientation.z = 1;
        control.orientation.w = 0;
      }
      int_marker.controls.push_back(control);
    }

    // 将交互式标记插入服务器,并设置回调函数
    server.insert(int_marker, &processFeedback);
  }

  // 应用更改
  server.applyChanges();

  // 进入主循环
  ros::spin();

  return 0;
}

visualization_msgs::InteractiveMarker int_marker;controls里都是InteractiveMarkerControl 对象,其中InteractiveMarkerControl 可以添加若干Marker(若干静态元素,默认是静态)如box_control,也添加可以是控制方式如:control。

通常:一个int_marker里添加若干个InteractiveMarkerControl,其中一个InteractiveMarkerControl添加Maker定义物体尺寸,其余若干个InteractiveMarkerControl表示对这个物体的控制。 然后在将int_marker添加到交互服务server.insert(int_marker, &processFeedback);

若:int_marker里有多个Maker,则表示对这多个物体一起控制

若:想添加两个不同的物体独立控制,则向server.insert两个InteractiveMarker即可

相关推荐
格调UI成品41 分钟前
从混乱到秩序:探索管理系统如何彻底改变工作流程
信息可视化·交互
qwertyuiop_i1 小时前
pe文件结构(TLS)
c++·tls·pe文件结构
岁忧1 小时前
(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
java·c++·算法·leetcode·职场和发展·go
无敌的小笼包2 小时前
第四讲:类和对象(下)
数据结构·c++
鑫鑫向栄2 小时前
[蓝桥杯]解谜游戏
数据结构·c++·算法·职场和发展·蓝桥杯
闻缺陷则喜何志丹3 小时前
【分治法 容斥原理 矩阵快速幂】P6692 出生点|普及+
c++·线性代数·数学·洛谷·容斥原理·分治法·矩阵快速幂
鑫鑫向栄3 小时前
[蓝桥杯]整理玩具
数据结构·c++·算法·蓝桥杯·动态规划
行云流水剑13 小时前
【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools
人工智能·学习·交互
南郁13 小时前
007-nlohmann/json 项目应用-C++开源库108杰
c++·开源·json·nlohmann·现代c++·d2school·108杰
菠萝0115 小时前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法