ROS MarkerArray的几种常见用法

news2025/1/13 9:24:40

ros使用过程中,经常会用到rviz可视化各种数据。而在rviz中,marker与markerarray是常用的一种可视化工具,最近也用到过几次了,这里随手记录一下。

1、makerarray画线

在marker中常见的就是表示两点之间的连线,而marker或者markerarray可以很好的可视化线条属性,简单示例如下:

void marker_visualization::Add_Lines_Mark()
{
    Clear_Lines_Marker();
    //point_line_pub.publish(MarkerArray);
    int len = 10;
    int count = 0;
    for(int i=0;i<len;i++)
    {
        point_lines.ns = "line_mark";    //命名空间namespace  
        //point_lines.type = visualization_msgs::Marker::ARROW;                                                                         
	    point_lines.type = visualization_msgs::Marker::LINE_LIST;     //类型
        point_lines.pose.orientation.x=0.0;
	    point_lines.pose.orientation.y=0.0;
	    point_lines.pose.orientation.z=0.0;
	    point_lines.pose.orientation.w=1.0;
        //lines.action = visualization_msgs::Marker::ADD;
	    point_lines.scale.x = 0.1;
	    //设置线的颜色,a应该是透明度
	    point_lines.color.r = 1.0;
	    point_lines.color.g = 0.0;
	    point_lines.color.b = 0.0;
	    point_lines.color.a = 1.0;
	    //这个是指定marker在被自动清除前可以逗留多长时间。这里 ros::Duration()表示不自动删除。如果在lifetime结束之前有新内容到达了,它就会被重置。
        point_lines.lifetime = ros::Duration();
        //线的初始点
        point_lines.id = count;  //与命名空间联合起来,形成唯一的id,这个唯一的id可以将各个标志物区分开来,使得程序可以对指定的标志物进行操作
        geometry_msgs::Point p_start;
        p_start.x = 2*i;
        p_start.y = 2*i;
        p_start.z = 0.0;	
        //将直线存储到marker容器
	    point_lines.points.push_back(p_start);
        geometry_msgs::Point p_end;
        p_end.x = 2*i+1;
        p_end.y = 2*i+1;
        p_end.z = 0.0;
        point_lines.points.push_back(p_end);
            
        point_lines.header.frame_id = "map";
        point_lines.header.stamp = ros::Time::now();
        MarkerArray.markers.push_back(point_lines);
        point_lines.points.clear();
        count++;
        
    }
    lines_array_pub.publish(MarkerArray);
    point_lines.points.clear();
    MarkerArray.markers.clear();
}

在rviz中显示如下:
在这里插入图片描述

2、makerarray画箭头

箭头的表示跟直线差不多,基础代码如下:

void marker_visualization::Add_Arrow_Mark()
{
    Clear_Arrow_Marker();
    int len = 10;
    int count = 0;
    tf2::Quaternion Quaternion;
    for(int i=0;i<len;i++)
    {
        lines_arrow.ns = "point_arrow";    //命名空间namespace                                                                          
	    lines_arrow.type = visualization_msgs::Marker::ARROW;     //类型
	    lines_arrow.scale.x = 0.5;//箭头长度
        lines_arrow.scale.y = 0.1;
        lines_arrow.scale.z = 0.1;
	    //设置线的颜色,a是透明度
	    lines_arrow.color.r = 0.0;
	    lines_arrow.color.g = 1.0;
	    lines_arrow.color.b = 0.0;
	    lines_arrow.color.a = 1.0;
	    //这个是指定marker在被自动清除前可以逗留多长时间。这里 ros::Duration()表示不自动删除。如果在lifetime结束之前有新内容到达了,它就会被重置。
        lines_arrow.lifetime = ros::Duration();
        //线的初始点
        for(int j=0;j<10;j++)
        {
            lines_arrow.id = count;  //与命名空间联合起来,形成唯一的id,这个唯一的id可以将各个标志物区分开来,使得程序可以对指定的标志物进行操作
            geometry_msgs::Point p_start;
            lines_arrow.pose.position.x = 2*i;
            lines_arrow.pose.position.y = 2*i;
            lines_arrow.pose.position.z = 0;
            p_start.x = 2*i;
            p_start.y = 2*i;
            p_start.z = 0;
            //将直线存储到marker容器
            geometry_msgs::Point p_end;
            
            p_end.x = 2*i+1;
            p_end.y = 2*i+1;
            p_end.z = 0;
            double yaw = atan2((p_end.y-p_start.y), (p_end.x-p_start.x));
            Quaternion.setRPY( 0, 0, yaw );
            lines_arrow.pose.orientation.x = Quaternion.x();
            lines_arrow.pose.orientation.y = Quaternion.y();
            lines_arrow.pose.orientation.z = Quaternion.z();
            lines_arrow.pose.orientation.w = Quaternion.w();
            
            lines_arrow.header.frame_id = "map";
            lines_arrow.header.stamp = ros::Time::now();
            ArrowArray.markers.push_back(lines_arrow);
            count++;
        }
    }
    arrow_array_pub.publish(ArrowArray);
    ArrowArray.markers.clear();
}

