tf 使用

2023-05-16

1. 发布自己的tf:

   

其实就是发布你建立的坐标系。步骤如下:
1.定义一个广播,相当于发布话题时定义一个发布器,还是以官方的小乌龟例程为例:

static tf::TransformBroadcaster br;

2.定义存放转换信息(平动,转动)的变量

tf::Transform transform;

3.设置坐标原点

transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );

需要注意:
(1)setOrigin()函数的参数类型需要为tf::Vector3类型
(2)假设是要发布一个子坐标系为”turtle1”父坐标系为“world”,那么其中(msg->x,msg->y,0.0)是指“turtle1”的坐标原点在“world”坐标系下的坐标。
4.定义旋转

 // 根据 欧拉角设置
 tf::Quaternion q;
  q.setRPY(0, 0, msg->theta);
  transform.setRotation(q);
 // 根据四元数设置
transform.setRotation( tf::Quaternion(0, 0, 0, 1) ); 

需要注意:
(1)setRPY()函数的参数为”turtle1”在“world”坐标系下的roll(绕X轴),pitch(绕Y轴),yaw(绕Z轴)
(2)为了确保转换正确强烈建议,在转换完后,运行下程序,打开rviz下使用确认下转换是否正确,我在实验中有一次,明明依次填入了三个角度,但是在rviz下发现并不正确,pitch,yaw还存在一个负号的关系(楼主对旋转角的正负号向来头晕,所以都是直接打开rviz,直接试,直观而且准确)。
5.将变换广播出去

br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));

其中,
(1)transform:存储变换关系的变量;
(2)ros::Time::now():广播tf使的时间戳;
(3)“world”:父坐标系的名字;
(4)turtle_name:子坐标系的名字,这里因为子坐标系有两个,所以它定义了字符串用于存放名字,方便切换,通常我们把名字填到引号里就可以了。
总结一下,假设你在机器人上应用,如果你知道机器人的位置x,y,z,与三个旋转角roll,pitch,yaw就可以广播一个tf了,如果在是平面移动机器人,则只需要知道x,y与yaw即可。


二、 获取 tf  关系:

 通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息。
在监听中我最常用两个函数:
(1)lookupTransform();
(2)transformPoint();

1。  lookupTransform():

     

1.函数功能:可以过得两个坐标系之间转换的关系,包括旋转与平移。
2.使用例程:http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28C++%29
3.主要步骤:
(1)定义监听器;

    tf::TransformListener listener

(2)定义存放变换关系的变量

    tf::StampedTransform transform;

(3)监听两个坐标系之间的变换

   try{
      listener.lookupTransform("/turtle2", "/turtle1",
                               ros::Time(0), transform);
    }
    catch (tf::TransformException &ex) {
      ROS_ERROR("%s",ex.what());
      ros::Duration(1.0).sleep();
      continue;
    }
注意:1.由于tf的会把监听的内容存放到一个缓存中,然后再读取相关的内容,而这个过程可能会有几毫秒的延迟,也就是,tf的监听器并不能监听到“现在”的变换,所以如果不使用try,catch函数会导致报错:“world” passed to lookupTransform argument target_frame does not exist. ”

2..lookupTransform()函数参数说明
a.官网的例程说的是实现从“/turtle2”到“/turtle1”的转换,但实际中使用时,我发现转换得出的坐标是在“/turtle2”坐标系下的
b.不可以把ros::Time(0)改成ros::time::now(),因为监听做不到实时,会有几毫秒的延迟。ros::Time(0)指最近时刻存储的数据,ros::time::now()则指当下,如果非要使用ros::time::now,则需要结合waitForTransform()使用,具体见:
http://wiki.ros.org/tf/Tutorials/tf%20and%20Time%20%28C++%29
实际中ros::Time(0)大多数情况下可以满足要求。
c.最后转换关系存入transform中

(4)使用变换
通常我们使用的是点的信息

transform.getOrigin().x()
transform.getOrigin().y()

可以得到在turtle1坐标系的原点,在turtle2坐标系下的位置。

transform.getRotation().getW();
transform.getRotation().getX();
transform.getRotation().getY();
transform.getRotation().getZ();

可以得到旋转的四元数,如何直接得到偏航角因为没有用到这个功能所以也就没有去找相关的函数。

(二)transformPoint()函数使用
在实际应用中我们肯定会需要把在一个坐标系下的点转换到另一个坐标系下,这就需要transformPoint()函数。
1.函数功能:将一个坐标系下的点的坐标转换到另一个坐标系下。
2.函数参数:如

   listener_.transformPoint("PTAM_world",m_normal_pose,pose_PTAM_world);

