2014-11-24 217 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!")