ROS发布TF变换
提示:在ROS中发布TF变换时,所使用的的角度为弧度而不是度。本文可以验证,有错误欢迎各位评论指出
ROS中发布TF变换
前言
TF变换时描述机器人各个坐标系之间的位置变换关系,在ROS中发布这些关系需要使用TF工具。TF变换具体内容可以参考官方文档:http://wiki.ros.org/tf/
TF变换需要设置的内容在ROS WiKi中已有详细介绍:
http://docs.ros.org/en/jade/api/geometry_msgs/html/msg/TransformStamped.html
发布主要由两部分构成,分别是平移和旋转变换,具体构成如下:
geometry_msgs/Vector3 translation
geometry_msgs/Quaternion rotation
平移变换主要是坐标系A—>B的坐标系原点位置关系,由三个轴的平移量构成,旋转表示坐标系A和B之间旋转关系,使用四元数来表示。理解四元数可以参考博文:https://blog.csdn.net/o_mmmm_o/article/details/90271848
理解旋转变换以及平移后,接下来通过程序设计实现TF发布。以下流程为作者抽象概括理解
发布TF变换流程:
1.建立一个广播者(TransformBroadcaster)
2.建立广播者需要广播的数据类型(TransformStamped)
3.给数据类型赋值、
4.循环广播
1.Python实现TF发布
导入python所需要的库文件:
#!/usr/bin/env python
import rospy
import tf2_ros # 此为广播者所在库
from geometry_msgs.msg import TransformStamped # 此为要广播的数据类型
import tf_conversions # 从欧拉角到四元数的转换,可以直接使用,避免自己求解
初始化节点以及广播者和广播数据,
rospy.init_node("tf_test")
br = tf2_ros.TransformBroadcaster() # 广播者
trans = TransformStamped() # 广播数据类型
rate = rospy.Rate(1) # TF发布频率
x = 0
y = 0
z = 0
theat = 0 # 广播的数据类型
接下来给广播数据赋值并让广播者广播数据
x += 0.1 # 此处实现自坐标系base_link沿着X轴和y轴方向运动,速度为0.1m/s,
y += 0.1
theat += 1*pi/180 # 旋转角度为1度
trans.header.frame_id = "odom"
trans.header.stamp = rospy.Time.now()
trans.child_frame_id = "base_link"
trans.transform.translation.x = x
trans.transform.translation.y = y
trans.transform.translation.z = z # 此处将平移变换赋值
# 接下来处理坐标系旋转 首先将欧拉角转换为四元数
q = tf_conversions.transformations.quaternion_from_euler(0, 0, theat)
# 给发布数据中的四元数赋值
trans.transform.rotation.x = q[0]
trans.transform.rotation.y = q[1]
trans.transform.rotation.z = q[2]
trans.transform.rotation.w = q[3]
# 广播者广播数据
br.sendTransform(trans)
rate.sleep()