(1)其中m_normal_pose数据类型为 geometry_msgs::PointStamped,
其中需要定义m_normal_pose.header.frame_id即该点所属的坐标系
(2)而“PTAM_world”则指,我要将m_normal_pose转换到“PTAM_world”坐标系下。
pose_PTAM_world是转换的结果,数据类型同样为geometry_msgs::PointStamped。
3.使用例程:

geometry_msgs::PointStamped turtle1;
turtle1.header.stamp=ros::Time();
turtle1.header.frame_id="turtle1";
turtle1.point.x=1;
turtle1.point.y=2;
turtle1.point.z=3;
geometry_msgs::PointStamped turtle1_world;
        try{
listener_.transformPoint("PTAM_world",turtle1,turtle1_world);
         }
             catch (tf::TransformException &ex) {
          ROS_ERROR("%s",ex.what());
          ros::Duration(1.0).sleep();
    }

说明:同样因为延时,turtle1.header.stamp不能为ros::Time::now();否则会出类似错误

[ERROR] [1456669076.279804500]: Lookup would require extrapolation into the future. Requested time 1456669076.279616253 but the latest data is at time 1456669076.159341977, when looking up transform from frame …

总结,只有开始使用tf了才能逐渐感受到它的方便,另外再建议tf一定要与rviz结合使用,真的直观又方便。

四元数 转 欧拉角:

     tf::Quaternion quat;

     tf::quaternionMsgToTF(amcl_pose.pose.pose.orientation,quat);
     double roll,pitch,yaw;
     tf::Matrix3x3(quat).getRPY(roll,pitch,yaw);

好像可以直接  quat.getYaw();

  tf::createQuaternionMsgFromYaw(yaw);

   tf::getYaw(msg->pose.pose.orientation);

  //四元数 -》 欧拉角

  tf::Quaternion  quat;
  tf::quaternionMsgToTF(amcl_pose.pose.pose.orientation,quat);
  double roll,pitch,yaw;
  tf::Matrix3x3(quat).getRPY(roll,pitch,yaw);



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

