ROS TF原理和使用方法

2023-05-16

ROS TF介绍

一、TF是什么?
1.TF是ROS的一个包(package)
2.TF能让用户随时记录各种坐标系之间的变换关系
3.TF能让用户在一个坐标系中进行坐标运算,并将转换关系后的位置关系传到另一个坐标系

在ROS里面查看tf变换关系

rosrun rqt_tf_tree rqt_tf_tree

在这里插入图片描述
图中为某一时刻的tf变换图(先要启动一个机器人模型),表示turtle1和turtle2与world之间的关系

也能通过rviz查看,但看上去不太清晰

rosrun rviz rviz

打开rviz后,点击右下方的Add,加入TF

rosrun tf view_frames

会产生一个pdf文件,打开后会有所有的tf变换结果
4.

针对某一个topic查看tf变换关系

rostopic echo /tf -turtle1

二、TF变换怎么使用
以官网的TF变换为例作一部分介绍,图中需要变换的有两方面,一个是机器人本体(base_link)与激光雷达(base_laser)的TF变换,另一个是激光雷达产生的激光点变换到base_link坐标系下(原来产生的激光点不会因为雷达位置变换而同步移动到相应位置,因此需要修改)。
注:红色的为base_link,蓝色的为base_laser
在这里插入图片描述
1.base_link与base_laser之间的变换
(原理描述)
如果以base_link作为基准,那么base_laser相对于base_link的水平方向的距离为0.1m,竖直方向的距离为0.2m.因此,从base_laser到base_link的坐标转换关系应该为(x:0.1m,y:0.0m, z:0.2m),相反的转换即是(x:-0.1m,y:0.0m,z:0.2m)。问题来了,如果每一个元件都按这样的方式去转换,当项目庞大,组件繁多的时候,就会应付不过来,因此TF为我们提供了更好的机制。
利用tf来管理这种关系,我们需要把他们添加到转换树(transform tree)中。一方面来说,转换树中的每一个节点都对应着一类坐标系,节点之间的连线即是两个坐标相互转换的一种表示,一种从当前节点到子节点的转换表示。Tf利用树结构的方式,保证了两个坐标系之间的只存在单一的转换,同时假设节点之间的连线指向是从parent到child。
在这里插入图片描述
基于我们简单的例子,我们需要创建两个节点,一个“base_link”,一个是“base_laser”。为了定义两者的关系,首先,我们需要决定谁是parent,谁是child。时刻记得,由于tf假设所有的转换都是从parent到child的,因此谁是parent是有差别的。我们选择“base_link”坐标系作为parent,其他的传感器等,都是作为“器件”被添加进robot的,对于“base_link”和“base_laser”他们来说,是最适合的。这就意味着转换关系的表达式应该是(x:0.1m,y0.0m,z:0.2m)。关系的建立,在收到“base_laser”的数据到“base_link”的转换过程,就可以是简单的调用tf库即可完成。我们的机器人,就可以利用这些信息,在“base_link”坐标系中,就可以推理出传感器扫描出的数据,并可安全的规划路径和避障等工作。
(具体实现)
先创建一个用于转换的package,并添加依赖(包名为robot_setup_tf,依赖roscpp,tf,geometry_msgs)

cd %TOP_DIR_YOUR_CATKIN_WS%/src
catkin_create_pkg robot_setup_tf roscpp tf geometry_msgs

我们已经创建了package。接着我们需要创建对应的节点,来实现广播任务base_laser->base_link。在robot_setup_tf包中,src目录下面新建一个tf_broadcaster.cpp文件,然后将下面代码贴进去。

cd robot_setup_tf/src
touch tf_broadcaster.cpp
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>//包含tf下面的广播tf变换头文件

