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

ROS如何取消话题发布的3秒latching延迟实现高频消息发送

问题原因

你遇到的阻塞、重复发送固定消息的问题,核心是rostopic pub命令的默认设计逻辑:

  • 带-1参数启动时,命令会默认启用latch锁存机制,发布1条消息后锁定3秒再退出,因此会出现对应提示和进程阻塞
  • 带-r参数设置发布频率时,命令只会重复发布启动时输入的固定内容的消息,无法动态读取新的消息内容,不能适配持续消息流的发布需求
解决方案

方案1:命令行流式发布(适合快速测试)

取消-1参数,添加--latch 0参数关闭锁存机制,通过管道将你的消息流对接至rostopic pub命令即可实现动态发布,示例如下:

# 读取本地消息流文件批量发布,每行对应一条完整的ADSBVehicle消息
cat your_message_stream.txt | rostopic pub --latch 0 /heifu0/mavros/adsb/send mavros_msgs/ADSBVehicle

如果是实时生成的消息流,直接将生成消息的命令输出通过管道对接即可,发布速度会匹配消息生成速度,无额外阻塞。

方案2:自定义ROS发布节点(适合稳定生产场景)

如果需要更灵活的发布控制,可编写极简的Python发布节点,完全跳过latch机制,示例代码如下:

import rospy
from mavros_msgs.msg import ADSBVehicle

def adsb_stream_publisher():
    # 定义发布者,默认关闭latch
    pub = rospy.Publisher('/heifu0/mavros/adsb/send', ADSBVehicle, queue_size=10)
    rospy.init_node('adsb_pub_node', anonymous=True)
    # 可自定义最高发布频率,比如设置为30Hz
    publish_rate = rospy.Rate(30)
    
    while not rospy.is_shutdown():
        # 此处替换为你自己的消息读取/生成逻辑
        adsb_msg = ADSBVehicle()
        adsb_msg.header.stamp = rospy.Time.now()
        # 填充ADSBVehicle其他字段...
        
        pub.publish(adsb_msg)
        publish_rate.sleep()

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

该方案无额外阻塞开销,可完全自定义消息生成、发布逻辑,适配高速持续消息流的发布需求。

内容的提问来源于stack exchange,提问作者Francisco Zacarias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:07