You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:02:15