跨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.hqwc.cn/news/703128.html

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

相关文章

偶然发现了Python的一个BUG。。。

一般情况下,dict(id1, **{id: 1})这句代码应该报TypeError。但如果在捕获了其他异常的情况下,再来执行这句代码,却是会报KeyError,如下图: Python3.10和Python3.9也能复现该情况,正当我摩拳踩掌&#xff0c…

QT客户端开发的注意事项

QT客户端开发是一个涉及图形用户界面(GUI)设计、网络编程、数据库交互等多个方面的复杂过程。以下是在进行QT客户端开发时应注意的一些关键事项,通过关注这些事项,可以提高QT客户端应用的质量和开发效率。北京木奇移动技术有限公司…

Python 机器学习 基础 之 监督学习 [决策树集成] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [决策树集成] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [决策树集成] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 决策树集成 1、随机森林 2、梯度提升回归树(梯…

【Spring】AbstractApplicationContext源码解读

这个类源码一打开,我滴妈有一种我不卷了,我送外卖去了的感觉1500行 但是还是对你自己说 坚持坚持再坚持。35岁再送外卖也不迟。 这里我们先看这个抽象类的注释: Abstract implementation of the ApplicationContext interface. Doesnt man…

Android存储文件路径的区别

一、Android存储简介 Android系统分为内部存储和外部存储 从Android6.0开始不断在更新存储(读写)权限,除了在AndroidManifest.xml文件里声明,app运行时也要动态申请使用对应的权限 提醒:应用私有存储不需要动态申请权…

大模型相关内容的研究学习

大模型研究学习 1.大模型的“幻觉” 幻觉可以分为事实性幻觉和忠实性幻觉。 事实性幻觉,是指模型生成的内容与可验证的现实世界事实不一致。 比如问模型“第一个在月球上行走的人是谁?”,模型回复“Charles Lindbergh在1951年月球先驱任务…

抖音剪辑音乐配乐音效合集,短视频制作分类配乐库素材

一、素材描述 这是一套短视频剪辑配乐库,包含大气震撼、儿童幽默、片头片尾、科技未来、惊险悬念、婚礼婚庆、各种各样、轻松明朗、民族风格、叙事抒情等配乐分类,基本上是应有尽有了。本套配乐库素材,大小18.18G,5个分卷压缩文件…

Chromium 调试指南2024 Windows11篇-条件断点、函数断点(十一)

1. 前言 在调试过程中,步进代码和条件断点/函数断点是非常有用的工具和技术,它们可以帮助开发者更加精确地定位和解决问题。本文将介绍步进代码的常用工具以及条件断点/函数断点的设置方法,帮助开发者更加高效地进行调试工作。 2. 步进代码…

一例Phorpiex僵尸网络变种的分析

概述 这是一例Phorpiex僵尸网络变种,通过NSIS打包,加载恶意dll(Flaminius.dll),读取dat文件(Preoral.dat),在内存解密并解压缩出一个Pe,创建同名傀儡进程并注入。通过可移动存储介质传播&#…

单链表题-ysf-反转-中间节点-回文-合并-分割

环形链表的约瑟夫问题_牛客题霸_牛客网 经典的约瑟夫环 #include <stdint.h> #include <stdlib.h> //创建链表 typedef struct ListNode ListNode;ListNode* buyNode(int x){ListNode* newNode(ListNode*)malloc(sizeof(ListNode));if(newNodeNULL){exit(1);}newN…

【Linux取经路】进程通信之匿名管道

文章目录 一、进程间通信介绍1.1 进程间通信是什么&#xff1f;1.2 进程间通信的目的1.3 进程通信该如何实现 二、管道2.1 匿名管道2.1.1 站在文件描述符角度深入理解管道2.1.2 接口使用2.1.3 PIPE_BUFFER 和 Pipe capacity2.1.4 管道中的四种情况2.1.5 管道特征总结 2.2 匿名管…

ORACLE ODAX9-2的一个误告警Affects: /SYS/MB的分析处理

在运维的多套ORACLE ODAX9-2版本&#xff0c;都遇到了一个计算节点的告警&#xff1a;Description: The service Processor poweron selftest has deteced a problem. Probabity;:100, UulD:cd1ebbdf-f099-61de-ca44-ef646defe034, Resource:/SYS/MB,&#xff1b;此告警从描述上…