根据ROS上自定义消息中的信息执行操作



我已经完成了教程,向您展示了如何在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
...

相关内容

最新更新