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;
}

ROS-TF的使用(常用功能)相关推荐

  1. 5 ROS的安装与常用操作简介

    5.1 ROS是什么? ROS(Robot Operating System机器人操作系统)是面向机器人的开源的元操作系统(meta-operating system).它能够提供类似传统操作系统的诸 ...

  2. asp.net 常用功能

    每每看到一些月经贴 日日贴的时候很费解 这里想搜集一些大家平时用到的常见功能代码或者组建之类的. 我列举一下. asp.net 常用功能  1各种导入导出 2各种上传下载(大文件,多文件,进度条,无刷 ...

  3. ROS Noetic入门笔记(二)ROS Noetic创建工作空间和功能包

    ROS Noetic入门笔记(一)在ubuntu20.04中安装ROS Noetic并简单测试 ROS Noetic入门笔记(二)ROS Noetic创建工作空间和功能包 ROS Noetic入门笔记 ...

  4. ROS TF原理和使用方法

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

  5. nginx介绍及常用功能

    什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务. Apache:重量级的,不支持高并发的服务器.在Apache上运行数以万计的并发访 ...

  6. Photoshop抠图、污点处理等常用功能及快捷键

    Photoshop抠图.污点处理等常用功能及快捷键 局部图片获取 图片污点修护 各种乱七八糟的常用东西 常用快捷键 常用功能的查看与设置 局部图片获取 a.钢笔工具创建路径后改为选区 b.选区工具3连 ...

  7. SAP MM不常用功能之供应商Rebate

    SAP MM不常用功能之供应商Rebate 采购中的返利流程 返利协议是卖方和买方之间签订的合同,在供应特定价值的物料时给予一定百分比的折扣. 下面是SAP系统中实现该业务场景的具体步骤. Step ...

  8. SAP QM 不常用功能点之 Physical-Sample Record

    SAP QM 不常用功能点之 Physical-Sample Record A record that contains all master data and transaction data fo ...

  9. 大白菜软件常用功能介绍

    大白菜软件常用功能介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.刻录光盘介绍 1.选择你需要的刻录的光盘 2.点击刻录光盘 3.确认之后点击刻录 4.等待刻录完成 转载于 ...

  10. [转]WebPack 常用功能介绍

    概述 Webpack是一款用户打包前端模块的工具.主要是用来打包在浏览器端使用的javascript的.同时也能转换.捆绑.打包其他的静态资源,包括css.image.font file.templa ...

最新文章

  1. 超级网管员原有QQ群己满,现增加新群
  2. webServer tomcat5/tomcat6/tomcat7诠释
  3. tomcat如何查找请求资源的?
  4. 工信部副部长怀进鹏:信息产业呈现四大发展特点
  5. Access 利用模版实现条码打印功能
  6. 经典实战教程!java编译器eclipse
  7. cssrem转换工具_微信小程序开发-rem转换rpx小工具
  8. MySQL双主高可用架构之MMM实战
  9. 舒尔特表-最终版 js
  10. 十年优秀网络玄幻小说大点评(推荐)
  11. 【PS | 学习】蛋黄酥海报制作
  12. CBAM、通道注意力、空间注意力学习
  13. Linux 平台上的软件包管理
  14. Android之雪花飘落效果
  15. 【小技术】数据库显示“远程过程调用失败”怎么办?
  16. three.js和D3.js
  17. 企业微信封号规则及解封
  18. 35款 JavaScript 图形图表库
  19. 信息化项目网络安全方案编制
  20. 中英文说明书丨 AbFluor 488 细胞凋亡检测试剂盒

热门文章

  1. MSF渗透测试android手机
  2. 如何删除数据库表中重复的数据
  3. 新学期,新气象|进入大学你会......
  4. 0.1+0.2==0.3吗?
  5. Ubuntu创建文件夹和创建文件命令
  6. 微信小程序 获取数组长度
  7. 亚马逊推出3D Fire智能手机
  8. tp5.1使用setInc失效的原因,以及解决方法
  9. linux查看硬盘是否挂载--和磁盘相关命令
  10. 单调队列java_浅谈单调队列优化dp