ROS学习笔记(十八):rviz之Markers: Sending Basic Shapes (C++)

  • 显示如何使用visualization_msgs / Marker消息将基本形状(立方体,球体,圆柱体,箭头)发送到rviz。

1.Intro

与其他显示不同,“标记显示”使您可以在rviz中可视化数据,而rviz不了解有关解释该数据的任何信息。 相反,原始对象是通过visualization_msgs / Marker消息发送到显示器的,该消息使您可以显示箭头,框,球和线之类的内容。

本教程将向您展示如何发送四个基本形状(盒子,球体,圆柱体和箭头)。 我们将创建一个程序,该程序每秒发送一个新标记,用不同的形状替换最后一个标记。

注意:rviz_visual_tools软件包为C ++用户提供了便利功能。

2.Create a Package

在开始之前,让我们在包路径中的某个位置创建一个名为using_markers的包:

catkin_create_pkg using_markers roscpp visualization_msgs

3.Sending Markers

3.1 The Code
将以下内容粘贴到src / basic_shapes.cpp中:

切换行号显示

  30 #include <ros/ros.h>
  31 #include <visualization_msgs/Marker.h>
  32 
  33 int main( int argc, char** argv )
  34 {
  35   ros::init(argc, argv, "basic_shapes");
  36   ros::NodeHandle n;
  37   ros::Rate r(1);
  38   ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>("visualization_marker", 1);
  39 
  40   // Set our initial shape type to be a cube
  41   uint32_t shape = visualization_msgs::Marker::CUBE;
  42 
  43   while (ros::ok())
  44   {
  45     visualization_msgs::Marker marker;
  46     // Set the frame ID and timestamp.  See the TF tutorials for information on these.
  47     marker.header.frame_id = "/my_frame";
  48     marker.header.stamp = ros::Time::now();
  49 
  50     // Set the namespace and id for this marker.  This serves to create a unique ID
  51     // Any marker sent with the same namespace and id will overwrite the old one
  52     marker.ns = "basic_shapes";
  53     marker.id = 0;
  54 
  55     // Set the marker type.  Initially this is CUBE, and cycles between that and SPHERE, ARROW, and CYLINDER
  56     marker.type = shape;
  57 
  58     // Set the marker action.  Options are ADD, DELETE, and new in ROS Indigo: 3 (DELETEALL)
  59     marker.action = visualization_msgs::Marker::ADD;
  60 
  61     // Set the pose of the marker.  This is a full 6DOF pose relative to the frame/time specified in the header
  62     marker.pose.position.x = 0;
  63     marker.pose.position.y = 0;
  64     marker.pose.position.z = 0;
  65     marker.pose.orientation.x = 0.0;
  66     marker.pose.orientation.y = 0.0;
  67     marker.pose.orientation.z = 0.0;
  68     marker.pose.orientation.w = 1.0;
  69 
  70     // Set the scale of the marker -- 1x1x1 here means 1m on a side
  71     marker.scale.x = 1.0;
  72     marker.scale.y = 1.0;
  73     marker.scale.z = 1.0;
  74 
  75     // Set the color -- be sure to set alpha to something non-zero!
  76     marker.color.r = 0.0f;
  77     marker.color.g = 1.0f;
  78     marker.color.b = 0.0f;
  79     marker.color.a = 1.0;
  80 
  81     marker.lifetime = ros::Duration();
  82 
  83     // Publish the marker
  84     while (marker_pub.getNumSubscribers() < 1)
  85     {
  86       if (!ros::ok())
  87       {
  88         return 0;
  89       }
  90       ROS_WARN_ONCE("Please create a subscriber to the marker");
  91       sleep(1);
  92     }
  93     marker_pub.publish(marker);
  94 
  95     // Cycle between different shapes
  96     switch (shape)
  97     {
  98     case visualization_msgs::Marker::CUBE:
  99       shape = visualization_msgs::Marker::SPHERE;
 100       break;
 101     case visualization_msgs::Marker::SPHERE:
 102       shape = visualization_msgs::Marker::ARROW;
 103       break;
 104     case visualization_msgs::Marker::ARROW:
 105       shape = visualization_msgs::Marker::CYLINDER;
 106       break;
 107     case visualization_msgs::Marker::CYLINDER:
 108       shape = visualization_msgs::Marker::CUBE;
 109       break;
 110     }
 111 
 112     r.sleep();
 113   }
 114 }

