SLAM从入门到精通(消息传递)

news2024/11/18 14:51:20

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们只是编写了一个publisher节点,以及一个subscribe节点。有了这两个节点,它们之间就可以通信了。在实际生产中,我们除了简单的通信之外,要传递的数据可能还有很多。这个时候,我们就要构建一个消息体。这个消息体可以是各种脚本,但需要同时能被publisher和subscribe访问到。幸好,ros给我们提供了这样的一种形式。

1、构建消息体

        在package下面创建一个msg文件夹。文件夹中保存一个Student.msg文件,它的内容如下所示,

string name
float64 height
float64 weight

        这个文件其实只是一个脚本。通过在workspace顶层输入catkin_make,就可以生成对应的头文件Student.h。注意,头文件保存的位置位于./devel/include/beginner_tutorials/Student.h。编译之前也要修改下CMakelists.txt文件,如下面2所示。

 2、修改CMakelists.txt文件


cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)

## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS message_generation roscpp rospy std_msgs genmsg)

add_message_files(FILES Student.msg)

## Declare ROS messages and services
#add_message_files(FILES Num.msg)
#add_service_files(FILES AddTwoInts.srv)

## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)

## Declare a catkin package
catkin_package()

## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

3、重新构建talker.cpp文件


#include "ros/ros.h"
#include "beginner_tutorials/Student.h"
#include <cstdlib>

using namespace std;

int main(int argc, char* argv[])
{
	ros::init(argc, argv, "node_MyMsgPub");
	if(argc!=4)
	{
		cout << "Error command parameter!\n" \
			"Please run command eg:\n" \
			"rosrun begin_tutorials talker LiLei 180 160" << endl;
		return 1;
	}

	ros::NodeHandle nh;
	
	ros::Publisher MyMsgPub = nh.advertise<beginner_tutorials::Student>("MyMsg", 100);
	beginner_tutorials::Student sdtMsg;
	sdtMsg.name = argv[1];
	sdtMsg.height = atof(argv[2]);
	sdtMsg.weight = atof(argv[3]);
	
	ros::Rate rate(10);
	while(ros::ok())
	{
		MyMsgPub.publish(sdtMsg);
		rate.sleep();
	}

	return 0;
}

        代码大部分和之前差不多,只要注意beginner_tutorials::Student这个结构体即可。

4、重新构建listener.cpp文件

#include "ros/ros.h"
#include "beginner_tutorials/Student.h"

void MyMsgCallback(const beginner_tutorials::Student& sdtInfo)
{
	ROS_INFO("Thestudent information is:\n"
		"name:%s--height:%f--weight:%f\n",
		sdtInfo.name.c_str(),
		sdtInfo.height,
		sdtInfo.weight);
}

int main(int argc, char* argv[])
{
	ros::init(argc, argv, "node_MyMsgSub");

	ros::NodeHandle nh;
	ros::Subscriber MyMsgSub = nh.subscribe("MyMsg", 1000, &MyMsgCallback);
	ros::spin();

	return 0;
}

        和talker.cpp一样,代码中只需要关注下beginner_tutorials::Student这个结构体就行。

5、顶层编译

        cd到workspace的顶层,直接输入catkin_make即可。

6、准备运行talker和listener节点

        在运行talker和listener节点之前,有两件事情要做。第一步,打开roscore;第二步,source ./dev/setup.sh文件。最后,分别打开talker和listenner即可。

rosrun beginner_tutorials talker LiLei 180 160
rosrun beginner_tutorials listener

        没什么意外的化,你会看到这样的打印。如果能看到这些打印,基本上说明我们已经学会使用了ros的消息功能。

[ INFO] [1695351213.590856004]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351213.692688848]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351213.791460924]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351213.891075380]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351213.990753652]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351214.090438037]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351214.190497066]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351214.291007141]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351214.390375087]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

[ INFO] [1695351214.490385779]: Thestudent information is:
name:LiLei--height:180.000000--weight:160.000000

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

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

相关文章

CNN(九):Inception v3算法实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 理论基础 Inception v3论文 Inception v3由谷歌研究员Christian Szegedy等人在2015年的论文《Rethinking the Inception Architecture f…

cmd运行jar包,txt文件中文乱码问题

首先&#xff0c;查看我们自己新建的txt文件的编码 我们可以看到&#xff1a;当前编码为UTF-8 然后&#xff0c;我们在cmd中输入命令&#xff1a; chcp 936对应的是默认的GBK编码&#xff0c;如果直接运行jar包&#xff0c;读取txt文件里的中文字符时&#xff0c;就会乱码 …

最新推荐的直链网盘榜单

随着数字化时代的到来&#xff0c;人们对于文件存储和共享的需求越来越大。直链网盘作为一种便捷的云存储解决方案&#xff0c;受到了许多用户的喜爱。本文结合了不同产品测评网站的意见&#xff0c;为您推荐以下几款优秀的直链网盘产品。 1、Zoho Workdrive&#xff1b;2、Goo…

康耐德机器视觉系统在锂电池封装外观缺陷检测发挥什么作用?

随着新能源大力发展&#xff0c;电池的需求越来越多&#xff0c;锂电池生产过程中需要保证质量&#xff0c;通过人工检测会出现错误&#xff0c;而且容易把电池包二次损坏。随着机器视觉技术的发展&#xff0c;很多锂电池生产厂家引入机器视觉来替代人工质检&#xff0c;实现产…

Swiper的使用流程

