TF发布的话题一般有两种: tf
和 tf_static
tf
是只要有节点发布就会有消息, tf_static
是在已知的坐标发生变化或有新的节点订阅的时候才会发布新的消息
tf 话题
录制数据集时一定要录这个话题
tf_static 话题
tf_static
是静态转换, 和tf
的格式一样, any transform on this topic can be considered true for all time. Internally any query for a static transform will return true.
tf_static
的发布者使用latched topics, the tf2_ros
static_transform_publisher
does this correctly. Note: avoid multiple latched static transform publishers on /tf_static in the same process, because with multiple latched publishers within the same node only one will latch correctly.
比如这样的,echo只有这一条结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38transforms:
-
header:
seq: 0
stamp:
secs: 1652186247
nsecs: 41763935
frame_id: "base_link"
child_frame_id: "move_link"
transform:
translation:
x: 0.0
y: 0.0
z: 0.0
rotation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
-
header:
seq: 0
stamp:
secs: 1652186247
nsecs: 41846600
frame_id: "base_link"
child_frame_id: "shelf_link"
transform:
translation:
x: 0.0
y: 0.0
z: 0.0
rotation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
---
- rosrun tf view_frames
当启动ROS程序后,如果想查看存在的所有坐标系转换关系,可以使用命令rosrun tf view_frames
,结果会在当前目录生成pdf文件:
顺便说一下,打开pdf的命令为evince frames.pdf
- rosrun rqt_tf_tree rqt_tf_tree
跟上一个命令差不多,区别是直接打开一个pdf文件,但不会保存
在仿真环境下,使用rostopic hz tf
,发现tf的频率是40Hz左右,这个数值是各个tf变化叠加的结果,使用rqt_tf_tree
可以看到
有些转换可能显示average rate有数值,但是buffer 和 recent transform都是0,这种其实没有发生tf,所以不能算数。
左上角还有一个clear buffer
按钮,Buffer length
会清零Buffer length
表示tf buffer
中有几秒的数据可使用,rqt_tf_tree
中是10秒,view frames
大约5秒
- tf_echo
本命令用来查看两个坐标系之间的实时转换,需要5秒钟:1
rosrun tf tf_echo /turtle1 /turtle2 //turtle1是parent坐标系, turtle2是child
- rqt_tf_tree
rosrun rqt_tf_tree rqt_tf_tree
显示一个带界面的tf图显示工具,不必等待,然后可以另存为svg,png等格式
结果发现刷新按钮不好用,当tf树改变后,刷新有时没有改变显示,有时工具无法响应了
- launch文件中的应用
如果要让两个坐标系建立转换关系,常常在launch文件中添加1
<node args="-0.24 0 0.295 1.571 0 -1.571 /base_link /camera 10" pkg="tf" name="base_link_to_camera" type="static_transform_publisher"/>
这个节点就是以base_link
为parent坐标系,向camera
转换的欧拉角形式。前三个参数是x,y,z三个方向的位移,之后的三个参数是yaw,pitch,roll,然后是parent坐标系和child坐标系,最后是隔多长时间发送一次变换,一般取100(ms)。另一种形式就是四元数形式,也就是将第4~6参数换为qx,qy,qz,qw。