我已经完成了教程,向您展示了如何在ROS中发布和订阅消息。
我现在已经在一个文件中设置了一个消息发送器和侦听器,但这正是我遇到一些问题的地方。这可能更像是一个Python问题,而不是ROS问题。
我当前的邮件发布了"0"。当这个消息发布时,我希望我的乌龟完成一个设定的动作,然而,我很难从发布的消息中提取1。
我要做的是在if语句中使用0。所以,如果0,就这样做,如果不是,就那样做。
有人建议我将侦听器callback
函数中要提取的信息设为global
。这似乎不起作用。
我希望有人能指出我做错了什么,或者提出一条前进的道路。
我的代码如下:
#!/usr/bin/env python
import rospy
from com760_week4_ws_pkg.msg import CustomChat
from std_msgs.msg import Header
from time import gmtime
from time import strftime
def callback(data):
global name
chatter = data.data
header = data.header
name = data.name
timestamp = header.stamp.to_sec()
rospy.loginfo("The message passed by %s is %s, sent at %s" % (name, chatter, strftime("%H:%M:%S", gmtime(timestamp))))
def listener():
rospy.Subscriber("message_chatter", CustomChat, callback)
def talker(count):
pub = rospy.Publisher("message_chatter", CustomChat, queue_size=10)
msg = CustomChat()
msg.name = "The ROS User xxxx"
msg.header.stamp = rospy.Time.now()
msg.data = "-HELLO, ROS-"
pub.publish(msg)
rospy.sleep(2)
listener()
if __name__ == '__main__':
rospy.init_node("chatter", anonymous=True)
count = 0
while not rospy.is_shutdown():
talker(count)
print(name)
当我运行这个时,我得到一个错误,说
line 42, in <module>
print(name)
NameError: global name 'name' is not defined
我确实尝试在代码的顶部添加name = " "
,但当我到达底部的打印时,它所做的只是打印空字符串。
每次调用talker
时,您遇到的一个主要问题是重新创建订阅者和发布者。这些只能创建一次;最好是在初始化节点时。
根据您的评论,还需要进行一些更改。首先,您会得到错误,因为只有当回调首先被调用时,name
才会被定义为全局;这不太可能在您的第一个print
之前发生,因此您会得到未定义的错误。要解决此问题,您可以简单地将name
声明为函数外部的全局变量。这将在加载脚本时创建变量,并处理错误。例如:
...
from time import strftime
name = ""
def callback(data):
global name
...