摘自:https://www.cnblogs.com/li-yao7758258/p/7672521.html

TF 在ROS基本作用和简单介绍

学之之博未若知之之要知之之要未若行之之实 2019-07-30 10:55:09 8055 收藏 18

分类专栏: 人工智能

TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系的坐标.

使用tf功能包,a. 监听tf变换: 接收并缓存系统中发布的所有参考系变换,并从中查询所需要的参考系变换。

b.广播 tf变换: 向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以直接将参考系变换关系直接插入tf树中,不需要再进行同步。

首先介绍关于TF的API的一些数据结构:

基本的数据类型有(Quaternion, Vector, Point, Pose, Transform)

这其中Quaternion 是表示四元数,vector3是一个3*1 的向量,point是一个表示一个点坐标,Pose是位姿(位姿是包括坐标以及方向) Transform是一个转换的模版

tf::Stamped <T>

是一种包含了除了Transform的其他几种基本的数据结构的一种数据结构:

1

2

3

4

5

6

7

8

9

10

11

12

template <typename T>    //模版结构可以是tf::Pose tf:Point 这些基本的结构

class Stamped : public T{

 public:

  ros::Time stamp_;    //记录时间

  std::string frame_id_;   //ID

  Stamped() :frame_id_ ("NO_ID_STAMPED_DEFAULT_CONSTRUCTION"){}; //Default constructor used only for preallocation

  Stamped(const T& input, const ros::Time& timestamp, const std::string & frame_id);

  

  void setData(const T& input);

};

tf::StampedTransform

TF::stampedtransform是TF的一种特殊情况:它需要frame_id和stamp以及child_frame_id。

/** \brief The Stamped Transform datatype used by tf */
class StampedTransform : public tf::Transform
{
public:ros::Time stamp_; ///< The timestamp associated with this transform 时间戳                                                                                                                                                                                                                                                       std::string frame_id_; ///< The frame_id of the coordinate frame  in which this transform is defined  定义转换坐标框架的frameID                                                                                                                                                                                                                    std::string child_frame_id_; ///< The frame_id of the coordinate frame this transform defines 的坐标系变换定义的id                                                                                                                                                                                                                            StampedTransform(const tf::Transform& input, const ros::Time& timestamp, const std::string & frame_id, const std::string & child_frame_id):tf::Transform (input), stamp_ ( timestamp ), frame_id_ (frame_id), child_frame_id_(child_frame_id){ };/** \brief Default constructor only to be used for preallocation */StampedTransform() { };/** \brief Set the inherited Traonsform data */void setData(const tf::Transform& input){*static_cast<tf::Transform*>(this) = input;};};

举个例子

在机器人的定位领域有蒙特卡罗定位(AMCL)的算法,这个算法是根据给定的地图,结合粒子滤波获取最佳定位点Mp,这个定位点是相对于地图map上的坐标,也就是base_link(也就是机器人的基坐标)相对map上的坐标。我们知道 odom 的原点是机器人启动时刻的位置,它在map上的位置或转换矩阵是未知的。但是AMCL可以根据最佳粒子的位置推算出 odom->map(就是说通过最佳粒子推算出机器人在地图的中的位置)的tf转换信息并发布到 tf主题上。因为base_link->odom的tf转换信息是每时每刻都在发布的,所以它是已知的

,所以这里有个这样的tf关系

map->base_link(就是地图中机器人的位置  是根据最佳粒子推算的)

base_link->odom(这是现实中机器人的位姿可以说是里程计的信息)

可以理解:机器人的里程计的信息 = 当前地图中的机器人的的位置    减去  地图中机器人的起点位置。

转为公式可以写成 :map->odom = map->base_link   -  base_link->odom

或者写为:

base_link->odom = map->base_link - map->odom  (这样更容易理解)

提示:首先我们可以先了解关于PRY这三个概念关于pitch yaw roll的博客 http://blog.csdn.net/yuzhongchun/article/details/22749521)

pitch是围绕X轴旋转,也叫做俯仰角,

yaw是围绕Y轴旋转,也叫偏航角,

roll是围绕Z轴旋转,也叫翻滚角

1.    ROS_DEBUG("New pose: %6.3f %6.3f %6.3f",
2.             hyps[max_weight_hyp].pf_pose_mean.v[0],
3.             hyps[max_weight_hyp].pf_pose_mean.v[1],
4.             hyps[max_weight_hyp].pf_pose_mean.v[2]);
5.     // hyps[max_weight_hyp].pf_pose_mean.v[0], [1], [2] 就代表了Mp  也就是机器人的位姿那么位姿的格式是(x,y,theta)最后一个是yaw偏航角,
6.    // subtracting base to odom from map to base and send map to odom instead
7.    tf::Stamped<tf::Pose> odom_to_map;
8.    try
9.    {
10.      tf::Transform tmp_tf(tf::createQuaternionFromYaw(hyps[max_weight_hyp].pf_pose_mean.v[2]),   tf::Vector3(hyps[max_weight_hyp].pf_pose_mean.v[0],
11.                                       hyps[max_weight_hyp].pf_pose_mean.v[1],
12.                                       0.0));
13.    // tmp_tf = 从map原点看base_link的位置  为yaw生成四元数,最后的0.0是(x,y,z)的Z的值为0  因为这是在二维平面中。
14.      tf::Stamped<tf::Pose> tmp_tf_stamped (tmp_tf.inverse(),
15.                                            laser_scan->header.stamp,
16.                                            base_frame_id_);
17.    //tmp_tf.inverse()  = 以为Mp为坐标的原点,地图map原点相对于Mp的位置,就是在base_link坐标系下map 原点的位置
18.      this->tf_->transformPose(odom_frame_id_,
19.                               tmp_tf_stamped,
20.                               odom_to_map);
21.     //进行 base_link坐标系下的点转换到odom坐标系,也就是把map原点转换到odom坐标系下,等于从odom原点看map原点的位置。放到latest_tf_变量里面
22.    }
23.    catch(tf::TransformException)
24.    {
25.      ROS_DEBUG("Failed to subtract base to odom transform");
26.      return;
27.    }  

TF命令行工具

(1) tf_monitor工具的功能是打印tf树中的所有参考系信息,通过输入参数来查看指定参考系之间的信息  用法: rosrun tf tf_monitor

tf_monitor <source_frame> <target_target>  监视一个特定的转换 For example, to monitor the transform from /base_footprint to /odom:

(2) tf_echo工具的功能是查看指定参考系之间的变换关系。命令的格式: tf_echo <source_frame> <target_frame>

(3)static_transform_publisher工具的功能是发布两个参考系之间的静态坐标变换,两个参考系一般不发生相对位置变化

(4)view_frames 是可视化的调试工具,可以生成pdf文件,来显示整棵tf树的信息。用法:rosrun tf view_frames

转载出处:

https://www.cnblogs.com/li-yao7758258/p/7672521.html

TF 在ROS基本作用和简单介绍相关推荐

