ROS 2 TF 概述
TF(Transform) 是 ROS 中用于跟踪多个坐标系之间变换关系的库。在 ROS 2 中,TF 系统被重构为 TF2,提供了更高效、更灵活的坐标变换管理。
核心概念
1. 坐标系(Frame)
- 每个机器人部件、传感器或环境物体都有自己的坐标系
- 例如:
base_link(机器人基座)、laser(激光雷达)、camera(相机)
2. 变换(Transform)
- 描述两个坐标系之间的平移(translation)和旋转(rotation)关系
- 表示为:
frame_B相对于frame_A的位置和姿态
3. 变换树(Transform Tree)
- 所有坐标系通过父子关系连接成一棵树
- 必须有一个根坐标系(通常是
map或odom)
ROS 2 TF2 架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ TF2 广播者 │ │ TF2 缓冲区 │ │ TF2 监听者 │
│ (Broadcaster) │────▶│ (Buffer) │◀────│ (Listener) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 发布变换信息 │ │ 查询坐标变换 │
│ /tf 话题 │ │ lookupTransform │
└─────────────────┘ └─────────────────┘
核心组件
| 组件 | 功能 | 对应类/节点 |
|---|---|---|
| Broadcaster | 广播坐标变换 | TransformBroadcaster |
| Static Broadcaster | 广播静态变换(固定关系) | StaticTransformBroadcaster |
| Listener | 监听并查询变换 | Buffer + TransformListener |
| Buffer | 存储变换历史 | tf2_ros::Buffer |
代码示例
1. 发布动态变换(Dynamic Transform)
import rclpy
from rclpy.node import Node
geometry_msgs.msg TransformStamped
tf2_ros
math
():
():
().__init__()
.br = tf2_ros.TransformBroadcaster()
.timer = .create_timer(, .publish_transform)
.t =
():
t = TransformStamped()
t.header.stamp = .get_clock().now().to_msg()
t.header.frame_id =
t.child_frame_id =
.t +=
t.transform.translation.x =
t.transform.translation.y =
t.transform.translation.z =
t.transform.rotation.x =
t.transform.rotation.y =
t.transform.rotation.z = math.sin(.t / )
t.transform.rotation.w = math.cos(.t / )
.br.sendTransform(t)
():
rclpy.init()
node = DynamicFramePublisher()
rclpy.spin(node)
rclpy.shutdown()

