前言
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()