10、tf发布与监听

10.1、tf功能包

10.1.1、tf是一个让用户随时间跟踪多个坐标系的功能包,它使用树形数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间、坐标系间完成点、向量等坐标变换。

10.1.2、使用步骤

1)、监听tf变换

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

2)、广播tf变换

向系统中广播坐标系之间的坐标变换关系。系统中可能会存在多个不同部分的tf变换广播。每个广播都可以直接将坐标变换关系插入tf树中,不需要再进行同步。

10.2、tf坐标系广播与监听的编程实现

10.2.1、创建并且编译功能包

10.2.2、如何实现一个tf广播器

1)、定义tf广播器(TransformBroadcaster);

2)、初始化tf数据,创建坐标变换值;

3)、发布坐标变换(sendTransform);

10.2.3、如何实现一个tf监听器

1)、定义TF监听器(TransformListener);

2)、查找坐标变换(waitForTransform、lookupTransform)

10.2.4、C++语言实现tf广播器

1)、在功能包learning_tf的src文件夹,创建一个c++文件(文件后缀为.cpp),命名为turtle_tf_broadcaster.cpp

2)、把下边的程序代码复制粘贴到turtle_tf_broadcaster.cpp文件中

3)、程序流程图

brocast_cpp

4)、代码解析

首先,先订阅小海龟的/pose位姿话题,倘若有该话题发布,那么就进入回调函数。再回调函数里边,首先先创建了tf的广播器,然后初始化tf数据,数据的值就是订阅/pose话题传过来的数据。最后,通过br.sendTransform把小海龟对于世界坐标的变换发布出去,这里说下sendTransform这个函数。有4个参数,第一个参数表示tf::Transform类型的坐标转换(也就是之前初始化的tf数据),第二个参数是时间戳,第三个和第四个是变换的源坐标系和目标坐标系。

10.2.4、C++语言实现tf监听器

1)、在功能包learning_tf的src文件夹,创建一个c++文件(文件后缀为.cpp),命名为turtle_tf_listener.cpp

2)、把下边的程序代码复制粘贴到turtle_tf_listener.cpp文件中

3)、程序流程图

listener_cpp

4)、代码解析

首先,通过服务调用产生另外一只小乌龟turtle2,然后创建turtle2速度控制发布者;接着创建一个监听器,监听和查找turtle1和tuetle2的左边变换,这里涉及到两个函数waitForTransform和lookupTransform

waitForTransform(target_frame,source_frame,time,timeout):两个frame分别表示目标坐标系和源坐标系,time表示等待两个坐标系之间变换的时间,因为坐标变换是阻塞程序,所以需要设置timeout,表示超时时间。

lookupTransform(target_frame,source_frame,time,transform):给定源坐标系(source_frame)和目标坐标系(target_frame),得到两个坐标系之间指定时间(time)的坐标变换(transform)。

经过lookupTransform我们得到了坐标变换的结果transform,然后通过transform.getOrigin().y(),transform.getOrigin().x()得到x,y的值,接着通过数学运算得到角速度angular.z和线速度linear.x,最后发布出去,让turtle2做运动。

10.2.5、修改CMakelist.txt和编译

1)、修改修改CMakelist.txt

修改功能包下的CMakelist.txt,添加下边内容

2)、编译

10.2.6、启动与运行效果演示

1)、启动

2)、效果展示

image-20220221115435169

3)、程序说明

启动roscore后,开启小海龟节点,这时候终端会出现一只小海龟;然后我们发布两个tf变换,turtle1->world,turtle2->world,因为要想知道turtle2与turtle1之间的变化,则需要知道他们跟world之间的变换;然后,开启tf监听程序,这时候会发现终端产生了另外一只小海龟turtle2,并且turtle2会向turtle1移动;然后,我们打开键盘控制,通过按下方向键来控制turtle1移动,然后turtle2会追着turtle1移动。

10.2.7、Python语言实现tf广播器

1)、在功能包learning_tf,创建一个文件夹script,切换到该目录下,新建一个.py文件,命名为turtle_tf_broadcaster.py

2)、把下边的程序代码复制粘贴到turtle_tf_broadcaster.py文件中

3)、程序流程图

image-20220225144350970

10.2.8、Python语言实现tf监听器

1)、在功能包learning_tf的script文件夹,创建一个python文件(文件后缀为.py),命名为turtle_tf_listener.py

2)、把下边的程序代码复制粘贴到turtle_tf_listener.py文件中

3)、程序流程图

image-20220427144454869

 

10.2.9、启动与运行效果展示

1)、编写一个launch文件

在功能包目录下,新建一个文件夹launch,切换至launch里边,新建一个launch文件,命名为start_tf_demo_py.launch,把以下内容复制到里边,

2)、启动

程序运行后,鼠标点击运行launch的窗口,按下方向键,turtle2会跟着turtle1移动。

3)、运行结果如下图

image-20220221163810784