项目需要把笔记本的数据发送到小车的ros上,我们采用socket通讯的方法。首先把通过socket把笔记本的数据发送到小车上,然后通过消息发布和订阅的方式把数据传递到小车的ros上。
一、通过socket发送笔记本上的数据
# -*- coding: utf-8 -*-
import socket
client = socket.socket()
#client.connect(('localhost', 1666)) # 设置连接的服务器的IP和端口
while True:
str = 'ab' + '1234' + 'cd' # 数据编码,防止socket接收数据错误
client.send(str.encode('utf-8')) # 设置编码为utf-8
client.close()
二、小车上接收笔记本的数据并以2Hz的频率发布消息
#!/usr/bin/env python2
import rospy
from std_msgs.msg import Int32
import socket
rospy.init_node('topic_publisher')
pub = rospy.Publisher('counter',Int32)
rate = rospy.Rate(2)
server = socket.socket()
server.bind(('localhost', 1666))
server.listen(5)
exit = ''
while True:
con, addr = server.accept()
print('connect_addr: ', addr)
while con:
msg = con.recv(1024).decode('utf-8')
if msg[0:2] == 'ab' and msg[-2:] == 'cd':
while not rospy.is_shutdown():
pub.publish(int(msg[2:6]))
rate.sleep()
if msg == 'break':
con.close()
exit = 'break'
break
if exit == 'break':
break
server.close()
此时打开终端输入
roscore
打开小车ros环境,发布数据到counter节点中。为了测试代码是否正确,打开另一个终端,输入
rostopic echo counter -n 5
可以得到counter话题发布的数据,如下图所示。
三、ros端接收counter话题数据,方便后续使用
#!/usr/bin/env python2
import rospy
from std_msgs.msg import Int32
def call(msg):
print(msg.data)
rospy.init_node('topic_subscriber')
sub = rospy.Subscriber('counter', Int32, call)
rospy.spin()
打印接收的数据,结果如下所示。
四、总结
我们通过socket通讯的方式,将笔记本数据传递到另一台设备的ros上,为后续工作的开展奠定了通讯基础。
参考博客
关于结合ros订阅和socket使用的python代码_恭喜发财__的博客-CSDN博客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)