ros1 自定义topic 主题的发布,监听以及和消息体的定义

1. 在功能包下新增msg 文件夹

在功能包的下面新建 msg 文件夹,如下图所示

在这里插入图片描述

2. 新增Person.msg 消息实体

右键打开命令框,输入 touch Person.msg
就会在msg 目录下新增 Person.msg 文件
在这里插入图片描述
在Person.msg中输入如下内容完成.msg文件的创建,msg文件是ROS独有的格式

在这里插入图片描述

string name
uint8 sex
uint8 ageuint8 unknown = 0
uint8 male = 1
uint8 female = 2

3 修改package.xml文件

需要加入编译依赖和执行依赖,编译和执行均需要相关依赖功能包,在package.xml文件中添加以下内容

<build_depend>message_generation</build_depend>     //编译的支持项
<exec_depend>message_runtime</exec_depend>     //生成可执行文件的支持项

在这里插入图片描述

4 修改CMakeLists.txt文件

//在功能包的CMakeList.txt文件夹下添加message_generation库,这一块主要是编译会用到的支持包
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)//在声明ROS消息时需要加入以下内容
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)//取消对编译选项的注释,在原本的内容下加入message_runtime,此处为生成可执行文件所需依赖包
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES package1CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)// 添加编译及链接文件,增加add_dependencies表明优先编译消息头文件,避免后续使用时候编译程序报错

回到catkin_ws 再编译

cd ~/catkin_wscatkin_make

5 新增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,队列长度为10        ros::Publisher person_info_pub  =  n.advertise<package1::Person>("/person_info",10); //设置循环频率(HZ),与loop_rate.sleep()函数关联,如果下一帧信息不满足频率要求则系统延时ros::Rate loop_rate(1);   while(ros::ok()){   //初始化learning_topic::Person类型的消息,并赋值learning_topic::Person person_msg;person_msg.name = "Bob";person_msg.age = 6;person_msg.sex =  package1::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();}return 0;
}

6 新增监听类Subscriber

#include  <ros/ros.h>
#include "learning_topic/Person.h"void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{//将接收到的消息打印出来,注意在这里需要使用->指针,因为传进来的参数也是指针,当前对象还没有.属性ROS_INFO("Subscribe 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;    //创建一个Publisher,发布名为/person_info的话题,消息类型为learning_topic::Person,队列长度为10        ros::Subscriber person_info_sub  =  n.subscribe("/person_info",10,personInfoCallback); ros::spin();return 0;
}

目录结构如下图
在这里插入图片描述

7 再次修改CMakeLists.txt文件

// 添加编译及链接文件,增加add_dependencies表明优先编译消息头文件,避免后续使用时候编译程序报错
add_executable(person_publishersrc/person_publisher.cpp)
target_link_libraries(person_publisher${catkin_LIBRARIES})
add_dependencies(person_publisher${PROJECT_NAME}_generate_messages_cpp)add_executable(person_subscribersrc/person_subscriber.cpp)
target_link_libraries(person_subscriber${catkin_LIBRARIES})
add_dependencies(person_subscriber${PROJECT_NAME}_generate_messages_cpp)

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

8 再次编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash

编译成功如下图
在这里插入图片描述

9.测试

先启动监听端

 rosrun learning_topic person_subscriber

启动发布者

rosrun learning_topic person_publisher

效果如下图所示:

在这里插入图片描述
这样自定义topic 的发布和订阅就已经完成了,有问题评论区见

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

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

相关文章

关于卷积神经网络中如何计算卷积核大小(kernels)

首先需要说明的一点是&#xff0c;虽然卷积层得名于卷积&#xff08; convolution &#xff09;运算&#xff0c;但我们通常在卷积层中使用更加直观的计算方式&#xff0c;叫做互相关&#xff08; cross-correlation &#xff09;运算。 也就是说&#xff0c;其实我们现在在这里…

安装 Node.js

首先&#xff0c;我们需要安装 Node.js 和相关的库&#xff0c;如 request 和 cheerio。 npm install request cheerio然后&#xff0c;我们可以使用以下代码来爬取网页内容&#xff1a; const request require(request); const cheerio require(cheerio);request({url: js…

基于ubuntu1604的ROS安装

不同版本的Ubuntu都有对应的ROS版本&#xff0c;不要强行安装不对应的版本&#xff0c;否则遇到问题会很难找到解决方法。此教程也只是基于Ubuntu1604和kinetic版本的ROS。 一、基本流程 以下命令仅记录执行顺序&#xff0c;不要无脑复制执行&#xff0c;重在理解 #基本更新…

Linux学习第35天:Linux LCD 驱动实验(二):星星之火可以燎原

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、LCD驱动程序编写 需要注意的地方&#xff1a; ①、 LCD 所使用的 IO 配置。 ②、 LCD 屏幕节点修改&#xff0c;修改相应的属性值&#xff0c;换成我们所使…

JavaScript爬虫程序爬取游戏平台数据

这次我用一个JavaScript爬虫程序&#xff0c;来爬取游戏平台采集数据和分析的内容。爬虫使用了爬虫IP信息&#xff0c;爬虫IP主机为duoip&#xff0c;爬虫IP端口为8000。以下是每行代码和步骤的解释&#xff1a; // 导入所需的库 const axios require(axios); const cheerio …

京东数据分析:2023年9月京东打印机行业品牌销售排行榜

