ROS-5.自定义topic消息格式

news2025/1/23 17:42:40

自定义topic消息格式

  • 1. 定义消息
    • 1.1. 定义msg文件
    • 1.2. 在package.xml中添加功能包依赖
    • 1.3. 在CMakeList.txt添加编译选项
    • 1.4. 编译
  • 2.定义发布者和订阅者
    • 2.1 定义发布者
    • 2.2. 定义订阅者
    • 2.3. 修改CMakeList.txt
    • 2.4 编译
  • 3. 使用消息
    • 3.1 启动ros主程序
    • 3.2. 启动发布者
    • 3.3 启动订阅者

前面我们定义了发布者和订阅者,里面的消息格式都是已经定义好了的,这里介绍怎么自定义我们自己的消息格式
在这里插入图片描述

1. 定义消息

1.1. 定义msg文件

ros中,定义消息是语言无关的,定义消息文件保存在如下

catkin_ws/src/learning_topic/msg/Person.msg

Person.msg 文件就是我们的消息文件,后缀为msg,语言无关,内容如下

//字符串 名称
string name
//uint8 性别
uint8 sex
// uint8 年龄
uint8 age

//这种方式定义性别枚举
uint8 unknown = 0
uint8 male = 1
uint8 female = 2

1.2. 在package.xml中添加功能包依赖

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

1.3. 在CMakeList.txt添加编译选项

在 find_package 语句后面追加 message_generation

find_package(catkin REQUIRED COMPONENTS
  ....
  message_generation
)

在 add_message_files 后面追加 Person.msg

add_message_files(
  FILES
  Person.msg
)

在 generate_messages 后面追加 std_msgs

generate_messages(
  DEPENDENCIES
  std_msgs
)

在 catkin_package后面追加 message_runtime

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topic
  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
#  DEPENDS system_lib
)

1.4. 编译

cd catkin_ws
catkin_make

2.定义发布者和订阅者

2.1 定义发布者

catkin_ws/src/learning_topic/src/person_publisher.cpp

内容如下

#include <ros/ros.h>
#include "learning_topic/Person.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "person_publisher");

    ros::NodeHandle node;

    // 创建一个publisher 发布名为/person_info的主题,消息类型为learning_topic::Person, 队列长度为10
    ros::Publisher person_info_pub = node.advertise<learning_topic::Person>("/person_info", 10);

    ros::Rate loop_rate(1);
    int count = 0;

    while (ros::ok())
    {
        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();
    }

    return 0;
}

2.2. 定义订阅者

catkin_ws/src/learning_topic/src/person_subscriber.cpp

#include <ros/ros.h>
#include "learning_topic/Person.h"

void person_info_callback(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::init(argc, argv, "person_subscriber");

    ros::NodeHandle node;

    ros::Subscriber person_info_sub = node.subscribe("/person_info", 10, person_info_callback);

    ros::spin();

    return 0;
}

2.3. 修改CMakeList.txt

catkin_ws/src/learning_topic/CMakeLists.txt

添加

add_executable(person_publisher src/person_publisher.cpp)
add_executable(person_subscriber src/person_subscriber.cpp)

add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

target_link_libraries(person_publisher
  ${catkin_LIBRARIES}
)
target_link_libraries(person_subscriber
  ${catkin_LIBRARIES}
)

2.4 编译

cd catkin_ws
catkin_make

3. 使用消息

3.1 启动ros主程序

roscore

3.2. 启动发布者

另开一个终端

source devel/setup.sh
rosrun learning_topic person_publisher 

3.3 启动订阅者

source devel/setup.sh
rosrun learning_topic person_subscriber

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

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

相关文章

处理时延降低24倍,联通云粒数据引擎优化实践

*作者&#xff1a;郑扬勇&#xff0c;云粒星河数据中台产品负责人 云粒智慧科技有限公司成立于 2018 年 6 月&#xff0c;是中国联通集团混改以来成立的首家合资公司&#xff0c;是中国智慧城市数智化建设者。一直以来&#xff0c;云粒智慧以数字化、智能化、集约化产品为核心&…

[杂谈]-2023年实现M2M的技术有哪些?

2023年实现M2M的技术有哪些&#xff1f; 文章目录 2023年实现M2M的技术有哪些&#xff1f;1、寻找连接2、M2M与IoT3、流行的 M2M 协议 在当今的数字世界中&#xff0c;机器对机器 (M2M) 正在迅速成为标准。 M2M 包括使联网设备能够交换数据或信息的任何技术。 它可以是有线或无…

关于已经安装了TorchCRF,导入时却提示“ModuleNotFoundError: No module named ‘torchcrf‘”的解决办法

应用python时&#xff0c;想导入torchcrf库 from torchcrf import CRF 但系统提示&#xff1a;ModuleNotFoundError: No module named torchcrf 在命令提示符里输入“pip list”检查已安装库&#xff0c;发现torchcrf已经安装 搞了半天&#xff0c;发现是大小写的问题&#x…

2023.9 - java - 浅拷贝

与 js的浅拷贝不同&#xff1a; 在 JavaScript 中&#xff0c; Object.assign() 或 spread 运算符等方法可以实现浅拷贝&#xff0c;但只针对对象的第一层属性进行复制。如果一个对象只包含基本数据类型的属性&#xff0c;那么对浅拷贝出来的对象进行修改不会影响原始对象&…

Spring IOC的理解

总&#xff1a; 控制反转&#xff08;IOC&#xff09;&#xff1a;理论思想&#xff0c;传统java开发模式&#xff0c;对象是由使用者来进行管理&#xff0c;有了spring后&#xff0c;可以交给spring来帮我们进行管理。依赖注入&#xff08;DI&#xff09;&#xff1a;把对应的…