现在,在using_markers包中编辑CMakeLists.txt文件,并添加:

add_executable(basic_shapes src/basic_shapes.cpp)
target_link_libraries(basic_shapes ${catkin_LIBRARIES})

3.3 Building the Code
您应该能够使用以下代码构建代码:

$ cd %TOP_DIR_YOUR_CATKIN_WORKSPACE%
$ catkin_make

3.4 Running the Code

rosrun using_markers basic_shapes

4.Viewing the Markers

Now,run rviz;

rosrun using_markers basic_shapes
rosrun rviz rviz

如果您以前从未使用过rviz,请参阅《用户指南》以开始使用。

因为我们没有任何tf转换设置,所以要做的第一件事是将固定帧设置为将标记设置为/ my_frame的帧。 为此,请将“固定帧”字段设置为“ / my_frame”。

接下来添加标记显示。 请注意,指定的默认主题“ visualization_marker”与正在发布的主题相同。

现在,您应该在原点看到一个每秒都会改变形状的标记:
在这里插入图片描述

热门文章

暂无图片
编程学习 ·

创新实训(10)-提取式文本摘要之bert聚类

创新实训(10)-提取式文本摘要之bert聚类 1. 思路 使用bert作为预训练模型,利用bert生成的词向量进行下游任务的处理,在这篇论文中使用的是k-means计算词向量分布的重心作为文本摘要的候选句子。可以看作是聚类的一种形式。 2.代码分析 基于Pytorch的Transformers框架,使用预…
暂无图片
编程学习 ·

算法复杂度评价指标(大o表示法)

大O表示法(1)常见的大o数量级函数(2)其他算法复杂度表示法 基本操作数量函数T(n)的精确值并不是特别重要,重要的是Tn(n)中起决定性因素的主导部分。用动态的眼光看,就是当问题规模增大的时候,T(n)中的一些部分会盖过其他部分的贡献。 数量级函数描述了T(n)中随着n增加而…
暂无图片
编程学习 ·

文献管理之 Citavi & Latex

文章目录为什么选择Citavi安装地址使用指南不足之处官方文档 为什么选择Citavi 比较好的文献管理软件主要有Citavi、Endnote、Mendeley、Zotero,根据Citavi、Endnote、Mendeley 功能大比拼!到底哪一款才是众望所归的终极文献管理软件?总结,Citavi不仅是个免费的软件,而且功…
暂无图片
编程学习 ·

LeetCode题解(0744):寻找比目标字母大的最小字母(Python)

题目:原题链接(简单)解法 时间复杂度 空间复杂度 执行用时Ans 1 (Python) O(logN)O(logN)O(logN) O(1)O(1)O(1) 136ms (69.15%)Ans 2 (Python) O(logN)O(logN)O(logN) O(1)O(1)O(1) 136ms (69.15%)Ans 3 (Python)LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,…
暂无图片
编程学习 ·

自增自减及逗号表达式

** 自增自减及逗号表达式 **一.自增、自减运算符1.自增运算符++和自减运算符–都是单目运算符,功能是使变量的值加1或减1。 2.自加或自减只能用于变量,而不能用于常量或表达式。 3.用于++、–运算的变量只能是整型、字符型和指针型变量运行下面的程序,观察并分析运算规则#in…
暂无图片
编程学习 ·

现代化程序开发笔记(13)——Git与Monorepo

本系列文章以我的个人博客的搭建为线索(GitHub 仓库:Evian-Zhang/evian-blog),记录我在现代化程序设计中的一些笔记。在这篇文章中,我将简要介绍代码版本管理利器Git,同时谈一谈Monorepo的工作方式。 代码版本管理工具 作为开发者,我们通常会遇到两种写代码的场景:一种…
暂无图片
编程学习 ·

HCIP-RS-H12-221题库以及解析(部分)

