ROS机器人入门第四课:话题通信

news2024/12/23 8:49:23

文章目录

  • ROS机器人入门第四课:话题通信
    • 一、话题通信概述
      • (一)概念
      • (二)作用
    • 二、话题通信基本操作
      • 需求:
      • 分析:
      • 流程:
      • (一)发布方
        • 解释一些关键的ROS函数和概念:
      • (二)订阅方
      • 关键ROS函数和概念的解释:
      • (三)添加可执行权限
      • (四)配置 CMakeLists.txt
      • (五)执行
      • (六)ROS解耦合

ROS机器人入门第四课:话题通信

一、话题通信概述

话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。话题通信的应用场景也极其广泛,比如下面一个常见场景:

机器人在执行导航功能,使用的传感器是激光雷达,机器人会采集激光雷达感知到的信息并计算,然后生成运动控制信息驱动机器人底盘运动。

在上述场景中,就不止一次使用到了话题通信。

  • 以激光雷达信息的采集处理为例,在 ROS 中有一个节点需要时时的发布当前雷达采集到的数据,导航模块中也有节点会订阅并解析雷达数据。
  • 再以运动消息的发布为例,导航模块会根据传感器采集的数据时时的计算出运动控制信息并发布给底盘,底盘也可以有一个节点订阅运动信息并最终转换成控制电机的脉冲信号。

以此类推,像雷达、摄像头、GPS… 等等一些传感器数据的采集,也都是使用了话题通信,换言之,话题通信适用于不断更新的数据传输相关的应用场景。

(一)概念

以发布订阅的方式实现不同节点之间数据交互的通信模式。

(二)作用

用于不断更新的、少逻辑处理的数据传输场景。

二、话题通信基本操作

需求:

编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布文本消息,订阅方订阅消息并将消息内容打印输出。

分析:

在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:

  1. 发布方
  2. 接收方
  3. 数据(此处为普通文本)

流程:

  1. 编写发布方实现;
  2. 编写订阅方实现;
  3. 为python文件添加可执行权限;
  4. 编辑配置文件;
  5. 编译并执行。

(一)发布方

这段代码是一个使用ROS(Robot Operating System,机器人操作系统)的Python脚本示例,旨在创建一个名为talker_p的节点,该节点周期性地向名为chatter的话题发送包含字符串的消息。它是一个简单的发布者(Publisher)节点,演示了ROS中发布消息的基本模式。下面对代码进行详细注释,并解释其中使用的关键ROS函数。

#! /usr/bin/env python
# - coding: utf-8 -*-

# 导入 rospy 库,rospy 是 ROS 在 Python 中的客户端库,用于使Python代码能与ROS通信。
import rospy
# 从 std_msgs 包中导入 String 消息类型,std_msgs 包含了许多标准的消息类型,String 是其中用于传输文本信息的一个类型。
from std_msgs.msg import String

# 判断此脚本是直接被执行而不是被导入到其他文件中时,下面的代码块将被执行。
if __name__ == "__main__":
    # 初始化ROS节点,命名为 "talker_p"。
    # 每个ROS节点都必须有一个唯一的名称,这样其他节点就可以与之通信。
    rospy.init_node("talker_p")
    
    # 实例化发布者对象。
    # 这一步创建了一个发布者对象,它能够向名为 "chatter" 的话题发布 String 类型的消息。
    # queue_size 参数是发布队列的大小,用于限制未处理消息的数量,防止内存消耗过大。
    pub = rospy.Publisher("chatter", String, queue_size=10)
    
    # 创建一个 String 类型的消息对象。
    msg = String()
    # 准备消息的前缀文本。
    msg_front = "hello 你好"
    # 初始化计数器,用于生成消息序列。
    count = 0
    
    # 设置消息发布的频率,这里是每秒1次。
    rate = rospy.Rate(1)
    # 在 ROS 节点未被关闭的情况下循环。
    while not rospy.is_shutdown():
        # 拼接字符串,将前缀和计数器的值合成为最终的消息内容。
        msg.data = msg_front + str(count)

        # 发布消息到 "chatter" 话题。
        pub.publish(msg)
        # 根据之前设置的频率暂停,确保按照设定的频率发布消息。
        rate.sleep()
        # 将发布的消息内容记录到 ROS 日志信息中,便于调试和记录。
        rospy.loginfo("写出的数据:%s", msg.data)
        # 更新计数器,为下一条消息准备。
        count += 1
