2014-11-24 163 views
0

我试图通过Python来订阅4个不同的出版商ROS。我使用下面的代码:ROS蟒蛇发布/订阅

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.msgcustom_msg3.msgcustom_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' 

我不知道如果你想订阅五个不同的主题有五个是怎么回事错在这里

+0

...它的工作原理? – jonrsharpe 2014-11-24 14:10:14

+0

@jonrsharpe我得到一个输出,这是错误的,也是一个错误消息。 – ADI 2014-11-24 14:24:03

+0

您的追踪与您发布的代码不符。另外请注意,'callback'的最后一行不像前四个。 – jonrsharpe 2014-11-24 14:25:32

回答

2

不同的消息类型做的是用五种不同的回调函数,一个用于publisher1一个发布custom_msg1一个发布custom_msg2一个发布custom_msg3一个发布custom_msg4的最佳方式,publisher2,publisher3,publisher4,以及一个用于FLOA发布float64消息的t_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!") 
+0

感谢您的帮助...它工作... – ADI 2014-12-02 16:15:24

0

如果你想使用一个功能,你将不得不使用的,如果别的

不同用户之间进行区分。

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!")