鲸参谋监测的京东平台9月份打印机市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;今年9月&#xff0c;京东平台打印机的销量为60万&#xff0c;环比增长约32%&#xff0c;同比下滑约25%&#xff1b;销售额为5亿&#xff0c;环比增长约35%&#xff0c;同比下滑约29%…

Python中的上下文管理器和with语句

在Python编程中,资源管理是一个核心概念,涉及文件处理、网络连接、数据库会话等。这些资源需要正确的管理,以确保它们在使用后被适当地关闭或释放,避免资源泄漏。Python通过上下文管理器(Context Managers)和with语句提供了一种优雅的资源管理机制。在本篇博客中,我们将…

jpa Repository的常用写法总结

一、前言 之前项目在xml中写sql&#xff0c;感觉标签有很多&#xff0c;比较灵活&#xff1b; 最近在写新项目&#xff0c;使用了jpa&#xff0c;只能在java中写sql了&#xff0c;感觉不太灵活&#xff0c;但是也得凑付用。 以下总结下常用入参出参写法。 二、Repository代…

Notepad++中删除连续的任意n行

使用Notepad里的行标记功能&#xff0c;可以删除指定的任意n行。 案例1&#xff0c;删除sample2.dat里的第201行到第10000行。方法如下&#xff1a; (1) 用户NotePad打开sample2.dat&#xff0c;右击201行 —》“开始/结束”/开始 图(1) 选择行的起点&#xff1a;201 (2) 接…

JS的内存泄漏详解

介绍&#xff1a; js中的内存垃圾回收机制&#xff1a;垃圾回收器会定期扫描内存&#xff0c;当某个内存中的值被引用为零时就会将其回收。当前变量已经使用完毕但依然被引用&#xff0c;导致垃圾回收器无法回收这就造成了内存泄漏。传统页面每次跳转都会释放内存&#xff0c;…

做什么数据表格啊,要做就做数据可视化

是一堆数字更易懂&#xff0c;还是图表更易懂&#xff1f;很明显是图表&#xff0c;特别是数据可视化图表。数据可视化是一种将大量数据转化为视觉形式的过程&#xff0c;通过图形、图表、图像等方式呈现数据&#xff0c;以便更直观地理解和分析。 数据可视化更加生动、形象地…

Linux内核分析(八)--用户/内核缓冲区及磁盘高速缓存

目录 一、引言 二、缓冲区 ------>2.1、缓冲区介绍 ------>2.2、缓冲区类型 ------------>2.2.1、行缓冲 ------------>2.2.2、全缓冲 ------------>2.2.3、无缓冲 ------>2.3、内核缓冲区 ------------>2.3.1、数据预读(cache) ------------&g…

蓝桥杯每日一题203.11.7

题目描述 题目分析 使用dp思维&#xff0c;当前位置是否可行是有上一位置推来&#xff0c;计算出最大的可行位置即可 #include <stdio.h> #include <string.h>#define N 256 int f(const char* s1, const char* s2) {int a[N][N];int len1 strlen(s1);int len2 …

kafka笔记要点和集群安装、消息分组、消费者分组以及与storm的整合机制

kafka笔记 1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端&#xff0c;一类叫producer&#xff08;消息生产者&#xff09;&#xff0c;一类叫做consumer&#xff08;消息消费者&#xff09;&#xff0c;客户端和broker服务器之间…

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata

文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…

AIGPT重大升级,界面重新设计,功能更加饱满,用户体验升级

AIGPT AIGPT是一款功能强大的人工智能技术处理软件&#xff0c;不但拥有其他模型处理文本认知的能力还有AI绘画模型、拥有自身的插件库。 我们都知道使用ChatGPT是需要账号以及使用魔法的&#xff0c;实现其中的某一项对我们一般的初学者来说都是一次巨大的挑战&#xff0c;但…

Fourier分析导论——第4章——Fourier级数的一些应用(E.M. Stein R. Shakarchi)

第 4 章 傅里叶级数的一些应用 Fourier series and analogous expansions intervene very naturally in the general theory of curves and surfaces. In effect, this theory, conceived from the point of view of analysis, deals obviously with the study of arbitra…

三款软件录制电脑屏幕视频

在这个视频信息快速发展的新时代&#xff0c;寻找好用的可以录制电脑屏幕视频的软件变得极其重要&#xff0c;因为制作视频已成为我们生活工作中不可或缺的一部分。 这些好用的录屏软件允许你录制摄像头、特定窗口、部分区域或整个桌面&#xff0c;同时还可对录制中的视频进行…

前沿技术:人工智能的未来之路

&#x1f38a;专栏【人工智能】 &#x1f33a;每日一句&#xff1a;天空黑暗到一定程度&#xff0c;星辰就会熠熠生辉&#xff01; ⭐欢迎并且感谢大家指出我的问题 文章目录 一、引言 二、人工智能的未来发展 三、人工智能发展面临的挑战 四、结论 一、引言 随着科技的不…

lvgl加载资源JPG image,播放动画

load jpg image to memory lvgl加载图片资源解码时间比较长&#xff0c;可以预先缓存到缓存中。 本方案时候lvgl&#xff0d;&#xff17;&#xff0c;下面是参考 Images — LVGL documentation 实施&#xff1a; lv_img_cache_set_size(cachecount);  //设置缓存的图片…