跨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实现节点间的直连 - 古月居可查看全文

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超实用的excel进销存管理系统(75份),自带库存预警,直接用!

进销存(Inventory Management)是企业管理中的一个核心组成部分,它涉及到商品的采购(进货)、销售和存储(库存)等环节。有效的进销存管理可以帮助企业降低成本、提高效率和客户满意度。 1. 采购管…

线程池的一些问题

核心线程数1.最大线程5.队列5.存活时间10s 1.场景一 如果核心线程数.被一直占用得不到释放.新进来1个任务.会怎么样?答: 会在队列中中死等. 只要进来的任务.不超过队列的长度,就会一直挡在队列中死等 package com.lin;import java.util.concurrent.Executors; import java.u…

knife4j案例

1.导入 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId> </dependency>2.在配置类中加入 knife4j 相关配置并设置静态资源映射&#xff08;否则接口文档页面无法访问&#xff…

基于Python的jieba库分析《斗破苍穹》文本中的高频词汇

分析《斗破苍穹》文本中的高频词汇 在进行文本分析时&#xff0c;了解文本中出现频率较高的词汇对于把握文本的主题和风格非常有帮助。本文将介绍如何使用Python的jieba库对《斗破苍穹》这部小说的文本进行分词处理&#xff0c;并统计高频词汇的出现次数&#xff08;本文只统计…

【机器学习】:基于决策树与随机森林对数据分类

机器学习实验报告&#xff1a;决策树与随机森林数据分类 实验背景与目的 在机器学习领域&#xff0c;决策树和随机森林是两种常用的分类算法。决策树以其直观的树形结构和易于理解的特点被广泛应用于分类问题。随机森林则是一种集成学习算法&#xff0c;通过构建多个决策树并…

图解堆排序【一眼看穿逻辑思路】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、堆的概念2、实现堆排序前的准备工作3、堆排序的思路3.1 第一步3.2 第二步 4、结语 1、…

Cannot read properties of undefined (reading ‘init‘)报错

出现这个报错是印象项目没有引echarts包 npm i echarts 下包 然后在main.js中引入 import echarts from echarts Vue.prototype.$echarts echarts 如果还不行 import * as echarts from echarts; 更改一下引入方式 ok了

OpenHarmony 实战开发——使用分布式菜单创建点餐神器

随着社会的进步与发展&#xff0c;科技手段的推陈出新&#xff0c;餐饮行业也在寻求新的突破与变革&#xff0c;手机扫描二维码点餐系统已经成为餐饮行业的未来趋势&#xff0c;发展空间巨大&#xff1b;扫码点餐&#xff0c;是“互联网餐饮”潮流的产物&#xff0c;可以有效地…

Leetcode—2244. 完成所有任务需要的最少轮数【中等】

2024每日刷题&#xff08;136&#xff09; Leetcode—2244. 完成所有任务需要的最少轮数 实现代码 class Solution { public:int minimumRounds(vector<int>& tasks) {unordered_map<int, int> map;for(int task: tasks) {map[task];}int ans 0;// freq 1 …

嵌入式学习-输入捕获

简介 框图介绍 输入通道部分 比较捕获寄存器与事件生成 相关寄存器

【论文阅读 | 三维重建】3D Gaussian Splatting for Real-Time Radiance Field Rendering(3DGS)

Abstract 辐射场方法最近彻底改变了用多张照片或视频捕获的新颖视图合成&#xff0c;然而实现高视觉质量仍然需要训练和渲染成本高昂的神经网络&#xff0c;而最近更快的方法不可避免地要牺牲速度来换取质量。对于无边界和完整的场景和1080P分辨率的渲染&#xff0c;目前没有任…

低成本、功能强大!德思特提供一体化WiFi 6E信道测试方案!

​ 作者介绍 一、方案介绍 伴随WiFi 6E与WiFi 7的提出&#xff0c;WIFI划分出一个全新的5.925GHz-7.125GHz 之间的80MHz和160MHz频段。1200MHz的带宽是迄今为止最宽的&#xff0c;是之前2.4GHz和5GHz WiFi 频段可用带宽的数倍。此外WiFi 6E引入了以下技术&#xff1a; ● 多…

全网最全的Postman接口自动化测试!

该篇文章针对已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境&#xff1a; Window 7 - 64 Postman 版本&#xff08;免费版&#xff09;&#xff1a;Chrome App v5.5.3 不同版本页面 UI 和部分…

搞大事!法国邀请芬兰公司建量子工厂

法国当地时间5月13日&#xff0c;法国总统马克龙宣布启动2024年度“选择法国”&#xff08;Choose France&#xff09;商业峰会。今年峰会召开前&#xff0c;法国赢得了创纪录的150亿欧元外国投资承诺&#xff0c;覆盖从人工智能到制药和能源等领域。 而涉及到量子领域最重磅的…

✅HTTPS和HTTP的区别是什么?

一、问题解析 HTTP和HTTPS是两种协议&#xff0c;分别是Hypertext Transfer Protocol和HyperText Transfer Protocol Secure。 HTTPS还经常被称之为HTTP over SSL或者HTTP over TSL&#xff0c;HTTPS经由HTTP进行通信&#xff0c;但利用SSL/TLS来加密数据包。 他们的区别主要…

打个样为centos安装mysql(下载安装)

文章目录 一、下载二、卸载mariadb三、创建用户和组四、解压并安装mysql五、修改my.cnf六、配置环境七、初始化数据库八、启动mysql服务、改密码配置远程链接九、完成 一、下载 https://downloads.mysql.com/archives/community/ 二、卸载mariadb 安装mysql的话会和mariadb的…

python:SunMoonTimeCalculator

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; https://github.com/Broham/suncalcPy # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # Datetime : 2024/5/14 21:59 # User …

通过 AWS Glue 同步 MaxCompute 数据到 S3

1. 下载驱动 下载 3.3.6 版本的 driver wget https://github.com/aliyun/aliyun-odps-jdbc/releases/download/v3.3.6/odps-jdbc-3.3.6-jar-with-dependencies.jar将下载的jar包上传到 S3 指定目录下。(版本会影响方案的成功&#xff0c;4.x 以上版本验证是不可行的) 2. 在 …

二手手机行业商家如何利用二手机店erp进行破局?

在数字化和AI发展越发先进的的今天&#xff0c;二手手机市场正迎来前所未有的变革。途渡科技精心打造的超机购ERP管理软件&#xff0c;凭借其独特的智能化、高效化特点&#xff0c;正在引领这场变革&#xff0c;为二手手机商家提供全面、深度的数字化管理解决方案。二手手机商家…

谷歌广告账号被暂停是因为什么?防封点大全背好!

跨境出海业务少不了需要做Google Ads推广业务&#xff1b;其中让投手们闻风丧胆的消息就是帐户被暂停。当 Google 检测到任何违反其政策且可能损害用户在线体验的行为时&#xff0c;就会发生这种情况。那么如何在做广告推广的同时&#xff0c;保证账号不被封禁呢&#xff1f;看…