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

news2025/4/14 7:44:25

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

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

在这里插入图片描述

2. 新增Person.msg 消息实体

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

在这里插入图片描述

string name
uint8 sex
uint8 age

uint8 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 COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

//在声明ROS消息时需要加入以下内容
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

//取消对编译选项的注释,在原本的内容下加入message_runtime,此处为生成可执行文件所需依赖包
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES package1
   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

// 添加编译及链接文件,增加add_dependencies表明优先编译消息头文件,避免后续使用时候编译程序报错


回到catkin_ws 再编译

cd ~/catkin_ws
 catkin_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.coloradmin.cn/o/1186454.html

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

相关文章

【Leetcode】【每日一题】【简单】2609. 最长平衡子字符串

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/find-the-longest-balanced-subs…

【Java】基于SpringBoot创建Web页面并热更新

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍基于SpringBoot创建Web页面并热更新。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

在微信小程序中怎么实现报名功能

在当今数字化时代&#xff0c;微信小程序已经成为各行各业进行营销和客户管理的必备工具。其中&#xff0c;报名功能作为微信小程序的一个重要应用场景&#xff0c;为企业或组织提供了方便、高效、实时的数据收集与管理方式。本文将为你详细介绍如何在微信小程序中实现报名功能…

shm4mn.dll没有被指定

每次打开excel&#xff0c;都会弹出提示“shm4mn.dll没有被指定” 网上各种方法都试了一次&#xff0c;没效果 解决方案&#xff1a; 直接在设置中删除所有添加的打印机

基于斑马算法的无人机航迹规划-附代码

基于斑马算法的无人机航迹规划 文章目录 基于斑马算法的无人机航迹规划1.斑马搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用斑马算法来优化无人机航迹规划。 1.斑马搜索算法 …

查看apk签名

cmd 命令&#xff1a; keytool -v -list -keystore "E:\xxx\release.jks"

01MyBatisPlus入门案例,常见注解,常用配置

一、入门案例 需求&#xff1a;基于课前资料提供的项目&#xff0c;实现下列功能&#xff1a; 新增用户功能根据id查询用户根据id批量查询用户根据id更新用户根据id删除用户 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供的starter&#xff0c;其中集成了Mybatis和Myba…

Navicat16连接不上mysql

博主是因为服务里MySQL没启动&#xff0c; 如果确定自己的数据库正确无误的朋友就可以退出寻找其它解决办法了。 如图&#xff0c;一打开navicat就初始化&#xff0c;啥都没有&#xff0c;也连接不上 1&#xff0c;搜索里搜【服务】找到MySQL&#xff0c; 发现MySQL未启动。点击…

Map(关联数组)和Set(集合)

目录 Map和Set是用来专门查找的数据结构,查找效率非常高 Map是key-value模型(对应了两个东西) Set是纯key模型(只对应i一个东西) Map的使用 Map的方法 Map的put()方法 Map的get()方法 Map的getOrdefault()方法 Map的keySet()方法 Map的entrySet()方法 Entry是Map的内部接口类​…

OpenAI开发者大会掀起风暴:GPT模型价格狂降50%,应用商店即将亮相,AI技术将引爆全球!

OpenAI首届开发者大会召开了&#xff01; 关键信息&#xff1a; GPT-4升级版GPT-4 Turbo来了&#xff0c;上下文窗口达到128k&#xff0c;为GPT-4的4倍&#xff1b;OpenAI还降低了几乎所有模型的API使用价格&#xff0c;整体便宜了一半多&#xff1b;GPT-4系列的多模态能力向B…

OAuth2.0双令牌

OAuth 2.0是一种基于令牌的身份验证和授权协议&#xff0c;它允许用户授权第三方应用程序访问他们的资源&#xff0c;而不必共享他们的凭据。 在OAuth 2.0中&#xff0c;通常会使用两种类型的令牌&#xff1a;访问令牌和刷新令牌。访问令牌是用于访问资源的令牌&#xff0c;可…

关于Python hydra库(OmegaConf)(yaml)

这为博友介绍的很清晰&#xff0c;就给大家引荐一下&#xff1a; Python hydra库(OmegaConf)(yaml)_hxxjxw的博客-CSDN博客 安装Python hydra-core我遇到的问题&#xff1a; which pip 确实是虚拟环境&#xff08;pytorch_gpu&#xff09; 依然报错 &#xff1a;ModuleNotF…

字节8年经验之谈 —— 如何从0开始做自动化测试?

自动化测试是使用软件工具在应用程序上自动运行测试的过程&#xff0c;无需任何人为干预。这可以通过减少手动测试的需要来保存时间并提高软件开发过程的效率。由于人为错误或不一致性&#xff0c;手动测试可能容易出错&#xff0c;这可能导致错误未被检测到。自动化测试通过提…

Jenkins 部署.net core 项目 - NU1301错误

/root/.jenkins/workspace/householdess/services/host/fdbatt.monitor.HttpApi.Host/fdbatt.monitor.HttpApi.Host.csproj : error NU1301: 本地源“/root/.jenkins/workspace/householdess/​http:/x.x.x.x:9081/repository/nuget.org-proxy/index.json”不存在。 [/root/.je…

uni-app多端开发

uni-app 多端开发 一、命令创建uni-app 项目二、在微信小程序后台找到 appId 填写 appId三、运行项目四、使用 uni-ui4-1、下载4-2、自动导入4-3、ts项目下载类型校验 &#xff08;uni-ui 组件库&#xff09;4-3-1、下载4-3-2、配置 五、持久化 pinia六、数据请求封装七、获取组…

【FastCAE源码阅读6】C++与Python的集成,实现相互调用

分析FastCAE代码之前先看看C与Python如何相互调用的。 一、C调用Python 先写个C调用Python的例子&#xff0c;然后再来看FastCAE集成Python就比较简单了。直接上代码&#xff1a; #include <iostream> #include "python.h"int main() {Py_Initialize();PyRu…

Android开发自定义实现炫酷的进度条

本篇文章主要记录自定义View实现的水平进度条&#xff0c;包含的主要内容:水平进度条可设置渐变的颜色、在水平进度条上添加开始好结束的图片以及动态添加进度条下面的进度文字说明。下面是效果图展示&#xff1a; 实现的以上效果的主要代码分析说明&#xff1a; 第一步&#…

【开源】基于Vue和SpringBoot的电子元器件管理系统

项目编号&#xff1a; S 002 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S002&#xff0c;文末获取源码。} 项目编号&#xff1a;S002&#xff0c;文末获取源码。 目录 一、摘要1.1 项目简介1.2 项目录屏 二、研究内容三、界面展示3.1 登录&注册&主页…

一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp

前言 大家有使用过.NET开发过OCR工具吗&#xff1f;今天给大家推荐一个基于百度飞桨封装的.NET版本OCR工具类库&#xff1a;PaddleOCRSharp。 OCR工具有什么用&#xff1f; OCR&#xff08;Optical Character Recognition&#xff09;工具可以将图像或扫描文件中的文本内容转…

“找不到emp.dll,无法继续执行代码”的问题要如何修复

今天我想和大家分享的是关于emp.dll缺失的4种解决方法。首先&#xff0c;让我们来了解一下emp.dll缺失的原因以及它是什么文件。 emp.dll是一个动态链接库文件&#xff0c;它位于系统的安装目录下。它是Windows操作系统的一部分&#xff0c;用于支持某些应用程序的正常运行。当…