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

自定义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(FILESPerson.msg
)

在 generate_messages 后面追加 std_msgs

generate_messages(DEPENDENCIESstd_msgs
)

在 catkin_package后面追加 message_runtime

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topicCATKIN_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, 队列长度为10ros::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.hqwc.cn/news/95961.html

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

相关文章

如何制作并运行 jar 程序

以下是用 Intellij 制作 jar 程序&#xff0c;并运行的方法。 【1】新建工程&#xff0c;保持默认选项&#xff0c;Next 【2】保持默认选项&#xff0c;Next 【3】给工程命名&#xff0c;设置保存位置&#xff0c;Finish 【4】新建工程结束&#xff0c;进入开发界面 【5】展开…

ArcGIS将两个相同范围但不同比例或位置的矢量数据移动到相同位置

有两个市图层&#xff0c;一个是正确经纬度的市行政范围图层&#xff0c;另一个是其他软件导出获取的不正确经纬度信息或缺失信息。 如果单纯的依靠移动图层&#xff0c;使不正确的移动到正确位置需要很久。尝试定义投影等也不能解决。 使用ArcMap 的空间校正工具条&#xff…

nnUNet v2数据准备及格式转换 (二)

如果你曾经使用过nnUNet V1&#xff0c;那你一定明白数据集的命名是有严格要求的&#xff0c;必须按照特定的格式来进行命名才能正常使用。 这一节的学习需要有数据&#xff0c;如果你有自己的数据&#xff0c;可以拿自己的数据来实验&#xff0c;如果没有&#xff0c;可以用十…

【负载均衡】常见的负载均衡策略有哪些?

文章目录 前言负载均衡分类常见负载均衡策略小结 前言 负载均衡策略是实现负载均衡器的关键&#xff0c;而负载均衡器又是分布式系统中不可或缺的重要组件。使用它有助于提高系统的整体性能、可用性、可靠性和安全性&#xff0c;同时支持系统的扩展和故障容忍性。对于处理大量…

JavaScript运行机制与实践应用

一、JavsScript运行机制 1、JavaScript 是一种解释型语言&#xff0c;它的执行机制主要包括以下几个步骤&#xff1a; 2、事件循环 3、JavaScript运行模型 4、JavaScript任务 5、JavaScript宏任务和微任务 6、案例分析 console.log(script start) setTimeout(function () {co…

c语言tips-c语言的虚函数实现

0. 前言 学过面对对象的同学都知道虚函数是面向对象编程中的一个重要概念&#xff0c;它允许在基类和派生类之间实现多态性&#xff08;polymorphism&#xff09;。我们可以在基类去定义一个成员函数&#xff0c;然后再派生类再去覆盖写它&#xff0c;这样在不同派生类使用相同…

Flutter 项目结构文件

1、Flutter项目的文件结构 先helloworld项目&#xff0c;看看它都包含哪些组成部分。首先&#xff0c;来看一下项目的文件结构&#xff0c;如下图所示。 2、介绍上图的内容。 -litb/main.dart文件&#xff1a;整个应用的入口文件&#xff0c;其中的main函数是整个Flutter应…

TCP Header都有啥?

分析&回答 源端口号&#xff08;Source Port&#xff09; &#xff1a;16位&#xff0c;标识主机上发起传送的应用程序&#xff1b; 目的端口&#xff08;Destonation Port&#xff09; &#xff1a;16位&#xff0c;标识主机上传送要到达的应用程序。 源端&#xff0c;目…

开开心心带你学习MySQL数据库之第三篇上

学校的项目组有必要加入吗? 看你的初心. ~~如果初心是通过这个经历能够提高自己的技术水平 ~~是可以考虑的 ~~如果初心是通过这个经历提高自己找工作的概率 ~~这个是不靠谱的,啥用没有 ~~如果初心是通过这个体验更美好的大学生活 ~~靠谱的 秋招,应届生,找工作是非常容易的!!! …

MySQL InnoDB 是怎么使用 B+ 树存数据的?

这里限定 MySQL InnoDB 存储引擎来进行阐述&#xff0c;避免不必要的阅读歧义。 首先通过一篇文章简要了解下 B 树的相关知识&#xff1a;你好&#xff0c;我是B树 。 B 树是在 B 树基础上的变种&#xff0c;主要区别包括&#xff1a; 1、所有数据都存储在叶节点&#xff0c;其…

C语言深入理解指针(非常详细)(二)

目录 指针运算指针-整数指针-指针指针的关系运算 野指针野指针成因指针未初始化指针越界访问指针指向的空间释放 如何规避野指针指针初始化注意指针越界指针不使用时就用NULL避免返回局部变量的地址 assert断言指针的使用和传址调用传址调用例子&#xff08;strlen函数的实现&a…

stable diffusion实践操作-宽高设置以及高清修复

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、SD宽高怎么设置&#xff1f;1.1 宽高历史 二、高清修复1. 文生图中的高清修复1.按钮Hires.fix2.不同放大算法对比1.第一类2.第二类3.第三类4.第四类5.第五类6.第六类7.第七类8.第八类9.第九类10.第十类11…