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]
我正在尝试从 .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]