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

2023-09-22 11:11:54

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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

更多推荐

uniapp瀑布流布局写法

首先我们要清楚瀑布流是什么?瀑布流布局(WaterfallFlowLayout),也称为瀑布流式布局,是一种常见的网页或移动应用布局方式,特点是元素以不规则的方式排列,就像瀑布中的流水一样,每个元素的高度可以不同。主要特点和优点包括:不规则的排列:瀑布流布局允许元素以不同的高度和宽度排列,因此适用于展示不同尺寸和形状的

网络安全(黑客)自学

想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有Web

坐标休斯顿,TDengine 受邀参与第九届石油天然气数字化大会

美国中部时间9月14日至15日,第九届石油天然气数字化大会在美国德克萨斯州-休斯顿-希尔顿美洲酒店举办。本次大会汇聚了数百名全球石油天然气技术高管及众多极具创新性的数据技术方案商,组织了上百场硬核演讲,技术专家与行业从业者共聚一堂,共同探讨石油天然气领域的创新技术和解决方案,全面了解整个行业的数字化潜力。TDengin

心理健康数据集:mental_health_chatbot_dataset

一.数据集描述1.数据集摘要该数据集包含与心理健康相关的问题和答案的对话对,以单一文本形式呈现。数据集是从流行的医疗博客(如WebMD、MayoClinic和HealthLine)、在线常见问题等来源精选而来的。所有问题和答案都经过匿名化处理,以删除任何个人身份信息(PII),并经过预处理以删除任何不必要的字符。2.语

RabbitMQ 消息应答

每日一句物是人非事事休,欲语泪先流。概述为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制,消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。自动应答消息发送后立即被认为已经传送成功,这种模式需要在高吞吐量和数据传输安全性方面做权衡。因为这种模式有两

【评论内容关键词提取】多种主流提取算法与大模型测试

文章目录1.写在前面2.TextRank关键词提取算法3.TFIDF算法4.jionlp算法5.sklearn算法6.Rake算法7.hanlp情感分析8.大语言模型1.写在前面做过舆情项目或文本内容情感分析的大家都知道,我们要从大量的文本内容中提取核心短语或者关键词!最近我们的爬虫项目中正好遇到了这么一个需求,我们收

服务器环境的关键组成部分

服务器环境是指服务器硬件和软件组成的整体环境,包括操作系统、网络配置、数据库、Web服务器软件、应用程序等。它提供了服务器运行和支持所需的基本条件和组件。以下是服务器环境中的一些关键组成部分:操作系统:服务器环境通常基于某种操作系统,如Linux、WindowsServer等。操作系统提供了服务器的基本功能和管理能力,

css知识学习系列(3)-每天10个知识点

目录1.伪类与伪元素在CSS中,伪类和伪元素有什么区别?请举例说明。2.文字与字体在CSS中,如何设置文字的大小和字体?你如何加载外部字体?3.布局在CSS中,你如何对元素进行垂直居中?4.动画与过渡你能举一个使用CSS中的动画和过渡的例子吗?并解释它的工作原理。5.重叠与层叠在CSS中,“position”属性对元素

vue+electron一键入门

前言帮公司弄了一个vue+electron项目,里面用到了axios、element-ui、ue-router、js-md5、sqlite3这些依赖库,其中sqlite3比较难搞下面会详细展开来讲,同时也涉及打包(window包、mac包)开始其实项目整体没啥好讲,我就讲一下数据库的封装、打包配置注意事项即可sqlit

K8S:pod资源限制及探针

文章目录一.pod资源限制1.pod资源限制方式2.pod资源限制指定时指定的参数(1)request资源(2)limit资源(3)两种资源匹配方式3.资源限制的示例(1)官网示例(2)Pod和容器的资源请求和限制格式(3)CPU资源单位介绍(4)内存资源单位(5)资源限制示例1:(6)资源限制示例2:二.健康检查:又

9.基于粤嵌gec6818开发板小游戏2048的算法实现

2048源码:感兴趣的可以去了解一下2048优化算法:基于蒙特卡罗树搜索的_2048_游戏优化算法_刘子正#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/mman.h>#include<lin

热文推荐