tf 使用 的相关文章

  • jquery ajax无刷新请求Struts2验证用户名密码数据库是否存在

    通过ajax请求验证后台数据是否存在 首先导入struts2的核心包 后台Action代码 import com opensymphony xwork2 ActionSupport public class CodeCheckAction
  • 手把手教你们通过jquery ajax调用查询java struts2后端数据+js拼接字符串

    1 首先新建一个web项目 xff0c 创建一个User实体 package com qm entity public class User private String id private String name private Str
  • python检查URL是否能正常访问

    今天 xff0c 项目经理问我一个问题 xff0c 问我这里有2000个URL要检查是否能正常打开 xff0c 其实我是拒绝的 xff0c 我知道因为要写代码了 xff0c 正好学了点python xff0c 一想 xff0c python
  • js自己写脚本自动操作注册插件,基于chrome浏览器

    大家好 xff01 又到了一周的福利时间 xff0c 今天给大家一个福利 xff0c 以后抢票不需要手动刷新页面了 xff0c 直接用你自己写的插件来控制 xff0c 事先声明 xff0c 本人是js菜鸟 xff0c 所以今天带来的例子都是
  • VMware Workstation Proa安装mac镜像

    首先你得有一个VMware 然后下载好mac镜像文件还有for OS X插件补丁 我这里都已经下载好了 xff0c 又需要的可以在评论里留下邮箱地址 xff0c 我分享给你 现在该有的文件都有了 xff0c 那么我们开始 首先VMware镜
  • Spring事务管理的四种方式(以银行转账为例)

    文章转自 https blog csdn net daijin888888 article details 51822257 本文配套示例代码下载地址 xff08 完整可运行 xff0c 含sql文件 xff0c 下载后请修改数据库配置 x
  • redis秒杀系统数据同步(保证不多卖)

    原文链接 http www cnblogs com shihaiming p 6062663 html 东西不多卖 秒杀系统需要保证东西不多卖 xff0c 关键是在多个客户端对库存进行减操作时 xff0c 必须加锁 Redis中的Watch
  • csdn过滤广告谷歌浏览器插件

    首先要知道浏览器插件的原理 通过访问网站 xff0c 加载我们写的js脚本 这样我们就可以对你所要操作的网站进行操作啦 xff01 首先看看谷歌的广告的代码块 如果换成你在开发这个网站 xff0c 肯定直接隐藏这个class 为 csdn
  • PX4源码分析1_PX4源码的下载和编译

    一 基本信息 xff1a 1 软件系统 xff1a Ubuntu 14 04 64bit 2 源码位置 xff1a https github com PX4 Firmware 3 参考博客 xff1a xff08 1 xff09 libin
  • PX4源码分析5_PX4启动流程

    PX4启动流程 xff0c 分为4步 xff1a 1 start xff1a 上电之后程序入口为Firmware NuttX nuttx arch arm src stm32 stm32 start c中的 start函数 xff0c 负责
  • 华为、TCL、大疆面试经历!32K高薪996和18K朝九晚五,我该怎么选?

    背景 楼主双非吊车尾一本毕业 xff0c 14年正式进入编程行业 xff0c 从事Android移动开发 一些个人的原因 xff0c 年前从一家公司裸辞 xff0c 带着老婆孩子离开了杭州 本想着回家过完年也就差不多赶上 金三银四 黄金季
  • PX4源码分析6_uorb通信机制

    一 创建流程 xff1a 在Firmware msg下创建msg文件 xff0c eg xff1a xxx msg xff0c 内容格式仿照原有msg文件在Firmware msg CMakeLists txt中将对应的msg文件添加 xf
  • PX4源码分析7_添加mavlink自定义消息

    一 自定义mavlink消息 xff1a 根据uorb消息 xff08 msg xff09 自定义mavlink消息 方法为利用mavlink generator工具在xml文件生成mavlink所需相应的头文件 二 发送自定义mavlin
  • Unix网络编程中第一个例子出现connect error: Connection refused

    这个问题我来回答 xff0c linux 现在因为安全问题 xff0c 各个发行版本默认是不开daytime服务的 由于要打开端口 xff0c 所以服务端程序需要用root权限执行 xff0c 所以你可以先 sudo daytimetcps
  • linux内存分配方法

    基于linux 驱动开发以及应用开发 当想要分配内存的时候 要面对很多的内存分配函数 malloc kmalloc vmalloc alloc page dma alloc 简单归纳如下 malloc 分配用户空间内存 不保证物理连续 xf
  • 算术移动和逻辑移动

    算术左移 逻辑左移 算术右移 逻辑右移有什么不同 算术左移 xff1a 末尾添0 xff1b 逻辑左移 xff1a 末尾添0 xff1b 算术右移 xff1a 左端最低位填充 xff1b 逻辑右移 xff1a 左端添0 算术左移和算术右移主
  • 素数的验证范围到数的开方

    假设范围大于数的开方 xff0c 则另个数必定小于数的开方 若两个数都大于数的开方 xff0c 则相乘必定大于这个数 所以只需要验证2到这个数的开方范围内就可以
  • CPU时间

    CPU时间 xff08 进程时间 xff09 xff1a 用户CPU时间 43 系统CPU时间 用户CPU时间 xff1a 用户态进程执行时间 系统CPU时间 xff1a 内核态进程执行时间 时钟时间 xff08 墙上时钟时间 xff09
  • 硬中断、软中断和信号

    硬中断是外部设备对CPU的中断 xff0c 软中断是中断底半部的一种处理机制 xff0c 信号则是由内核 xff08 或其他进程 xff09 对某个进程的中断 硬中断是由外部事件引起的因此具有随机性和突发性 xff1b 软中断是执行中断指令
  • CMakeLists.txt----一点儿自己的经验教训

    被CMakeLists txt坑过数次 xff08 大多是被自己蠢哭 xff09 xff0c 把用过的命令稍微记一下 注意 xff1a 中文空格等什么诡异字符 xff0c 链接库的名字不要忘记 xff0c 不要写错 好记性不如烂键盘 xff