int main(int argc, char** argv){
  ros::init(argc, argv, "robot_tf_publisher");//初始化robot_tf_publisher节点
  ros::NodeHandle n;	//在robot_tf_publisher节点下面新建一个节点控制器n

  ros::Rate r(100);		//设置节点控制器n的发布频率为100

  tf::TransformBroadcaster broadcaster; //创建tf变换的一个对象(tf类下面的广播的对象,如果不懂,加强c++学习)

  while(n.ok()){				//循环判断节点控制器是否计满100,若是则执行
    broadcaster.sendTransform( //tf创建的对象发布消息
      tf::StampedTransform(		  
        tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.1, 0.0, 0.2)),
        ros::Time::now(),"base_link", "base_laser")); 
        //发布的消息有5个元素,
        //第一个元素tf::Quaternion为旋转变换,就是说base_laser在转换到base_link的时候
        //是否需要进行一定的旋转,
        //第二个元素,tf::Vector3为x,y,z三轴的位移变换,
        //第三个元素为变换的时间(因为变换是根据一定时间执行一次),
        //第四个元素为转换的基准目标,也就是转换后到这个坐标系,
        //第五个元素为待转换的坐标系
    n.sleep();//没有操作的时候,节点控制器休眠
  }
}

2.base_laser的激光点到base_link的变换
在robot_setup_tf功能包中,在src目录下创建tf_listener.cpp,并将下面的代码粘贴到里面:
特别提醒:一个TransformListener对象会自动的订阅ROS系统中的变换消息主题,同时管理所有的该通道上的变换数据。也就是说不需要自己手动添加tf的订阅关系

cd robot_setup_tf/src
touch tf_listener.cpp
#include <ros/ros.h>
#include <geometry_msgs/PointStamped.h>
#include <tf/transform_listener.h>	//添加tf订阅的头文件

void transformPoint(const tf::TransformListener& listener){
  //创建一个函数,参数为TransformListener,作用为将“base_laser”坐标系的点,变换到“base_link”坐标系中。
  geometry_msgs::PointStamped laser_point;
  laser_point.header.frame_id = "base_laser";

  //we'll just use the most recent transform available for our simple example
  laser_point.header.stamp = ros::Time();
  //消息名字最后的“Stamped”的意义是,它包含了一个头部,
  //允许我们去把时间戳和消息的frame_id相关关联起来。
  //我们将会设置laser_point的时间戳为ros::time(),
  //即是允许我们请求TransformListener取得最新的变换数据。
  

  //创建的点为虚拟点
  laser_point.point.x = 1.0;
  laser_point.point.y = 0.2;
  laser_point.point.z = 0.0;

  try{
    geometry_msgs::PointStamped base_point;
    listener.transformPoint("base_link", laser_point, base_point);
    //我们已经有了从“base_laser”到“base_link”变换的点数据。进一步,我们通过TransformListener对象,调用transformPoint(),填充三个参数来进行数据变换。第1个参数,代表我们想要变换的目标坐标系的名字。第2个参数填充需要变换的原始坐标系的点对象,第3个参数填充,目标坐标系的点对象。所以,在函数调用后,base_point里存储的信息就是变换后的点坐标。

    ROS_INFO("base_laser: (%.2f, %.2f. %.2f) -----> base_link: (%.2f, %.2f, %.2f) at time %.2f",
        laser_point.point.x, laser_point.point.y, laser_point.point.z,
        base_point.point.x, base_point.point.y, base_point.point.z, 
        base_point.header.stamp.toSec());
        
  }
  catch(tf::TransformException& ex){
    ROS_ERROR("Received an exception trying to transform a point from \"base_laser\" to \"base_link\": %s", ex.what());
  }
}

int main(int argc, char** argv){
  ros::init(argc, argv, "robot_tf_listener");
  ros::NodeHandle n;

  tf::TransformListener listener(ros::Duration(10));

  //we'll transform a point once every second
  ros::Timer timer = n.createTimer(ros::Duration(1.0), boost::bind(&transformPoint, boost::ref(listener)));

  ros::spin();

}

3.修改CMakeList.txt

add_executable(tf_broadcaster src/tf_broadcaster.cpp)
add_executable(tf_listener src/tf_listener.cpp)
target_link_libraries(tf_broadcaster ${catkin_LIBRARIES})
target_link_libraries(tf_listener ${catkin_LIBRARIES})

4.编译通过

$ cd %TOP_DIR_YOUR_CATKIN_WS%
$ catkin_make

5.运行代码

