ROS1快速入门学习笔记 - 07话题消息的定义与使用

目录

一、话题模型

二、自定义话题消息

1. 在功能包下创建msg目录用于存储话题文件

2. 在package.xml文件中添加功能包依赖;

3. 在CMakeLists.txt增加编译选项;

4. 完成编译

5. 配置CMakeLists.txt中的编译规则(增加发布者和订阅者)

6. 并运行发布者和订阅者

6. Python的实现


一、话题模型

二、自定义话题消息

  • 定义msg文件;
string name
uint8  sex
uint8  ageuint8 unknown = 0
uint8 male = 1
uint8 female = 2
  • 在package.xml文件中添加功能包依赖;
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  • 在CMakeLists.txt增加编译选项;
find_package(...... message_generation)add_message_files(FILES person.msg)
generate_messages(DEPENDENCIES std_msgs)catkin_package(...... message_runtime)
  • 编译生成语言相关文件 

具体步骤如下:

1. 在功能包下创建msg目录用于存储话题文件

文件内容为上述定义的msg文件。

2. 在package.xml文件中添加功能包依赖;

3. 在CMakeLists.txt增加编译选项;

 

 

 

4. 完成编译

先catkin_make进行编译

然后在下面的路径可以找到编译后的C++类型的头文件

需要通过发布者和订阅者来实现话题的演示

我们在下面路径下分别添加发布者和订阅者对应的C++代码文件

 

其中person_publisher.cpp的代码如下所示:

#include <ros/ros.h>
#include "learning_topic/Person.h"int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "person_publisher");// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);// 设置循环的频率ros::Rate loop_rate(1);int count = 0;while (ros::ok()){// 初始化learning_topic::Person类型的消息learning_topic::Person person_msg;person_msg.name = "Tom";person_msg.age  = 18;person_msg.sex  = learning_topic::Person::male;// 发布消息person_info_pub.publish(person_msg);ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);// 按照循环频率延时loop_rate.sleep();}


其中person_subscriber.cpp的代码如下所示:

#include <ros/ros.h>
#include "learning_topic/Person.h"// 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{// 将接收到的消息打印出来ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", msg->name.c_str(), msg->age, msg->sex);
}int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "person_subscriber");// 创建节点句柄ros::NodeHandle n;// 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallbackros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);// 循环等待回调函数ros::spin();return 0;
}

5. 配置CMakeLists.txt中的编译规则(增加发布者和订阅者)

  • 设置需要编译的代码和生成的可执行文件;
  • 设置链接库;
  • 添加依赖项;
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

将其添加到CMakeLists.txt文件中

 

6. 并运行发布者和订阅者

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun learning_topic person_subscriber
$ rosrun learning_topic person_publisher

最终的运行结果如下:

 

而且,我们可以发现,吧ROSmaster关闭后,发布者和订阅者依然在发布信息

 

并且,此时如果有第三个节点想要与这两个节点进行沟通是办不到的,因为ROSMaster已经关闭了。

6. Python的实现

将代码移动至以下目录中

其中Py代码的具体内容如下:

 person_publisher的代码如下:

import rospy
from learning_topic.msg import Persondef velocity_publisher():# ROS节点初始化rospy.init_node('person_publisher', anonymous=True)# 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10person_info_pub = rospy.Publisher('/person_info', Person, queue_size=10)#设置循环的频率rate = rospy.Rate(10) while not rospy.is_shutdown():# 初始化learning_topic::Person类型的消息person_msg = Person()person_msg.name = "Tom";person_msg.age  = 18;person_msg.sex  = Person.male;# 发布消息person_info_pub.publish(person_msg)rospy.loginfo("Publsh person message[%s, %d, %d]", person_msg.name, person_msg.age, person_msg.sex)# 按照循环频率延时rate.sleep()if __name__ == '__main__':try:velocity_publisher()except rospy.ROSInterruptException:pass

 person_subscriber的代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
######################################################################### 该例程将订阅/person_info话题,自定义消息类型learning_topic::Personimport rospy
from learning_topic.msg import Persondef personInfoCallback(msg):rospy.loginfo("Subcribe Person Info: name:%s  age:%d  sex:%d", msg.name, msg.age, msg.sex)def person_subscriber():# ROS节点初始化rospy.init_node('person_subscriber', anonymous=True)# 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallbackrospy.Subscriber("/person_info", Person, personInfoCallback)# 循环等待回调函数rospy.spin()if __name__ == '__main__':person_subscriber()

运行步骤与上述C++的一致 

 

 

 

 

 

 

 

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

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

相关文章

Linux 第十三章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【办公类-22-13】周计划系列(5-5)“周计划-05 周计划表格内教案部分“节日”清空改成“节日“” (2024年调整版本)Win32

背景需求&#xff1a; 本学期19周&#xff0c;用了近10周的时间&#xff0c;终于把周计划教案部分的内容补全了&#xff08;把所有教案、反思的文字都撑满一个单元格&#xff09;&#xff0c; 一、原始教案 二、新模板内的教案 三、手动添加文字后的样式&#xff08;修改教案…

STM32之HAL开发——电容按键

电容按键原理 电容器 (简称为电容) 就是可以容纳电荷的器件&#xff0c;两个金属块中间隔一层绝缘体就可以构成一个最简单的电容。如图 32_1 (俯视图)&#xff0c;有两个金属片&#xff0c;之间有一个绝缘介质&#xff0c;这样就构成了一个电容。这样一个电容在电路板上非常容…

