ROS专题----tf和tf2坐标变换

举报
zhangrelay 发表于 2021/07/15 05:00:05 2021/07/15
【摘要】 ROS专题----tf和tf2坐标变换 ---- 工作区设置 如果您尚未创建用于完成教程的工作区, 请单击此处查看一些简要说明 。 从tf1迁移到tf2 转换数据类型这是对转换数据类型的语法更改的快速说明。将TransformListener从tf迁移到tf2这是一个将tf TransformListener类转换为...

ROS专题----tf和tf2坐标变换

----

工作区设置

如果您尚未创建用于完成教程的工作区, 请单击此处查看一些简要说明 。

从tf1迁移到tf2

  1. 转换数据类型

    这是对转换数据类型的语法更改的快速说明。

  2. 将TransformListener从tf迁移到tf2

    这是一个将tf TransformListener类转换为tf2监听器类的指南

  3. 将TransformBroadcaster从tf迁移到tf2

    这是一个将tf TransformBroadcaster类转换为tf2 Broadcaster类的指南

学习tf2

  1. tf2简介

    本教程将给你一个好主意tf2可以为你做什么。它显示了使用turtlesim的多机器人示例中的一些tf2功率这也引入使用tf2_echoview_framesrviz

C ++

蟒蛇

  1. 写一个tf2静态广播(C ++)

    本教程教你如何广播静态坐标框架到tf2

  2. 写一个tf2广播电台(C ++)

    本教程教你如何广播机器人的坐标框架到tf2。

  3. 编写一个tf2监听器(C ++)

    本教程教你如何使用tf2来访问框架转换。

  4. 添加框架(C ++)

    本教程教你如何为tf2添加一个额外的固定框架。

  5. 学习tf2和时间(C ++)

    本教程教您使用waitForTransform函数等待变换在tf2树上可用。

  6. 时间旅行与tf2(C ++)

    本教程将向您介绍tf2的高级时间旅行功能

  7. 创建数据转换包(C ++)

    本教程将教你如何创建使用tf2转换方法转换C ++数据类型所需的方法。

  1. 编写一个tf2静态广播(Python)

    本教程教你如何广播静态坐标框架到tf2

  2. 编写tf2广播机构(Python)

    本教程教你如何广播机器人的状态到tf2。

  3. 编写tf2侦听器(Python)

    本教程教你如何使用tf2来访问框架转换。

  4. 添加框架(Python)

    本教程教你如何为tf2添加一个额外的固定框架。

  5. 学习tf2和时间(Python)

    本教程教您使用lookup_transform函数中的超时,等待变换在tf2树上可用。

  6. 时间旅行与tf2(Python)

    本教程将向您介绍tf2的高级时间旅行功能

  7. 创建数据转换包(Python)

    本教程将教你如何创建使用tf2转换方法转换Python数据类型所需的方法。

调试tf2

  1. 调试tf2问​​题

    本教程提供了一个系统的方法来调试tf2相关的问题。

使用带有tf2的传感器消息

  1. 使用带有tf2_ros :: MessageFilter的标记数据类型

    本教程描述如何使用tf2_ros :: MessageFilter处理Stamped数据类型。

用tf2设置你的机器人

  1. 使用tf设置您的机器人

    本教程提供了设置您的机器人开始使用tf的指南。

  2. tfを用いたロボットのセットアップ

    このチュートリアルではtfを使ってロボットをセットアップする方法を学びます。

  3. 为你的机器人配置tf

    本教程提供了设置您的机器人开始使用tf的指南。

  1. 在自己的机器人上使用机器人状态发布器

    本教程解释了如何使用机器人状态发布器将机器人的状态发布到tf

  2. Utiliser le“机器人国家出版商”倾倒votre propre机器人

    策tutoriel explique评论VOUS pouvez publier L'政变德VOTRE机器人TF,连接utilisant乐“机器人状态出版商”。

  3. 在自己的机器人上使用机器人状态发布器

    このチュートリアルでは机器人状态出版商を使うことで,どのようにしてロボットの状态をTFに发布できるのかを学びます


----

frames2.png

tf2做什么?为什么要使用tf2?

你想看看什么tf可以做,而不是只是阅读它吗?查看tf2介绍演示