在这里插入图片描述

3、makerarray写字

marker是可以在rviz中的特定位置显示文本的,但是需要注意的是它似乎显示不了汉字:

void marker_visualization::Add_Txt_Mark()
{
    Clear_Txt_Marker();
    int len = 10;
    int count = 0;
    tf2::Quaternion Quaternion;
    for(int i=0;i<len;i++)
    {
        txt_mark.header.frame_id="map";
        txt_mark.header.stamp = ros::Time::now();
        txt_mark.ns = "txt_mark";
        //txt_mark.action = visualization_msgs::Marker::ADD;
        txt_mark.pose.orientation.w = 1.0;
        txt_mark.id = count;
        txt_mark.type = visualization_msgs::Marker::TEXT_VIEW_FACING;

        txt_mark.scale.z = 0.4;
        txt_mark.color.b = 255;
        txt_mark.color.g = 255;
        txt_mark.color.r = 255;
        txt_mark.color.a = 1;
        geometry_msgs::Pose pose;
        pose.position.x = 2*i+0.2;
        pose.position.y = 2*i+0.2;
        pose.position.z = 0;
        string text = "test";
        txt_mark.text=text;
        txt_mark.pose=pose;
        txt_mark.lifetime = ros::Duration();
        TxtArray.markers.push_back(txt_mark);
        count++;
    }
    txt_array_pub.publish(TxtArray);
    TxtArray.markers.clear();
}

显示结果如下:
在这里插入图片描述

4、makerarray画圆

某些时候需要在rviz中表示一些坐标位置的时候,使用一个立体的点是一种很好的方式:

void marker_visualization::Add_Sphere_Mark()
{
    Clear_Sphere_Marker();
    int len = 10;
    int count = 0;
    for(int i=0;i<len;i++)
    {
        sphere_mark.header.frame_id = "map";
        sphere_mark.header.stamp = ros::Time::now();
        sphere_mark.ns = "sphere_mark";
        sphere_mark.id = count; 
        sphere_mark.type = visualization_msgs::Marker::SPHERE; 
        sphere_mark.action = visualization_msgs::Marker::ADD;
        sphere_mark.pose.position.x = 2*i;
        sphere_mark.pose.position.y = 2*i;
        sphere_mark.pose.position.z = 2*i;
        sphere_mark.pose.orientation.x = 0.0;
        sphere_mark.pose.orientation.y = 0.0;
        sphere_mark.pose.orientation.z = 0.0;
        sphere_mark.pose.orientation.w = 1.0;
        sphere_mark.scale.x = 0.2;
        sphere_mark.scale.y = 0.2;
        sphere_mark.scale.z = 0.2; 
        sphere_mark.color.r = 1.0;
        sphere_mark.color.g = 1.0;
        sphere_mark.color.b = 0.0;
        sphere_mark.color.a = 1.0;
        count++;        
        SphereArray.markers.push_back(sphere_mark);
    }
    sphere_array_pub.publish(SphereArray);
    SphereArray.markers.clear();
}

结果如下:
在这里插入图片描述

5、makerarray消除

在添加了Marker之后,设置marker的 duration_time不起作用,表现形式是:marker一直显示,不会消失;使用delete指令也不能将已经显示在rviz内部的marker删除;所以我们需要用另外一种方式消除marker,简单的来说就是发布一组新的marker覆盖掉当前的marker,我们将其值设置为透明或者长度设置为一个非常小的值之类的都可以实现这个效果,拿第一个画线的例子来说:

