ros入门(四)--python实现话题订阅和发布及TCP数据转发

机器人发布话题,进行话题订阅,并将话题通过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,发布节点 ,运行结果
ros入门(四)--python实现话题订阅和发布及TCP数据转发_第1张图片
注意:我初步学习时,在运行节点前,应该先配置 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,发布节点 ,运行客户端结果显示
ros入门(四)--python实现话题订阅和发布及TCP数据转发_第2张图片

发现问题,欢迎反馈~

参考链接:
话题通信基本操作
ROS与Python入门教程

你可能感兴趣的:(ROS入门学习,linux,ubuntu,python)