机器人系统通常具有时间改变的许多3D 坐标系,例如世界框架,基础框架,夹具框架,头框架等.tf2随着时间跟踪所有这些框架,并且允许你提出诸如以下问题:

  • 5秒钟前头框相对于世界框架在哪里?
  • 对象在我的夹子上相对于我的基地的姿势是什么?
  • 基础框架在地图框架中的当前姿势是什么?

tf2可以在分布式系统中操作这意味着有关机器人坐标系的所有信息可用于系统中任何计算机上的所有ROS组件。Tf2可以使用包含所有变换信息的中央服务器运行,或者您可以让分布式系统中的每个组件构建自己的变换信息数据库。

有关设计的更多信息,请参阅设计

教程

我们创立了一套教程来指导您使用TF2,一步一步来。你可以开始介绍tf2教程。有关所有tf2和tf2相关教程的完整列表,请查看教程页面。

基本上有两个任务,任何用户将使用tf2,监听变换和广播变换。

任何使用tf2的人都需要监听转换:

  • 侦听变换 - 接收和缓冲在系统中广播的所有坐标帧,并查询帧之间的特定变换。检查写一个tf2监听教程(Python) (C ++)

要扩展机器人的功能,您需要开始广播变换。

  • 广播变换 - 将坐标帧的相对姿态发送到系统的其余部分。系统可以具有许多广播器,每个广播器提供关于机器人的不同部分的信息。查看写一个tf2广播机构教程(Python) (C ++)

一旦你完成了基本的教程,你可以继续学习tf2和时间。tf2和时间教程(Python) (C ++)教导tf2和时间的基本原理。关于tf2和时间(Python) (C ++)的高级教程教导了使用tf2的时间旅行的原理。

如果您正在寻找一个简单的工具来手动调整tf变换,例如快速逐眼调整,请尝试手动TF校准工具

概述

高级设计

设计页面描述的TF2库的高层设计。

tf2是形成tf的第二代的一组包的核心有三种类型的软件包。

支持的数据类型

tf2实现模板化数据类型支持。这允许核心包具有最小的依赖性,并且存在添加对转换到和来自不同数据类型以及转换这些数据类型的支持的包。 请参阅tf2转换概述,以及本教程了解如何在不同的数据类型中使用tf2。tf2有一个内部数据类型,它基于项目符号的LinearMath库。但是,建议使用一个完全支持的数学数据类型,以最好地支持您的应用程序。 tf2转换方法也支持在多个不同数据类型之间转换和转换。

在它的核心tf2依赖于标记的数据类型,可以方便地与具有消息#报头的 ROS消息相关联

数据类型支持包

这些包提供了允许tf2本地与任何外部库的数据类型一起工作的方法。大多数都是C ++或Python特定的。

坐标框架约定

使用tf2的一个重要部分是使用坐标框架的标准约定。

使用坐标框架的约定有几个来源。

  • REP 103中涵盖单位,方向惯例,手性,旋转表示和协方差表示

  • REP 105中介绍了移动基准坐标系的标准名称

  • 类人机器人的标准坐标框架在REP 120中

  • 有关使用的一些数学术语的定义,请参见/术语页。

命名

ROS中的坐标帧由字符串frame_id标识,格式为小写字母下划线分隔。此字符串在系统中必须是唯一的。所有生成的数据可以简单地识别它的frame_id,以说明它在世界上的位置。

tf_prefix 在以前的版本中有一个tf_prefix的概念,它将使用/ separator 作为框架名称的前缀。用于表示它已经被加前缀的前导斜杠。 为了向后兼容,tf2将剥离任何前导/字符。

无重新映射:

tf frame_ids的概念与ROS名称没有相同的作用域特别地,命名空间计算图的特定子部分不改变tf树表示的物理布局因为这个frame_id不遵循命名空间重新映射规则。通常支持ROS参数以允许改变算法中使用的frame_id。

多个机器人:

对于具有多个机器人的用例,通常建议在机器人之间使用多个主机和转发特定的tf信息。 在主机之间实现桥接有几种不同的方法。 有关更多信息,请参阅sig / Multimaster

工具

  • tf2 tf2包是一个ROS独立实现的核心功能。如果复制了消息数据类型,则可以在ROS之外使用。

  • tf2_tools提供了许多工具来在ROS中使用tf2

ROS绑定

