python socket 通信 PC和ROS

本文介绍了一种基于socket的通信方式,使ROS系统能够与PC端进行数据交换。通过Python类封装了客户端和服务端的实现,简化了使用过程。具体包括PC端作为客户端的连接和消息发送接收逻辑,以及ROS端作为服务端的消息处理流程。
摘要由CSDN通过智能技术生成

前言

socket是基于C/S架构的,进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端。在我们的PC端同ROS通信的过程中PC端作为客户端,ROS部分作为服务端。

笔者将实现该通信过程的代码封装成python的类,这样在使用代码的过程中可以通过python类和少量地代码实现相应的功能。

PC端

PC端作为socket通信的客户端。

PC端代码

import time
import socket


class toRos():
    def __init__(self,HOST,PORT):
        self.BUFFER=4096
        # 定义socket通信类型 ipv4,tcp
        self.soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 连接服务器
        try:
            self.soc.connect((HOST, PORT))
            print("成功连接ROS!")
        except:
            print("连接ROS不成功")
        # 延时
        time.sleep(1)

    def send(self, msg):
        try:
            self.soc.send(msg.encode("utf-8"))
            print("成功发送ROS消息!")
        except:
            print("send error!")

    def receive(self):
        # 接受消息
        buf = self.soc.recv(self.BUFFER)
        buf.decode("utf-8")
        # 打印消息
        print(buf)
        return buf

    def close(self):
        # 接口关闭
        self.soc.close()

ROS端

ROS端作为通信的服务端。

ROS端代码

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

import time
import socket
import rospy
from std_msgs.msg import String

HOST='192.168.1.105'

PORT=8008

BUFFER=4096

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.bind((HOST,PORT))

sock.listen(5)


rospy.init_node('tcptalker',anonymous=0)
pub=rospy.Publisher('tcptopic',String,queue_size=10)
con,addr=sock.accept()

print 'i am listening'

while not rospy.is_shutdown():
    try:
        #con.settimeout(5)
        buf=con.recv(BUFFER)
        print buf
        pub.publish(buf)  
        #time.sleep(1)
	#con.send('yes i recv')
    except socket.timeout:
        print 'time out'
    

con.close()

发送消息demo

使用指南

保证PC和ROS处于同一个局域网下,首先在ROS端(linux系统下)crtl+alt+t打开中端,ifconfig 查看IPV4下的地址,随后初始化类即可。
通信过程中现在ros中启动相应的节点,随后运行python文件即可。

if __name__ == "__main__":
    myROSconnection = toRos('192.168.1.105', 8008)
    myROSconnection.send("bkq")
    myROSconnection.receive()
在C#中,你可以利用.NET Framework下的System.Net.Sockets命名空间提供的Socket类来进行跨平台通信,包括PC(个人计算机)之间的连接,如Windows和Linux机器之间。ROS (Robot Operating System) 是一个专门为机器人设计的操作系统框架,它通常用于实时数据交换和节点间通信。 如果你想要在C# PCROS节点之间建立通信,一种常见的做法是通过ROS的TCP通信机制,也就是所谓的ROS Bridge或Nodelets。以下是一个简单的步骤概述: 1. **创建ROS服务或话题**:在ROS环境中,你需要定义一个服务或发布者-subscriber对,以便其他程序可以发送请求或订阅消息。 2. **C#客户端**:在C#中,你可以使用`microsoft.ros.net`库来连接到ROS节点并调用服务、订阅主题。首先需要设置ROS Node URI(例如,`ws://localhost:11311`),然后通过`NodeClient`发起请求或监听服务和主题。 ```csharp using Microsoft.ROS; using Microsoft.ROS.NET; // ... var node = new Node("my_node"); Uri uri = new Uri("ws://localhost:11311"); // 发起服务调用 var service = node.ServiceClient<YourServiceType>("your_service_name", uri); service.Request = ...; // 设置请求内容 service.Invoke(); // 订阅主题 var topicSubscriber = node.TopicSubscriber<YourMessageType>("your_topic_name", uri, OnMessageReceived); ``` 3. **OnMessageReceived回调函数**:定义处理接收到的主题消息的方法。 4. **错误处理**:记得处理可能出现的网络连接异常或其他错误。 **注意事项**: - C#和ROS之间的通信需要确保网络可达并且ROS服务器已启动,并且C#应用程序具有适当的权限访问。 - 使用第三方库,如`RosBridgeClient`,简化了与ROS的集成,特别是在客户端向ROS发布消息方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值