ROS-TF的使用(常用功能)

2023-05-16

tf 使用_人非人1991的博客-CSDN博客

一、TF中的数据格式:

这些数据格式全都是class

头文件:#include <tf/transform_datatypes.h>基本上可以包含所有的tf数据类型

(1)tf::Vector3

tf::Vector3 point;

默认构造一个对象:tf::Vector3(float x, float y, float z)

对于tf::Vector3对象还有set与get方法。

1)举例:构造一个xyz分别为0,0,0的对象  tf::Vector3(0,0,0)

2)举例:使用geometry_msgs::PoseStampedPtr pose构造一个对象

tf::Vector3(pose->pose.position.x,pose->pose.position.y,pose->pose.position.z)

(2)tf::Quaternion

tf::Quaternion q;

1) 举例:使用geometry_msgs::PoseStampedPtr pose构造一个对象

tf::quaternionMsgToTF(pose->pose.orientation,q);   //把geomsg形式的四元数转化为tf形式,得到q

2) q.setRPY(Rtheta,Ptheta,Ytheta);//根据已经知道的欧拉角进行设置q,分别是child_frame绕着frame坐标系下的roll(绕X轴),pitch(绕Y轴),yaw(绕Z轴)

已知q,获取roll,pitch,yaw

tf::Matrix3x3(q).getRPY(roll,pitch,yaw);

3)tf_q = tf::createQuaternionFromYaw( theta ); theta是绕z轴旋转角,其他两个轴旋转角为0;

tf_q = tf::createQuaternionFromRollPitchYaw(roll,pitch,yaw);

如要生成ros_q,可以直接使用 :ros_q = tf::createQuaternionMsgFromYaw(theta);

ros_q = tf::createQuaternionMsgFromRollPitchYaw(roll,pitch,yaw);

4) q = tf::Quaternion(0,0,0,1);//直接通过参数设置q,0,0,0,1代表没有任何旋转

拓展:把tf四元数转化为geomsg四元数

geometry_msg::Quaternion msg_q;

tf::quaternionTFToMsg(tf_q,msg_q);

(3)tf::Transform

tf::Transform transform

1) transform = tf::Transform( tf::Quaternion(0,0,0,1) , tf::Vector3(0,0,0) );   //使用参数初始化,得到transform

2) transform. setRotation( tf_q );

transform.setOrigin( tf_point );    //通过set方法得到transform

(4)tf::StampedTransform

这种类型是由tf::Transform作为父类继承而来的

tf::StampedTransform stamped_transform

stamped_transform = tf::StampedTransform( transform, ros::Time::now(), "frame", "child_frame");     //使用参数初始化得到

可以直接获取stamped_transform.getRotation(),   stamped_transform.getOrigin();


二、tf::TransformBroadcaster

发布TF

头文件:#include< tf / transform_broadcaster.h  >

tf::TransformBroadcaster broadcaster;    //定义发布器

broadcaster.sendTransform( stamped_transform ) ;   //发布一个tf,stamped_transform是一个tf::StampedTransform类型的数据。

三、tf::TransformListener

头文件:#include< tf / transform_listener.h>

tf::TransformListener  listener   //定义监听器     
(1)lookuoTransform();   //获取tf

tf::StampedTransform stamped_transform;   //定义存放变换关系的变量
try
{
//得到child_frame坐标系原点,在frame坐标系下的坐标与旋转角度
      listener.lookupTransform("frame", "child_frame",ros::Time(0), stamped_transform);                   
}
    catch (tf::TransformException &ex)
{
      ROS_ERROR("%s",ex.what());
      ros::Duration(1.0).sleep();
      continue;
}

获取到stamped_transform后可以使用这些信息

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

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

(2)transformPoint()

在实际应用中需要将一个坐标系下的点转化到另一个坐标系下

//将child_frame坐标系下的Point1,转化到frame坐标系下,存储在point2中
geometry_msgs::PointStamped point1;
point1.header.stamp=ros::Time();
point1.header.frame_id="child_frame";
point1.point.x=1;
point1.point.y=2;
point1.point.z=3;
geometry_msgs::PointStamped point2;
try
{
     listener.transformPoint("frame",point1,point2);
}
catch (tf::TransformException &ex) 
{
    ROS_ERROR("%s",ex.what());
    ros::Duration(1.0).sleep();
 }

四、四元数转欧拉角

