文章目录
一、TF功能包
1、TF功能包简介
坐标变换是机器人系统中常用的基础功能,ROS中的坐标变换系统由TF功能包维护。
TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树形数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间、在坐标系间完成点、向量等坐标的变换。
TF可以在分布式系统中操作。也就是说,一个机器人系统中所有的坐标变换关系,对于所有的节点组件都是可用的,所有订阅TF消息的节点都会缓冲一份所有坐标系的变换关系数据,所以这种结构不需要中心服务器来存储任何数据。
2、TF功能包使用步骤:
(1) 监听TF变换
接收并缓存系统中发布的所有坐标变换数据,并从中查询所需要的坐标变换关系。
(2) 广播TF变换
向系统中广播坐标系之间的坐标变换关系。系统中可能会存在多个不同部分的TF变换广播,每个广播都可以直接将坐标变换关系插入TF树中,不需要再进行同步。
3、TF工具
(1) tf_monitor
tf_monitor工具的功能是打印TF树中所有坐标系的发布状态,也可以通过输入参数来查看指定坐标系之间的发布状态。
(2) tf_echo
tf_echo工具的功能是查看指定坐标系之间的变换关系。
(3) static_transform_publisher
static_transform_publisher工具的工能是发布两个坐标系之间的静态坐标变换,这两个坐标系不发生相对位置变化。
(4) view_frames
view_frames是可视化的调试工具,可以生成pdf文件,显示整颗TF树的信息。
二、乌龟例程中的TF
在乌龟仿真其中安装功能包 turtle_tf :
$ sudo apt-get install ros-kinetic-turtle-tf
安装完成后使用如下命令运行例程:
$ roslaunch turtle_tf turtle_tf_demo.launch
乌龟仿真器打开后会出现两只小乌龟,并且下方下方的小乌龟会自动向中心位置的的小乌龟移动,如下图:
打开键盘控制节点,控制中心位置的小乌龟运行:
$ rosrun turtlesim turtle_teleop_key
另外一只乌龟总会跟着我们控制的那只乌龟运行,如下图:
使用TF工具查看一下这个例程中的TF树:
$ rosrun tf view_frames
得到结果如下图所示:
如上图所示:在当前系统中存在三个坐标系:world、 turte1、turtle2 。
world 是世界坐标系,作为系统的基础坐标系,其他坐标系都相对该坐标系建立,所以world 是TF树的根节点 。相对于world 世界坐标系,又分别针对两只乌龟建立了两个乌龟坐标系,这两个坐标系的原点就是乌龟在世界坐标系下的坐标位置。
要让 turtle2 跟随 turte1 运动,等价于 turtle2 坐标系需要向 turtle1 坐标系移动,就需要知道两个坐标系之间的坐标变换。
使用 tf_echo 工具在TF树中查找乌龟坐标系之间的变换关系:
$ rosrun tf tf_echo turtle1 turtle2
乌龟坐标系之间的变换关系如下图所示:
也可以通过rviz 的图形界面更加形象地看到这三者之间的左边关系:
$ rosrun rviz rviz -d 'rospack find turtle_tf'/rviz/turtle_rviz.rviz
得到 turtle2 与 turte1 之间的坐标变换后,就可以计算两只小乌龟的角度和距离,即可控制 turtle2 向 turte1 移动了。