跨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.rhkb.cn/news/326951.html

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

相关文章

基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)全网首发【图像识别-天气分类】

一个能够从给定的环境图像中自动识别并分类天气(如晴天、多云、雨天、雪天闪电等)的系统。 技术栈: 深度学习框架:PyTorch基础模型:VGG16与EfficientNet任务类型:计算机视觉中的图像分类 模型选择 VGG16 …

【微信小程序开发】深入探索事件绑定、事件冒泡、页面跳转的逻辑实现

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

微信小程序(Taro)获取经纬度并转化为具体城市

1、获取经纬度 申请权限,想要使用微信小程序获取经纬度的方法是要申请该方面的权限。 获取经纬度的方法有很多选择其中一个使用就好。 我使用的是Taro.getFuzzyLocation() 在app.config.js中需要添加设置 requiredPrivateInfos: ["getFuzzyLocat…

第2章Spring Boot实践,开发社区登录模块【仿牛客网社区论坛项目】

第2章Spring Boot实践,开发社区登录模块【仿牛客网社区论坛项目】 前言推荐项目总结第2章Spring Boot实践,开发社区登录模块1.发送邮件配置MailClient测试 2.开发注册功能访问注册页面提交注册数据激活注册账号 3.会话管理体验cookie体验session 4.生成验…

10分钟获取IP SSL证书——建议收藏

IP SSL证书是一种专门为IP地址签发的安全套接字层(SSL)证书,与常规SSL证书主要绑定到域名(如 example.com)不同,IP SSL证书直接绑定到服务器的IP地址(如 192.0.2.1)。 一 . IP地址…

百度文心一言 java 支持流式输出,Springboot+ sse的demo

参考&#xff1a;GitHub - mmciel/wenxin-api-java: 百度文心一言Java库&#xff0c;支持问答和对话&#xff0c;支持流式输出和同步输出。提供SpringBoot调用样例。提供拓展能力。 1、依赖 <dependency> <groupId>com.baidu.aip</groupId> <artifactId…

C语言例题41、八进制转换为十进制

#include<stdio.h>void main() {int x;printf("请输入一个8进制整数&#xff1a;");scanf("%o", &x);printf("转换成十进制后的整数为%d\n", x); }运行结果&#xff1a; 本章C语言经典例题合集&#xff1a;http://t.csdnimg.cn/FK0Qg…

学习软考----数据库系统工程师32

NoSQL非关系型数据库 CAP理论和BASE特性 关系型数据库主要使用ACID理论 各种NoSQL数据 库的分类与特点

前端XHR请求数据

axios封装了XHR(XMLHttpRequest) 效果 项目结构 Jakarta EE9&#xff0c;Web项目。 无额外的maven依赖 1、Web页面 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&…

强化训练:day7(字符串中找出连续最长的数字串、岛屿数量、拼三角)

文章目录 前言1. 字符串中找出连续最长的数字串1.1 题目描述1.2 解题思路1.3 代码实现 2. 岛屿数量2.1 题目描述2.2 题目描述2.3 代码实现 3. 拼三角3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 字符串中找出连续最长的数字串   2. 岛屿数量   3. 拼三角 1. 字符串…

11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

【数据库】数据库指令

一。数据库打开 1.命令行 2.进入mysql mysql -uroot -p密码 3.退出 exit&#xff1b; 二。针对数据库的操作 1.创建数据库&#xff08;有分号&#xff09; create database student; 2.使用数据库 use student 3.删除数据库&#xff08;有分号&#xff09; drop database…

计算机Java项目|Springboot学生读书笔记共享

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

SpringAMQP-消息转换器

这边发送消息接收消息默认是jdk的序列化方式&#xff0c;发送到服务器是以字节码的形式&#xff0c;我们看不懂也很占内存&#xff0c;所以我们要手动设置一下 我这边设置成json的序列化方式&#xff0c;注意发送方和接收方的序列化方式要保持一致 不然回报错。 引入依赖&#…

【HarmonyOS】笔记八-图片处理

概念 开发者经常需要在应用中显示一些图片&#xff0c;例如&#xff1a;按钮中的icon、网络图片、本地图片等。在应用中显示图片需要使用Image组件实现&#xff0c;Image支持多种图片格式&#xff0c;包括png、jpg、bmp、svg和gif&#xff0c;该接口通过图片数据源获取图片&am…

网站设计模板简单又好看

在互联网时代&#xff0c;每个企业都需要拥有一个好看又具有吸引力的网站。一个简单却又好看的网站设计模板可以为企业带来许多好处。本文将探讨一些如何设计一个简单又好看的网站模板的技巧。 首先&#xff0c;一个好的网站设计模板应该具备简洁明了的布局。简单的布局能够使用…

地下车库导航地图怎么做?停车场地图绘制软件哪个好?

上海懒图科技以先进技术和丰富的行业服务经验为用户提供停车场景下的全流程服务平台&#xff0c;用户基于平台可自主快速绘制酷炫的停车场地图&#xff0c;通过提供完善的停车场应用功能集和扩展API服务包&#xff0c;可以方便地实现电子地图服务于您的各类停车场应用中&#x…

鸿蒙——即将是国内全部物联网的搭载系统

国内物联网时代 中国国内物联网时代是指在中国国内&#xff0c;物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;技术得到广泛应用和发展的时代。在这个时代&#xff0c;各种设备和物品都可以通过互联网进行连接和交互&#xff0c;实现信息的采集、传输和…

问题—前端调用接口url多加一个/,本地可以调通,测试环境报错302,分开调两个接口

问题背景 接口url前面多加一个/ &#xff0c;npm run serve 起项目&#xff0c;本地调用正常 npm run build 打包到测试环境&#xff0c;接口出现问题&#xff0c;分开调用接口&#xff0c;且报302错误 问题原因&#xff1a; 本地开发环境和测试环境的URL处理方式不同 本地使…

【前端性能优化】深入解析重绘和回流,构建高性能Web界面

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3af; 引言&#xff1a;探索Web性能的基石&#x1f3d7;️ 基础概念&#xff1a;什么是重绘和回流&#xff1f;&#x1f4cc; 回流&#xff08;Reflow&#xff09;&#x1f4cc; 重绘&#xff08;Repaint&#xff0…