【ROS笔记5】tf 和 tf2_ros 的使用区别

目录

[1. 前言](#1. 前言)

[2. tf 和 tf2的比较](#2. tf 和 tf2的比较)

[1. 架构和内聚性(模块化)](#1. 架构和内聚性(模块化))

[2. 效率和功能(静态变换是关键)](#2. 效率和功能(静态变换是关键))

[2.1 启动命令的差异](#2.1 启动命令的差异)

[核心区别: TF 必须不断地重复发布相同的静态变换,而 TF2 认识到这是静态变换,所以只在必要时发送。](#核心区别: TF 必须不断地重复发布相同的静态变换,而 TF2 认识到这是静态变换,所以只在必要时发送。)

[2.2 运行结果比对](#2.2 运行结果比对)

[rostopic echo /tf](#rostopic echo /tf)


1. 前言

最近在使用tf or tf_ros2 来发布消息,一直出现问题,记录一下。

bash 复制代码
## tf 正确
        <node pkg="tf" type="static_transform_publisher" name="base"
        args="0 0 0 0 0 0 1 /base /combine 50" />


## tf_ros2 错误
    <node pkg="tf_ros2" type="static_transform_publisher" name="base"
        args="0 0 0 0 0 0 1 /base /combine 50" />


## tf_ros2 正确
    <node pkg="tf_ros2" type="static_transform_publisher" name="base"
        args="0 0 0 0 0 0 1 /base /combine" />

static_transform_publisher 是一个 ROS 工具,用于发布一个不变的坐标变换。它要求用户提供特定数量的参数来定义 平移 (Position)旋转 (Orientation)坐标系名称 (Frames)发布频率 (Period)

static_transform_publisher 有两种正确的使用格式:

对于tf2, 不用使用

2. tf 和 tf2的比较

1. 架构和内聚性(模块化)

这是两者最大的区别,TF2 更加模块化和内聚。

2. 效率和功能(静态变换是关键)

TF2 引入了 tf_static 话题,显著提高了发布不常变动的坐标变换的效率。

2.1 启动命令的差异

版本 命令 最后参数 含义
TF2 rosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 /base_link /laser TF2 版本默认发布频率极低(实际上通常只发布一次),并将变换发布到 /tf_static 话题。
TF rosrun tf static_transform_publisher 0 0 0 0 0 0 /base_link /laser 100 100 (ms) TF 版本必须 指定发布周期(这里是 100ms),并将变换发布到 /tf 话题。

++核心区别: TF 必须不断地重复发布相同的静态变换,而 TF2 认识到这是静态变换,所以只在必要时发送。++

2.2 运行结果比对

rostopic echo /tf
  • 输出行为: 循环输出坐标系信息。

  • 原因: TF 版本的 static_transform_publisher 被配置为以 10Hz(即 100ms 周期)向 /tf 话题发送消息。即使变换 T/base_link/laser​ 始终是单位变换 (0,0,0,0,0,0,1),它也会每隔 100ms 发送一次相同的消息。

  • 作用: /tf 话题专门用于发布那些随时间不断变化的动态变换 (例如,机器人里程计 ​)。

rostopic echo /tf_static

  • 输出行为: 坐标系信息只输出一次(或在新订阅者连接时再次输出)。

  • 原因: TF2 版本的 static_transform_publisher 认识到这是一个静态变换,因此它通过 Latched Topic (锁存话题) 的机制发布到 /tf_static

    • 锁存话题 (Latched Topic): 当发布者发送一条消息后,它会保持(锁存)在话题上。任何新的订阅者连接时,都会立即收到最后一条已发布的锁存消息。
  • 作用: 这样可以确保:

    1. 网络上没有重复的静态数据传输。

    2. 任何新的 TF 监听器启动时,都能立即获取所有静态变换,而无需等待下一次周期性发布。

总结: 在 TF2 中,如果您要发布一个摄像头相对机械臂末端的标定结果(它不会改变),您应该使用 /tf_static 。如果您要发布一个机器人的轮式里程计(它每秒都在变化),您应该使用 /tf

相关推荐
Piko6142 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
AOwhisky3 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
Piko6144 小时前
锐捷交换机 DHCP Server部署
运维·网络·笔记
取地址符5 小时前
Rust学习笔记(基于Rustlings)(2):数据结构与集合
笔记·学习·rust
A.零点6 小时前
期末复习,408考研数据结构:第一章绪论完整知识梳理与真题深度解读
c语言·数据结构·笔记·考研
EQ-雪梨蛋花汤6 小时前
【Unity笔记】VR 一体机画面锯齿、模型边缘闪烁、接缝抖动排查:MSAA、Mipmap、Render Scale、Z-Fighting 全流程记录
笔记·unity·vr
茯苓gao6 小时前
嵌入式开发笔记:工业机器人通信协议深度解析——从现场总线到工业以太网
笔记·嵌入式硬件·学习·机器人·信息与通信
取地址符6 小时前
Rust语法学习 (基于Rustlings)(1):基础语法
经验分享·笔记·学习·rust
不会调制解调的猫7 小时前
笔记 | 什么是 rp_filter(反向路径过滤)?
服务器·网络·笔记
星马梦缘7 小时前
ACM CSP竞赛笔记(二十三)——线段树 与 树状数组
笔记·线段树·acm·树状数组·csp