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);// 设置发布频率为1Hz
    while (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,发现地图向右移动了一个格子。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

沐风老师3DMAX一键多孔结构建模插件Porous使用方法

​3DMAX一键多孔结构建模插件Porous使用教程 3dMax是大家熟知的3D建模软件之一&#xff0c;其功能非常的强大&#xff0c;在科研绘图领域有着非常广泛的应用&#xff0c;但是由于科研绘图的图形&#xff08;模型&#xff09;一般都属于异形结构&#xff0c;手工绘制建模&#x…

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

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

人类记忆优化算法:针对全局优化问题的记忆启发优化器

Human memory optimization algorithm: A memory-inspired optimizer for global optimization problems 24年 Expert Systems With Applications sci一区 原文链接: https://doi.org/10.1016/j.eswa.2023.121597 Zhu D, Wang S, Zhou C, et al. Human memory optimization alg…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…

Web--CSS基础

文章目录 定义方式选择器文本字体背景边框元素展示格式内边距与外边距盒子模型位置浮动flex布局响应式布局 定义方式 行内样式表 直接定义在style属性中&#xff0c;作用于当前标签 <img src "/imges/logo.jpg" alt "" style "width 400"…

时钟影响ADC性能不仅仅是抖动

时钟影响ADC性能除了抖动&#xff0c;还有占空比。 在高速AD采样中&#xff0c;时钟占空比是非常重要的一个参数。时钟信号的上升沿控制ADC的采样&#xff0c;而下降沿控制着信号的保持&#xff0c;在一个周期内才可以完成量化输出&#xff0c;所以必须保持时钟的占空比为50%&…

自动化决策和业务流程类控制的系统前端UI设计开发

自动化决策和业务流程类控制的系统前端UI设计开发

NLP——电影评论情感分析

python-tensorflow2.0 numpy 1.19.1 tensorflow 2.0.0 导入库 数据加载 数据处理 构建模型 训练 评估 预测 1.基于2层dropout神经网络 2.基于LSTM的网络 #导入需要用到的库 import os import tarfile import urllib. request import tensorflow as tf import numpy a…

使用Python批量处理Excel的内容

正文共&#xff1a;1500 字 10 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在前面的文章中&#xff08;如何使用Python提取Excel中固定单元格的内容&#xff09;&#xff0c;我们介绍了如何安装Python环境和PyCharm工具&#xff0c;还利用搭好的环境简单测试了一下ChatGPT提…

小程序名片怎么生成?AI名片生成器源码系统 为企业店铺创建自己的数字名片

在数字化时代&#xff0c;小程序名片已经成为企业店铺展示自身形象、推广产品和服务的重要工具。分享一个AI名片生成器源码系统春哥AI雷达智能名片小程序系统企业商业运营版&#xff0c;含完整代码包和详细的图文安装部署搭建教程&#xff0c;新手也能轻松使用&#xff0c;源码…

MySQL: 索引与事务

文章目录 1. 索引 (Index)1.1 概念1.2 作用1.3 使用场景1.4 索引的使用1.5 索引的使用案例 (不要轻易尝试)1.6 索引背后的数据结构1.7 重点总结 2.事务2.1 为什么要使用事务2.2 事务的概念2.3 事务的使用2.4 对事务的理解2.5 事务的基本特性 1. 索引 (Index) 1.1 概念 索引是…

Python Requests库详解

大家好&#xff0c;在现代网络开发中&#xff0c;与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言&#xff0c;提供了各种工具和库来简化这一过程。其中&#xff0c;Requests库作为Python中最受欢迎的HTTP库之一&#xff0c;为开发人员提供了简单而…

12-Gateway网关-网关作用介绍

12-Gateway网关-网关作用介绍 1.为什么需要网关&#xff1a; 网关功能&#xff1a; ​ 1.身份认证和权限校验 ​ 2.服务路由、负载均衡 ​ 3.请求限流 2.网关的技术实现&#xff1a; 在SpringCloud中网关的实现包括两种“ ​ gateway ​ zuul Zuul是基于Servlet的实…

node-mysql的批量插入

此前我批量插入都是用类似这样的命令&#xff1a; sqlcmdinsert into table(field1,field2,...) values ? indata[["f1v1","f2v1"],["f1v2","f2v2"],...] mysqlconn.query(sqlcmd,[indata],(err,res)>{...})但是感觉不太舒服&…

VueRouter3学习笔记

文章目录 1&#xff0c;入门案例2&#xff0c;一些细节高亮效果非当前路由会被销毁 3&#xff0c;嵌套路由4&#xff0c; 传递查询参数5&#xff0c;命名路由6&#xff0c;传递路径参数7&#xff0c;路径参数转props8&#xff0c;查询参数转props9&#xff0c;replace模式10&am…

Vue--》从零开始打造交互体验一流的电商平台(二)

今天开始使用 vue3 + ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多…

SAP Build 1-工作流表单开发

1. BTP SAP Build环境配置 1.1 启用试用账号 访问BTP trial&#xff0c;启用试用账号&#xff0c;没有的话注册一个即可 https://account.hanatrial.ondemand.com/trial/#/home/trial 注册完之后就会让选择区域&#xff0c;要选US的区域才有自动化相关的功能 然后就开始生成…

什么是Java?

什么是Java&#xff1f;java是什么&#xff1f;下面我们来总结一下。 java是什么&#xff1f; java是一个静态编程语言&#xff0c;具有强大的多线程特征&#xff0c;目前java不仅采用c语言的优点&#xff0c;还去掉了一些多继承指针&#xff0c;等复杂的概念&#xff0c;我们…

跟着大佬学RE(六)

findKey 嗯&#xff0c;就是一个窗口程序&#xff0c;没有输入&#xff0c;flag 应该就藏在程序里面 第一遍自己直接莽做&#xff0c;在string窗口&#xff0c;找到 flag{} 看到标红直接 nop 然后&#xff0c;然后就不知道怎么搞了 这串字符提示不能随便 nop &#xff0c;重新…

优设AI导航

1、优设AI导航 优设AI导航