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

如何订阅AMCL位姿并按照ground truth位姿的频率打印输出

问题原因

  • 你将死循环写在了/amcl_pose的订阅回调函数里,第一次接收到位姿消息后,程序就会一直卡在回调的while循环中,后续新的位姿消息再也无法触发回调更新全局变量,因此只能一直打印初始位姿
  • 另外你定义的rospy.Rate(10)没有调用sleep()方法,实际不会生效,循环会以最高频率运行占用大量CPU

正确实现方案

实现逻辑为:用全局变量缓存最新的amcl_pose位姿,在主循环里按照ground_truth/state的默认频率定时打印缓存的最新位姿即可,参考代码如下:

#! /usr/bin/env python
import rospy
from geometry_msgs.msg import PoseWithCovarianceStamped   

# 全局变量缓存最新位姿
latest_pose = None

def pose_callback(msg):
    global latest_pose
    # 每次收到新的amcl_pose消息就更新缓存
    latest_pose = msg.pose.pose.position

if __name__ == "__main__":
    rospy.init_node("amcl_pose_printer")
    # 订阅amcl_pose话题
    sub = rospy.Subscriber('/amcl_pose', PoseWithCovarianceStamped, pose_callback)
    
    # 可先通过rostopic hz /ground_truth/state查询实际频率,替换下方参数,ground_truth默认一般为10Hz
    print_rate = rospy.Rate(10) 
    
    while not rospy.is_shutdown():
        # 确保已经收到过位姿数据再打印
        if latest_pose is not None:
            print(latest_pose)
        print_rate.sleep()

补充说明

如果需要严格对齐ground_truth/state的时间步长而非仅仅频率对齐,可以同时订阅ground_truth/state,每次收到ground_truth/state的消息时就打印当前缓存的最新amcl_pose位姿即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:15:03