跨ROS系统通信:使用TCP实现节点间的直连

当涉及到在机器人操作系统(ROS)环境中的通信时,标准做法通常是在同一个ROS网络内通过话题和服务进行。但在某些特定情况下,比如当你有两个分布在不同网络中的ROS系统时,标准的通信方法可能不太适用。此时,一个可行的解决方案是建立一个直连的TCP通信,允许跨ROS系统的节点之间直接传输消息。本文将实现一个进行TCP通信节点示例程序

场景概述
想象一下,有两台计算机A和B,每台上都运行着一个独立的ROS系统。我们的目标是让系统A中的节点监听话题testa,并将接收到的消息通过TCP发送给系统B中的节点。同样,系统B中的节点将监听话题testb并通过TCP将消息回传给系统A。

这种设置的一个典型应用场景是多机器人协作,其中机器人位于不同的网络环境中,或者需要与不支持ROS的遗留系统交互。

实现步骤
1. 准备工作

首先,确保两台计算机都安装了ROS,并且需要使两台设备能互ping
在本示例中我是在局域网中的两台设备中进行演示的
闲言少叙,我们直接开始分析以下的程序

系统A
在系统A上,创建一个节点tcp_publisher_a.py,它订阅话题testa并将消息发送给系统B。
完整程序如下:

#!/usr/bin/env pythonimport rospyfrom std_msgs.msg import Stringimport socketdef on_message_received(msg):    rospy.loginfo("Received message on 'testa': %s", msg.data)    try:        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as tcp_socket:            # 连接到系统B的TCP服务器            tcp_socket.connect(('SYSTEM_B_IP', 10000))            rospy.loginfo("Sending message to System B")            tcp_socket.sendall(msg.data.encode('utf-8'))    except Exception as e:        rospy.logerr("Could not send message to System B: %s", e)def testa_listener():    rospy.init_node('testa_listener', anonymous=True)    rospy.Subscriber('testa', String, on_message_received)    rospy.spin()if __name__ == '__main__':    testa_listener()

这个Python程序是为了作为机器人操作系统(Robot Operating System,简称ROS)网络的一部分而设计的。它监听特定的ROS主题上的消息,并在收到消息后,通过TCP套接字连接将该消息转发到另一个系统(称为”System B”)。该程序使用了rospy库,这是ROS的Python客户端库,以及socket库用于网络通信。
运行示例:

以下是对程序各个部分的详细分析:

导入模块

import rospyfrom std_msgs.msg import Stringimport socket
  • rospy是ROS的Python客户端API,提供了与ROS交互所需的功能。
  • std_msgs.msg是提供标准ROS消息类型的包。这里导入了消息类型String。
  • socket是Python模块,提供了对BSD套接字接口的访问,允许通过网络进行通信。

回调函数

def callback(msg):    rospy.loginfo("Received on testa: %s", msg.data)    try:        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:            sock.connect(('SYSTEM_B_IP', 10000))            rospy.loginfo("Sending message to System B")            sock.sendall(msg.data.encode('utf-8'))    except socket.error as exc:        rospy.logerr("Caught exception socket.error : %s", exc)
  • callback是一个函数,当在ROS主题’testa’上接收到新消息时调用。
  • rospy.loginfo用于记录接收到的消息。
  • 使用socket.socket(socket.AF_INET, socket.SOCK_STREAM)创建了一个TCP套接字。
  • AF_INET表示使用的是IPv4。
  • SOCK_STREAM表示它是一个TCP套接字。
  • 套接字尝试连接到’SYSTEM_B_IP’的10000端口。’SYSTEM_B_IP’应该替换为System B的实际IP地址。
  • 成功连接后,会打印另一个日志消息,表示消息正在发送到System B。
  • 从ROS主题收到的消息通过.encode('utf-8')转换为UTF-8编码的字节串,然后通过套接字发送。
  • 如果在尝试建立连接或发送数据时出现socket.error异常,将通过rospy.logerr记录错误信息。

监听器函数

def listener():    rospy.init_node('testa_listener', anonymous=True)    rospy.Subscriber('testa', String, callback)    rospy.spin()
  • listener函数初始化了一个名为’testa_listener’的ROS节点。
  • rospy.init_node用于初始化节点,anonymous=True表示在节点名称后添加随机数以确保名称的唯一性。
  • rospy.Subscriber创建了一个订阅者,订阅名为’testa’的主题,并指定当有消息到达时调用callback函数。
  • rospy.spin()是一个不会返回的循环,它会保持程序运行并等待消息到达。

主函数

if __name__ == '__main__':    listener()

点击跨ROS系统通信:使用TCP实现节点间的直连 - 古月居可查看全文

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

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

相关文章

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第21课-购买烟花插件

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第21课-购买烟花插件 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

OmniDrive:具有 3D 感知推理和规划功能的自动驾驶整体 LLM-智体框架

24年5月北理工、Nvidia和华中科大的论文“OmniDrive:A Holistic LLM-Agent Framework for Autonomous Driving with 3D Perception Reasoning and Planning”。 多模态大语言模型(MLLMs)的进展导致了对基于LLM的自动驾驶的兴趣不断增长&…

软件各阶段资料(需求设计,系统架构,开发文档,测试文档,运维阶段的部署维护文档,概要设计,详细设计)

