ROS tf
- 基础使用
- 查看tf信息
- 1. 创建link关系图
- 2.在rqt中查看link关系图
- 3. 终端中输出tf变换关系
- 4. rviz中查看
- 程序中使用
- Transformer
- TransformBroadcaster
- TransformListener
ROS中tf是核心基础功能之一,负责将世界中的所有link联系在一起,记录带有时间戳的相对三维坐标关系,让我们可以随时得到不同link之间的相对位置关系。
基础使用
查看tf信息
1. 创建link关系图
此命令将会创建一个pdf类型的tf关系图,可以查看发布者、频率等信息
$ rosrun tf view_frames
2.在rqt中查看link关系图
$ rosrun rqt_tf_tree rqt_tf_tree
3. 终端中输出tf变换关系
$ rosrun tf tf_echo [reference_frame] [target_frame]
4. rviz中查看
打开rivz,点击Add添加tf查看
程序中使用
ros wiki 中给出了比较详细的介绍与教程,包括命令行工具、教程、API接口等,可以进行初步的了解与学习。
API链接 tf,支持python与C++两种语言。
以下使用C++语言举例:
最常用的是tf::Transformer 、 tf::TransformBroadcaster 和 tf::TransformListener,分别负责转换、发布与监听的任务。
Transformer
- frameExists()
查看frame是否存在 - lookupTransform()
查看两个frame之间的转换关系 - transformPose()
转换获的得一个posestamped值基于某坐标系的位姿 - waitForTransform()
等待两个坐标系的转换发出
示例1:
获取两个坐标系的转换关系
说明: 获取tf时经常会抛出异常,所以使用循环不断读取直到获取,其中waitForTransform()也可以提高获取概率
rate = rospy.Rate(10.0)
listener = tf.TransformListener()
get_pose = False
while not rospy.is_shutdown() and not get_pose:
try:
now = rospy.Time.now()
listener.waitForTransform(base_link, target_link, now, rospy.Duration(0.3))
(trans, rot) = listener.lookupTransform(base_link, target_link, now)
get_pose = True
except (tf.Exception, tf.LookupException, tf.ConnectivityException):
print("tf echo error")
continue
rate.sleep()
示例2:
转换获的得一个posestamped值基于某坐标系的位姿
pose_stamped = PoseStamped()
pose_stamped.pose = pose
pose_stamped.header.frame_id = "/camera_color_frame"
rate = rospy.Rate(10.0)
listener = tf.TransformListener()
get_pose = False
while not rospy.is_shutdown() and not get_pose:
try:
now = rospy.Time.now()
listener.waitForTransform("/base_link", "camera_color_frame", now, rospy.Duration(0.3))
pose_stamped_return = listener.transformPose("/base_link", pose_stamped)
get_pose = True
except (tf.Exception, tf.LookupException, tf.ConnectivityException):
print("tf echo error")
continue
rate.sleep()
TransformBroadcaster
- sendTransform()
发布坐标系转换
示例:
发布base_link与camera_color_frame的坐标系tf转换
br = tf.TransformBroadcaster()
rate = rospy.Rate(10.0)
while not rospy.is_shutdown():
pose = Pose()
br.sendTransform((pose.position.x, pose.position.y, pose.position.z),
(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w),
rospy.Time.now(),
"base_link",
"camera_color_frame")
rate.sleep()
TransformListener
TransformListener类继承了Transformer,所以可以直接使用Transformer中函数
- transformPose()
转换获的得一个posestamped值基于某坐标系的位姿
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)