简单的发布者/订阅者(Python)

自己在使用ROS的过程中一直使用Python编程语言,因此在此只介绍基于Python的发布者/订阅者代码,有兴趣的可以到官网参考C++的代码。

1、编写代码前的准备工作

在前面已经介绍了如何创建一个ROS空间,以及如何创建自定义的消息和服务,在这里默认你已经掌握了上述内容。假设我已经在自己的用户目录下创建了一个名为ROSworkspace的工作空间,在工作空间的src文件夹下已经创建了一个名为newpackage的软件包(功能包)。在软件包内的msg文件夹下创建了一个名为Str.msg的消息文件,消息文件的内容如下所示:

string str

并且已经将上述所有代码进行了一次编译。

2、主题发布者节点

在~/ROSworkspace/src/newpackage/src目录下(一般一个软件包的节点可执行文件都放在这个目录下),创建一个talker.py文件,文件内的代码如下所示:

#!/usr/bin/env python
#coding:utf-8
# license removed for brevity

import rospy
import time
from newpackage.msg import Str

def talker():
    pub = rospy.Publisher('chatter2',Str,queue_size = 10)#创建一个话题
    rospy.init_node('talker',anonymous = True)#声明一个发布话题的节点
    rate = rospy.Rate(1)#话题发布的频率1Hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
        rospy.loginfo(hello_str)#将数据打印出来
        pub.publish(hello_str)#将数据发送到话题上
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

创建成功后,不要忘记把.py文件变为可执行文件:(这一步非常重要。默认当前在该文件所在路径下,否则应该在文件名前面加上路径)

chmod +x talker.py

使用该指令后可以用ls列出文件,可以发现文件名颜色与之前比发生了变化。

3、主题订阅者节点

在~/ROSworkspace/src/newpackage/src目录下,创建一个listener.py文件,文件内的代码如下所示:

#!/usr/bin/env python
#coding:utf-8
import rospy
from newpackage.msg import Str

def callback(data):
    rospy.loginfo("I heard %s", data.str)#将数据打印在屏幕上,注意data.后面必须是消息中定义的消息名称

def listener():
    rospy.init_node('listener', anonymous=True)#声明一个订阅者节点
    rospy.Subscriber("chatter2", Str, callback)#订阅一个话题,收到话题数据后并做出相应的反应

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    listener()

创建成功后,不要忘记把.py文件变为可执行文件:

chmod +x listener.py

4、编译工程,并运行上述节点

回到工作空间目录下,并且编译工程:

cd ~/ROSworkspace
catkin_make

首先运行节点/rosout

roscore

然后打开一个新的终端,运行话题发布者节点talker.py

rosrun newpackage talker.py

结果如图:

再次重新打开一个终端,运行话题订阅者节点 listener.py
rosrun newpackage listener.py

结果如图:




5、遇到问题

自己在创建完整个工程,并且编译成功后,直接在该窗口中运行节点总是出现下面提示的错误:

No module named newpackage.msg...

自己至今仍然不知道错误所在,检查了所有文件和步骤都没有问题,后来用以下方法解决了:

将之前在建立工程的所有终端全部关闭,并且开启新的终端来运行节点,就OK...感觉很奇怪....





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值