ValueError: data_class [Twist] is not a class

ValueError: data_class [Twist] is not a class

我正在尝试从 .yaml 文件获取值以在 ROS 中订阅和写入包文件。但是我遇到了这个错误,我无法解决。我想我无法在代码中将我的值定义为 class 名称。

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import rospy 
import rosbag
from geometry_msgs.msg import Twist

filename='test.bag'
bag = rosbag.Bag(filename, 'w')


sensor_info=rospy.get_param("/bag/sensor_info") 
move_datatype=sensor_info[1]['datatype'] # Twist
move_topic=sensor_info[1]['topic_name'] # /cmd_vel

def move_callback(msg):
    x=msg

def main():
    global x
    rospy.init_node('rosbag_save', anonymous=True)
    rospy.Subscriber(move_topic,move_datatype(),move_callback)
    while not rospy.is_shutdown():
        bag.write(f'{move_topic}',x)

if __name__ == '__main__':
    try:
        main()
    except rospy.ROSInterruptException:
        pass

这是我的代码

bag:
  sensor_info:
    - {"topic_name": "/multi_scan", "datatype": "LaserScan"}
    - {"topic_name": "/cmd_vel", "datatype": "Twist"}

这是我的 .yaml 文件

您收到此错误是因为当您从服务器读取 rosparam 时,它将被存储为字符串;您不能将其传递给订阅者。相反,您应该在读入后将其转换为对象类型。有几种方法可以做到这一点,但使用 globals() 可能是最简单的。本质上,这个 returns 是全局符号 table 中所有内容的字典,您可以从那里使用键(字符串)获取值(class 类型)。这可以这样完成:

sensor_info = rospy.get_param("/bag/sensor_info") 
move_datatype_string = sensor_info[1]['datatype'] # Twist
move_topic = sensor_info[1]['topic_name'] # /cmd_vel

move_datatype = globals()[move_datatype_string]