Рос питон издатель / подписчик

Я пытаюсь подписаться на 4 разных издателя в ROS через python. Я использую следующий код:

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'

Я не знаю, что здесь происходит не так

2 ответа

Решение

Если вы хотите подписаться на пять разных тем с пятью различными типами сообщений, лучший способ сделать это - использовать пять различных функций обратного вызова, одна для publisher1, которая публикует custom_msg1, publisher2, который публикует custom_msg2, publisher3, который публикует custom_msg3, publisher4, который публикует custom_msg4, и один для float_publisher, который публикует сообщения float64.

В функции обратного вызова данные параметров в основном представляют собой структуру, в которой есть все компоненты, объявленные в заголовке сообщения. Ошибка, которую вы получаете, заключается в том, что функция обратного вызова вызывается с данными типа 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!")
Другие вопросы по тегам