【ROS官网 tf 教程】http://wiki.ros.org/tf/Tutorials
【参考博客】
- 三维旋转矩阵(包括任意轴的通用旋转矩阵、Euler角、单位四元数)的计算
- 视觉SLAM中的数学基础 第二篇 四元数
- ROS学习–轻松使用tf
- tf 使用
- ROS探索总结(二十二)——设置机器人的tf变换
- ROS之tf空间坐标变换完全详解
- ROS探索总结(十二)——坐标系统
- ROS之tf空间坐标变换浅析
- ROS中的tf(transform)的理解 ,你追我小乌龟的深入剖析
- tf(Transform Frame)变换
- 张宇考研数学闭关修炼,线性代数部分,163页,向量空间,相关知识
【总述】
针对上面这些博客,有的我感觉说的有道理,有的又说的比较扯淡,虽然我是入门级别,但是也是看了小20篇博客,加上官网的英文教程,总的来说,也算是入了门,知道个大概。下面我阐述一下我的观点以及看法。
如果想要实现turtle1追turtle2,需要以下几点:向世界广播两只turtle的位置,使用listener来计算如何从第二只turtle到第一只turtle,向第二只turtle的订阅话题发消息,让turtle2动起来。所以总结起来,广播是一个独立功能节点,监听是另一个功能节点来计算如何使得turtle2到达turtle1,计算出结果后,将消息发送给turtle2订阅的话题,使得turtle2动起来,故,共涉及6个结点:键盘节点(操作turtle1),turtle1节点,turtle1广播节点,listener节点,turtle2节点,turtle2广播节点
两个乌龟有坐标,分别是他们俩的名字
【注】:对于这篇文章,目前所知甚少,无法系统进行整理,为防止以后忘记,特记录下几点需要注意的地方:
-
创建tf需要用TransformBroadcaster,只需要创建它就可以了,他将这个坐标系的名字,位置,角度,父坐标系,进行广播。并且公布它到world坐标系的transform,注意创建的时候,就已经是sendTransform了,他发送的就是transform
tf.TransformBroadcaster().sendTransform((0.0, 2.0, 0.0)坐标系在现时刻的相对于父坐标系的位置,(0.0, 0.0, 0.0, 1.0)相对于父坐标系的旋转角度, rospy.Time.now()时间戳, "carrot1"坐标系名称, "turtle1"父坐标系名称) -
获取transform只需要一个listener就可以了,lookuptransform一般用rospy.Time(0),尽量不要用now,因为会产生消息还未到达的错误,如果一定要用now,要设置一个waitForTransform,listener.waitForTransform("/turtle2", “/carrot1”, now, rospy.Duration(4.0))在里面设置一个等待时长Duration,超时后就不再等待。这篇博客也很好:https://www.cnblogs.com/aobosir/p/5928559.html
-
lookuptransform获取的应该是两个坐标系原点之间的xy坐标差值,和旋转角度,也就是这个transform应该是针对原点来说的,这也是为什么教程中改变,坐标系之间的变换后,turtle2追turtle1会错位的原因,因为在给turtle2消息的时候,这个消息就是针对于原点变换来说的,而不是turtle1的坐标,所以实际上是turtle2去追逐carrot1的原点。
-
如果是turtle2追5秒前的turtle1,一定要有一个静态全局不变的参考系,以这个参考系为桥梁,来控制turtle2的运动
-
对于lookupTransform,(trans,rot) = listener.lookupTransform(’/turtle2’, ‘/turtle1’, rospy.Time(0)),trans是一个数组,保存这xy坐标差值,rot是旋转角度,
可以看到是从turtle1变换到turtle2,所以turtle2是变换结果,需要的是从turtle1怎么操作,类似于平移旋转,从而达到turtle2的效果 -
对于rospy.Time(0):For real tf use cases, it is often perfectly fine to use Time(0). Get access to the latest available transforms in that tf tree。。
具体可以查看:https://answers.ros.org/question/243179/whats-the-diff-between-rospytime0-and-rospytimenow/