  1. 基于X86的MikroTik ROS软路由的简单介绍和应用(一)

    基于X86的MikroTik ROS软路由的简单介绍和应用 写在前面 其实基于X86开发的路由系统,很早就有一些企业开始做了,国内的比较出名的有海蜘蛛,维盟.爱快等等,但是今天介绍的呢,是国外的一个专 ...

  2. tf.nn.sampled_softmax_loss用法简单介绍

    tf.nn.sampled_softmax_loss用法简单介绍 在研究Skip-gram模型时遇到了采用方式的softmax,一时没有搞明白,下面做个小案例试一下. tf.nn.sampled_so ...

  3. 测绘涉密证怎么办理,有什么作用?想办理测绘资质,测绘涉密证必不可缺!简单介绍几种吧,看看有没有你们适用的

    测绘涉密证有多种,简单介绍几种吧,看看有没有你们适用的 1.地理信息安全保密培训合格证书 是由国家基础地理信息中心发证的 适用于测绘资质申请.地理信息安全审查.测绘资质单位保密安全审查.项目招投标中加 ...

  4. 玩转人工智能(3)常用的大数据框架简单介绍

    时光不老,我们不散. 讲大数据框架前,简单的介绍下大数据的文化.信息时代人类社会的进步得益于分享和开源.大数据时代属于信息时代的第三代发展阶段(2001年到2011年可以认为是CT行业的黄金期,200 ...

  5. VAE 模型基本原理简单介绍

    VAE 模型基本原理简单介绍 1. 编写目的 2. 推荐资料 3. 相关背景 3.1 生成模型(Generative model): 3.2 隐变量模型(Latent Variable Models) ...

  6. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  7. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  8. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  9. 求介绍matlab函数用法的书,MATLAB初学者教程--函数用法的简单介绍

    1.4 函数用法的简单介绍 1.4.1什么是函数 似乎很多人一听到函数这个词就会想到数学中的某个概念,然后对于恐惧数学的同学就开始打退堂鼓.在matlab当中到处可以用到函数,它的出现可以让我们用很简 ...

最新文章

  1. 论文《一种金融市场预测的深度学习模型:FEPA》(2)----有效市场假说,预测原则概念及自己的思考
  2. 滴滴高管今年集体不拿年终奖 员工奖励力度缩减一半
  3. Zookeeper详解(一):分布式与Zookeeper
  4. 通信原理-随相数字信号的最佳接收
  5. 曾经想学很多很多,最后发现自己只能专心学那么很少的几个必杀技
  6. Java监视器绑定的超人
  7. ES6 深拷贝_你别自以为是:ES6误区 之 Object.assign()、const
  8. 编辑bpmn_「业务架构」BPMN简介第四部分-数据和工件
  9. c语言数字密码输入新密码,想程序高手求助--用C语言来编辑一个输入密码的程序...
  10. c语言结构体函数传递方式,c-将struct传递给函数
  11. 虚拟机使用宿主机全局代理
  12. Java-好玩的猜数小游戏
  13. centos下申请阿里云泛域名证书并自动更新
  14. nck课程笔记:破解补丁工具的使用
  15. JAVA小实验——接口与继承
  16. 探究InnoDB数据页内部行的存储方式
  17. 达人评测 迅鲲1300t相当于骁龙多少 迅鲲1300T对比骁龙870哪个好
  18. ECharts-旭日图(Sunburst)带时间轴
  19. mysql简化的审批流程表设计
  20. Mysql常用函数(一)

热门文章

  1. 鱼眼相机的成像模型与畸变校正
  2. 【重磅推荐】安卓手机电脑投屏软件vysor(比模拟机更方便的电脑操作Android手机)【电脑控制手机的软件】
  3. STM32CubeMX基于HAL库点亮LED灯
  4. SpringBoot实现证书License的授权和验证
  5. 2021-07-04 m3u8格式直播地址
  6. 03、机器学习 (贝叶斯分类算法与应用)
  7. Qt5.8与触摸Tslib-1.4库ARM-ZYNQ平台的移植(一)
  8. SOLIDWORKS Simulation带接触的装配体分析方法
  9. Windows10笔记本电脑无法进入睡眠模式
  10. 黑客零基础入门教程,从入门到精通学习路线规划,看完这篇就够了。