ros中的TF

TF树的通信方式与TF树的具体表示TF树的建立如何根据TF树得到任意坐标系的转换关系?ros中静态tf坐标关系发布方式关于base_link

TF树的通信方式与TF树的具体表示

TF树的建立和维护是基于Topic通信机制的。根据TF树的原理,它是靠建立与维护每个父子坐标系的变换关系来维护整个系统的所有坐标系的变换关系的。每个parent 坐标系到child坐标系变换关系是靠被称为broadcastor的发布器节点来持续发布的。虽然是靠Topic通信机制发布的parent 坐标系到child坐标系的变换,但并不是让每一对父子坐标系都发布一个话题,实际上发布的唯一个话题是/topic,该话题集合了所有发布的父子坐标系的变换关系。也就是说TF机制并不是让每一对父子坐标系都发布一个话题,而是将所有的父子坐标系都集合到到一个话题上,该话题的消息中传递的数据是所有父子坐标系的变换关系,是父子坐标系变换关系的一个大数组。使用tf的tflisener就可以监听从任意两个坐标系的变换。前提是TF的树上能把这两个联通。

TF树的建立

在开始建立TF树的时候需要指定第一个父坐标系(parent frame)作为最初的坐标系。比如机器人系统中的map坐标系。 在第一次发布一个从已有的parent frame到新的child frame的坐标系变换时,这棵树就会添加一个树枝,之后就是维护。 TF树的建立和维护靠的是tf提供的tfbroadcastor类的sendtransform接口。transformBroadcaster()类就是一个publisher,而sendTransform的作用是来封装publish的函数。

如何根据TF树得到任意坐标系的转换关系?

如果想要获得任意两个坐标系的转换关系,其实订阅器是收取的/tf话题上的消息,该消息集合了所有发布的父子坐标系的变换关系。订阅器接收的其实是当前时刻的整个TF树,然后搜索这棵树,根据不同的父子坐标系关系找到一条变换的路径。这条变换路径就能通过父子关系通路连接起所求的这两个坐标系,从而通过不断将该通路上的变换矩阵相乘得到最终的所求的这两个坐标系的变换关系。TF对发布器与订阅器进行了封装,使开发者通过TF的接口更加简单地建立对TF树中某些坐标系转换关系的维护与订阅。用tf的tflisener监听某一个指定的从一个a frame到b frame的变换即可。

ros中静态tf坐标关系发布方式

static_transform_publisher static_transform_publisher工具的功能是发布两个参考系之间的静态坐标变换,两个参考系一般不发生相对位置变化。 命令的格式如下: static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms以上两种命令格式,需要设置坐标的偏移和旋转参数,偏移参数都使用相对于xyz三轴的坐标位移,而旋转参数第一种命令格式使用以弧度为单位的 yaw/pitch/roll三个角度(yaw是围绕x轴旋转的偏航角,pitch是围绕y轴旋转的俯仰角,roll是围绕z轴旋转的翻滚角),而第二种命令格式使用四元数表达旋转角度。发布频率以ms为单位,一般100ms比较合适。 该命令不仅可以在终端中使用,还可以在launch文件中使用,使用方式如下:

关于base_link

一般在urdf文件中都要定义base_link,它代表了机器人的主干,其它所有的frame都是相对于base_link定义并粘在一起的。它们一起相对于大地图map移动,让机器人移动就是向tf发布 geometry_msgs::TransformStamped 消息通知ros base_linke相对于map的tf转换关系。