随机推荐

  • docker命令之push

    1 背景 NAME docker push Push an image or a repository to the registry SYNOPSIS docker push NAME TAG DESCRIPTION Push an im
  • C标准库源码解剖(4):字符串处理函数string.h和wchar.h

    string h中包含了所有的字符串处理函数 xff0c 也包含了内存处理函数 xff0c 因为这些内存处理函数 xff08 如比如 复制 搜索 xff09 的功能与字符串处理函数功能类似 我们是用通用指针来指向内存块的 xff0c 通用指
  • VS 2019 + Clang-Format

    VS 2019配置Clang Format Clang Format选项 span class token comment 语言 None Cpp Java JavaScript ObjC Proto TableGen TextProto
  • C语言bmp图片读取写入

    一 介绍 bmp是我们常用的一种图片格式 xff0c 这里用c语言写一个程序打开 xff0c 读取像素点然后增亮 增亮公式 y 61 kx 43 b 这里用的24位的真彩bmp图片 二 实现 img bmp c span class tok
  • 树莓派设置wifi自动连接

    1 sd卡烧录好镜像 2 在boot目录创建 wpa supplicant conf 内容 span class token assign left variable ctrl interface span span class token
  • 电路城 电路方案 51单片机开发板(原理图+PCB+学习程序源文件)

    1 89C52单片机 xff0c 支持USB口或者是串口两种下载程序方式 xff1b 2 6位数码管 xff08 做动态扫描及静态显示实验 xff09 3 8位LED发光二极管 xff08 做流水灯实验 xff09 4 MAX232芯片RS
  • 信息系统开发与管理

    信息化是这个时代的主旋律 xff0c 如何执她之手 xff0c 跟上她的节拍 xff0c 不掉队 xff0c 我相信 xff0c 聪明的读者 xff0c 你的答案一定跃然于心底 一本 信息系统开发与管理 xff0c 结合学生信息管理系统 x
  • 在与SQL Server建立连接时出现与网络相关的或特定于实例的错误

    向往前一样 xff0c 学习牛腩新闻发布系统的视频 xff0c 敲代码 xff0c 打开数据库 xff0c 出现一个框框 xff0c 详细内容如下 xff1a 数据库连接不上 xff0c 所有的工作都要歇班 xff0c 捣鼓了会儿 xff0
  • Sql Server服务远程过程调用失败

    由于开发系统 xff0c 需要vs版本统一 xff0c 于是经过了昨天一整天艰苦卓绝的斗争 xff0c 小编终于成功的写在了13版本的vs xff0c 重新装上了12版本的vs xff0c 本来想着 xff0c 12版本的vs搭建成功了 x
  • Android仿淘宝购物车demo

    夏的热情渐渐退去 xff0c 秋如期而至 xff0c 丰收的季节 xff0c 小编继续着实习之路 xff0c 走着走着 xff0c 就走到了购物车 xff0c 逛过淘宝或者是京东的小伙伴都知道购物车里面的宝贝可不止一件 xff0c 对于爱购
  • Android Demo---实现从底部弹出窗口

    在前面的博文中 xff0c 小编简单的介绍了如何制作圆角的按钮以及圆角的图片 xff0c 伴着键盘和手指之间的舞步 xff0c 迎来新的问题 xff0c 不知道小伙伴有没有这样的经历 xff0c 以App为例 xff0c 点击头像的时候 x
  • 浅谈如何带领好一个团队

    实习回来之后 xff0c 小编接手了一个新的项目 xff0c 市委组织部考核项目 xff0c 听着有没有很高大上 xff0c 因为这个项目是给国家机关做的 xff0c 跟他们打交道 xff0c 小编的心情只能用两个字来形容 xff0c 呵呵
  • 为什么说slam技术不等于智能导航?

    在机器人智能移动中 xff0c SLAM发挥了无可比拟的作用 xff0c SLAM simultaneous localization and mapping 也称为CML Concurrent Mapping and Localizati
  • 情不知所起,一“网”而深

    你只看到我的程序 xff0c 却没有看到背后的代码 xff1b 你有你的选择 xff0c 我有我的坚持 xff1b 你嘲笑我假期过节不回家陪父母 xff0c 我可怜你只在家向父母衣食伸手 xff1b 你可以轻视我的道路 xff0c 我会证明
  • 【项目实战】---首页一级分类的显示

    在前面的博文中 xff0c 小编主要简单的介绍了用户模块中的验证码程序是如何实现的 xff0c 今天继续来介绍我们的项目 xff0c 今天小编主要简单的介绍一下如何实现首页的一级分类的显示 xff0c 比如小伙伴现在看的CSDN xff0c
  • Kettle---初识

    最近因公司项目的原因 xff0c 小编接触到了Kettle这样一款工具 xff0c 感觉挺好玩儿的 xff0c 通过几天的探索和学习 xff0c 对 Kettlde 的使用有了一点点小心得 xff0c 小编打算把这段期间学习和探索到的关于
  • 读书笔记---《人月神话》

    台上一分钟 xff0c 台下十年功 宝剑锋从磨砺出 xff0c 梅花香自苦寒来 xff1b 不经一番寒彻骨 xff0c 哪得梅花扑鼻香 xff1b 业精于勤而荒于嬉 xff0c 行成于思而毁于随 不积跬步 xff0c 无以至千里 xff1b
  • Intel CPU型号官网详解

    https www intel cn content www cn zh processors processor numbers html
  • Nrf52832 freeOS系统移植

    最近因为项目开发需要 xff0c 需要多任务的操作系统在nrf52832上运行 xff0c 于是根据例程移植了下FreeOS系统 根据例程F nRF5 SDK 15 2 0 9412b96 examples ble peripheral b
  • tf 使用

    1 发布自己的tf xff1a 其实就是发布你建立的坐标系 步骤如下 xff1a 1 定义一个广播 xff0c 相当于发布话题时定义一个发布器 xff0c 还是以官方的小乌龟例程为例 xff1a span class hljs keywor