Detla lake with Java--入门

最近在研究数据湖&#xff0c;虽然不知道研究成果是否可以用于工作&#xff0c;但我相信机会总是留给有准备的人。 数据湖尤其是最近提出的湖仓一体化概念&#xff0c;很少有相关的资料&#xff0c;目前开源的项目就三个&#xff0c;分别是hudi, detla lake, iceberg。最终选择…

常用算法代码模板 (3) :搜索与图论

AcWing算法基础课笔记与常用算法模板 (3) ——搜索与图论 常用算法代码模板 (1) &#xff1a;基础算法 常用算法代码模板 (2) &#xff1a;数据结构 常用算法代码模板 (3) &#xff1a;搜索与图论 常用算法代码模板 (4) &#xff1a;数学知识 文章目录 0 搜索技巧1 树与图的存…

机器学习:基于Sklearn、XGBoost框架,使用XGBClassifier、支持向量分类器和决策树分类器预测乳腺癌是良性还是恶性

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

大数据组件之Storm简介

大数据组件之Storm简介 摘要&#xff1a; Apache Storm是一个开源的实时大数据处理系统&#xff0c;由Twitter公司开发并捐赠给Apache基金会。它以其高吞吐量、可扩展性和容错性在实时数据处理领域占据重要地位。本文将对Apache Storm进行全面介绍&#xff0c;包括其架构、特点…

MySQL:飞腾2000+Centos7.6 aarch64 部署MySQL8.0.36

目录 1.硬件环境 2.MySQL选择 Bundle版本【全部文件】​编辑 3.下载并安装 4.安装完成后检查mysql 5.初始化MySQL 6.那就问了&#xff0c;都初始化了啥&#xff1f; 7.尝试启动MySQL 8.给mysql文件授权 9.再次尝试启动正常 10.mysql初始化目录出现了mysql.sock 11.找…

Android SQLite中的UNIQUE constraint failed错误

报错信息&#xff1a; UNIQUE constraint failed SQLite中的UNIQUE constraint failed错误&#xff0c;表明尝试插入或更新数据库时出现了违反唯一性约束的情况。唯一性约束确保在特定列或列集合中的值在表中是唯一的&#xff0c;即不能有重复的值。当你尝试插入或更新已存在于…

为什么我的Mac运行速度变慢 mac运行速度慢怎么办 如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

C、C++的联合体:union关键字含义

C、C的联合体&#xff1a;union关键字含义 **联合体&#xff08;Union&#xff09;**在C语言中是一种特殊的数据结构&#xff0c;它允许在相同的内存位置存储不同的数据类型。但是&#xff0c;在任何时候&#xff0c;联合体中只有一个成员是有效的&#xff0c;因为所有的成员都…

http请求内容

Cookie 可以包含多个键值对&#xff0c;因此它不仅限于单个值。一个 Cookie 可以携带多个属性&#xff0c;每个属性由键值对表示 Set-Cookie: namevalue; expiresSat, 30 Apr 2022 23:59:59 GMT; path/; domain.example.com; secure; HttpOnly 在HTTP协议中&#xff0c;请求头之…

【项目学习01_2024.04.27_Day02】

学习笔记 3 课程查询3.4 生成接口文档ApiOperation("课程查询接口") 和Api注解的区别Api(value "课程信息编辑接口",tags "课程信息编辑接口")其中的value和tags有什么用呢Swaager的常用注解如下&#xff1a;3.5 开发持久层3.5.1 生成mapper3.…

从NoSQL到NewSQL——10年代大数据浪潮下的技术革新

引言 在数字化浪潮的推动下&#xff0c;数据库技术已成为支撑数字经济的坚实基石。腾讯云 TVP《技术指针》联合《明说三人行》特别策划的直播系列——【中国数据库前世今生】&#xff0c;我们将通过五期直播&#xff0c;带您穿越五个十年&#xff0c;深入探讨每个时代的数据库演…

如何获得理想的词向量表示?

为了获得理想的词向量表示以支持下游任务&#xff0c;词汇的嵌入向量通常会经过一系列的处理和优化步骤。以下是一些关键的操作&#xff1a; 初始化&#xff1a;嵌入向量最初是随机初始化的&#xff0c;但一些方法会使用更智能的初始化策略&#xff0c;比如通过预训练的嵌入或者…

8_手眼标定总结_auboi5机械臂与海康平面相机

经过不断地学习与调试&#xff0c;不断地学习网络上其他同志分享的资料&#xff0c;opencv手眼标定迎来了阶段性结束。实际测试结果在机械臂坐标系中X方向差5mm左右。 代码参考《https://blog.csdn.net/wanggao_1990/article/details/81435660》 注意事项&#xff1a; ①标定…

软考高级架构师:嵌入式操作系统微内核例题解析

1 题目和解析 1.1 题目 以下关于操作系统微内核架构特征的说法&#xff0c;不正确的是&#xff08;&#xff09;。 A. 微内核的系统结构清晰&#xff0c;利于协作开发 B. 微内核代码量少&#xff0c;系统具有良好的可移植性 C. 微内核有良好的伸缩性、扩展性 D. 微内核的功能…

Java解决最后一个单词长度

Java解决最后一个单词长度 01 题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s "Hel…