不定期更新题库和解析,原题库不包含解析,解析有错误或不对的地方欢迎评论指正 1.由于属性AS-path不能在AS内起作用,所以规定BGP路由器不会宣告任何从IBGP对等体来的更新信息给其对等体 (√) 2.通过重发布命令注入BGP的路由,其orgin的属性为incomplete (√) 3.自制系统…
暂无图片
编程学习 ·

面试题:从 URL 在浏览器被输入到页面展现的过程中发生了什么?

曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?要搞懂这个问题,我…
暂无图片
编程学习 ·

云服务器与物理服务器哪一种更适合企业应用部署?

云服务器与物理服务器哪一种更适合企业应用部署呢? 全球企业早已意识到利用高端技术来提高工作效率并获得竞争优势。从目前的舆论方向来看,部分企业的转型主要围绕着如何将旧系统和应用迁移到“云”。而选用“云”的原因,是因为它的可伸缩性,高效率和高可用性。然而,有些人…
暂无图片
编程学习 ·

单调栈解决Next Greater Number一类题

单调栈是什么? 单调栈使得每次新元素入栈后,栈内元素都保持有序(单调递增或者单调递减)。 单调递增栈:栈中数据出栈的序列为单调递增序列。 单调递减栈:栈中数据出栈的序列为单调递减序列。 注意:这里所说的递增递减是出栈的顺序,不是栈中数据的顺序。 单调栈的应用 通…
暂无图片
编程学习 ·

springboot 整合xcf 发布 webservice

Spring Boot集成webService在pom添加依赖<!--WerbService CXF依赖 start--> <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId> </dependency> <dependency><groupId>org.…
暂无图片
编程学习 ·

Java从小白到老白学习笔计【一】

命令提示符(cmd) 启动 win + r 切换盘符 盘符名称: 进入文件夹 cd 文件夹名称 进入多级文件夹 cd 文件夹1\文件夹2\文件夹3 返回上一级 cd… 直接回根路径 cd 查看当前内容 dir 清屏 cls 退出 exit String 首字母大写,不是关键字 加号代表字符串的连接操作 任何…
暂无图片
编程学习 ·

CMMI 2.0 和 1.3

CMMI2.0与1.3在组织形式区别很大,很多PA和之前的不太一样了,而且PA在2.0中叫实践域,1.3中叫过程域。不过其实核心内容没有大的变化,只是相关内容的位置进行了调整,部分描述进行了优化。目前是过渡阶段,2.0和1.3都可以评估,但截止日期之后就只适用2.0了。1.3评估的截止日…
暂无图片
编程学习 ·

小程序全局socket使用 并自定义发送心跳

//app.js App({globalData: {userInfo: nullsocketUrl:"wss:.....",//socketUrl//延迟timeout: 10000,socketHeartTimer: null,//socket连接回调函数callback: function () {},//socket连接定时器socketClientTimer: null,//当前socket是否连接isSocketConnect: fals…
暂无图片
编程学习 ·

CUDA学习(四):cudaMalloc、cudaMemcpy和cudaFree函数

文章目录一、cudaMalloc、cudaMemcpy和cudaFree 介绍二、第一个例子,实现GPU端的加法 可以像调用C函数那样将参数传递给核函数 当设备执行任何有用的操作时,都需要分配内存,例如将计算机返回给主机。 一、cudaMalloc、cudaMemcpy和cudaFree 介绍 内存空间开辟、内存复制和内…
暂无图片
编程学习 ·

git用法备份

git远程仓库创建本地仓库ssh加密创建远程仓库 创建本地仓库 在命令行输入以下内容: $ mkdir gitstore $ cd gitstore $ git init Initialized empty Git repository in C:/Users/15665/gitstore/.git/我们可以看到gitstore目录下多了一个.git目录,证明创建成功。接下来在gits…
暂无图片
编程学习 ·

wx.DateTime.ParseDate(‘yesterday‘)往前倒退一天

用wxpython写了个小程序,打开程序后要把工作日期往前倒退一天,看wx.DateTime的说明时,发现这个控件有强大的自动分析功能。官方原文如下:The date formatting and parsing functions convert wx.DateTime objects to and from text. The conversions to text are mostly tr…