解释一些关键的ROS函数和概念:
  • rospy.init_node("talker_p"):该函数用于初始化一个ROS节点,这是启动任何ROS节点的第一步。这里的"talker_p"是节点的名称,它必须在ROS系统中唯一。

  • rospy.Publisher("chatter", String, queue_size=10):这个函数创建一个发布者对象,用于向特定的话题(这里是chatter)发布消息。String是消息类型,而queue_size参数用于控制发布者消息队列的大小,有助于处理网络延迟或处理速度慢时消息的积压问题。

  • rospy.Rate(1):这个函数创建一个Rate对象,用于控制循环的速率。这里设置为1Hz,意味着循环每秒运行一次。

  • rospy.is_shutdown():这是一个检查ROS节点是否收到了终止信号(如Ctrl+C)的函数。如果是,则返回True,循环将停止。

  • pub.publish(msg):通过之前创建的发布者对象pub调用publish方法来发布消息。msg是要发布的消息对象。

  • rate.sleep():这个方法使当前循环休眠足够的时间,以保持循环运行在设定的频率上。

  • rospy.loginfo():这个函数用于将信息记录到ROS日志里,类似于Python的print函数,但是它提供了更丰富的日志管理功能。


如若不写订阅方的代码想直接查看发布方的消息,可以使用如下命令:
rostopic echo 话题
在这里插入图片描述


(二)订阅方

这段代码展示了如何在ROS(Robot Operating System,机器人操作系统)中创建一个订阅者节点,监听并处理来自特定话题(chatter)的消息。下面对代码进行详细注释,并解释其中使用的关键ROS函数。

# 导入 rospy 库,rospy 是 ROS 在 Python 中的客户端库,允许Python代码与ROS通信。
import rospy
# 从 std_msgs 包中导入 String 消息类型,这是一个用于传输文本信息的标准消息类型。
from std_msgs.msg import String

# 定义回调函数,这个函数将在节点收到新消息时被调用。
# msg 参数是收到的消息对象。
def doMsg(msg):
    # 在 ROS 日志中记录信息,这里记录的是收到的消息内容。
    rospy.loginfo("I heard:%s", msg.data)

# 检查这个脚本是否是主程序,而不是被其他文件导入。
if __name__ == "__main__":
    # 初始化 ROS 节点,节点名为 "listener_p"。
    # 每个节点必须有一个唯一的名称,以便在 ROS 网络中被识别。
    rospy.init_node("listener_p")
    
    # 实例化订阅者对象。
    # 这一步创建了一个订阅者对象,它将监听名为 "chatter" 的话题,
    # 并且每当有新消息时,就会调用 doMsg 函数。
    # String 指定了话题消息的类型,queue_size 用于限制消息队列的大小。
    sub = rospy.Subscriber("chatter", String, doMsg, queue_size=10)
    
    # 进入循环,等待消息到来。
    # rospy.spin() 使得Python脚本保持运行状态,并在收到新消息时调用回调函数。
    # 它是一个阻塞调用,直到节点被明确地关闭或接收到终止信号(例如Ctrl+C)。
    rospy.spin()