这些包为使用tf2的开发人员提供了主要接口

  • tf2_rostf2提供roscpp绑定,包括BufferListenerBufferBroadcasterBufferServerBufferClient的类

  • tf2_ros还为tf2提供rospy绑定,包括BufferListener BufferBroadcasterBufferClient的类

从tf迁移

有关从tf迁移的更多信息,请参阅迁移指南


----

工作区设置

如果您尚未创建用于完成教程的工作区, 请单击此处查看一些简要说明 。

学习tf

C ++

蟒蛇

  1. 写一个tf播放器(C ++)

    本教程教你如何广播机器人的坐标框架到tf。

  2. 写一个tf监听器(C ++)

    本教程教你如何使用tf获取框架转换的访问。

  3. 添加框架(C ++)

    本教程教你如何添加一个额外的固定框架到tf。

  4. 学习tf和时间(C ++)

    本教程教你使用waitForTransform函数等待变换在tf树上可用。

  5. 时间旅行与tf(C ++)

    本教程将向您介绍tf的高级时间旅行功能

  1. 写一个tf广播机构(Python)

    本教程教你如何广播机器人的状态到tf。

  2. 编写tf侦听器(Python)

    本教程教你如何使用tf获取框架转换的访问。

  3. 添加框架(Python)

    本教程教你如何添加一个额外的固定框架到tf。

  4. 学习tf和时间(Python)

    本教程教你使用waitForTransform函数等待变换在tf树上可用。

  5. 时间旅行与tf(Python)

    本教程将向您介绍tf的高级时间旅行功能

现在您已经完成这些教程,请花时间完成这个简短的问卷

调试tf

  1. 调试tf的问题

    本教程提供了一个系统的方法来调试tf相关的问题。

使用传感器消息与tf

  1. 使用带有tf :: MessageFilter的标记数据类型

    本教程描述如何使用tf :: MessageFIlter来处理Stamped数据类型。

用tf设置你的机器人

  1. 使用tf设置您的机器人

    本教程提供了设置您的机器人开始使用tf的指南。

  2. 在自己的机器人上使用机器人状态发布器

    本教程解释了如何使用机器人状态发布器将机器人的状态发布到tf

  3. 与robot_state_publisher一起使用urdf

    本教程给出了使用URDF的机器人模型的完整示例,其中使用robot_state_publisher。首先,我们创建具有所有必要部分的URDF模型。然后我们写一个节点,发布JointState和transforms。最后,我们一起运行所有的部分。



----

frames2.png

tf做什么?为什么要使用tf?

你想看看什么tf可以做,而不是只是阅读它吗?查看tf介绍演示

机器人系统通常具有时间改变的许多3D 坐标系,例如世界框架,基础框架,夹具框架,头框架等。tf随着时间跟踪所有这些框架,并且允许你提出诸如以下问题:

  • 5秒钟前头框相对于世界框架在哪里?
  • 对象在我的夹子上相对于我的基地的姿势是什么?
  • 基础框架在地图框架中的当前姿势是什么?

tf可以在分布式系统中操作这意味着有关机器人坐标系的所有信息可用于系统中任何计算机上的所有ROS组件。没有中央服务器转换信息的。

有关设计的更多信息,请参阅/设计

在TePRA 2013 论文/ TePRA2013_Foote上有一篇关于tf的论文

教程

我们创建了一组教程,逐步引导您使用tf。你可以开始介绍tf教程。有关所有tf和tf相关教程的完整列表,请查看教程页面。

基本上有两个任务,任何用户将使用tf,监听变换和广播变换。

任何使用tf的人都需要监听转换:

  • 侦听变换 - 接收和缓冲在系统中广播的所有坐标帧,并查询帧之间的特定变换。查看写一个tf监听教程(Python) (C ++)

要扩展机器人的功能,您需要开始广播变换。

  • 广播变换 - 将坐标帧的相对姿态发送到系统的其余部分。系统可以具有许多广播器,每个广播器提供关于机器人的不同部分的信息。查看写一个tf广播机构教程(Python) (C ++)

完成基本教程后,您可以继续学习tf和时间。tf和时间教程(Python) (C ++)教导tf和时间的基本原理。关于tf和时间(Python) (C ++)的高级教程教导了时间旅行与tf的原则。

代码API概述

