tf用法汇总和代码实战
#include <tf/tf.h>这个头文件有哪些主要的功能?
【从零开始学习SLAM】官方tf教程小海龟跟随程序
【从零开始学习SLAM】将坐标系变换关系发布到话题 tf_static
【从零开始学习SLAM】将坐标系变换关系发布到 topic tf
【从零开始学习SLAM】分解ros小海龟跟随代码
tf
是 ROS(Robot Operating System)中一个非常重要的包,用于处理多个坐标系之间的关系。它允许开发者跟踪随时间变化的坐标系,并在这些坐标系之间进行变换。以下是 tf
的两个主要用途:变换监听(Transform Listener)和变换广播(Transform Broadcaster)的示例。
tf
监听坐标变换(Transform Listener)监听器(Listener)用于监听和查询两个坐标系之间的关系。
import rospy
import tf
def listener():
rospy.init_node('tf_listener')
listener = tf.TransformListener()
rospy.sleep(2.0) # 为tf缓冲填充数据留出时间
while not rospy.is_shutdown():
try:
# 获取最近的变换
(trans, rot) = listener.lookupTransform('/target_frame', '/source_frame', rospy.Time(0))
rospy.loginfo("Translation: " + str(trans))
rospy.loginfo("Rotation: " + str(rot))
except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
continue
tf
广播坐标变换(Transform Broadcaster)广播器(Broadcaster)用于创建和发送坐标系之间的关系。
import rospy
import tf
from geometry_msgs.msg import TransformStamped
def broadcaster():
rospy.init_node('tf_broadcaster')
br = tf.TransformBroadcaster()
rate = rospy.Rate(10.0)
while not rospy.is_shutdown():
# 创建变换
t = TransformStamped()
t.header.stamp = rospy.Time.now()
t.header.frame_id = "source_frame"
t.child_frame_id = "target_frame"
t.transform.translation.x = 1.0
t.transform.translation.y = 2.0
t.transform.translation.z = 3.0
t.transform.rotation.x = 0.0
t.transform.rotation.y = 0.0
t.transform.rotation.z = 0.0
t.transform.rotation.w = 1.0
# 发布变换
br.sendTransform((t.transform.translation.x, t.transform.translation.y, t.transform.translation.z),
(t.transform.rotation.x, t.transform.rotation.y, t.transform.rotation.z, t.transform.rotation.w),
rospy.Time.now(),
t.child_frame_id,
t.header.frame_id)
rate.sleep()
将上述两段代码分别保存为 Python 脚本(例如 tf_listener.py
和 tf_broadcaster.py
)。
确保这些脚本在你的 ROS 工作空间中并且是可执行的。
分别使用 rosrun
运行这些节点:
rosrun your_package_name tf_listener.py
rosrun your_package_name tf_broadcaster.py
在这两个示例中,tf_broadcaster.py
创建并发送一个从 “source_frame” 到 “target_frame” 的坐标变换,而 tf_listener.py
则监听并查询这两个坐标系之间的变换。这些脚本在实际应用中可以用于多种场景,例如机器人臂的姿态跟踪、移动机器人的导航等。