一、 引言 (一) 编写目的 (二) 范围 (三) 文档约定 (四) 术语 二、 项目概要 (一) 建设背景 (二) 建设目标 (三&#xff0…

解决Jmeter报错 :Error generating the report: java.lang.NullPointerException

当我们在使用命令行的方式来执行jmeter 脚本的时候,例如 ./jmeter -n -t /opt/jmeter/script/test.jmx -Juser50 -Jtime100 -l /opt/jmeter/script/restult2.jtl 上面脚本的含义解释如下: -n -t 通过命令行的方式执行脚本test.jmx -Juser50 并发用户…

【贪心的商人】-华为OD

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法,所以会发布自己的解题思路,希望大家多指教 一、题目描述 商人经营一家店铺,有number种商品,由…

一次完整的GC流程

Java堆中内存区分 Java的堆由新生代(Young Generation)和老年代(Old Generation)组成。新生代存放新分配的对象,老年代存放长期存在的对象。 新生代(Young)由年轻区(Eden&a…

亚马逊卖家,如何打造爆款,如何提高产品权重、曝光、流量?

新老卖家们要知道,亚马逊A9算法影响产品排名的关键因素:产品相关性、销售排名、产品价格、点击率、转化率、产品图片、买家评论、买家满意度、QA的答复情况、搜索结果页详细信息级别。亚马逊A9算法,是根据卖家提供的listing文案信息进行收录、…

新一代GPT!GPT-4O:更快、更懂人类情感的人工智能新纪元

今天凌晨(5.14凌晨),OpenAI 的 GPT-4O 版本在自然语言处理领域带来了革命性的改变。不仅在处理速度上获得了显著提升,GPT-4O 还增加了对人类情感的理解能力,这使得它在与人类的交互中更加自然和富有同理心。本文将深入…

嵌入式学习<2>:EXTI、ADC、NVIC和AFIO

嵌入式学习_part2 本部分笔记用于学习记录,笔记源头 >>b站江科大_STM32入门教程_EXTI EXTI、ADC、NVIC和AFIO 开发环境:keil MDK、STM32F103C8T6 1 )EXTI STM32F10xxx参考手册(中文)-> 中断与事件 ->…

[OpenGL] PCF 柔和阴影

目录 一 为什么要使用PCF技术? 二 算法 三 效果 本章节源码点击此处 一 为什么要使用PCF技术? 在阴影改善这篇文章最后我们发现阴影的边缘锯齿化很严重,对于这种问题主要是因为采样精度的问题对于不同片段有可能从深度纹理中采样到了同一个纹理像素,这就导致形成了明显的…

python 批量webp格式转换成jpg

首先,你需要安装Pillow库。如果还未安装,可以通过pip安装: pip install Pillow 创建一个Python脚本来读取webp文件,并将其转换为jpg格式。 只需修改source_folder和dest_folder变量为你的实际文件夹路径即可使用这个脚本。 fro…

InstantStyle —— 文本到图像生成中的风格保持新突破

在人工智能领域,文本到图像生成(Text-to-Image Generation)技术正迅速发展,其应用范围从娱乐到专业设计不断扩展。然而,风格一致性生成一直是该领域的一个技术难题。最近,InstantX团队提出了一种名为Instan…

MathType7.4破解版补丁包下载安装无需激活秘钥许可证

MathType是一个强大的数学公式编辑器,它为教育工作者、学生和科研人员提供了一种高效、便捷的数学公式编辑方法。无论是在撰写学术论文、制作教学课件还是进行科研报告,MathType都能满足您的需求。 MathType具有丰富的符号库和模板。它包含了几乎所有常用…

Docker安装、使用及常用命令

一、Docker是什么? Docker是一种开源的容器化技术,允许开发者将应用及其运行环境打包在一个轻量级、可移植的容器中。这样,不论在开发、测试还是生产环境中,应用都能在任何Docker支持的平台上无缝运行。Docker使用Dockerfile来自…

Linux 多进程开发

0、程序和进程 程序 是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程。 进程 是正在运行的程序的实例。是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 1、区别 程序是静态的,进程是动态的,程序是存储在某…

1689 ssm社区老人危机干预系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm社区老人危机干预系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主…

常见加解密算法03 - RC4逆向认识

各位聪明绝顶,才高八斗的读者们你们好!今天我们主要讨论编译之后的RC4算法识别。 题外话,之前看到一个蛋疼的小知识,说“势”这个字最好不好查词典释义。我是很好奇的,果然后来无法直视势不可挡这个成语。 言归正传&am…

【MySQL】常见的数据类型

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:MySQL 目录 👉🏻常见的数据类型bit类型enumset集合查询函数find_ in_ set 👉🏻浮点类型float类型decimal &am…

Ansys Zemax|HUD 设计实例

说明 本文介绍了HUD设计实例。 实例说明 规格如下: 显示器尺寸:24*8mm 眼盒尺寸:100*40mm 放大倍率:5 (虚像尺寸 120*40mm) 虚像距离:1.8m 最终光学系统的整体布局如下图所示。 从HUD发出的…

官宣!招商工作全面启动“2024南京智博会”众多企业踊跃报名

2024南京智博会,作为一场盛大的科技盛宴,经过多年的发展与沉淀,已经成功跻身国内顶尖的高新技术产品及解决方案的展示平台之列,成为了引领行业趋势的风向标。本届智博会不仅汇聚了众多知名科技企业,更展现了国内外最前…