ROS笔记三:话题

目录

简要介绍

ROS话题通信机制的一些核心概念和流程:

话题通信的流程如下

ROS常见的topic命令行指令

发布话题

1.创建ROS节点并初始化

 2.创建话题发布者

3.创建消息实例并设置内容

4.将消息发布出去

5.保持节点运行

订阅话题 

初始化ROS节点和创建NodeHandle

创建订阅者并指定回调函数

编写消息回调函数

保持节点运行:

自定义消息类型数据

创建消息文件

在CMakeLists.txt中添加消息依赖

编译和构建

使用自定义消息类型

 注意点


简要介绍

在ROS中,话题(topics)是最常用的通信机制之一,它允许节点之间以异步的方式进行消息的发布和订阅。一个节点可以发布某个话题的消息,而其他节点则可以订阅该话题以接收相应的消息。

话题通信机制是一种:一(发布者)对多(订阅者)、异步的通信机制

ROS话题通信机制的一些核心概念和流程:

1.消息类型(Message type):在ROS中,每个话题都有一个特定的消息类型,该消息类型定义了该话题所传递的数据结构和内容。例如,一个表示激光雷达扫描数据的消息类型可能包括激光雷达的位置、角度、距离等信息。

2.发布者(Publisher):发布者是一个ROS节点,它可以将特定消息类型的数据发布到某个话题中,其他节点可以通过订阅该话题来接收该消息。一个节点可以同时作为多个话题的发布者。

3.订阅者(Subscriber):订阅者是一个ROS节点,它可以从某个话题中接收特定消息类型的数据,从而实现对该话题的订阅。一个节点可以同时订阅多个话题。

4.话题名称(Topic name):话题名称是一个字符串,用来标识某个话题在ROS系统中的唯一性。在进行订阅或发布操作时,节点需要指定要订阅或发布的话题名称。

5.消息队列(Message queue):消息队列是一个缓存区,用来存储已发布但未被订阅者接收的消息。当节点订阅某个话题时,如果该话题之前已经有消息发布,那么这些消息会首先被放入消息队列中,等待订阅者进行接收。

话题通信的流程如下

1.发布者创建一个话题,并将特定消息类型的数据发布到该话题中。

2.订阅者订阅特定话题,等待接收该话题中的消息。

3.如果在订阅者订阅之前已经有消息发布到该话题中,那么这些消息会被放入消息队列中,等待订阅者进行接收。

4.当发布者发布新的消息时,订阅者会收到该消息并进行处理。

ROS常见的topic命令行指令

  1. rostopic echo:该命令可以用于打印某个话题的消息内容,从而实时监测该话题的状态和数据。例如,使用rostopic echo /scan可以实时显示激光雷达数据。

  2. rostopic hz:该命令可以用于查看某个话题的发布频率,从而评估系统的性能和稳定性。例如,使用rostopic hz /scan可以显示激光雷达数据的发布频率。

  3. rostopic info:该命令可以用于查看某个话题的详细信息,包括其名称、数据类型、发布者和订阅者等内容。例如,使用rostopic info /scan可以显示激光雷达数据的相关信息。

  4. rostopic list:该命令可以列举出当前ROS系统中所有可用的话题名称,从而方便用户查看和选择特定话题。例如,使用rostopic list可以显示所有可用的话题名称。

  5. rostopic pub:该命令可以用于往某个话题中输入特定的消息内容,从而模拟某些场景下的数据输入。例如,使用rostopic pub /cmd_vel geometry_msgs/Twist "{linear: {x: 0.1}, angular: {z: 0.5}}"可以向/cmd_vel话题发送一个Twist消息。

  6. rostopic bw:该命令可以用于查看某个话题的带宽使用情况,从而评估系统网络和性能瓶颈。例如,使用rostopic bw /scan可以显示激光雷达数据的带宽使用情况。

  7. rostopic find:该命令可以根据数据类型查找符合条件的话题名称,从而方便用户快速定位到特定话题。例如,使用rostopic find std_msgs/String可以查找所有数据类型为std_msgs/String的话题名称。

  8. rostopic type:该命令可以用于查看某个话题的数据类型,从而帮助用户了解该话题所传递的数据结构和内容。例如,使用rostopic type /scan可以显示激光雷达数据的数据类型。

