# -*- coding: utf-8 -*- #!/usr/bin/env python import rospy import tf2_ros import geometry_msgs.msg from nav_msgs.msg import Odometry import tf def odometry_callback(msg): # 创建 TransformStamped 消息 transformStamped = geometry_msgs.msg.TransformStamped() # 获取当前时间戳 transformStamped.header.stamp = rospy.Time.now() transformStamped.header.frame_id = "odom" # 原坐标系 transformStamped.child_frame_id = "base_link" # 目标坐标系 # 提取平移信息 transformStamped.transform.translation.x = msg.pose.pose.position.x transformStamped.transform.translation.y = msg.pose.pose.position.y transformStamped.transform.translation.z = msg.pose.pose.position.z # 提取旋转信息(四元数) q = msg.pose.pose.orientation transformStamped.transform.rotation.x = q.x transformStamped.transform.rotation.y = q.y transformStamped.transform.rotation.z = q.z transformStamped.transform.rotation.w = q.w # 发布TF变换 tf_broadcaster.sendTransform(transformStamped) rospy.loginfo("Published transform from odom to base_link") def listener(): # 初始化 ROS 节点 rospy.init_node('odom_to_base_link_tf_broadcaster') # 创建 TF 广播器 global tf_broadcaster tf_broadcaster = tf2_ros.TransformBroadcaster() # 订阅 /laser_odom 话题 rospy.Subscriber('/laser_odom', Odometry, odometry_callback) # 保持节点运行 rospy.spin() if __name__ == '__main__': try: listener() except rospy.ROSInterruptException: pass