我正在尝试通过python订阅ROS中的4个不同的发布者。我使用以下代码:
def callback(data):
rospy.loginfo (" Publisher1 Value %s ", custom_msg1.custom_string1)
rospy.loginfo (" Publisher2 Value %s ", custom_msg2.custom_string2)
rospy.loginfo (" Publisher3 Value %s ", custom_msg3.custom_string3)
rospy.loginfo (" Publisher4 Value %s ", custom_msg4.custom_string4)
rospy.loginfo (" float_publisher value %f ", data.Float64)
def python_code():
rospy.init_node("python_code")
rospy.Subscriber("float_publisher",Float64,callback)
rospy.Subscriber("publisher1", custom_msg1,callback)
rospy.Subscriber("publisher2", custom_msg2,callback)
rospy.Subscriber("publisher3", custom_msg3,callback)
rospy.Subscriber("publisher4", custom_msg4,callback)
rospy.loginfo(" Test: start spinning!")
rospy.spin()
rospy.loginfo("node has shutdown!")
其中custom_msg1.msg包含定义为字符串的custom_string1,并以相同的方式custom_msg2.msg、custom_msg3.msg和custom_msg4.msg
我想知道我是否正确使用了浮动消息和自定义消息。输出如下:
Publisher1 Value <member 'custom_string1' of 'custom_msg1' objects>
Publisher2 Value <member 'custom_string2' of 'custom_msg2' objects>
Publisher3 Value <member 'custom_string3' of 'custom_msg3' objects>
Publisher4 Value <member 'custom_string4' of 'custom_msg4' objects>
以错误结尾:
rospy.loginfo (" float_publisher value %f ", data.Float64)
AttributeError: 'Custom_msg4' object has no attribute 'Float64'
我不知道这里出了什么问题
如果您想订阅具有五种不同消息类型的五个不同主题,最好的方法是使用五个不同的回调函数,例如:
- 一个用于发布
custom_msg1
的publisher1
- 发布
custom_msg2
publisher2
- 发布
custom_msg3
publisher3
- 发布
custom_msg4
的publisher4
- 一个用于发布
float64
消息的float_publisher
。
回调函数中,参数数据基本上是一个结构,其中包含在消息头中声明的所有组件。您得到的错误是因为回调函数正在使用 custom_msg4
类型的数据调用,并且它正在其中查找名为 Float64
的组件。
def callback1(data):
rospy.loginfo (" Publisher1 Value %s ", data.custom_string1)
def callback2(data):
rospy.loginfo (" Publisher2 Value %s ", data.custom_string2)
def callback3(data):
rospy.loginfo (" Publisher3 Value %s ", data.custom_string3)
def callback4(data):
rospy.loginfo (" Publisher4 Value %s ", data.custom_string4)
def callback5(data):
rospy.loginfo (" float_publisher value %f ", data.Float64)
def python_code():
rospy.init_node("python_code")
rospy.Subscriber("float_publisher",Float64,callback5)
rospy.Subscriber("publisher1", custom_msg1,callback1)
rospy.Subscriber("publisher2", custom_msg2,callback2)
rospy.Subscriber("publisher3", custom_msg3,callback3)
rospy.Subscriber("publisher4", custom_msg4,callback4)
rospy.loginfo(" Test: start spinning!")
rospy.spin()
rospy.loginfo("node has shutdown!")
如果你想使用一个函数,你必须使用一个 if else 来
区分不同的订阅者。
def callback(data,who):
if who == 5:
rospy.loginfo (" float_publisher value %f ", data.data)
else:
rospy.loginfo (" Publisher%d Value %s ",who, data.data)
def python_code():
rospy.init_node("python_code")
rospy.Subscriber("float_publisher",Float64,callback,5)
rospy.Subscriber("publisher1", String,callback,1)
rospy.Subscriber("publisher2", String,callback,2)
rospy.Subscriber("publisher3", String,callback,3)
rospy.Subscriber("publisher4", String,callback,4)
rospy.loginfo(" Test: start spinning!")
rospy.spin()
rospy.loginfo("node has shutdown!")