React笔记(四)类组件(2)

一、类组件的props属性 组件中的数据&#xff0c;除了组件内部的状态使用state之外&#xff0c;状态也可以来自组件的外部&#xff0c;外部的状态使用类组件实例上另外一个属性来表示props 1、基本的使用 在components下创建UserInfo组件 import React, { Component } from…

OpenCV基本操(IO操作,读取、显示、保存)

图像的IO操作&#xff0c;读取和保存方法 1.1 API cv.imread()参数&#xff1a; 要读取的图像 读取图像的方式&#xff1a; cv.IMREAD*COLOR:以彩色模式加载图像&#xff0c;任何图像的图像的透明度都将被忽略。这是默认参数 标志&#xff1a; 1 cv.IMREAD*GRAYSCALE :以…

【进阶之路】pytest自动化测试框架从0-1精通实战

前言 1、运行方式 命令行模式&#xff1a; pytest -s login.py主函数模式&#xff1a; if __name__ __main__:pytest.main(["-s", "login.py"])pytest.ini运行&#xff1a; 在 pytest.ini 文件中配置 pytest 的运行参数。 注意点&#xff1a; 位置&…

车载监管模块项目需求分析报告

目录 1 文档说明.......................................................................................... 4 2 参考文件.......................................................................................... 4 3 概述.......................................…

真机安装Linux Centos7

准备工具&#xff1a; 8G左右U盘最新版UltraISOCentOS7光盘镜像 操作步骤 下载镜像 地址&#xff1a;http://isoredirect.centos.org/centos/7/isos/x86_64/ 安装刻录工具UltraISO&#xff0c;刻录镜像到U盘 ① 选择ISO镜像文件 ② 写入磁盘镜像&#xff0c;在这里选择你的U盘…

NLP(六十七)BERT模型训练后动态量化(PTDQ)

本文将会介绍BERT模型训练后动态量化&#xff08;Post Training Dynamic Quantization&#xff0c;PTDQ&#xff09;。 量化 在深度学习中&#xff0c;量化&#xff08;Quantization&#xff09;指的是使用更少的bit来存储原本以浮点数存储的tensor&#xff0c;以及使用更少的…

C#知识点、常见面试题

相关源码 https://github.com/JackYan666/CSharpCode/blob/main/CSharpCode.cs 0.简要概括 1.删除集合元素 1.For循环删除集合元素:从后面往前删除 从前往后删,有可能不能完全删除 #region 01.For循环删除集合元素void Test01_ForDelListElement(){//错误代码 虽然可以跑…

说说你了解的 Nginx

分析&回答 nginx性能数据 高并发连接: 官方称单节点支持5万并发连接数&#xff0c;实际生产环境能够承受2-3万并发。内存消耗少: 在3万并发连接下&#xff0c;开启10个nginx进程仅消耗150M内存 (15M10150M) 1. 正向、反向代理 所谓“代理”&#xff0c;是指在内网边缘 …

Dump文件的生成以及使用WinDbg静态分析

前言 本文章主要介绍了如何生成Dump文件&#xff0c;包括两种方式&#xff0c;通过代码生成和通过注册表生成。并且介绍了WinDbg工具的下载和使用&#xff0c;以及如何使用WinDbg工具去静态分析Dump文件&#xff0c;从而找到程序的崩溃位置。 生成Dump文件 通过调用WinAPI生成…

WGCNA分析教程 | 代码四

写在前面 WGCNA的教程&#xff0c;我们在前期的推文中已经退出好久了。今天在结合前期的教程的进行优化一下。只是在现有的教程基础上&#xff0c;进行修改。其他的其他并无改变。 前期WGCNA教程 WGCNA分析 | 全流程分析代码 | 代码一 WGCNA分析 | 全流程分析代码 | 代码二 …

论文阅读_扩散模型_DDPM

英文名称: Denoising Diffusion Probabilistic Models 中文名称: 去噪扩散概率模型 论文地址: http://arxiv.org/abs/2006.11239 代码地址1: https://github.com/hojonathanho/diffusion &#xff08;论文对应代码 tensorflow&#xff09; 代码地址2: https://github.com/AUTOM…

Linux图形栈入门概念

Mesa在图形栈中的位置 游戏引擎&#xff1a; 游戏引擎指的是一种软件框架&#xff0c;通过编程和各种工具&#xff0c;帮助开发者设计、构建和运行视频游戏。它相当于一个虚拟的世界创造工具&#xff0c;提供了各种功能模块和资源&#xff0c;如渲染引擎、物理引擎(碰撞检测、重…

跨模态可信感知

文章目录 跨模态可信感知综述摘要引言跨协议通信模式PCP网络架构 跨模态可信感知跨模态可信感知的概念跨模态可信感知的热点研究场景目前存在的挑战可能改进的方案 参考文献 跨模态可信感知综述 摘要 随着人工智能相关理论和技术的崛起&#xff0c;通信和感知领域的研究引入了…

【网络编程上】

目录 一.什么是互联网 1.计算机网络的定义与分类&#xff08;了解&#xff09; &#xff08;1&#xff09;计算机网络的定义 &#xff08;2&#xff09;计算机网络的分类 ① 按照网络的作用范围进行分类 ②按照网络的使用者进行分类 2.网络的网络 &#xff08;理解&#xf…

OpenCV模块介绍

其中core、highgui、imgproc是最基础的模块&#xff0c;该课程主要是围绕这几个模块展开的&#xff0c;分别介绍如下: core模块实现了最核心的数据结构及其基本运算&#xff0c;如绘图函数、数组操作相关函数。 highgui模块实现了视频与图像的读取、显示、存储等接口。 imgp…