roslaunch robot_setup_tf tf_broadcaster
rosrun robot_setup_tf tf_listener
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS TF原理和使用方法 的相关文章

  • linux-2.6.32.6源码目录结构分析及其driver所占比重

    find maxdepth 1 type d name exec du sh 未编译个目录文件大小 xff1a 423M linux 2 6 32 6 5 8M firmware 1 3M lib 140K init 144K virt 2
  • Formatter(格式化)和 Converter(格式化)

    功能 xff1a Spring框架的功能 xff0c Formatter和Converter均可以将一种对象类型转换成另一种对象类型 区别 xff1a Converter是通用元件 xff0c 可以在应用程序的任意层中使用 Formatte
  • 牛人 就是这样锤炼出来的,中兴资深工程师,嵌入式专家韦东山是这样炼成的!

    导读 xff1a 还在大学的你 xff0c 不知道未来何去何从 xff1f 都说迷茫是大事做不了 xff0c 小事不想做 还在做程序袁的你 xff0c 是不是也想创业 xff1f 程序袁好创业吗 xff1f Linux好学吗 xff1f 学
  • Windows下编译PX4源码并连接simulink

    目录 一 安装UAV支持PX4飞行器支持包二 下载工具链对于2019a对于2021a 三 克隆PX4源码四 构建PX4固件固件的选择编译指令报错的处理 五 MATLAB的Test Connection 一 安装UAV支持PX4飞行器支持包
  • ubuntu树莓派3/4B+的GPIO硬件串口通信

    目录 一 概要二 树莓派硬件常识三 交换硬件串口和mini串口映射关系3 1 查看原始映射3 2 编辑config文件 xff0c 置换硬件映射3 3 禁用蓝牙 四 串口功能配置4 1 编辑cmdline文件4 2 禁用蓝牙4 3 串口功能
  • JS运行原理,宏任务微任务的任务loop驱动模式

    要拎清运行原理 xff0c 就要知道js有什么无理限制和主要解决什么问题 首先 xff0c js是单线程的 xff0c 不能开辟多线程 这决定了它支持并发 xff0c 不支持并行 并发 强调的是可以一起 出 发 xff0c 并行 强调的是可
  • 关于CPU C-States 省电模式,你需要知道的事情

    为了在CPU空闲的时候降低功耗 xff0c CPU可以被命令进入low power模式 每个CPU都有几种power模式 xff0c 这些模式被统称为C states或者C modes lower power模式最早在486DX4处理器上被
  • nginx如何部署多个web应用(vue)

    服务器资源与域名资源都是有限的 xff0c 如何在同一个域名下部署多个vue项目 xff08 nginx反向代理 xff09 xff0c 通过域名后面的不同的URI来访问不同的应用 xff0c 来解决资源不足的问题 xff0c 在此期间遇到
  • 【博客8】缤果PyQt5串口调试助手V1.1(初级篇)

    超级好用的Python QT GUI串口调试助手 目录 前言 一 软件概要 xff1a 二 软件界面 xff1a 1 App动态演示 2 其他扩展展示 三 main py源码 xff1a 1 PyQt5 Serial Debug Assis
  • 主机ubuntu通过SSH访问TX2

    因为最近实验室搭建好了装有激光雷达的ros小车 xff0c 笔者想通过主机对TX2的文件进行管理和下载 但由于笔者之前使用TX2都是直接连接在显示屏上使用 xff0c 并未使用过远程访问 xff0c 为此笔者查了较多资料走了不少弯路 xff
  • IDEA快捷创建Servlet项目

    IDEA快捷创建Servlet项目 1 右键单击 要创建Servlet项目 所在的包 注 xff1a 若没有Servlet选项 打开File gt project structure 进入如下页面 xff0c 选择你使用的工程 xff0c
  • 【基础教程】Python转义字符及用法

    ASCII 编码为每个字符都分配了唯一的编号 xff0c 称为编码值 在 Python 中 xff0c 一个 ASCII 字符除了可以用它的实体 xff08 也就是真正的字符 xff09 表示 xff0c 还可以用它的编码值表示 这种使用编
  • SAP 实施新的金融工具 IFRS17规则解析

    在实施新的金融工具 IFRS 规则的过程中 xff0c 保险公司现在看到了保险负债的新标准 经过多年的长期讨论 xff0c IASB 于 2016 年 11 月承诺在 2021 年 1 月 1 日生效 xff0c 并明确表示不会考虑进一步推
  • FreeRTOS中任务控制块中关于堆栈的三个变量pxTopOfStack、pxStack、pxEndOfStack的分析

    这里写自定义目录标题 FreeRTOS中任务控制块中关于堆栈的定义 typedef struct tskTaskControlBlock volatile StackType t pxTopOfStack lt Points to the
  • 在keil中添加c文件时的一些常见错误

    近期在做项目时 xff0c 计划添加一个测距模块 xff0c 因此要新建一个c文件封装一些函数 xff0c 方便调用 xff0c 在实际操作时遇到了以下两个问题 1 编译时报错 error no such file or dictionar
  • stm32f1驱动HC-SR04超声波测距模块

    这段时间算是比较系统的学习了一点stm32相关的东西 xff0c 驱动超声波测距模块这个简单的小任务综合了定时器 xff0c 中断 xff0c 串口三个知识点 xff0c 拿来练手还是挺不错的 首先先介绍一下HC SR04模块 xff1a
  • HC05/HC06蓝牙模块驱动(1)

    花了点时间熟悉了一下蓝牙模块 xff0c 发现意料之外的简单 先说蓝牙模块的三种工作模式 xff08 这三种工作模式是HC05 06共有的 xff0c 并且通过模块上的LED反映出来 xff09 1 待连接模式 HC05 快速闪灯 HC06
  • Raft的PreVote实现机制

    Raft的PreVote实现机制 1 背景 在Basic Raft算法中 xff0c 当一个Follower与其他节点网络隔离 xff0c 如下图所示 xff1a Follower 2在electionTimeout没收到心跳之后 会发起选
  • ubuntu环境下opencv学习+踩坑

    opencv学习 43 踩坑 环境 ubuntu 19 04vscode 1 37 0opencv 3 4 7cmake 3 13 4 自己的blog在持续更新中 https blog csdn net sasasatori article
  • jetson nano上opencv+vscode环境搭建+踩坑记录

    jetson nano踩坑 1 英伟达系的cpu是arm64架构 xff0c 而市面上大部分直接支持的软件是amd64架构 xff0c 这就导致了很多很好用的软件无法直接在上面用 xff0c 比如simple note 2 vsc我是找了个

