如何在Python中发布ROS AnyMsg?遇AttributeError问题求助
使用rospy发布rospy.msg.AnyMsg的可行方案
可行性说明
可以实现,但不能直接用常规的publish方法发布常规ROS消息对象。AnyMsg是ROS为订阅任意类型消息设计的特殊类型,不具备常规ROS消息的_slot_types等元属性,因此常规发布流程会报错。
错误原因
rospy的publish方法内部会调用args_kwds_to_message,尝试检查消息类的_slot_types属性来处理输入参数,但AnyMsg没有该属性,导致抛出AttributeError。
实现方案
方案1:手动构造AnyMsg对象并填充原始字节
直接创建AnyMsg实例,将目标消息序列化后的字节赋值给它的_buff属性,再进行发布:
import rospy from std_msgs.msg import String import rospy.msg rospy.init_node('anymsg_publisher_node') # 创建AnyMsg类型的发布者 publisher = rospy.Publisher('jason_topic', rospy.msg.AnyMsg, queue_size=10) # 构造要发送的常规ROS消息并序列化 target_msg = String(data="测试AnyMsg发布") serialized_data = target_msg.serialize() # 构造AnyMsg对象,填充原始字节缓冲区 any_msg = rospy.msg.AnyMsg() any_msg._buff = serialized_data # 发布消息 publisher.publish(any_msg) rospy.spin()
方案2:调用底层publish_message方法
绕过rospy的消息类型检查,直接调用底层方法发送序列化数据和消息类型:
import rospy from std_msgs.msg import String rospy.init_node('anymsg_publisher_node') # 构造目标消息并序列化 target_msg = String(data="测试AnyMsg发布") serialized_data = target_msg.serialize() msg_type = target_msg._type # 获取消息类型全称,比如"std_msgs/String" # 直接调用底层发布方法 rospy.topics.publish_message( topic='jason_topic', msg_type=msg_type, msg_data=serialized_data, queue_size=10 ) rospy.spin()
注意事项
- 订阅端如果用
AnyMsg接收消息,需要自行获取消息类型(通过msg._connection_header['type']),再调用对应消息类的deserialize方法解析msg._buff中的字节数据。 - 两种方案本质都是发送序列化后的原始字节,区别在于是否通过
AnyMsg对象封装。
内容的提问来源于stack exchange,提问作者jasonsf
相关产品推荐
相关产品推荐

