ros入门教程(十)-- TF & URDF


TF是指机器人学里的坐标变换,不管SLAM还是机械臂的的运动都会涉及到坐标系的表换。
URDF是统一机器人描述格式,是ros制定的一套描述机器人的规范。

TF

TF即Transform。机器人在抓取一个物体时,需要精确的数学表达来控制每一个关节机构,其中涉及到准确的数据关系。这时就用到了TF,用来操作和维护坐标系的转换。

TransForm: 坐标变换(位置 + 姿态),是坐标系数据维护的工具。

ros里所提到的tf可以包含很多种不同的意思:

  • 坐标转换的标准

定义了坐标转换的数据结构和格式,它本质上是一个树状的数据结构,通常称其为tf tree

  • 话题

/tf: 里的msg就是保存的上面提到的树结构,保存了机器人甚至整个地图的坐标转换关系。

  • 工具

也可以理解为一个package,里面包含了很多的工具,包括可视化。

  • 接口

roscpp和rospy里面关于tf的接口

TF树

在这里插入图片描述

上图所示的就是一个pr2机器人模型。模型是由很多部件组成的,我们称其为link。每一个link对应了一个frame,也就是一个坐标系。那如何维护各个坐标系之间的连通关系呢?我们就用到了TF树。TF树中任意两个frame都必须是连通的。

在这里插入图片描述

如图所示为robot-sim-demo运行起来所呈现的TF树。

连通方式是通过每一个link对应的node作broadcast, 以topic的方式维持关系。此处的broadcast,本质上就是一个publisher。TF树其实就是把/tf这个topic截取了一段信息,来恢复成了TF tree。

TF消息格式

TransformStamped.msg

该数据结构是ros里面两个frame之间tf的数据格式

在这里插入图片描述

Vector3 translation 表示三维坐标上的平移,Quaternion rotation表示旋转

tf/tfMessage.msg & tf2_msgs/TFMessage.msg

在这里插入图片描述

tf in C++

TF相关数据类型

在这里插入图片描述

注意最后一个t::StampedTransform, 它和上一节里提到的geometry_msgs/TransformStamped.msg名字很像,但有区别。前者只能用在C++里,不是一个msg,只是c++的一个类。而后者与语言无关,是一个依赖于ros的msg,所有语言都可以发这个消息。
case:
在这里插入图片描述

tf::TransformBroadcaster类

这个就是上面tf tree里面的broadcaster,它其实就是一个publisher。本质上就是把publish函数做了封装。在具体使用时,我们只需要在node里构建这个类,然后调用sendTransform函数。下面是该函数的不同重载。

在这里插入图片描述

发送单个的transform、 发送一个transform的数组、把transformStamped消息发送出去等

tf::TransformListener类

上面的类是发送,这个类就是接收了。

在这里插入图片描述

对于第一个函数lookupTransform得到目标坐标系到源坐标系的转换关系,然后存放到第四个参数transform上。注意第三个,时间参数需要填ros::Time(0),不可以使用ros::TIme::now(), 不然会有时间误差。

tf in python

TF相关数据类型

向量、点、四元数、矩阵都可以表示成类似数组的形式。
Tuple、list、Numpy Array通用

case:

t = (1.0, 5.0, 0) #平移
q = [1, 0, 0, 0]  #四元数
m = numpy.identity(3) #旋转矩阵
tf.transformations 库

在这里插入图片描述

使用前需要import tf

tf.TransformListener类

在这里插入图片描述

对于第三个函数lookupTransform,同样,时间参数需要填rospy.Time(0),不可以使用rospy.Time.now(), 不然会有时间误差。

该类里还有其他函数,如下:
在这里插入图片描述

tf.TransformBroadcaster类

在这里插入图片描述

tf常用工具

# 根据当前的tf树创建一个pdf图(基于当前的5秒记录绘制)
$ rosrun tf view_frames  )
# 查看当前的tf树 (动态查看)
$ rosrun rqt_tf_tree rqt_tf_tree
# 查看两个frame之间的变换关系
$ rosrun tf tf_echo [reference_frame][target_frame]

urdf

Unified Robot Description Format 统一机器人描述格式

在这里插入图片描述

在urdf中,我们用link和joint来描述机器人的关节和零部件。

link

link 就是部件,每个link都有三个轴分别代表xyz。

joint

joint是连接两个link之间的关节,所以joint和tf是对应的。tf的改变实际发生在joint上。

所以在urdf上,我们就要定义好这些link和joint,也就是link和joint的属性,我们都要定义在urdf文件里。

在这里插入图片描述
这个文件和之前的launch文件写法很像,都是xml文件。

在编写文件时,joint和link还有自己的属性:

在这里插入图片描述

转载请注明出处。
本文总结于中国大学MOOC《机器人操作系统入门》
链接: link.
图片来自于课程视频截图

发布了43 篇原创文章 · 获赞 20 · 访问量 1469

猜你喜欢

转载自blog.csdn.net/Chen_2018k/article/details/104356654