文章目录

  • 步骤
  • 发布者
  • 步骤
  • 发布者信息
  • 消息
  • 完整代码
  • 结果
  • 优化
  • 完整代码
  • 运行结果
  • 订阅者
  • 步骤
  • 完整代码
  • 运行结果
  • 优化
  • 不同节点的关系
  • 节点关系
  • 不同编程语言的交流沟通


步骤

发布者

步骤

发布者信息

1.指明执行这个脚本文件的解释程序

#! /usr/bin/env python

2…导入库

import rospy
from std_msgs.msg import String

3.初始化ros节点

rospy.init_node("writer")# 参数为节点名称

4.创建发布者对象

pub = rospy.Publisher("article",String,queue_size=10)# 参数分别为话题,话题类型,队列长度
消息

1.创建被发布的消息

msg = String()# 设置消息是String()类型

2.编写循环

while not rospy.is_shutdown():# 当ros没关时循环
    msg.data = "perfect"
    pub.publish(msg)

3.数据内容

msg.data = "perfect"

4.发布数据

pub.publish(msg);# 发布者对象发布数据
完整代码
#! /usr/bin/env python
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
    rospy.init_node("writer")
    pub = rospy.Publisher("article",String,queue_size=10)
    
    msg = String()

    while not rospy.is_shutdown():
        msg.data = "perfect"
        pub.publish(msg)

结果

无事发生(这是正确的因为没有编写日志内容)

ros python 数组消息类型_python

如有想要打印可以在终端使用以下代码:

rostopic echo "话题名称"

结果如下,data会一直打印,成功!

ros python 数组消息类型_开发语言_02

优化

1.设置发布频率

rate = rospy.Rate(1)

2.消息编号与消息拼接

msg.data = str(count)+"-->"+"perfect"

3.用日志打印

rospy.loginfo(msg)

4.休眠

rate.sleep();//休眠时间 = 1/频率
完整代码
#! /usr/bin/env python
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
    rospy.init_node("writer")
    pub = rospy.Publisher("article",String,queue_size=10)
    
    msg = String()
    rate = rospy.Rate(1)
    count = 0
    while not rospy.is_shutdown():
        msg.data = str(count)+"-->"+"perfect"
        pub.publish(msg)
        count+=1
        rospy.loginfo(msg)
        rate.sleep()
运行结果

ros python 数组消息类型_python_03

订阅者

步骤

1.导包

import rospy
from std_msgs.msg import String

2.初始化节点

rospy.init_node("reader")

3.创建订阅者对象

pub = rospy.Subscriber("article",String,doMsg,queue_size=10)# 新增一个回调函数

4.创建回调函数

# 传入msg参数:为了打印数据
def doMsg(msg):
    rospy.loginfo("我收到:%s",msg.data)

5.回调函数

rospy.spin() # 必须要有这句
完整代码
#! /usr/bin/env python
import rospy
from std_msgs.msg import String

def doMsg(msg):
    rospy.loginfo("我收到:%s",msg.data)

if __name__ == "__main__":
    rospy.init_node("reader")
    pub = rospy.Subscriber("article",String,doMsg,queue_size=10)
    
    rospy.spin()
运行结果

ros python 数组消息类型_python_04

优化
我们会发现当先启动接收者,再启动发布者时,我们收到的数据并不全面。这是因为:发布者还未在 roscore 注册完毕
解决方法:在发布者里加入休眠语句
rospy.sleep(2)

成功!!

ros python 数组消息类型_数据_05

不同节点的关系

运行两个终端后,执行命令

rqt_graph

节点关系

ros python 数组消息类型_数据_06

不同编程语言的交流沟通

使用ros时,不同编程语言可以一个作为发布方,一个作为订阅方,但需要同一个

话题才能联系起来

ros python 数组消息类型_python_07