ROS1和ROS2 RVIZ 代码详解

目录

    • ROS1和ROS2 RVIZ 代码详解
  • 1、 头文件
  • 2、创建对象
  • 3、DELETEALL 操作,防止重影
  • 4、坐标系、时间戳、命名空间、id、生命周期
  • 5、类型和操作
  • 6、位姿
  • 7、尺寸大小
  • 8、颜色设置
  • 9、LINE_STRIP/LINE_LIST的形点集marker.points
  • 10、文字marker设置显示内容

参考wiki.ros.org的教材: http://wiki.ros.org/rviz/Tutorials/Markers%3A%20Basic%20Shapes

1、 头文件

ros1, 不用include 头文件 geometry_msgs/Point.h, 但是依赖了geometry_msgs功能包

#include <ros/ros.h>
//单独一个marker的头文件
#include <visualization_msgs/Marker.h>
//marker vector的头文件
#include <visualization_msgs/MarkerArray.h>

ros2

#include <rclcpp/rclcpp.hpp>
//单独一个marker的头文件
#include <visualization_msgs/msg/marker.hpp>
//marker vector的头文件
#include <visualization_msgs/msg/marker_array.hpp>
//形点的头文件
#include <geometry_msgs/msg/point.hpp>

2、创建对象

visualization_msgs::MarkerArray markerArray;
visualization_msgs::Marker marker;
geometry_msgs::Point pt;
markerArray.markers.reserve(n);//根据需求确定n的值

3、DELETEALL 操作,防止重影

marker.action=visualization_msgs::Marker::DELETEALL;
markerArray.markers.emplace_back(marker);

DELETEALL 操作是在ROS Indigo版本中新增加的,用来删除某个topic前一周期中的所有的Marker显示,所以一般在MarkerArray的第一个元素就push这个marker_delete。注意删除的是所有的,无论namespace 和id是多少。action设置了这个操作后不需要设置其他参数,

4、坐标系、时间戳、命名空间、id、生命周期

//选择系统自带的基础坐标系marker.frame_id="base_link";//ros1的获取方式ros::Time::now()//ros2的获取方式 node.get_clock()->now()marker.header.stamp=ros::Time::now();//生命周期,ROS1时间段函数ros::Duration(1),单位秒//ROS2时间段函数rclcpp::Duration::from_nanoseconds(1*10^9),单位纳秒marker.lifetime = ros::Duration();//这里没有设置时间参数,表示无限长,系统不会自动删除。//命名空间marker.ns="hdmap_lines";//idmarker.id=0;

注意:

  1. 若rviz收到相同命名空间和id的marker,会覆盖掉之前的marker,所以若不是同一个marker,需要保证命名空间和id不能都相同。
  2. 若markerArray第一个元素操作的是DELETEALL,那么其他元素可以设置生命周期无限长,也就是系统不会自己删除,当收到新的消息时就会自动删除这个topoic之前的全部显示。

5、类型和操作

//类型
marker.type=visualization_msgs::Marker::LINE_STRIP;//操作:ADD,DELETE,DELETEALL,一共三种
marker.action=visualization_msgs::Marker::ADD;

类型有:LINE_STRIP 实线、 LINE_LIST 虚线 CUBE 圆柱体、 ARROW 箭头、CYLINDER SPHERE、TEXT_VIEW_FACING文字
注意:

  1. 实线最少需要两个点,因为一个点无法确定一条线的,没有方向。一个点时RVIZ会报ERROR,但是不影响显示。
  2. 虚线必须是偶数个点,否则会报错,但是不影响显示。这是因为虚线的一个线段是两个点连起来的,所以必须是偶数。
  3. 文字显示、圆柱体之类需要设置marker.pose ,见标题6,不需要往marker.points里面push点。相反实线和虚线不用设置pose,但是需要push point。

操作:ADD,DELETE,DELETEALL
注意:DELETEALL是用来删除一个topic中所有的marker,DELETE是删除指定命名空间和id的marker.

6、位姿

    //位置marker.pose.position.x = 0;marker.pose.position.y = 0;marker.pose.position.z = 0;//朝向marker.pose.orientation.x = 0.0;marker.pose.orientation.y = 0.0;marker.pose.orientation.z = 0.0;marker.pose.orientation.w = 1.0;//一般是1

注意:

  1. 文字显示、圆柱体之类需要设置marker.pose ,见标题6,不需要往marker.points里面push点。相反实线和虚线不用设置pose,但是需要push point;
  2. 对于车道线,文字显示之类,朝向一般只设置w,值为1,其它若是0,可以不设置,默认为0

7、尺寸大小

    marker.scale.x = 1.0;marker.scale.y = 1.0;marker.scale.z = 1.0;

该数字表示各个方向的尺寸大小,单位是m, 都取1表示一立方米的大小

8、颜色设置

    marker.color.r = 0.0f;marker.color.g = 1.0f;marker.color.b = 0.0f;marker.color.a = 1.0;//设置透明度