发布话题

发布话题是指将消息发送到特定的话题,以便其他节点可以接收和处理这些消息。话题是一种基于发布-订阅模式的通信机制,它允许不同的节点之间进行异步的消息传递。

1.创建ROS节点并初始化

在开始发布消息之前,需要先创建一个ROS节点,并进行初始化。这个节点将负责发布消息到指定的话题。

#include "ros/ros.h"int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "publisher_node");// 创建NodeHandle对象ros::NodeHandle nh;// 在这里编写发布者的代码return 0;
}

 2.创建话题发布者

在ROS节点中,你需要创建一个话题发布者对象。话题发布者用于将消息发送到特定的话题。你需要指定话题的名称和消息类型作为发布者的参数。

ros::Publisher pub = nh.advertise<消息类型>("话题名称", 队列大小); 

 e.g如果要发布字符串消息到名为/chatter的话题上

ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter", 10);

3.创建消息实例并设置内容

在发布消息之前,需要创建一个对应消息类型的实例,并设置其内容。

消息类型 message;

message.字段 = 值;

 e.g.

对于std_msgs::String消息类型,可以这样创建一个消息实例,并将其内容设置为"Hello, World!":

std_msgs::String message;

message.data = "Hello, World!";

4.将消息发布出去

使用话题发布者的publish()方法将消息发布到指定的话题上。

pub.publish(message);

5.保持节点运行

在发布消息后,一般需要调用ros::spin()或者ros::spinOnce()来保持节点处于运行状态,以便能够发送消息并接收其他节点发送的消息。

ros::spin();

// 或者

ros::spinOnce();

订阅话题 

订阅者(Subscriber)用于接收和处理其他节点发布的消息。订阅者通过订阅特定的话题来接收消息,并在接收到消息后执行相应的回调函数进行处理。下面是订阅话题的详细步骤:

初始化ROS节点和创建NodeHandle

在开始订阅消息之前,首先需要初始化ROS节点并创建一个NodeHandle对象。

#include "ros/ros.h"
int main(int argc, char **argv)
{ros::init(argc, argv, "subscriber_node");ros::NodeHandle nh;// 在这里编写订阅者的代码ros::spin();  // 保持节点运行return 0;
}

创建订阅者并指定回调函数

 使用NodeHandle对象的subscribe<消息类型>("话题名称", 队列大小, 回调函数)方法创建一个订阅者,指定要订阅的消息类型、话题名称、队列大小以及接收到消息时要调用的回调函数。

 ros::Subscriber sub = nh.subscribe("话题名称", 队列大小, 回调函数);

 e.g如果要订阅名为/chatter的字符串消息,可以这样创建订阅者: 

void messageCallback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO("Received message: %s", msg->data.c_str());
}ros::Subscriber sub = nh.subscribe("/chatter", 10, messageCallback);

编写消息回调函数

消息回调函数是在接收到消息时被调用的函数,用于处理接收到的消息数据。

void messageCallback(const 消息类型::ConstPtr& msg)
{// 处理接收到的消息
}

保持节点运行:

最后,在订阅消息后,通常需要调用ros::spin()或者ros::spinOnce()来保持节点处于运行状态,以便接收和处理消息。

完整的订阅者代码:

#include "ros/ros.h"
#include "std_msgs/String.h"
void messageCallback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO("Received message: %s", msg->data.c_str());
}int main(int argc, char **argv)
{ros::init(argc, argv, "subscriber_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("/chatter", 10, messageCallback);ros::spin();return 0;
}

自定义消息类型数据

创建消息文件

使用ROS消息描述语言(Message Description Language,简称msg)创建一个消息文件,该文件定义了自定义消息的结构和字段。通常,消息文件位于msg文件夹中。

e.g创建一个名为CustomMessage.msg的消息文件,其中包含一个字符串字段data 

string data

CMakeLists.txt中添加消息依赖

 在ROS软件包的CMakeLists.txt文件中添加对自定义消息的依赖项。

find_package(catkin REQUIRED COMPONENTSroscppstd_msgsmessage_generation   # 添加这行
)add_message_files(FILESCustomMessage.msg   # 添加你创建的消息文件
)generate_messages(DEPENDENCIESstd_msgs
)

确保在CMakeLists.txtcatkin_package()函数之前添加了message_generation依赖。 

编译和构建

运行catkin_make命令编译和构建ROS软件包。

cd catkin_ws
catkin_make

使用自定义消息类型

在代码中使用自定义消息类型,包括订阅者和发布者。

#include "ros/ros.h"
#include "package_name/CustomMessage.h"  // 替换成你的自定义消息类型void messageCallback(const package_name::CustomMessage::ConstPtr& msg)
{ROS_INFO("Received message: %s", msg->data.c_str());
}int main(int argc, char **argv)
{ros::init(argc, argv, "subscriber_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("/chatter", 10, messageCallback);ros::spin();return 0;
}

 上述将package_name替换为你的自定义消息所在的软件包名。CustomMessage是自定义消息类型的名称,需要根据实际情况进行替换。

确保在使用自定义消息之前,已经运行了catkin_make命令来编译和构建ROS软件包,以便让ROS能够正确识别和使用自定义消息类型。

 注意点

在使用自定义消息之前,要确保订阅者和发布者都使用了相同的自定义消息类型,并且正确地引用了消息类型的头文件。

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

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

相关文章

PMP考试之20240214

1、你同时管理着公司的六个项目。两个项目属于类似类型&#xff0c;而其他四个项目则完全不同。你的职位是&#xff1f; A.项目组合经理 B.项目集经理 C.项目经理 D.项目协调员 答案&#xff1a;A 解析&#xff1a;在项目组合管理中&#xff0c;一组相关或非相关的计划和…

二次元自适应动态引导页

源码介绍 二次元自适应动态引导页&#xff0c;HTMLJSCSS&#xff0c;记事本修改&#xff0c;上传到服务器即可&#xff0c;也可以本地双击index.html查看效果 下载地址 https://wfr.lanzout.com/isRem1o7bfcb

MockServer 服务框架设计

大部分现有的 mock 工具只能满足 HTTP 协议下简单业务场景的使用。但是面对一些复杂的业务场景就显得捉襟见肘&#xff0c;比如对 socket 协议的应用进行 mock&#xff0c;或者对于支付接口的失败重试的定制化 mock 场景。 为解决上述问题&#xff0c;霍格沃兹测试学院设计并研…

零基础学编程怎么入手,中文编程工具构件箱之多页面板构件用法教程,系统化的编程视频教程上线

零基础学编程怎么入手&#xff0c;中文编程工具构件箱之多页面板构件用法教程&#xff0c;系统化的编程视频教程上线 一、前言 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 http://​ https://edu.csdn.net/course/detail/39036 ​ …

回乡后发现大家的消费水平都在升级

今天大年初四&#xff0c;来湖南第7天。 大年初四走亲戚&#xff0c;到城里姨妈家做客&#xff0c;我惊讶地发现&#xff0c;这里的消费风向正在发生一场悄然的变革。 以往&#xff0c;我认为大城市的消费水平代表着潮流和品质&#xff0c;然而这次我却发现小城市的消费观念正在…

re:从0开始的CSS之旅 14. 显示模式的切换

1. 两个属性 display 属性可以用于转换元素的显示模式 可选值&#xff1a; block 转换为块元素 inline 转换为行内元素 inline-block 转换为行内块元素 none 不显示元素&#xff0c;并且不占用元素的位置 visibility 属性用于设置元素是否显示 可选值&#xff1a; visible 显示…

文档类图像的智能识别,文档分类自定义分类器

文档类图像的智能识别是利用人工智能技术对文档图像进行自动识别和信息提取的过程。在实际应用中&#xff0c;文档分类是文档类图像识别的一个重要环节&#xff0c;而自定义分类器则可以提高文档分类的准确性和适应性。本文将介绍文档分类自定义分类器的相关概念和方法。 …

springboot/ssm知名作家信息管理系统Java文学作品展示管理系统

springboot/ssm知名作家信息管理系统Java文学作品展示管理系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.…

下一代块存储重新定义任务关键型存储架构

HPE 宣布全面推出基于 HPE Alletra Storage MP 构建的 HPE GreenLake for Block Storage 第 3 版&#xff0c;提供业界首款分解式横向扩展块存储&#xff0c;并提供 100% 数据可用性保证。这种独特的块存储产品由共享一切存储架构提供支持&#xff0c;并通过 HPE GreenLake 云平…

智能门锁代码实现之连接硬件的步骤

准备硬件和开发环境&#xff1a;确保你拥有所需的硬件&#xff08;如微控制器、门锁控制电路、通信接口等&#xff09;&#xff0c;并设置好 C 语言的开发环境。对于 Arduino 等开源硬件平台&#xff0c;你可能需要安装特定的 IDE&#xff08;集成开发环境&#xff09;和驱动程…

(算法3)二分查找

朴素二分查找 最直接的二分查找&#xff0c;有序&#xff0c;查找数组中的某个元素 这种方法是有局限性的&#xff1a;只可以查找升序的数组&#xff0c;且要查找的元素是一个 注意&#xff1a;mid(中点&#xff09;的计算应该是&#xff1a;left(right-left)/2 (个数是偶数时…

接口测试06 -- pytest接口自动化封装Loggin实战

1. 接口关键字封装 1.1 基本概念 接口关键字封装是指:将接口测试过程中常用的操作、验证封装成可复用的关键字(或称为函数、方法),以提高测试代码的可维护性和可复用性。 1.2 常见的接口关键字封装方式 1. 发送请求:封装一个函数,接受参数如请求方法、URL、请求头、请求…

Sketch 99.1 for macOS

Sketch 99.1 for macOS 概述 这个程序是对矢量绘图的创新性和焕然一新的看法。它特意采用了极简主义的设计&#xff0c;基于一个大小无限、图层自由的绘图空间&#xff0c;没有调色板、面板、菜单、窗口和控件。 此外&#xff0c;它提供了强大的矢量绘图和文本工具&#xff0c;…

django通过指定用户手机号查询外键所关联的数据,倒序查询

django通过指定用户手机号查询外键所关联的数据 在Django中&#xff0c;可以通过使用filter方法和双下划线语法来查询外键所关联的数据。以下是一种常见的方法&#xff1a; from your_app.models import User, ForeignKeyModel# 假设User模型有一个名为phone的字段&#xff…

基于Spring Boot的美容院管理系统设计与实现,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1757434902285987841

洛谷数组P1319压缩技术

做题思路&#xff1a; 这里表示输入的第一个数字N为N*N的方阵&#xff0c;后面的数字表示连续输入几个1或者0&#xff0c;定义result表示实际输出的数字0或1&#xff08;result输出0或1&#xff0c;可以用绝对值abs我们初始化result为0&#xff0c;我们将它-1后再取绝对值就可以…

二、ClickHouse简介

ClickHouse简介 前言一、行式存储二、DBMS功能三、多样化引擎四、高吞吐写入能力五、数据分区与线程级并行六、场景七、特定版本 前言 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用 C 语言编写&#xff0c;主要…

[NSSCTF]-Web:[SWPUCTF 2021 新生赛]easyrce解析

先看网页 代码审计&#xff1a; error_reporting(0); &#xff1a;关闭报错&#xff0c;代码的错误将不会显示 highlight_file(__FILE__); &#xff1a;将当前文件的源代码显示出来 eval($_GET[url]); &#xff1a;将url的值作为php代码执行 解题&#xff1a; 题目既然允许…

速盾:cdn集群防御空间dns服务器

在当今数字化时代&#xff0c;网络安全和性能成为了企业关注的焦点。速盾的CDN集群防御空间DNS服务器技术为网站提供了更高水平的安全性和性能优化。本文将深入探讨这一技术的关键特点和优势。 1. 集群防御&#xff1a; 速盾的CDN集群防御通过分布在全球的节点集群&#xff0c;…

c++恶魔轮盘制造第1期输赢

小常识&#xff0c;恶魔叫DEALER&#xff0c;上帝叫God. 赢了很简单 void sheng() { cout<<"你获胜了&#xff01;";MessageBox(NULL,TEXT("你的钱~~~~~~给你"),TEXT("DEALER"),MB_OK);system("pause");system("cls"…