ROS学习记录:C++节点发布自定义地图

前言

ROS栅格地图格式
在了解了ROS地图消息包的数据结构后(链接在上),本文将编写一个节点,发布地图消息包,看看在RViz中显示是什么效果。

一、准备

1、为了简单起见,发布一个两行四列的地图

在这里插入图片描述

2、为了便于观测,只对地图第一行进行赋值(注意,第一行是从下往上数),第二行保持空白。

在这里插入图片描述

3、根据ROS定义的栅格占据值,有障碍物占据的栅格值为100,没有障碍物的为0,未知状态的为-1.

在这里插入图片描述

4、进行如下赋值,则0和1号格有障碍物,2号格没有,3号格未知。

在这里插入图片描述

二、实现步骤

在这里插入图片描述

三、操作

1、输入cd catkin_ws1/src/ 进入工作空间的src目录

在这里插入图片描述

2、输入catkin_create_pkg map_pkg rospy roscpp nav_msgs创建软件包map_pkg

在这里插入图片描述

3、输入code .打开VScode

在这里插入图片描述

4、在map_pkg软件包的src目录下创建节点代码文件map_pub_node.cpp

在这里插入图片描述

5、在map_pub_node.cpp节点文件中,写入如下代码

#include <ros/ros.h>// 引入ROS和导航消息
#include <nav_msgs/OccupancyGrid.h>int main(int argc, char *argv[])
{ros::init(argc,argv,"map_pub_node");// 初始化ROS节点ros::NodeHandle n;ros::Publisher pub = n.advertise<nav_msgs::OccupancyGrid>("/map",10);// 创建一个名为/map的OccupancyGrid类型的话题发布者ros::Rate r(1);// 设置发布频率为1Hzwhile (ros::ok()){nav_msgs::OccupancyGrid msg;// 创建一个OccupancyGrid类型的消息// 设置消息的帧ID和时间戳msg.header.frame_id = "map";msg.header.stamp = ros::Time::now();// 设置地图的原点坐标和分辨率msg.info.origin.position.x = 0;msg.info.origin.position.y = 0;msg.info.resolution = 1.0;// 设置地图的宽度和高度msg.info.width = 4;msg.info.height = 2;// 设置地图的数据,这里假设地图大小为4x2,并赋予一些示例数据msg.data.resize(4*2);msg.data[0] = 100;msg.data[1] = 100;msg.data[2] = 0;msg.data[3] = -1;// 发布地图消息pub.publish(msg);// 按照预定的频率休眠r.sleep();}return 0;
}

6、在CMakeLists.txt文件末尾,添加如下编译规则

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

在这里插入图片描述

7、进入工作空间,输入source ./devel/setup.bash设置ROS的环境变量,以便在当前的终端窗口中正确运行ROS软件包。

在这里插入图片描述

8、输入catkin_make进行编译

在这里插入图片描述

9、编译成功

在这里插入图片描述

10、接下来运行节点,首先重新打开一个终端,启动roscore

在这里插入图片描述

11、再打开一个终端,进入工作空间,先输入source ./devel/setup.bash设置环境变量,再输入rosrun map_pkg map_pub_node运行节点。

在这里插入图片描述

12、再打开一个终端,输入rviz运行rviz

在这里插入图片描述

13、在rviz中添加一个坐标轴标识

在这里插入图片描述

14、这个标识的位置,便是世界坐标系的原点

在这里插入图片描述

15、点击这个,添加地图显示

在这里插入图片描述

16、将地图消息的话题名称设置为实验节点发布的/map

在这里插入图片描述

17、可以看到地图显示出来了,跟地图规划时进行对比,发现是一样的,说明地图创建成功了。

在这里插入图片描述
在这里插入图片描述

18、这两行代码是设置地图原点(就是地图的左下角)相对于世界坐标系的偏移量,我们现在设置的都是0,故地图的原点是和世界坐标系原点重合的

在这里插入图片描述

19、对偏移量x进行修改,并保存

在这里插入图片描述

