15. 坐标变换 — TF2 广播与监听
概述
本示例通过 demo_xmake_tf2 包,演示 ROS 2 的 TF2 坐标变换系统:静态变换广播、动态变换广播和变换监听。
ROS 2 知识点:TF2 树、StaticTransformBroadcaster、TransformBroadcaster、TransformListener、lookupTransform
xmake 知识点:tf2_ros、tf2_geometry_msgs 等多依赖包解析
ROS 2 知识
TF2 坐标变换
TF2 维护一棵坐标系树,描述各坐标系之间的空间关系:
world
└── base_link
└── sensor_link
- StaticTransformBroadcaster:发布不随时间变化的变换(如传感器安装位置)
- TransformBroadcaster:发布随时间变化的变换(如机器人运动)
- TransformListener:监听变换树,查询任意两帧之间的变换
lookupTransform
auto t = tf_buffer_->lookupTransform("world", "sensor_link", tf2::TimePointZero);
// 返回 world -> sensor_link 的变换
示例代码
xmake.lua 构建配置
target("static_tf_broadcaster")
set_kind("binary")
set_installdir("lib/demo_xmake_tf2")
add_files("src/static_tf_broadcaster.cpp")
add_ros_deps("rclcpp", "tf2_ros", "geometry_msgs")
target("tf_listener")
set_kind("binary")
set_installdir("lib/demo_xmake_tf2")
add_files("src/tf_listener.cpp")
add_ros_deps("rclcpp", "tf2_ros", "tf2_geometry_msgs", "geometry_msgs")
add_ros_deps() 一次处理多个 TF2 相关包的依赖。
构建与运行
colcon build --packages-select demo_xmake_tf2
source install/setup.bash
# 终端 1:静态变换
ros2 run demo_xmake_tf2 static_tf_broadcaster
# 终端 2:动态变换
ros2 run demo_xmake_tf2 dynamic_tf_broadcaster
# 终端 3:监听变换
ros2 run demo_xmake_tf2 tf_listener
验证
# 查看 TF 树
ros2 run tf2_tools view_frames
# 查看特定变换
ros2 run tf2_ros tf2_echo world sensor_link
xmake 知识点小结
本示例展示了 add_ros_deps() 对多个互相关联的 ROS 包的统一管理能力。
内容扩展
以下资源可帮助你深入了解本章涉及的技术领域。
开源项目
- tf2 — TF2 核心实现
工具
- tf2_monitor — 变换树延迟监控
- rviz2 TF Display — 可视化坐标系
文档与教程
论文与技术报告
- T. Foote, "tf: The Transform Library", IEEE TePRA, 2013