关键ROS函数和概念的解释:

  • rospy.init_node("listener_p"):该函数用于初始化一个ROS节点。这是启动任何ROS节点的必要步骤。这里的"listener_p"是节点的名称,它在ROS网络中必须是唯一的。

  • rospy.Subscriber("chatter", String, doMsg, queue_size=10):这个函数创建了一个订阅者对象,用于订阅特定的话题(这里是chatter)并指定当收到新消息时所调用的回调函数(这里是doMsg)。String参数指定了订阅的消息类型,而queue_size参数用于控制消息队列的大小,有助于处理网络延迟或处理速度慢时消息的积压问题。

  • doMsg(msg):这是一个用户定义的回调函数,每当订阅的话题有新的消息时,这个函数就会被调用。msg参数是收到的消息对象。在这个函数内部,使用rospy.loginfo来记录消息内容。

  • rospy.spin():这个函数会让节点进入等待循环,等待并处理回调函数。它是一个阻塞(blocking)调用,意味着除非节点被关闭,否则程序将停在这里。这是订阅者节点保持激活并响应话题消息的常用方法。

  • rospy.loginfo():这个函数用于在ROS日志中记录信息,对于调试和跟踪节点行为非常有用。


注意: 二者需要设置相同的话题

比如上面的发布方和订阅方都订阅了相同的话题:chatter


(三)添加可执行权限

终端下进入 scripts 执行:chmod +x *.py

在这里插入图片描述

(四)配置 CMakeLists.txt