随机推荐

  • rc视觉工作日常

    RC视觉 由于硬件条件限制 xff0c 最后选择的开发方案为主机 43 jetson nano交叉开发的方案 xff0c 计划实现的目标为识别到某个特征物体 xff08 比如运动的羽毛球 xff09 之后 xff0c 将处理之后的消息通过串
  • 服务器后台语言选型参考

    1 后台服务器什么技术搭建 xff1f 2 为什么大型网站前端使用 PHP 后台逻辑用 Java xff1f 3 为什么大型网站前端使用 PHP 后台逻辑用 Java xff1f 4 Java在Web开发语言上败给了PHP
  • MVC4 网站发布(整理 + 部分转载 + 部分问题收集和解决方案)

    网站发布步骤 这部分是转载文章 在此标明出处 xff0c 以前有文章是转的没标明的请谅解 xff0c 因为有些已经无法找到出处 xff0c 或者与其它原因 如有冒犯请联系本人 xff0c 或删除 xff0c 或标明出处 因为好的文章 xff
  • 2022-适用于 Windows 10 Version 1809 的 02 累积更新,适合基于 x64 的系统 (KB5010351) - 错误 0x800f0982

    2022 适用于 Windows 10 Version 1809 的 02 累积更新 xff0c 适合基于 x64 的系统 KB5010351 错误 0x800f0982 系统是win10 企业版 LTSC版本 可能安装的是精简版导致的 运
  • sqlsever中text字段类型是否会影响查询性能

    先上结论 会影响查询性能 我在库里找了一张表T Sys Log 然后做2个副本 备份表 SELECT INTO T Sys Log back FROM T Sys Log SELECT INTO T Sys Log back2 FROM T
  • 【无标题】

    起因 2010 年 xff0c 谷歌宣布退出地内市场的时候 xff0c 一直保留着 谷歌地图 和 谷歌翻译 这两个公共服务 有兴趣自行百度下谷歌和百度恩怨 在 2020 年 xff0c 谷歌停止了 谷歌地图 在内地的服务 现在 xff0c
  • vmware ESXI 裸金属架构 本地服务器 开启Intel VT-x(虚拟化技术)

    我想使用vmware ESXI 安装的WIN10虚拟机中装vmware软件再装win10 即虚拟机中套虚拟机 基于工作要求某个XXX项目需要开启VPN远程到客户内网进行维护 客户对网络审计比较严 安装VPN的那台机子识别码要上传服务器 基本
  • 对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

    因为是转载文章 在此标明出处 xff0c 以前有文章是转的没标明的请谅解 xff0c 因为有些已经无法找到出处 xff0c 或者与其它原因 如有冒犯请联系本人 xff0c 或删除 xff0c 或标明出处 因为好的文章 xff0c 以前只想收
  • leveldb之log文件

    leveldb之log文件 1 log文件在LevelDb中的主要作用是系统故障恢复时 xff0c 能够保证不会丢失数据 因为在将记录写入内存的Memtable之前 xff0c 会先写入Log文件 xff0c 这样即使系统发生故障 xff0
  • STM32单片机的CRL和CRH寄存器

    这里写目录标题 问题 xff1a 基础知识 xff1a 解释 xff1a 扩展PA1为输入 上 下拉 PA2为输入 上 下拉 PA1为输出 xff08 通用推挽输出50MHZ xff09 PA2为输出 xff08 通用推挽输出50MHZ x
  • visualsvn server 无法访问url

    IIS 发布网站 本机能访问 其它人访问不了 看一下服务端 VisualSVN Server 的服务有没有启动 x A 34 H g6 L N s 管理 服务 VisualSVN Server 备注 做为开发机子 手动优化自己的电脑吧 否则
  • JS日期加减,日期运算

    因为是转载文章 在此标明出处 xff0c 以前有文章是转的没标明的请谅解 xff0c 因为有些已经无法找到出处 xff0c 或者与其它原因 如有冒犯请联系本人 xff0c 或删除 xff0c 或标明出处 因为好的文章 xff0c 以前只想收
  • jQuery easyui 选中特定的tab

    获取选中的 Tab 1 获取选中的 tab panel 和它的 tab 对象 2 var pp 61 39 tt 39 tabs 39 getSelected 39 3 var tab 61 pp panel 39 options 39 t
  • Server Error in '/' Application. 解决办法

    Server Error in 39 39 Application Access to the path 39 E NetWeb2 Content upFile BClientExcel 大客户部通讯录导入 xlsx 39 is denie
  • easyui-datagrid 数据出不来(样式引起的bug)

    今天任务是需要从另一个项目中将某几个功能页面移植到现有的项目中 这是比较繁琐的功能 理解要移植功能的逻辑 xff08 业务逻辑 xff0c 涉及到的表和存储过程 xff09 页面样式 这么是我遇到的一个问题之一 xff1b 我需要展现一个e
  • c#切割字符串几种方法

    1 xff0c 按单一字符切割 string s 61 34 abcdeabcdeabcde 34 string sArray 61 s Split 34 c 34 oreach string i in sArray Console Wri
  • Linux

    一 常用操作以及概念 快捷键求助关机PATHsudo包管理工具发行版VIM 三个模式GNU开源协议 二 磁盘 磁盘接口磁盘的文件名 三 分区 分区表开机检测程序 四 文件系统 分区与文件系统组成文件读取磁盘碎片blockinode目录日志挂
  • 动态链接库与静态链接库的区别

    静态链接库与动态链接库都是共享代码的方式 xff0c 如果采用静态链接库 xff0c 则无论你愿不愿意 xff0c lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了 但是若使用 DLL xff0c 该 DLL 不必被包含在最终
  • ssm——小学期实训总结

    实训总结 经过这两个星期短暂的学习 xff0c 我学习了ssm的框架搭建与web前端设计基础 在第一个星期 xff0c 老师着重为我们讲了框架的原理 搭建与运用 xff1b 而在第二个星期 xff0c 重点则转移到了小组对项目的开发与研究上
  • ROS TF原理和使用方法

    ROS TF介绍 一 TF是什么 xff1f 1 TF是ROS的一个包 xff08 package xff09 2 TF能让用户随时记录各种坐标系之间的变换关系 3 TF能让用户在一个坐标系中进行坐标运算 xff0c 并将转换关系后的位置关