void marker_visualization::Clear_Lines_Marker()
{
    visualization_msgs::Marker clear_mark;
    for(int i =0;i<10;i++)
    {
        clear_mark.ns = "line_mark";
        clear_mark.id = i; 
        clear_mark.pose.orientation.x=0.0;
	    clear_mark.pose.orientation.y=0.0;
	    clear_mark.pose.orientation.z=0.0;
	    clear_mark.pose.orientation.w=1.0;
        //lines.action = visualization_msgs::Marker::ADD;
	    clear_mark.scale.x = 0.1;
        clear_mark.scale.y = 0.1;
        clear_mark.scale.z = 0.1;
	    //设置线的颜色,a应该是透明度
	    clear_mark.color.r = 1.0;
	    clear_mark.color.g = 0.0;
	    clear_mark.color.b = 0.0;
	    clear_mark.color.a = 1.0;
        geometry_msgs::Point p_start;
        p_start.x = 0.0;
        p_start.y = 0.0;
        p_start.z = 0.0;
        clear_mark.points.push_back(p_start);
        geometry_msgs::Point p_end;
        p_end.x = 0.1;
        p_end.y = 0.0;
        p_end.z = 0.0;
        clear_mark.points.push_back(p_end);
	    //这个是指定marker在被自动清除前可以逗留多长时间。这里 ros::Duration()表示不自动删除。如果在lifetime结束之前有新内容到达了,它就会被重置。
        clear_mark.lifetime = ros::Duration();
        clear_mark.header.frame_id = "map";
        clear_mark.header.stamp = ros::Time::now();
        MarkerArray.markers.push_back(clear_mark);
        clear_mark.points.clear();
    }
    lines_array_pub.publish(MarkerArray);
    MarkerArray.markers.clear();
}

以上是markerarray的一些简单用法,后期有更多用法继续更新。

如果需要复现的话详细的代码放在:

https://download.csdn.net/download/YiYeZhiNian/87135596

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】1752. 检查数组是否经排序和轮转得到

题目描述 给你一个数组 nums 。nums 的源数组中&#xff0c;所有元素与 nums 相同&#xff0c;但按非递减顺序排列。 如果 nums 能够由源数组轮转若干位置&#xff08;包括 0 个位置&#xff09;得到&#xff0c;则返回 true &#xff1b;否则&#xff0c;返回 false 。 源数组…

怎么提高外贸开发信的回复率?

写客户开发信是每个外贸人都必备的技能。对于成本预算小的企业来讲&#xff0c;开发信是性价比非常高的一种方式。但是&#xff0c;很多人在写完开发信之后并没有收获到比较好的回复效果&#xff0c;可能是因为他们没有把握写开发信的技巧。怎么提高外贸开发信的回复率&#xf…

挖掘数据价值,华为云大数据BI解决方案有绝招

在没有接触电子商务时&#xff0c;就一直很好奇&#xff0c;他们是怎么知道我需要什么并及时推送给我的&#xff0c;直到后来自己也开始做电商的时候&#xff0c;才知道原来电子商务必不可少的是大数据分析方案。在这里我强烈给同业者们安利一下华为云的大数据BI解决方案&#…

大厂都在用MyBatis,跳槽的时候MyBatis更是面试必问的内容,那你对于MyBatis又掌握了多少呢?这份MyBatis源码解析值得拥有!

MyBatis作为一个流行的半自动ORM框架&#xff0c;里面融合了许多优秀的设计理念&#xff0c;分析其源码骨架能够帮你建立良好的项目设计经验。由于其比较复杂&#xff0c;我会分成几篇来讲&#xff0c;一起踏上征服的旅程吧&#xff01; 首先把MyBatis源码包导入到idea&#x…

PC_非连续内存分配方式@分页存储管理@地址变换机构@快表@有效访存时间

文章目录非连续内存分配方式&#x1f388;分页存储管理基本分页存储管理页面和页面大小分块和碎片逻辑地址结构页表页表项结构页表项和地址比较&#x1f388;页表项地址地址变换机构基本地址变换机构结构图映射过程Note:页表长度页表项长度页表大小例小结ref具有快表的地址变换…

xxl-job安装部署

一、简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 中文文档English Documentation 二、安装 xxl-job需要的提前安装好以下环境&#xff1a;jdk、m…

A-Level物理例题解析及练习Projectile Motion

今日知识点&#xff1a;Magnetic Force例题 Q: A proton p and an electron e, with the same velocity, enter a magnetic field which is perpendicular to the direction of their motion. The field acts into the page. Which of the following diagrams best represents …

Spire.XLS for Java 12.11.8 Excel to PDF bug Fix