catkin_install_python(PROGRAMS
  scripts/talker_p.py
  scripts/listener_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

在这里插入图片描述

(五)执行

  1. 启动 roscore;

  2. 启动发布节点;

  • 先启动命令行source ./devel/setup.bash
  • 再启动命令行rosrun 包名 自定义文件名.py
  1. 启动订阅节点。
  • 先启动命令行source ./devel/setup.bash
  • 再启动命令行rosrun 包名 自定义文件名.py

在这里插入图片描述
运行结果如图所示:

在这里插入图片描述


因为发布方是软起动,需要先在master里注册,注册过程中可能就已经把消息发出去了,即使先打开订阅方,再打开发布方也一样会丢失数据,所以我们可以先确保发布方注册完,再发送信息

即在发布方的代码中设置一个休眠函数rospy.sleep(3),我这里是休眠3秒再发送数据

在这里插入图片描述


注意:可以使用 rqt_graph 查看节点关系。

在这里插入图片描述

(六)ROS解耦合

即便你使用不同的语言编写的节点,那么他们之间也是可以实现数据交换

在话题通信中,只要话题一致,C++和python写的代码就可以相互通信

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

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

相关文章

2024年福建事业单位招聘详细流程

2024年福建事业单位招聘详细流程,速速查收!

湖北汽车工业学院 实验一 关系数据库标准语言SQL

头歌 实验一 关系数据库标准语言SQL 制作不易!点个关注呗!为大家创造更多的价值! 目录 头歌 实验一 关系数据库标准语言SQL**制作不易!点个关注呗!为大家创造更多的价值!** 第一关:创建数据库第…

简单服务器通信、IO多路复用(select、poll、epoll)以及reactor模式。

网络编程学习 简单服务器通信TCP三次握手和四次挥手三次握手(如下图)常见问题? 四次挥手 client和server通信写法server端client端 通信双方建立连接到断开连接的状态转换怎么应对多用户连接?缺点 IO多路复用select优缺点 pollpol…

算法---动态规划练习-5(下降路径最小和)

下降路径最小和 1. 题目解析2. 讲解算法原理方法一方法二 3. 编写代码法一法二 1. 题目解析 题目地址:点这里 2. 讲解算法原理 方法一 首先,通过matrix的大小确定矩阵的行数m和列数n。 创建一个大小为(m1) (n2)的二维动态规划数组dp,其中d…

OC 技术 苹果内购

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络&#xff0…

2022 年甘肃省职业院校技能大赛 高职组 网络系统管理竞赛 网络构建模块试题

2022 年甘肃省职业院校技能大赛 高职组网络系统管理竞赛 网络构建模块试题 目 录 考试说明… 3 任务描述… 3 任务清单… 3 (一)基础配置… 3 (二)有线网络配置… 4 (三)无线网络配置… 6 (四&a…

惊艳亮相!新版飞桨星河社区邀您共赴星辰大海

亲爱的开发者们: 一场始于好奇、归于热爱的邂逅,让开发者们在飞桨星河社区相聚,相逢于活动、课程、比赛、项目……五年来,千万开发者的共同参与,让这个社区更富活力、更加温暖。 2018年,AI Studio 1.0版本上…

RHCE- 4-Web服务器(2)

基于https协议的静态网站 概念解释 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。 HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中…

LVS负载均衡(load balance)

一 LVS LVS:Linux Virtaul Server,该软件的功能是实现 LB(load balance) 二LVS 的三种工作模式 1.NAT 模式(NAT) LVS 服务器同时充当一台 NAT 网关,拥有公有 IP ,同时负责将针对此…

Apple Vision Pro应用合集

这里给大家分享一个网站,手机了最新的apple vision pro 上面运行的应用。 1、查找应用:用户可以浏览特色推荐的应用,或者通过随机挑选功能发现新的应用。 2、社区交流:提供社区功能,用户可以在这里交流使用体验、分享…

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件,这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

SAP gui 组服务器 提示 Error service sapmsPRD unknown

/etc/hosts 追加IP地址和域名的配对关系 /etc/services 追加 sapms[sid] 3601/tcp

java数据结构与算法刷题-----LeetCode665. 非递减数列

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路:时间复杂度O( n n n),空间复杂度…

在vscode终端terminal加大栈空间How to increase max stack size in c++ using vscode

参考:https://devpress.csdn.net/cloud/63268204fd0b112779162383.html Answer a question In many dynamic programming and graph problems it is required to do long depth recursion. I am currently using vscode and mingw in windows for my c programs. But in defau…

计算机视觉之三维重建(4)---三维重建基础与极几何

文章目录 一、三维重建基础1.1 问题引入1.2 线性解法1.3 非线性解法1.4 多视图几何的关键问题 二、极几何与基础矩阵2.1 极几何2.2 极几何特例2.3 本质矩阵2.4 本质矩阵的性质2.5 基础矩阵2.6 基础矩阵的性质 三、基础矩阵估计 一、三维重建基础 1.1 问题引入 1. 从单张图像恢…

MySQL Explain 字段详解

Explain 工具介绍 Explain 一般被称为解释器,通过 Explain 工具,我们能分析我们使用的查询语句或是结构的性能瓶颈,它提供 MySQL 如何执行语句的信息。 使用语法: explain [extended|partition] select在 select 关键字前加 ex…

【多模态融合】SuperFusion 激光雷达与相机多层次融合 远距离高清地图预测 ICRA 2024

前言 本文介绍激光雷达与相机进行多层次融合,包括数据级融合、特征级融合和BEV级融合。 融合后的BEV特征可以支持不同的任务头,包括语义分割、实例编码和方向预测,最后进行后处理生成高清地图预测,它是来自ICRA 2024的。 会讲解…

【C++ leetcode】双指针(专题完结)

15. 三数之和 题目 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的…

3.26学习总结

java 实例变量和局部变量 实例变量是记录这个类中对象的特点的每一个对象的实例变量都可以不同(例如名字,性别等),其中一个对象的实例变量改变不会影响其他的变量. 类变量是一种特殊的实例变量,他的特殊在于所有的对象的类变量都是相同的,当一个对象改变了类变量那么所有对象…

0101支付安全-支付模块-项目实战

文章目录 一、信息安全的基础-机密性1 相关概念2 对称加密和非对称加密 二、身份认证三 摘要算法四、数字签名五、数字证书结语 在支付过程中,设计多方的敏感信息,那么安全尤为重要。下面先简单介绍下,相关概念。 一、信息安全的基础-机密性 …