20、按Ctrl+Z打断刚才运行的节点

在这里插入图片描述

21、输入catkin_make进行编译

在这里插入图片描述

22、编译成功

在这里插入图片描述

23、重新运行节点

在这里插入图片描述

24、再查看rviz,发现地图向右移动了一个格子。

在这里插入图片描述

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

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

相关文章

机器学习:如何在Python中实现决策树分类?

如何在Python中实现决策树分类&#xff1f; 在机器学习领域&#xff0c;决策树算法是一种常用且高效的分类与回归方法。它不仅易于理解和解释&#xff0c;还能处理数值型和分类型数据。本文将带你深入探索Python中的决策树算法&#xff0c;理解其基本原理&#xff0c;并通过代…

SmartEDA VS Multisim/Proteus:电子设计江湖,谁主沉浮?

在电子设计的江湖里&#xff0c;SmartEDA、Multisim和Proteus无疑是几大门派&#xff0c;各自拥有独特的武功秘籍和门派特色。今天&#xff0c;我们就来一场巅峰对决&#xff0c;看看这些电子设计软件究竟谁能笑傲江湖&#xff0c;成为电子设计界的霸主&#xff01; 一、门派起…

Linux:通过线程互斥同步实现基于BlockingQueue的生产消费者模型

一、总体调度&#xff1a;主函数Main.cc #include "BlockQueue.hpp" #include "Thread.hpp" #include <string> #include <vector> #include <functional> #include <unistd.h> #include <ctime>using namespace ThreadMod…

Seq2seq、编码器解码器神经网络

目录 一、Seq2seq 简介二、编码器三、解码器四、编码器-解码器的训练 遇到看不明白的地方&#xff0c;欢迎在评论中留言呐&#xff0c;一起讨论&#xff0c;一起进步&#xff01; 需掌握的前提知识&#xff1a; LSTM、词嵌入 本文参考&#xff1a;【官方双语】编码、解码神经网…

PasteCluster组件介绍(一款让你的.Net服务快速支持集群部署的中间件)

前言 PasteCluster是由.NET6.0编写的集群中间件&#xff0c;先已开源: PasteCluster.Gitee 在实际开发中&#xff0c;如果一个服务(比如api)是否支持集群部署&#xff0c;其实是由开发决定的&#xff01; 举个栗子 我们知道缓存&#xff0c;可以分几种方式&#xff0c;最简单的…

tkinter菜单栏

tkinter菜单栏 菜单栏效果代码 菜单栏 在 Tkinter 中&#xff0c;Menu 组件用于创建菜单栏、下拉菜单和上下文菜单&#xff0c;是构建图形用户界面&#xff08;GUI&#xff09;应用程序的常见需求。 效果 代码 import tkinter as tk from tkinter import messagebox# 创建主…

DAMA学习笔记(一)-数据管理

1.引言 数据管理(Data Management) 是为了 交付、 控制、 保护 并 提升 数据和信息资产的 价值 , 在其整个生命周期中制订 计划、 制度、 规程和实践 活动, 并 执行 和 监督 的过程。 数据管理专业人员(Data Management Professional) 是指 从事数据管理各方面的工作…

MySQL与PostgreSQL关键对比三(索引类型)

目录 索引类型 B-tree 索引 Hash 索引 Full-text 索引 GiST 索引 GIN 索引 BRIN 索引 索引创建示例 MySQL PostgreSQL 结论 以下SQL语句的执行如果需要开发工具支持&#xff0c;可以尝试使用SQLynx或Navicat来执行。 MySQL和PostgreSQL在索引方面有许多相似之处&am…

【C#线程设计】2:backgroundWorker

实现&#xff1a; &#xff08;1&#xff09;.控件&#xff1a;group Box&#xff0c;text Box&#xff0c;check Box&#xff0c;label&#xff0c;botton&#xff0c;richtextbox 控件拉取见&#xff1a;https://blog.csdn.net/m0_74749240/article/details/139409510?spm1…

mingw如何制作动态库附python调用

