TF的基本知识

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

使用TF功能包,一般包括以下两个步骤:
(1)监听TF变换
接收并缓存系统中发布的所有坐标变换数据,并从中查询所需要的坐标变换关系。
(2)广播TF变换
向系统中广播坐标系之间的坐标变换关系。系统中可能会存在多个不同部分的TF变换广播,每个广播都可以直接将坐标变换关系插入TF树中,不需要再进行同步。

TF工具

tf_monitor

tf_monitor工具的功能是打印TF树中所有坐标系的发布状态,也可以通过输入参数来查看指定坐标系之间的发布状态。

tf_monitor
tf_monitor <source_frame> <target_frame>

tf_echo

tf_echo工具的功能是查看指定坐标系之间的变换关系。

tf_echo <source_frame> <target_frame>

static_transform_publisher

static_transform_publisher工具的功能是发布两个坐标系之间的静态坐标变换,这两个坐标系不发生相对位置变化。

# 坐标xyz表示偏移参数,欧拉角yaw(围绕z轴旋转的偏航角)pitch(围绕y轴旋转的俯仰角)roll(围绕x轴旋转的翻滚角)表示旋转参数,period_in_ms为发布频率
static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
#  坐标xyz表示偏移参数,四元数qx qy qz qw表示旋转参数,period_in_ms为发布频率
static_transform_publisher x y z yaw qx qy qz qw frame_id child_frame_id period_in_ms

view_frames

view_frames是可视化的调试工具,可以生成pdf文件,显示整棵TF树的信息。

rosrun tf view_frames

rqt_tf_tree

rqt_tf_tree是一个实时工具,观察在Ros上被发布的坐标系树,可用刷新按钮来更新树的内容。与view_frames的区别在于:view_frames工具连续采样5s获得的树的内容,并存成一个图片;这个工具可以连续的观察树的内容,使用起来更方便。

$ rosrun rqt_tf_tree rqt_tf_tree

各坐标系及其关系

  • 世界坐标(map)
    map坐标系是一个世界固定坐标系,作为长期的全局参考是很有用的。在典型的设置中,定位模块基于传感器的监测,不断的重新计算世界坐标中机器人的位姿,从而消除偏差,但是当新的传感器信息到达时可能会跳变。
  • 里程计坐标系(odom)
    odom 坐标系是一个世界固定坐标系,作为一种精确的、短期的本地参考是很有用的,但偏移使得它不能作为长期参考。在odom 坐标系中的机器人的姿态能够保证是连续的,这意味着在odom 坐标系中的移动平台的姿态总是平滑变化,没有跳变。
  • 基坐标系(base_link)
    base_link坐标系是机器人本体坐标系,它可以安装在基座中的任意方位。
  • 雷达坐标系(base_laser)
    base_laser坐标系是激光雷达的坐标系,与激光雷达的安装点有关。

odom和map坐标系是不是重合的?可以很肯定的告诉你,机器人运动开始是重合的。但是,随着时间的推移是不重合的,而出现的偏差就是里程计的累积误差。
那map–>odom的tf怎么得到?就是在一些校正传感器合作校正的package比如amcl会给出一个位置估计(localization),这可以得到map–>base_link的tf,所以估计位置和里程计位置的偏差也就是odom与map的坐标系偏差。所以,如果你的odom计算没有错误,那么map–>odom的tf就是0.

创建TF广播器

C++:参考网站链接
Python:参考网站链接

创建TF监听器

C++:参考网站链接
Python:参考网站链接

Logo

鸿蒙生态一站式服务平台。

更多推荐