ROS tf 和 tf2

文章目录

tf 简介

在这里插入图片描述

  • 什么是tf
    tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助用户在任意时间,将点、向量等数据的坐标,在两个参考系中完成坐标变换。
    tf设计

  • tf可以做什么
    一个机器人系统通常有很多三维的参考系,而且会随着时间的推移发生变化,例如全局参考系(world frame),机器人中心参考系(base frame),机械夹参考系(gripper frame),机器人头参考系(head frame)等等。tf可以以时间为轴,跟踪这些参考系(默认是10秒之内的),并且允许用户提出如下的申请:
    1.五秒钟之前,机器人头参考系相对于全局参考系的关系是什么样的?
    2.机器人夹取的物体相对于机器人中心参考系的位置在哪里?
    3.机器人中心参考系相对于全局参考系的位置在哪里?
    tf可以在分布式系统中进行操作,也就是说一个机器人系统中所有的参考系变换关系,对于所有节点组件,都是可用的,所有订阅tf消息的节点都会缓冲一份所有参考系的变换关系数据,所以这种结构不需要中心服务器来存储任何数据。

  • tf的使用流程
    想要使用tf功能包,总体来讲可以分为以下两个步骤:
    1.监听tf变换
    接收并缓存系统中发布的所有参考系变换,并从中查询所需要的参考系变换。
    2.广播tf变换
    向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以直接将参考系变换关系直接插入tf树中,不需要再进行同步。

  • tf实例理解
    小乌龟例子1
    小乌龟例子2

Reference:
https://blog.youkuaiyun.com/hcx25909/article/details/50154225
https://blog.youkuaiyun.com/crazyquhezheng/article/details/49124115

https://blog.youkuaiyun.com/ZhangRelay/article/details/62052505?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.nonecase

https://answers.ros.org/question/11242/what-is-the-difference-between-tf-and-tf2/

http://wiki.ros.org/tf/Overview/Transformations

https://blog.youkuaiyun.com/qq_40109030/article/details/91558368

https://blog.youkuaiyun.com/hcx25909/article/details/9255001

03-08
### ROS TF2 使用指南常见问题解决 #### 安装配置 为了使用 `tf2`,通常不需要单独安装该库,因为大多数ROS 2发行版已经包含了它。然而,在某些情况下可能需要额外组件的支持。例如,对于特定功能如监听器或广播器,可以利用Python接口来操作变换树[^2]。 #### 基本概念介绍 - **Transform Tree (TF tree)** 是一个有向无环图(DAG),节点代表坐标系之间的相对位置关系。 - **Static Transform Publisher**: 发布静态转换信息;适用于固定不变的关系。 - **Broadcasters Listeners** : 广播当前时刻的空间变换数据以及订阅这些消息并查询历史记录。 #### Python API 示例 下面是一个简单的例子展示如何创建一个发布者接收者的配对: ```python import rclpy from geometry_msgs.msg import TransformStamped from tf2_ros import StaticTransformBroadcaster, Buffer, TransformListener def handle_turtle_pose(msg, turtlename): stfbrd = StaticTransformBroadcaster(node) # 构建新的变换帧 transform = TransformStamped() transform.header.stamp = node.get_clock().now().to_msg() transform.header.frame_id = 'world' transform.child_frame_id = f'{turtlename}/base_link' # 设置平移分量 transform.transform.translation.x = msg.x transform.transform.translation.y = msg.y # 添加旋转四元数表示法... quaternion = euler_to_quaternion(0, 0, theta) # Assuming you have a function to convert Euler angles to Quaternion. transform.transform.rotation.w = quaternion[0] transform.transform.rotation.x = quaternion[1] transform.transform.rotation.y = quaternion[2] transform.transform.rotation.z = quaternion[3] stfbrd.sendTransform(transform) if __name__ == '__main__': rclpy.init() node = rclpy.create_node('my_tf_broadcaster') sub = node.create_subscription( Pose, '/turtle1/pose', lambda msg: handle_turtle_pose(msg, 'turtle1'), 10) try: while rclpy.ok(): rclpy.spin_once(node) except KeyboardInterrupt: pass node.destroy_node() rclpy.shutdown() ``` 这段代码展示了怎样通过监听海龟机器人的姿态变化并将之作为世界坐标系下的位姿更新发送出去。 #### 解决方案建议 如果遇到无法获取预期的变换结果的问题时,请确认以下几点: - 所有的广播源都正常工作并且频率合理; - 时间戳同步良好——即所有参计算的时间标记应该尽可能接近实际发生时间; - 正确设置了父级(`frame_id`)子级(`child_frame_id`)名称; - 如果涉及到多个不同步的消息流,则考虑引入缓存机制以确保一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值