map2odom_publisher.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import rospy
  4. import tf2_ros
  5. import geometry_msgs.msg
  6. from nav_msgs.msg import Odometry
  7. import tf
  8. def odometry_callback(msg):
  9. # 创建 TransformStamped 消息
  10. transformStamped = geometry_msgs.msg.TransformStamped()
  11. # 获取当前时间戳
  12. transformStamped.header.stamp = rospy.Time.now()
  13. transformStamped.header.frame_id = "odom" # 原坐标系
  14. transformStamped.child_frame_id = "base_link" # 目标坐标系
  15. # 提取平移信息
  16. transformStamped.transform.translation.x = msg.pose.pose.position.x
  17. transformStamped.transform.translation.y = msg.pose.pose.position.y
  18. transformStamped.transform.translation.z = msg.pose.pose.position.z
  19. # 提取旋转信息(四元数)
  20. q = msg.pose.pose.orientation
  21. transformStamped.transform.rotation.x = q.x
  22. transformStamped.transform.rotation.y = q.y
  23. transformStamped.transform.rotation.z = q.z
  24. transformStamped.transform.rotation.w = q.w
  25. # 发布TF变换
  26. tf_broadcaster.sendTransform(transformStamped)
  27. rospy.loginfo("Published transform from odom to base_link")
  28. def listener():
  29. # 初始化 ROS 节点
  30. rospy.init_node('odom_to_base_link_tf_broadcaster')
  31. # 创建 TF 广播器
  32. global tf_broadcaster
  33. tf_broadcaster = tf2_ros.TransformBroadcaster()
  34. # 订阅 /laser_odom 话题
  35. rospy.Subscriber('/laser_odom', Odometry, odometry_callback)
  36. # 保持节点运行
  37. rospy.spin()
  38. if __name__ == '__main__':
  39. try:
  40. listener()
  41. except rospy.ROSInterruptException:
  42. pass