SLAM+语音机器人DIY系列:(二)ROS入门——7.理解tf的原理
摘要
ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便。我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS基础知识进行详细的讲解,给不熟悉ROS的朋友起到一个抛砖引玉的作用。本章节主要内容:
7.理解tf的原理
(1)机器人中的坐标系
一个机器人系统中通常会有多个三维参考坐标系,而且这些坐标系之间的相对关系随时间推移会变化。这里举一个实际的机器人应用场景例子,来说明这种关系和变化:
全局世界坐标系:通常为激光slam构建出来的栅格地图的坐标系map。
机器人底盘坐标系:通常为机器人底盘的坐标系base_footprint。
机器人上各部件自己的坐标系:比如激光雷达、imu等传感器自己的坐标系base_laser_link、imu_link。
这些坐标系之间的关系有些是静态的、有些是动态的。比如当机器人底盘移动的过程中,机器人底盘与世界的相对关系map->base_footprint就会随之变化;而安装在机器人底盘上的激光雷达、imu这些传感器与机器人底盘的相对关系base_footprint->base_laser_link、base_footprint->imu_link就不会随之变化。其实,这个很好理解。
如图25中,map->base_footprint会随着底盘的移动而变化,即动态坐标系关系。

(图25)动态坐标系关系
如图26中,base_footprint->base_laser_link、base_footprint->imu_link不会随着底盘的移动而变化,即静态坐标系关系。

(图26)静态坐标系关系
(2)机器人坐标关系工具tf
由于坐标及坐标转换在机器人系统中非常重要,特别是机器人在环境地图中自主定位和导航、机械手臂对物体进行复杂的抓取任务,都需要精确的知道机器人各部件之间的相对位置及机器人在工作环境中的相对位置。因此ROS专门提供了tf这个工具用于简化这些工作。
tf可以让用户随时跟踪多个坐标系的关系,机器人各个坐标系之间的关系是通过一种树型数据结构来存储和维护的,即tf tree。借助这个tf tree,用户可以在任意时间将点、向量等数据的坐标在两个坐标系中完成坐标值变换。
如图27,为一个自主导航机器人的tf tree结构图。圆圈中是坐标系的名称,箭头表示两个坐标系之间的关系,箭头上会显示该坐标关系的发布者、发布速率、时间戳等信息。

(图27)一个自主导航机器人的tf tree结构图
(3)使用tf
使用tf分为两个部分,广播tf变换、监听tf变换。
广播tf变换:
ROS网络中的节点可以向系统广播坐标系之间的变换关系。比如负责机器人全局定位的amcl节点会广播map->odom的变换关系,负责机器人局部定位的轮式里程计计算节点会广播odom->base_footprint的变换关系,机器人底盘上安装的传感器与底盘的变换关系可以通过urdf机器人模型进行广播(urdf将在后面实际机器人中进行讲解)。每个节点的广播都可以直接将变换关系插入tf tree,不需要进行同步。通过多个节点广播坐标变换的关系,便可以实现tf tree的动态维护。
关于广播tf变换的具体程序实现,请直接参考ROS官方教程http://wiki.ros.org/tf/Tutorials
监听tf变换:
ROS网络中的节点可以从系统监听坐标系之间的变换关系,并从中查询所需要的坐标变换。比如要知道机器人底盘当前在栅格地图坐标系下的什么地方,就可以通过监听map->base_footprint来实现,比如要知道机器人底盘坐标系上的某个坐标点在世界坐标系下的坐标是多少,就可以通过监听map->base_footprint,并通过map->base_footprint这个变换查询出变换后的坐标点取值。
关于监听tf变换的具体程序实现,请直接参考ROS官方教程http://wiki.ros.org/tf/Tutorials
后记
------SLAM+语音机器人DIY系列【目录】快速导览------
第1章:Linux基础
第2章:ROS入门
第3章:感知与大脑
第4章:差分底盘设计
第5章:树莓派3开发环境搭建
第6章:SLAM建图与自主避障导航
2.google-cartographer机器人SLAM建图
第7章:语音交互与自然语言处理
第8章:高阶拓展
2.centos7下部署Django(nginx+uwsgi+django+python3)
----------------文章将持续更新,敬请关注-----------------
如果大家对博文的相关类容感兴趣,或有什么技术疑问,欢迎加入下面的《SLAM+语音机器人DIY》QQ技术交流群,一起讨论学习^_^

SLAM+语音机器人DIY系列:(二)ROS入门——7.理解tf的原理的更多相关文章
- SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——1.ROS是什么
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——8.理解roslaunch在大型项目中的作用
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——9.熟练使用rviz
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
随机推荐
- Angular2+ 使用 Protractor 与 Modify Header Value (HTTP Headers) 插件 完成 Windows Authorization 验证
入职新公司第二周,接到了一个E2E测试的任务,两天的时间把所有的测试条件都写完了,结果剩下三天都卡在了Windows Authorization验证这里. 先说一下公司项目Authorize的逻辑 第 ...
- 禁用后退键 BackSpace
<script language="JavaScript">document.onkeydown = check;function check(e) { var ...
- React 中阻止事件冒泡的问题
在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...
- [日志分析] Access Log 日志分析
0x00.前言: 如何知道自己所在的公司或单位是否被入侵了?是没人来“黑”,还是因自身感知能力不足,暂时还没发现?入侵检测是每个安全运维人员都要面临的严峻挑战.安全无小事,一旦入侵成功,后果不堪设想. ...
- 从壹开始 [ Id4 ] 之二║ 基础知识集合 & 项目搭建一
前言 哈喽大家又见面啦,感觉好久没更新了,这几天看了一本书<解忧杂货铺>,嗯挺好的,推荐一下
- Hyperledger Fabric、Corda和以太坊对比
Hyperledger Fabric . Corda 和以太坊的对比 三种不同的框架 我们从 Hyperledger Fabric.R3 Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领 ...
- [Hyperledger] Fabric系统中 peer模块的 gossip服务详解
最近一直在看fabric系统中的核心模块之一——peer模块.在看peer的配置文件core.yaml的信息时,对其中的gossip配置选项很感兴趣.看了一上午,还是不能明白这个选项到底什么意思呢?表 ...
- 学习JVM是如何从入门到放弃的?
前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记.现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书. 学习JVM的目的也很简单: 能够知道JVM是什么,为我们干 ...
- Postgre Sql获取最近一周、一月、一年日期函数
使用Postgre Sql获取近一周.一年.一月等系统函数调用如下,使用方面相对于Ms Sql server 容易了许多. --当前时间 select now(); --current_timesta ...
- C#字符串的一些常用方法
字符串常用方法 string str =""; string[] strArray = str.Split('截取字符'); //按字符将字符串拆分为数组 str = str.Re ...