经常问的问题

命令行工具

虽然tf主要是一个意图在ROS 节点使用的代码库,但它附带了一组大量的命令行工具,它们有助于调试和创建tf坐标系。这些工具包括:

您还可以使用tf_remap节点,它是重新映射坐标变换的实用程序节点。

tf_monitor

tf_monitor

  • 将关于当前坐标变换树的信息打印到控制台。例如:

$ rosrun tf tf_monitor
结果:对于所有帧

框架:
框架:/ base_footprint发布者/ robot_pose_ekf平均延迟:0.0469324最大延迟:0.0501503
Frame:/ base_laser_link发布者/ robot_state_publisher平均延迟:0.00891066最大延迟:0.009591
Frame:/ base_link / by / robot_state_publisher发布时间平均延迟:0.00891147最大延迟:0.009592
0.00891431最大延迟:0.009595

...为了简洁...

广播公司:
节点:/ realtime_loop 94.7371 Hz,平均延迟:0.000599916最大延迟:0.001337
节点:/ robot_pose_ekf 30.8259 Hz,平均延迟:0.0469324最大延迟:0.0501503
节点:/ robot_state_publisher 25.8099 Hz,平均延迟:0.0089224最大延迟:0.00960276

tf_monitor <source_frame> <target_target>

  • 监视特定的转换。例如,要监视从/ base_footprintodom的转换

$ rosrun tf tf_monitor / base_footprint / odom
结果:for / base_footprint到/ odom
链当前是:/ base_footprint  - > / odom
净延迟avg = 0.00371811:max = 0.012472

框架:
框架:/ base_footprint发布者/ robot_pose_ekf平均延迟:0.0465218最大延迟:0.051754
帧:/ odom发布者/ realtime_loop平均延迟:0.00062444最大延迟:0.001553

广播公司:
节点:/ realtime_loop 95.3222 Hz,平均延迟:0.00062444最大延迟:0.001553
节点:/ robot_pose_ekf 30.9654 Hz,平均延迟:0.0465218最大延迟:0.051754
节点:/ robot_state_publisher 25.9839 Hz,平均延迟:0.00903061最大延迟:0.00939562

tf_echo

tf_echo <source_frame> <target_frame>

  • 打印有关source_frametarget_frame之间的特定转换信息例如,要回显/ map/ odom之间的转换

$ rosrun tf tf_echo / map / odom
时间1263248513.809
 - 翻译:[2.398,6.783,0.000]
 - 旋转:四元数[0.000,0.000,-0.707,0.707]
在RPY [0.000,-0.000,-1.570]

static_transform_publisher

static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms

  • 使用x / y / z偏移量(以米为单位)和偏航/俯仰/滚动(以弧度为单位)将静态坐标变换发布到tf。(偏转是绕Z的旋转,俯仰是绕Y的旋转,滚动是绕X的旋转)。周期(以毫秒为单位)指定发送转换的频率。100ms(10hz)是一个很好的值。

static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms

  • 使用以米和四元数为单位的x / y / z偏移量将静态坐标变换发布到tf。周期(以毫秒为单位)指定发送转换的频率。100ms(10hz)是一个很好的值。

static_transform_publisher被设计为用于手动使用的命令行工具,以及在roslaunch文件中用于设置静态变换。例如:

切换行号
   1 <launch> 
   2 <node pkg =“tf”type =“static_transform_publisher”name =“link1_broadcaster”args =“1 0 0 0 0 0 1 link1_parent link1 100”/> 
   3 </ launch>

view_frames

view_frames是一个图形调试工具,用于创建当前变换树的PDF图形。

$ rosrun tf view_frames

您可能希望在完成后查看图表,因此Ubuntu系统上的典型用法是:

$ rosrun tf view_frames
$ evince frames.pdf

因此,在.bashrc添加一个有用的快捷方式是:

alias tf ='cd / var / tmp && rosrun tf view_frames && evince frames.pdf&'

注:参见rqt_tf_tree允许帧的动态自省。

roswtf插件

roswtf tf附带一个roswtf的插件,当你运行roswtf时自动运行这个插件将分析您当前的tf配置,并尝试找到常见的问题。要运行,只需调用roswtf

$ roswtf

节点

#Keywords转换,变换,坐标变换


----


----


文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/62052505

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。