机器人发布话题,进行话题订阅,并将话题通过TCP转发给PC端。这里主要是基本的消息订阅和socket 代码实现。
1.发布方发布话题 (1)相关代码
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#1.导包
import rospy
from std_msgs.msg import String
if __name__ == '__main__':
#2.初始化 ROS 节点:命名(唯一),节点为talker_p
rospy.init_node('talker_p')
#3.实例化 发布者 对象(发布话题-chatter,std_msgs.msg.String类型,队列条目个数)
pub =rospy.Publisher('chatter',String,queue_size=10)
#4.组织被发布的数据,并编写逻辑发布数据
msg = String() # #创建 msg 对象
msg_front ='good good study, day day up'
count =0 #计数
rate = rospy.Rate(10) #f发布频率,10次/秒
while not rospy.is_shutdown(): #用于检测程序是否退出,是否按Ctrl-C 或其他
msg.data = msg_front + str(count)
pub.publish(msg) #发布信息到主题
rate.sleep()
rospy.loginfo('写出的数据:%s',msg.data) #在屏幕输出日志信息,写入到rosout节点,也可以通过rqt_console来查看
count +=1 #计数
(2) 修改权限chmod +x *.py (3) 启动roscore,发布节点 ,运行结果 注意:我初步学习时,在运行节点前,应该先配置 CMakeLists.txt文件,但是我没有配置,依然可以运行,不知道为什么?有了解的麻烦告知~
2.订阅话题并通过TCP转发 (1)话题订阅并转发相关代码示例
#! /usr/bin/env python
# -*- coding:utf-8 -*-
from socket import *
import rospy
from std_msgs.msg import String
def doServer(msg):
# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
#s = socket.socket(AF_UNIX, SOCK_STREAM)
# 本地信息
address = ('localhost', 8080) #绑定本机地址IP
# 绑定
tcp_server_socket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
# listen里的数字表征同一时刻能连接客户端的程度.
tcp_server_socket.listen(128)
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
# clientAddr 是元组(ip,端口)
client_socket, clientAddr = tcp_server_socket.accept()
# 接收对方发送过来的数据,和udp不同返回的只有数据
# recv_data = client_socket.recv(1024) # 接收1024个字节
# print('接收到的数据为:', recv_data.decode('gbk'))
# 发送一些数据到客户端
# client_socket.send("thank you !".encode('gbk'))
while not rospy.is_shutdown():
client_socket.send(msg.data) #向客户端发送数据
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
if __name__ == "__main__" :
#1. 初始化ROS节点
rospy.init_node('listener_p')
#2.实例化 订阅者 对象 (订阅话题-chatter,std_msgs.msg.String类型, 回调函数doServer ,队列条目个数)
sub = rospy.Subscriber('chatter',String,doServer,queue_size=1)
#3,设置循环调用回调函数
rospy.spin()
(2) 客户端代码示例
from socket import *
def client():
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = "IP XXXX.XXX.XX"
server_port = 8080
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 提示用户输入数据
# send_data = input("请输入要发送的数据:")
# tcp_client_socket.send(send_data.encode("gbk"))
# 接收对方发送过来的数据,最大接收1024个字节
while True:
recvData = tcp_client_socket.recv(29)
print('接收到的数据为:', recvData.decode('gbk'))
# 关闭套接字
tcp_client_socket.close()
if __name__ == "__main__":
client()
(3)修改权限chmod +x *.py (4) 启动roscore,发布节点 ,运行客户端结果显示
发现问题,欢迎反馈~
参考链接: https://www.ncnynl.com/archives/201611/1059.html http://www.autolabor.com.cn/book/ROSTutorials/di-2-zhang-ros-jia-gou-she-ji/22hua-ti-tong-xin/213-hua-ti-tong-xin-zhi-python-shi-xian.html
|