1.官网查看演示 Swiper演示 - Swiper中文网 2.找到想使用的 比如想使用 卡片切换(255) 记住这个名字 3.去下载示例 下载Swiper - Swiper中文网 4.找到对应文件 5.根据里面引入的东西加到自己的页面 一定要引入swiper的 js 和 css html结构要按示例对应的三层结构 需要 …

深入了解队列数据结构:定义、特性和实际应用

文章目录 &#x1f34b;引言&#x1f34b;队列的定义&#x1f34b;队列的实现&#x1f34b;队列的应用&#x1f34b;练习题&#x1f34b;结语 &#x1f34b;引言 队列&#xff08;Queue&#xff09;是计算机科学中一种重要的数据结构&#xff0c;它常用于各种应用程序中&#x…

typescript 交叉类型

交叉类型简介 TypeScript中的交叉类型是指将多个类型合并为一个类型。这使得我们可以将现有的多种类型叠加到一起成为一种类型&#xff0c;它包含了所需的所有类型的特性。 写这篇文章先问大家一个问题,如何让一个对象既有a类型约束,又有b类型约束? 如果你看了我这篇文章types…

【vue2第十九章】手动修改ESlint错误 和 配置自动化修改ESlint错误

目标:认识代码规范 代码规范:一套写代码的约定规则。例如:“赋值符号的左右是否需要空格”&#xff0c;"一句结束是否是要加;”等 为什么要使用代码规范&#xff1f; 在团队开发时&#xff0c;提高代码的可读性。 在创建项目时&#xff0c;我们选择的就是一套完整的代码…

移动机器人运动规划 --- 基于图搜索的Dijkstra算法

移动机器人运动规划 --- 基于图搜索的Dijkstra算法 Dijkstra 算法Dijkstra 算法 伪代码流程Dijkstra 算法步骤示例Dijkstra算法的优劣分析 Dijkstra 算法 Dijkstra 算法与BFS算法的区别就是 : 从容器中弹出接下来要访问的节点的规则不同 BFS 弹出: 层级最浅的原则&#xff0c…

【教学类】公开课学号挂牌(15*15CM手工纸)

作品展示&#xff1a; 15*15CM手工纸 文本框12磅加粗。学号数字是段落写入&#xff0c;黑体270磅 背景需求 最近都在小班、中班、大班里做“Python学具测试”&#xff0c;由于都是陌生的孩子&#xff0c;上课时&#xff0c;我通常只能喊“白衣服的女孩”“花格子衣服的男孩”…

八大排序(三)--------简单选择排序

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…

我写的最蠢的代码

链接 就问你怎么样吧。。。。。。

云计算(Docker)

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言&#xff0c;并遵从 Apache2.0 协议开源。它可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。Docker 可用于开发…

Gateway学习和源码解析

文章目录 什么是网关&#xff1f;搭建实验项目demo-servicegateway-service尝试简单上手 路由&#xff08;Route&#xff09;断言&#xff08;Predicate&#xff09;和断言工厂&#xff08;Predicate Factory&#xff09;gateway自带的断言工厂After&#xff08;请求必须在某个…

概率论与数理统计(第一章 概率论的基本概念)

文章目录 第一章 概率论的基本概念一、随机试验二、事件的概率 第一章 概率论的基本概念 一、随机试验 随机试验特点&#xff1a; ①可以在相同的条件下重复进行 ②每次试验的可能结果不止一个&#xff0c;并且能提前预测所有的可能结果 ③在未进行试验前不知道哪一个结果会出…

抖音SEO源码

抖音短视频seo矩阵系统源码是一种用于优化抖音视频内容的工具&#xff0c;可以帮助用户提高抖音视频的搜索排名和流量&#xff0c;从而增加视频曝光和转化率。该系统包括两部分&#xff0c;即数据收集和分析模块以及SEO策略和实施模块。 数据收集和分析模块主要负责从抖音平台…

MySQL进阶 —— 超详细操作演示!!!(中)

MySQL进阶 —— 超详细操作演示&#xff01;&#xff01;&#xff01;&#xff08;中&#xff09; 三、SQL 优化3.1 插入数据3.2 主键优化3.3 order by 优化3.4 group by 优化3.5 limit 优化3.6 count 优化3.7 update 优化 四、视图/存储过程/触发器4.1 视图4.2 存储过程4.3 存…

爬虫实践-豆瓣读书Top250

爬虫学习与实践 一、爬虫介绍二、爬虫原理TCP3次握手&#xff0c;4次挥手过程 三、页面解析之数据提取四、正则表达式五、实践1. 抓取百度贴吧2. 拉钩招聘网 六、 进阶版 一、爬虫介绍 网络爬虫&#xff0c;其实叫作网络数据采集更容易理解。就是通过编程向网络服务器请求数据…

MasterAlign相机参数设置-增益调节

相机参数设置-曝光时间调节操作说明 相机参数的设置对于获取清晰、准确的图像至关重要。曝光时间是其中一个关键参数&#xff0c;它直接影响图像的亮度和清晰度。以下是关于曝光时间调节的详细操作步骤&#xff0c;以帮助您轻松进行设置。 步骤一&#xff1a;登录系统 首先&…

JumpServer存在未授权访问漏洞(CVE-2023-42442) 附POC

文章目录 JumpServer存在未授权访问漏洞&#xff08;CVE-2023-42442&#xff09;CVE-2023-42442 附POC1. JumpServer简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 JumpServer存在未授权访问漏洞&#xff08;CVE-2023-42442&#xff09;…