ROS学习笔记(13)坐标变换(TF和TF2)

时间:2024-04-21 10:21:29

0.前提

我翻了一下我以前的教程发现我居然没有讲过TF坐标转换,那现在补上。在机器人学中坐标转换是一个极为重要的概念、内容,在大量的科技公司招聘机器人岗位的人才时掌握机器人运动学正解和逆解等都是加分项。机器人在实际应用当中会涉及到大量的位置和姿态变换,引入坐标系和坐标系变换对求解位姿是及其重要的。而在ROS当中的坐标变换系统由TF和TF2功能包提供。)

1.TF和TF2介绍

1.TF

TF是一个可让使用者跟踪多个坐标系变化的功能包,使用树形数据结构,根据时间缓冲、维护多个坐标系的坐标变换关系,帮助开发者完成点、向量等坐标系的变换。tf/Tutorials - ROS Wiki

使用TF功能包,总的说有两步:

1.监听TF变换

接收并缓存系统中发布的所有坐标变换数据,查询所需坐标变换关系。

2.广播TF变换

广播坐标系间的变换。每个广播都可直接将坐标系变换关系插入TF树中,无需进行同步。

2.TF和TF2的主要变化

在ros官网中我们可以得知TF已经被TF2,官方也是建议直接使用TF2,因此本文对TF只进行简单讲解。tf2和tf的区别

1.添加/tf_static主题

2.ROS独立核心

3.新的API模板

4.python支持的更新

5.操作查询

6.删除对tf_prefix的支持

3.TF2

本质上TF2和TF实现的是同一种效果,但TF2提供了 TF 功能的超集

1.安装

 sudo apt-get install ros-noetic-turtle-tf2 ros-noetic-tf2-tools

注意:先使用roscore查看自己的ros版本


2.运行

roslaunch turtle_tf2 turtle_tf2_demo.launch

注意:如果之前没有对python3进行软连接会报错

解决办法就是对python3进行软连接

sudo ln -s /usr/bin/python3 /usr/bin/python

 ok,这下就能正常运行了

点击终端,你可以用方向键控制你的小海龟,你会发现你的小海龟会被另一个小海龟追逐。

原理就是后方的小海龟会同步前方小海龟得位置信息,然后运动到位置点。

3.What's happening?

演示使用了TF2库创建了三个坐标系:世界坐标系、小海龟1的坐标系、小海龟2的坐标系。使用tf2广播器发布海龟坐标系,使用tf2侦听器计算海龟帧差异,移动小海龟2跟随小海龟1。

4.tf2工具

4.1.view_frames

view_frames创建tf2通过ROS广播的帧图表。

打开两个终端,分别输入:

roslaunch turtle_tf2 turtle_tf2_demo.launch
rosrun tf2_tools view_frames.py

会看到两条消息,tf2侦听器正在侦听通过ROS广播的帧,绘制帧连接方式的树。

查看树:

evince frames.pdf

 rosrun rqt_tf_tree rqt_tf_tree 

 

这里可以看到tf2广播的3个帧(坐标系),world、turtle1和turtle2,世界(world)是其它两个的父帧。view_frames还报告一些诊断信息,说明何时接收最旧和最新的帧转换,以及 TF2 帧发布到 TF2 以进行调试的速度。

4.2.tf_echo

tf_echo报告ROS广播的任意两帧间的转换。(查看指定坐标系间的变换关系)

rosrun tf tf_echo [reference_frame] [target_frame]

tf_echo侦听器接收到ROS广播的帧时,显示: 

5.Rviz和TF2

我们可以通过rviz更直观的看到坐标系间的关系。我们控制我们的小海龟1时会看到坐标系间的变换关系。

 rosrun rviz rviz -d `rospack find turtle_tf2`/rviz/turtle_rviz.rviz

ok,俺不多说了,具体请看tf2/教程 - ROS Wiki