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
相关产品推荐
相关产品推荐