1.mingw和msvc g -fpic HelloWorld.cpp -shared -o test.dllg -L . -ltest .\test.cpp 注意-L后面的.挨不挨着都行&#xff0c;-l不需要-ltest.dll&#xff0c;只需要-ltest 2.dll.cpp extern "C" {__declspec(dllexport) int __stdcall add(int a, int b) {return…

吴恩达2022机器学习专项课程C2W3:2.25 理解方差和偏差(诊断方差偏差正则化偏差方案)

目录 引言名词替代影响模型偏差和方差的因素1.多项式阶数2.正则化参数 判断是否有高偏差或高方差1.方法一&#xff1a;建立性能基准水平2.方法二&#xff1a;建立学习曲线 总结 引言 机器学习系统开发的典型流程是从一个想法开始&#xff0c;然后训练模型。初次训练的结果通常…

C语言最终讲:预处理详解

C语言最终讲&#xff1a;预处理详解 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏和函数的对比6.1宏的优势6.1.1\符号 6.2宏的劣势 7.#和##7.1#运算符7.2##运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1本地…

13. UDP协议与RTP协议

UDP协议 UDP协议比较简单&#xff1a; UDP的长度是固定的&#xff0c;用总长度-UDP长度就是数据长度。 UDP是不保证他的有序性和可靠性的。对于音频和视频是这样是比较好的&#xff0c;因为这段丢了&#xff0c;我们可以从下一段在开始解码。 RTP RTP 协议概述 RTP&#x…

【MySQL】(基础篇六) —— 过滤数据

过滤数据 本文将讲授如何使用SELECT语句的WHERE子句指定搜索条件。 WHERE子句 数据库表一般包含大量的数据&#xff0c;很少需要检索表中所有行。通常只会根据特定操作或需要提取表数据的子集。只检索所需数据需要指定搜索条件&#xff08;search criteria&#xff09;&…

独孤思维:做副业,万物皆可成为素材

01 分享一个独孤日更的素材来源。 很多小伙伴&#xff0c;刚开始写自媒体&#xff0c;都喜欢一本正经的阅读书籍&#xff0c;文章。 把素材来源&#xff0c;灵感来源&#xff0c;全部押注在这个地方。 其实万物皆可成为素材。 比如昨天早上&#xff0c;独孤参加公司的会议…

代码随想录算法训练营第36期DAY56

DAY56 套磁很顺利&#xff0c;发现又有书读了&#xff01; 300最长递增子序列 朴素法&#xff0c;这个好想&#xff0c;但是不对&#xff0c;比如 0 1 0 3 2 3 我的算法会找出0 1 3作为答案&#xff0c;而不是0 1 2 3 可以看出&#xff0c;后面的状态依赖于前面的状态&am…

zero shot,few shot以及无监督学习之间的关系是什么

Zero-shot learning、few-shot learning和无监督学习都是机器学习中的方法&#xff0c;它们共同的特点是在有限或没有标签数据的情况下进行学习。下面是这三种方法之间的关系和区别&#xff1a; Zero-shot Learning (零样本学习)&#xff1a; 零样本学习是在模型训练过程中完全…

中介子方程十

X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαXiXrXkXtXyX$XpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXeXyX$Xd…

Facebook革新:数字社交的下一个阶段

在数字化时代&#xff0c;社交网络已经成为人们生活中不可或缺的一部分。作为全球最大的社交网络平台之一&#xff0c;Facebook一直在不断创新&#xff0c;引领着数字社交的发展。然而&#xff0c;随着科技的不断进步和社交需求的变化&#xff0c;Facebook正在走向一个新的阶段…

Gitte的使用(Windows/Linux)

Gitte的使用&#xff08;Windows/Linux&#xff09; 一、Windows上使用Gitte1.下载程序2.在Gitte上创建远程仓库3.连接远程仓库4.推送文件到远程仓库 二、Linux上使用Gitte1.第一次从仓库上传1.1生成公钥1.2配置SSH公钥1.3新建一个仓库1.4配置用户名和邮箱在Linux中1.5创建仓库…