/*********四元数转欧拉角********/
tf::Quaternion tf_q;
tf::quaternionMsgToTF(amcl_pose.pose.pose.orientation,tf_q);
double roll,pitch,yaw;
tf::Matrix3x3(tf_q).getRPY(roll,pitch,yaw);

//四元数转yaw角
tf::getYaw(tf_q);
tf::getYaw(ros_q);

/********欧拉角转四元数*****/
ros_q = tf::createQuaternionMsgFromYaw(yaw);
rt_q = f::createQuaternionFromYaw(yaw);
ros_q = tf::createQuaternionMsgFromRollPitchYaw(roll,pitch,yaw);
tf_q = tf::createQuaternionFromRollPitchYaw(roll,pitch,yaw);
tf_q.setRPY(roll,pitch,yaw);

void GetXYZWFromRPY(double roll, double pitch, double yaw, double& x, double& y, double& z, double& w)
{
  roll /= 2;
  pitch /= 2;
  yaw /= 2;
  x = sin(roll) * cos(pitch) * cos(yaw) - cos(roll) * sin(pitch) * sin(yaw);
  y = cos(roll) * sin(pitch) * cos(yaw) + sin(roll) * cos(pitch) * sin(yaw);
  z = cos(roll) * cos(pitch) * sin(yaw) - sin(roll) * sin(pitch) * cos(yaw);
  w = cos(roll) * cos(pitch) * cos(yaw) + sin(roll) * sin(pitch) * sin(yaw);
}

五、已知tf::Transform tf 和其中一个坐标系下的 pose 可以将其转化到另一个坐标系下

geometry_msgs::Pose transformPose(geometry_msgs::Pose &pose, tf::Transform &tf)
{
    tf::Pose tf_pose;
    tf::poseMsgToTF(pose,tf_pose);

    tf_pose = tf * tf_pose;

    geometry_msgs::Pose ros_pose;
    tf::poseTFToMsg(tf_pose, ros_pose);

    return ros_pose;
}

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