注意:color.a等于0时,marker是完全透明的,无法看见

9、LINE_STRIP/LINE_LIST的形点集marker.points

pt.x=1;
pt.y=1;
marker.points.emplace_back(pt);
pt.y+=1;
marker.points.emplace_back(pt);
markerArray.emplace_back(std::move(marker));

注意:用了std::move后,marker里面的字符串以及容器类变量就变成空的了,需要重新赋值。

10、文字marker设置显示内容

如果marker的action选择TEXT_VIEW_FACING,那么需要给marker.text赋值,是个string,若是显示固定的字符串,那么可以直接用如下赋值

marker.text="adbcd";//直接赋值

若是想实时地显示某个变量地值,那么可以用stringstream类对象来将变量的值转换成字符串,若是多次转换用同一个对象,记得每次要提前清空,用str(" ")或clear()

int count=6;
int value=7;
std::stringstream context;//定义一个字符串流
context<<"count: "<<count<<std::endl<<"value: "<<value<<std::endl;
//str()成员函数用来获取内容,或者重设内容,str("")表示清空内容
marker.text=context.str();

ROS1和ROS2RVIZ 代码详解相关推荐

  1. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  2. html5代码转换为视频,HTML5中的视频代码详解

    摘要 腾兴网为您分享:HTML5中的视频代码详解,智学网,云闪付,易推广,小红书等软件知识,以及360win10,流量魔盒,fitbit,上港商城,安卓2.3.7,全民惠,五年级下册英语单词表图片,t ...

  3. js php base64,JavaScript实现Base64编码与解码的代码详解

    本篇文章给大家分享的是jJavaScript实现Base64编码与解码的代码详解,内容挺不错的,希望可以帮助到有需要的朋友 一.加密解密方法使用//1.加密 var str = '124中文内容'; ...

  4. yii mysql 事务处理_Yii2中事务的使用实例代码详解

    前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...

  5. 代码详解|tensorflow实现 聊天AI--PigPig养成记(1)

    Chapter1.代码详解 完整代码github链接,Untitled.ipynb文件内. [里面的测试是还没训练完的时候测试的,今晚会更新训练完成后的测试结果] 修复了网上一些代码的bug,解决了由 ...

  6. vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者

    废话少说,代码如下所述: /p> 显示123 /p> 补充:vuejs {{}},v-text 和 v-html的区别 {{message}} let app = new Vue({ el ...

  7. sift计算描述子代码详解_代码详解——如何计算横向误差?

    在路径跟踪控制的论文中,我们常会看到判断精确性的指标,即横向误差和航向误差,那么横向误差和航向误差如何获得? 在前几期代码详解中,参考路径和实际轨迹均由To Workspace模块导出,如图所示: 那 ...

  8. 委托与事件代码详解与(Object sender,EventArgs e)详解

    委托与事件代码详解 using System; using System.Collections.Generic; using System.Text; namespace @Delegate //自 ...

  9. python怎么画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

最新文章

  1. Coolblue的持续部署
  2. C# 7中函数多值返回_转自InfoQ
  3. 2014\Province_C_C++_B\1 啤酒和饮料
  4. 排序算法——归并排序
  5. Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 错误解决
  6. OSGI-flex-blazeds通信
  7. bcscale php,【PHP开发】bcscale timezone charset的设定说明
  8. 中科院人工智能应用 福玛特550G解析
  9. linux openfire mysql_Linux系统安装openfire及其如何后台运行openfire
  10. 常用遥感数据下载地址
  11. echarts实现动态的图表
  12. 第十一篇,看门狗定时器编程
  13. 2020.1.1 只争朝夕,不付韶华
  14. CPU、MPU、MCU和SOC还傻傻分不清楚 看这篇文章就够了
  15. Summary: Rendering Pipeline简单总结一下渲染管线流程图
  16. 0-VMware Horizon 2203 虚拟桌面-目录大纲
  17. 安卓listview下拉刷新_iPhone上被吹爆的良心App,安卓手机终于能用上了
  18. 解决win7 若要安装Office2010,需要在计算机上安装MSXML版本6.10.1129.0 问题
  19. 黑马程序员新版Linux零基础快速入门到精通——学习笔记
  20. Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 15

热门文章

  1. 东华大学2021考研基本练习题46~90
  2. win10 动态磁盘 linux,win10系统基本磁盘转换成动态磁盘的操作办法
  3. 基于JAVA酒店订房系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  4. 计算机二级WPS 选择题(模拟和解析十二)
  5. 怎样编写一个go语言软件
  6. 苹果电脑的杀毒软件?Clean My Mac X 4..12.5使用测评
  7. 字符串核对之Boyer-Moore算法
  8. RouterOS配置【网络工程】(保姆级图文)
  9. Samtec科普 | 连接器设计中的温度挑战
  10. 用户通过什么和计算机交换信息,人和计算机进行信息交换是通过计算机的输入、输出设备实现的。(  )——青夏教育精英家教网——...