谷歌找破解版Spire.XLS for Java is a professional Java Excel API that enables developers to create, manage, manipulate, convert and print Excel worksheets without using Microsoft Office or Microsoft Excel. Spire.XLS for Java supports both for the old Excel …

Spark系列之Spark的Shuffle详解及相关参数调优

title: Spark系列 第七章 Spark的Shuffle详解及相关参数调优 ​ 大多数Spark作业的性能主要就是消耗在了shuffle环节&#xff0c;因为该环节包含了大量的磁盘IO、序列化、网 络数据传输等操作。因此&#xff0c;如果要让作业的性能更上一层楼&#xff0c;就有必要对shuffle过程…

数图互通高校房产管理——公房管理功能详解

数图互通房产管理系统在这方面做得比较全面&#xff1b; 公用房管理 1 房屋档案 可维护校区信息、公房的楼栋信息、公房的房间信息&#xff0c;记录校区的名称、建成年份、占地面积、建筑面积等基本信息。记录楼栋的编号、名称、建筑面积、使用面积等基本信息&#xff0c;同…

[附源码]计算机毕业设计springboot超市商品管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

企业研发数据:省级工业企业研发费用、企业非真实研发支出原始数据加计算stata do代码两大维度指标

1、省级工业企业研发费用 1、数据来源&#xff1a;Wind 2、时间跨度&#xff1a;2008-2019年 3、区域范围&#xff1a;全国31省(区分了东中西部地区&#xff09; 4、指标说明&#xff1a; 包含如下指标&#xff1a; 省级规模以上工业企业R&D经费 省级规模以上工业企…

Kotlin高仿微信-第8篇-单聊

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

http和dubbo接口调用主动设置超时时间

http接口超时方案 方案1&#xff1a;多个resttemplate&#xff0c;不同超时时间的使用不同的template&#xff0c;优点&#xff1a;简单&#xff0c;扩展起来复制粘贴&#xff0c;缺点&#xff1a;代码冗余&#xff0c;多个template占用内存不够优雅 方案2&#xff1a;单个res…

MySQL事务和锁

目录 1、四大特性 2、事务引发的问题 3、事务控制演进 3.1、排队 3.2、排它锁 3.3、读写锁 3.4、MVCC 4、事务的隔离级别 4.1、四种隔离级别 4.2、事务隔离级别和锁的关系 4.3、MySQL隔离级别控制 5、锁机制和实战 5.1、锁分类 5.1.1、按操作粒度分类 5.1.2、按…

CDMP选修课都有什么?

大家都知道CDMP认证考试有四个级别。分别是A级&#xff08;基础级&#xff09;P级&#xff08;实践级&#xff09;M级&#xff08;专业级&#xff09;F级&#xff08;大师级&#xff09;。级别越高&#xff0c;考试难度就越大&#xff0c;分数比例要求也更高&#xff0c;相对应…

在Linux命令行中查找空目录

在 Linux 系统中&#xff0c;出现空的目录这是很正常的事情&#xff0c;而且&#xff0c;也是有办法一次性把它们都找出来的。 但是&#xff0c;仅仅列出空目录并不是我们的目的&#xff0c;我们今天了解一下如何删除这些空的目录。 在Linux中查找空目录 查找空目录&#xf…

ThinkPHP5文档学习——配置

文章目录一、配置目录二、配置格式PHP数组定义其它格式的支持二级配置三、配置加载惯例配置应用配置拓展配置场景配置四、读取配置参数五、动态配置设置配置参数六、独立配置独立配置文件V5.0.1版本已经废除该写法自动读取扩展配置七、配置作用域八、环境变量配置一、配置目录 …

语文课内外杂志语文课内外杂志社语文课内外杂志社2022年第14期目录

幼儿教育《语文课内外》投稿&#xff1a;cn7kantougao163.com 家园协同视域下幼儿心理危机的预防与干预对策 曹锭1-3 幼小衔接阶段幼儿时间观念的培养对策 陈晶晶4-6 有效支持 助力幼儿在书海中徜徉 胡玲珊7-9 东西部幼儿园结对帮扶,助力乡村教育扶贫——以广州市人民政府机关幼…

虹科分享|终端安全防护|网络安全术语列表(二)

如果你的工作或者生活与网络安全有关&#xff0c;你就知道它使用了自己独特的、不断发展的语言。术语和缩略语受到网络安全专家的喜爱。因此&#xff0c;我们创建了一个全面的网络安全词汇表&#xff0c;解释了常用的网络安全术语、短语和技术。我们设计此列表是为了揭开安全专…