运行时获取ros消息类型

Get ros message type at runtime

我希望通过 rosparam 加载配置文件,其中包含要订阅的通用回调的类型。现在这就是我所拥有的,但无法弄清楚如何让它与订阅者一起工作。

import rospy
from std_msgs.msg import *

def generic_cb(data):
    print(data.data)

if __name__ == '__main__':
    rospy.init_node('generic_node')
    topic_name = rospy.get_param('topic_name')
    topic_type = rospy.get_param('topic_type')
    rospy.Subscriber(topic_name, topic_type, generic_cb)

    rospy.spin()

在 Python 中,您可以使用 globals 查找和 return 来自字符串的消息类型

import rospy
from std_msgs.msg import *

def generic_cb(data):
    print(data.data)

if __name__ == '__main__':
    rospy.init_node('generic_node')

    topic_name = rospy.get_param('topic_name')
    topic_type = rospy.get_param('topic_type')
    
    ros_msg_type = globals()[topic_type]

    rospy.Subscriber(topic_name, ros_msg_type, generic_cb)

    rospy.spin()

查看动态计算主题类型的rostopic API,您可以在事先不知道的情况下获取主题的消息类型:

import rostopic
import rospy

rospy.init_node('test_node')

TopicType, topic_str, _ = rostopic.get_topic_class('/some/topic')

def callback(msg):
    print(msg)

rospy.Subscriber(topic_str, TopicType, callback)

rospy.spin()