ROS-TF的使用(常用功能) 的相关文章

  • python:函数传参是否会改变函数外参数的值

    参考链接 xff1a https blog csdn net u012614287 article details 57149290 https blog csdn net qq915697213 article details 66972
  • Catkin创建工程

    介绍 catin make编译过程 xff0c cmake指令依据你的CMakeLists txt 文件 生成cmakefiles和makefile文件 make再依据此cmakefiles和makefile文件编译链接生成可执行文件 ca
  • ros中使用serial包实现串口通信

    一 Ubuntu下的串口助手cutecom 1 安装cutecom并打开 xff1a sudo apt get install cutecom sudo cutecom 2 查看电脑链接的串口信息 xff08 名称 xff09 xff1a
  • 构造函数后冒号的作用

    构造函数后面的冒号起分割作用 xff0c 是类给成员变量赋值的方法 xff0c 初始化列表 xff0c 更适用于成员变量的常量const型 struct XXX XXX y 0xc0
  • 字节序(byte order)和位序(bit order)

    字节序 byte order 和位序 bit order 在网络编程中经常会提到网络字节序和主机序 xff0c 也就是说当一个对象由多个字节组成的时候需要注意对象的多个字节在内存中的顺序 以前我也基本只了解过字节序 xff0c 但是有一天当
  • __thread关键字

    thread是GCC内置的线程局部存储设施 xff0c 存取效率可以和全局变量相比 thread变量每一个线程有一份独立实体 xff0c 各个线程的值互不干扰 可以用来修饰那些带有全局性且值可能变 xff0c 但是又不值得用全局变量保护的变
  • SCRUM框架包括3个角色、3个工件、5个活动、5个价值

    转自http www scrumcn com agile scrum knowledge library scrum html SCRUM 是一个用于开发和维持复杂产品的框架 Scrum 是一个用于开发和维持复杂产品的框架 xff0c 是一
  • Hadoop伪分布式安装步骤

    Hadoop伪分布式安装步骤 目录 Hadoop伪分布式安装步骤 一 永久关闭防火墙 二 配置主机名 1 编辑network文件 xff1a vim etc sysconfig network 2 将HOSTNAME属性改为指定的主机名 x
  • MPU6050的一些问题及解决办法

    最近做的项目要用到MPU6050 xff0c 出现了以下这些问题 xff1a 当然 xff0c 也有一些奇怪的事 xff0c 我是在淘宝上买的现成的模块 xff0c 那个ADO无论接地还是高电平 xff0c MPU的地址都是用0xD0 xf
  • 程序员的期望与现实

    来自 xff1a 程序员最幽默 xff08 ID xff1a humor1024 xff09 0 我期望的代码 VS 实际代码的工作方式 1 我认为我的代码 VS 项目经理看到的代码 2 我心里想做的架构 VS 我真正写出来的架构 3 开发
  • PixHawk Bootloader

    在https github com PX4这里下载的Bootloader代码 xff0c 编译TARGET HW PX4 FMU V2这个版本的 xff0c 然后将代码烧录到STM32F4探索者这块开发板上 xff0c 代码能够正常运行 x
  • 解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本不匹配的问题

    解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本 xff08 同时内核存在问题 xff09 不匹配的问题 不要轻易升级显卡驱动版本 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xf
  • NVIDIA Jetson Xavier NX入门(1)——镜像烧写

    NVIDIA Jetson Xavier NX入门 xff08 1 xff09 镜像烧录 1 准备SD卡并且格式化 推荐使用SD Card Formater软件进行SD卡格式化 xff0c SD Card Formater软件下载地址 界面
  • NVIDIA Jetson Xavier NX入门(2)——系统设置;环境搭建

    NVIDIA Jetson Xavier NX入门 xff08 2 xff09 系统设置 环境搭建 1 NVIDIA Jetson Xavier NX连接显示器 键盘 鼠标 xff1b 2 Jetson Xavier NX连接电源后 xff
  • NVIDIA Jetson Xavier NX使用UART进行串口通信

    NVIDIA Jetson Xavier NX使用UART进行串口通信 一 NVIDIA Jetson Xavier NX的40pin接口 NVIDIA Jetson Xavier NX开发板俯视图 xff1a 2 开发板上打印出的UART
  • 远程服务器时Ubuntu报错:qt.qpa.xcb: could not connect to display

    远程服务器时Ubuntu报错 xff1a qt qpa xcb could not connect to display 远程服务器时Ubuntu报错 xff1a qt span class token punctuation span q
  • linux下USB设备编号固定

    linux下USB设备插入时系统自动分配编号 xff0c 多个相同设备时 xff0c 按插入顺序分配编号 以串口为例 xff0c 插入的USBtoSerial顺序不一样时 xff0c 系统分配的设备号是不一样的 但是每个USB接口对设备来说
  • Java进阶书籍推荐

    学习Java xff0c 书籍是必不可少的学习工具之一 xff0c 尤其是对于自学者而言 废话不多说 xff0c 下边就给大家推荐一些Java进阶的好书 第一部分 xff1a Java语言篇 1 Java编程规范 适合对象 xff1a 初级
  • GitHub+Docker Hub自动构建镜像

    一 什么是Dockerfile xff1f Dockerfile是一个包含用于构建镜像的命令的文本文档 可以使用在命令行中调用任何命令 Docker通过读取Dockerfile中的指令自动生成镜像 它们简化了从头到尾的流程并极大的简化了部署
  • 前端工程化 - 剖析npm的包管理机制(完整版)

    导读 现如今 xff0c 前端开发的同学已经离不开 npm 这个包管理工具 xff0c 其优秀的包版本管理机制承载了整个繁荣发展的NodeJS社区 xff0c 理解其内部机制非常有利于加深我们对模块开发的理解 各项前端工程化的配置以加快我们

