第 5 章 ROS多坐标系关系查看(自学二刷笔记)

重要参考:

课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ

讲义链接:Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

5.1.5 坐标系关系查看

在机器人系统中,涉及的坐标系有多个,为了方便查看,ros 提供了专门的工具,可以用于生成显示坐标系关系的 pdf 文件,该文件包含树形结构的坐标系图谱。

1.准备

首先调用 rospack find tf2_tools 查看是否包含该功能包,如果没有,请使用如下命令安装:

sudo apt install ros-noetic-tf2-tools
2.使用
2.1生成 pdf 文件

启动坐标系广播程序之后,运行如下命令:

rosrun tf2_tools view_frames.py

会产生类似于下面的日志信息:

[INFO] [1592920556.827549]: Listening to tf data during 5 seconds...
[INFO] [1592920561.841536]: Generating graph in frames.pdf file...

查看当前目录会生成一个 frames.pdf 文件

2.2查看文件

可以直接进入目录打开文件,或者调用命令查看文件:evince frames.pdf

内如如图所示:


另请参考:

5.1.7 TF2与TF

1.TF2与TF比较_简介
  • TF2已经替换了TF,TF2是TF的超集,建议学习 TF2 而非 TF

  • TF2 功能包的增强了内聚性,TF 与 TF2 所依赖的功能包是不同的,TF 对应的是 tf 包,TF2 对应的是 tf2 和 tf2_ros 包,在 TF2 中不同类型的 API 实现做了分包处理。

  • TF2 实现效率更高,比如:在TF2 的静态坐标实现、TF2 坐标变换监听器中的 Buffer 实现等

2.TF2与TF比较_静态坐标变换演示

接下来,我们通过静态坐标变换来演示TF2的实现效率。

2.1启动 TF2 与 TF 两个版本的静态坐标变换

TF2 版静态坐标变换:rosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 /base_link /laser

TF 版静态坐标变换:rosrun tf static_transform_publisher 0 0 0 0 0 0 /base_link /laser 100

会发现,TF 版本的启动中最后多一个参数,该参数是指定发布频率

2.2运行结果比对

使用 rostopic 查看话题,包含 /tf 与 /tf_static , 前者是 TF 发布的话题,后者是 TF2 发布的话题,分别调用命令打印二者的话题消息

rostopic echo /tf :当前会循环输出坐标系信息

rostopic echo /tf_static :坐标系信息只有一次

2.3结论

如果是静态坐标转换,那么不同坐标系之间的相对状态是固定的,既然是固定的,那么没有必要重复发布坐标系的转换消息,很显然的,tf2 实现较之于 tf 更为高效

### 查询 ROS2 中坐标系之间转换关系ROS2 中,`tf2_ros::Buffer` 类提供了 `lookupTransform` 方法来查询两个坐标系之间的转换关系。此方法允许获取从源坐标系到目标坐标系的最新可用转换。 ```cpp try { geometry_msgs::msg::TransformStamped transform_stamped; transform_stamped = tf_buffer_->lookupTransform( target_frame, // 目标坐标系名称 source_frame, // 源坐标系名称 tf2::TimePointZero // 使用最新的可用转换 ); } catch (tf2::LookupException& ex) { RCLCPP_ERROR(this->get_logger(), "Failed to find transformation: %s", ex.what()); } ``` 上述代码展示了如何使用 C++ 实现 `lookupTransform` 函数调用[^1]。为了执行这段代码,需先创建并初始化 `tf2_ros::Buffer` 和 `tf2_ros::TransformListener` 对象实例。这通常是在节点类构造函数内完成的操作。 对于 Python 用户而言,实现方式略有不同: ```python from tf2_ros.buffer import Buffer from tf2_ros.transform_listener import TransformListener import rclpy from rclpy.node import Node from geometry_msgs.msg import TransformStamped class TfListenerNode(Node): def __init__(self): super().__init__('tf_lookup_node') self.tf_buffer = Buffer() self.tf_listener = TransformListener(self.tf_buffer, self) def main(args=None): rclpy.init(args=args) node = TfListenerNode() try: trans: TransformStamped = node.tf_buffer.lookup_transform( 'target_frame', # 目标坐标系名 'source_frame', # 源坐标系名 time=rclpy.time.Time() # 获取最近一次记录的时间戳数据 ) print(f'Transform found:\n{trans}') except Exception as e: print(e) if __name__ == '__main__': main() ``` 以上脚本定义了一个简单的 ROS 节点,该节点会尝试查找名为 `'source_frame'` 的坐标系相对于 `'target_frame'` 的位置和方向,并打印结果[^4]。 除了编程接口外,还可以利用命令行工具 `ros2 run tf2_ros tf2_echo <frame_id_1> <frame_id_2>` 来实时监控指定两帧间的相对位姿变化情况[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值