文章目录
- 步骤
- 发布者
- 步骤
- 发布者信息
- 消息
- 完整代码
- 结果
- 优化
- 完整代码
- 运行结果
- 订阅者
- 步骤
- 完整代码
- 运行结果
- 优化
- 不同节点的关系
- 节点关系
- 不同编程语言的交流沟通
步骤
发布者
步骤
发布者信息
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)
结果
无事发生(这是正确的因为没有编写日志内容)
如有想要打印可以在终端使用以下代码:
rostopic echo "话题名称"
结果如下,data会一直打印,成功!
优化
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()
运行结果
订阅者
步骤
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()
运行结果
优化
我们会发现当先启动接收者,再启动发布者时,我们收到的数据并不全面。这是因为:发布者还未在 roscore 注册完毕
解决方法:在发布者里加入休眠语句
rospy.sleep(2)
成功!!
不同节点的关系
运行两个终端后,执行命令
rqt_graph
节点关系
不同编程语言的交流沟通
使用ros时,不同编程语言可以一个作为发布方,一个作为订阅方,但需要同一个
话题才能联系起来