TF是Transformations Frames的缩写。在ROS中,是一个工具,提供了坐标转换等方面的功能。
说白了TF工具就是帮助你完成坐标转换的一个工具,有了它就不用去计算各个坐标系之间的转换了,学过机器人学的应该会对此感受颇深。
在ROS中,TF工具包包含了三块内容:Broadcaster
,Listener
,TF转换工具
ROS中提供的是TF转换工具。转换是通过两个部分来完成的。
Broadcaster
负责向TF工具广播 参照物
和 自己的位置
关系Listener
负责向TF工具查看 想要知道的 两个物体间的相对坐标
TF工具底层是通过向量来去实现的。
(1)采用tf_monitor,查看当前TF树中所有坐标系的发布状态。
rosrun tf tf_monitor
(2)采用rqt_tf_tree,查看当前所有坐标之间的变换关系,可通过刷新更新当前树的内容。
rosrun rqt_tf_tree rqt_tf_tree
(3)采用tf_echo,获取reference_frame和target_frame之间的坐标变换关系。
rosrun tf tf_echo [reference_frame] [target_frame]
部分代码
from tf.broadcaster import TransformBroadcaster
from tf.transformations import quaternion_from_euler
broadcaster = TransformBroadcaster()
def pose_callback(msg):
if not isinstance(msg, Pose):
return
# 机器人在参考坐标系的位置msg.x和msg.y,姿态msg.theta
translation = (msg.x, msg.y, 0)
rotation = quaternion_from_euler(0, 0, msg.theta) # 欧拉角 -> 四元素
broadcaster.sendTransform(translation, rotation, rospy.Time().now(), "child", "parent") # 发广播
其中 quaternion_from_euler
将欧拉角转换为四元素:欧拉角,旋转矩阵。其中欧拉角:roll:x、pitch:y、yaw:z。
sendTransform
中传入的几组数分别为:
translation
:描述位置rotation
:通过四元素来描述姿态Time().now()
:time,打上时间戳"child"
:子坐标系(机器人坐标系)"parent"
:父坐标系(机器人的参考坐标系)部分代码
# 获取相对位置信息的listener
listener = TransformListener()
rate = rospy.Rate(10)
while not rospy.is_shutdown():
try:
transform = listener.lookupTransform("target_frame", "source_frame", rospy.Time())
except:
rate.sleep()
continue
x, y, z = transform[0] # 获取位置
quat = transform[1] # 获取姿态 (四元素) -> rpy
roll, pitch, yaw = euler_from_quaternion(quat)
lookupTransform
中传入的几组数分别为:
"target_frame"
:参考坐标系"source_frame"
:求解的坐标系rospy.Time()
:获得最近的相对位置待补充
古月居的:ROS探索总结(十二)——坐标系统
C++的实现参考:ROS学习——tf坐标系统