随机推荐

  • GPRS模块开发初步(软件)

    文章来源 xff1a http blogold chinaunix net u1 56388 showart 1121149 html 1 AT 指令简介 AT 指令集一般指专门用来控制调制解调器的指令集 该指令集最初由美国 Hayes 公
  • 【安装库】matlab2020b安装及百度网盘提速

    安装库 matlab2020b安装及百度网盘提速 matlab2020b安装 一 xff0c 下载 百度网盘 链接 xff1a https pan baidu com s 18iLFaAbWt8IntUefX3eWfA 提取码 xff1a
  • FreeRTOS系统中CPU使用率统计方法分析

    FreeRTOS系统中CPU使用率统计方法分析 基本概念 操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标 它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题 而CPU使用率也不能过高 xff0c 避免资源
  • NVIDIA GeForce 940M 设备是不可移动的,无法弹出或拔出问题解决办法

    上个月在新入手的笔记本上安装了一个CUDA的开发环境 xff0c 并选择安装了GeForce Experience工具 xff0c 前两天打开GeForce Experience工具浏览时 xff0c 工具提醒可以更新NVIDIA显卡驱动
  • 大学生职业规划要穿“营销三点式”

    我们现在就是这样的环境 xff0c 这样的 教育 xff0c 这样的模式 xff0c 这一切是无法改变的 xff0c 那你适应它吗 xff1f 不是 xff0c 你若适应它 xff0c 你只能茫然 xff01 为什么 xff1f 因为你适应
  • 网络与串口调试工具TCPCOM

    TCPCOM xff0c 网络与串口二合一调试助手 xff0c 将网络调试助手与串口调试助手合二为一 xff0c 绿色软件 xff0c 简单高效 软件特色 1 支持中英文双语言 xff0c 自动根据操作系统环境选择系统语言类型 xff1b
  • Cmake以及CmakeLists

    CMake使用 CMake1 gcc make和CMake的关系2 CMake一般使用流程2 1 生成构建系统2 2 执行构建 xff08 比如make xff09 xff0c 生成目标文件 xff1b 2 3 执行测试 安装或打包 3 C
  • 卡尔曼滤波公式及其详细推导(不涉及矩阵求导)

    卡尔曼滤波公式及推导 1 前言 卡尔曼滤波 Kalman Filter 是一种关于线性离散系统滤波问题的递推算法 其使用递推的形式对系统的状态进行估计 xff0c 以测量中产生的误差为依据对估计值进行校正 xff0c 使被估计的状态不断接近
  • Nmap常用命令及扫描原理

    Nmap常用参数 sS TCP SYN扫描 sU UDP扫描 sA ACK扫描 sW 窗口扫描 scanflags RSTSYNFIN 自定义扫描 O 检测目标操作系统类型 sV 检测目标上运行服务的版本 v 增加输出信息的详细程度 vv
  • pixhawk无人机结合openmv之精准降落

    pixhawk飞控与openmv之精准降落 一 精准降落概述二 精准降落流程三 代码逻辑流程四 总结反思改进 一 精准降落概述 1 概述 无人机在生产生活中逐渐获得更大的用途 xff0c 京东的物流无人机有望解决用户快递最后一分钟的问题 x
  • ROS Catkin 教程之 catkin_package(...) 到底在做什么?

    While looking at a CMakeLists txt file I was wondering the exact meaning of the CATKIN DEPENDS option of the catkin pack
  • c++中的sstream

    include lt sstream gt 头文件中主要包含了stringstream xff0c 可以用来进行数据格式转换 std stringstream ss 1 注意每当调用一次 lt lt 和 gt gt 后 xff0c stri
  • boost库之geometry

    Boost Geometry介绍 love code love life CSDN博客 boost geometry include lt boost assign hpp gt include lt boost geometry geom
  • Ali OSS

    常用工具 对象存储 OSS 阿里云
  • c++ 使用 matplotlibcpp

    xff08 1 xff09 拷贝matplotlibcpp h头文件到自己工程 GitHub lava matplotlib cpp Extremely simple yet powerful header only C 43 43 plo
  • Ubuntu16.04操作系统的安装

    由于今年才开始接触Linux操作系统 xff0c 并且一直在使用Ubuntu16 04 xff0c 已经在计算机上安装过很多次 xff0c 今天就在此总结一下Ubuntu16 04的安装 xff08 今天开到一位同事博客点击打开链接写的非常
  • 在Linux(Ubuntu)中使用终端编译并运行.c和.cpp文件

    首先要保证系统中安装了C语言和C 43 43 对应的编译器 xff1a gcc gt C g 43 43 gt C 43 43 1 c文件的编译与运行 xff08 1 xff09 c文件hello c代码如下 xff1a include l
  • ubuntu软件的编译安装方式

    在Linux操作系统上安装了好几天的VTK PCL OpenCV后来总结出了一条规律 xff0c 就是Linux下软件编译安装的方法 xff0c 困扰了自己好几天 xff0c 终于解决了 xff0c 所以乘热打铁现总结一下 xff0c 希望
  • C/C++字符串长度的计算

    char ch1 10 61 39 s 39 39 h 39 39 0 39 39 h 39 char ch2 61 34 sh 0h 34 char ch3 61 34 shh 34 xff08 1 xff09 strlen 统计字符串存
  • ROS-TF的使用(常用功能)

    tf 使用 人非人1991的博客 CSDN博客 一 TF中的数据格式 xff1a 这些数据格式全都是class 头文件 xff1a include lt tf transform datatypes h gt 基本上可以包含所有的tf数据类