机器人算法—ROS TF坐标变换

1.TF基本概念

(1)什么是TF?
TF是Transformations Frames的缩写。在ROS中,是一个工具包,提供了坐标转换等方面的功能。
tf工具包,底层实现采用的是一种树状数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助程序员在任意时间,将点、向量等数据的坐标,在两个参考系中完成坐标变换。
(2)为什么需要坐标转换?
坐标转换最主要要解决的是位置和姿态问题。
(3)什么是位置? 我在哪里说的就是位置问题。
(4)什么是姿态?我摆了个什么造型给你看,是横着的,竖着的,躺着的,这个就是姿态。
其实坐标转换解决的问题是 我在什么位置摆了个什么造型的问题。
其实描述一个物体的位置,我们有很多种方式。
例如我们描述一下月球的位置:
在这里插入图片描述
上图中,我们可以说月亮在地球的左上方xxx公里,也可以说在火星左下方xxx公里。

但是如果我们看看实时运行图时
在这里插入图片描述
我们不能简单的描述:
月亮在地球的左上方xxx公里,在火星左下方xxx公里。
因为他是实时运动的,这个时候我们要采用一定规则对坐标进行描述,还要实时动态的计算出来。
坐标描述规则就是位置和姿态。
位置的描述也都是采用相对的策略。
实时计算就是将两两相对的位置,转换为另外两两相对的位置。

2.TF使用的场景

在这里插入图片描述
在这里插入图片描述
机器人每个关节的传感和运动都是参考自身 以上面的机器人烹饪为例, 头部的视觉传感器(摄像头)参考自己, 计算出煎饼和锅距离自己的距离.
机器人的左手右手的运动又是根据自己的当前位置来控制空间坐标的移动.
如果想让机器人各个部件能够协同工作, 就要建立一种世界坐标系统, 可以让各个node节点坐标系的点和向量可以互相转换.

3.TF工作原理

坐标系
右手法则
在这里插入图片描述
姿态RPY
roll: 翻滚 pitch: 俯仰 yaw: 偏航

TF构成
ros中,tf工具包包含了三块内容:Broadcaster,Listener,TF转换工具
要弄清楚怎么使用TF工具包,首先我们要明确位置关系描述。
位置关系描述是通过相对坐标系来的。相对坐标系就是一个参照物,我们在这个参照物下,来说明自己的位置和姿态。

4.TF工作原理

在这里插入图片描述
ROS中提供的是TF转换工具。转换是通过两个部分来完成的。
Broadcaster负责向TF工具广播 参照物和自己的位置关系
Listener负责向TF工具查看 想要知道的两个物体间的相对坐标
TF工具底层是通过向量来去实现的。

5.案例一

TF开发流程

  1. 建立Broadcaster,将小乌龟1坐标发送给TF工具
void callback(const turtlesim::Pose::ConstPtr &message, tf::TransformBroadcaster broadcaster) {tf::Transform transform;//设置位置transform.setOrigin(tf::Vector3(message->x, message->y, 0));//设置姿态tf::Quaternion quaternion;quaternion.setRPY(0, 0, message->theta);transform.setRotation(quaternion);broadcaster.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", "turtle1"));
}

我们在小乌龟pose回调中,得到小乌龟相对于窗体的坐标信息(message)。
broadcaster在发送相对位置信息时,需要给定两个类型的数据:
在相对环境中的 坐标(origin),包含x,y,z坐标
在相对环境中的姿态 (rotation),包含x,y,z方向的转动情况
在发送数据时,要标明谁相对谁的位置。参照物我们认为是父坐标。

  1. 建立Broadcaster,将小乌龟2坐标发送给TF工具¶
    参考第1步骤

  2. 建立Listener,通过查看TF工具获得小乌龟1和小乌龟2间的相对坐标

tf::TransformListener listener;
ros::Rate rate(10);
while (ros::ok()) {tf::StampedTransform transform;try {listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);} catch (exception e) {ROS_INFO_STREAM(e.what());rate.sleep();continue;}tf::Vector3 &origin = transform.getOrigin();double x = origin.x();double y = origin.y();const tf::Quaternion &quaternion = transform.getRotation();double theta = quaternion.z();
}

转换监听器listener可以从TF工具中,获得想要的两个物体间的相对坐标。
前一个参数是作为参照物存在的,坐标和姿态都是(0,0,0)
第二个参数是相对于第一个参数的参照物的坐标和姿态。

Reference

  1. TF工作原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/208650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022年03月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 红框中加入哪个选项积木,不能阻止气球下落? A: B: C: D:

实现极坐标图表QPolarChart的角度轴范围是[0,360]时,0度在水平右侧

目录 参考角度轴范围是[0,360]时,0度在水平右侧.h.cpp 参考 Qt数据可视化(QPolarChart雷达图) 默认QPolarChart的范围是[0,360]时,0度在垂直上方 如官方例子QValueAxis角度轴范围是[-100,100] 角度轴范围是[0,360]时,0度在水平右侧 原理&am…

@Scheduled注解 定时任务讲解

用于在Java Spring框架中定时执行特定任务的注解 Scheduled,它能够指定方法在特定时间间隔或特定时间点执行。默认参数是cron,cron参数被用来定义一个Cron表达式,它代表了任务执行的时间规则 参数如下 Cron 这是是一种时间表达式&#xff…

模拟量采集----测量输入的电流

生活中的模拟量有很多 大多都为电压信号和电流信号 今天讲如何测量输入的电流信号 通过欧姆定律可知 电流测量的测量:是将电流加载在固定阻值的电阻上,来测量这个电阻二端的电压 最后反算出电流的大小 所用的公式是IU/R 我们使用仿真软件来看测量…

CST同轴馈电步骤

CST同轴馈电步骤 算例1. 同轴内芯2. 填充材料3. 外皮4. GND减去一个圆形,使EMWAVE可以通过5. 添加端口6. 结果比较 算例 cst模型库中的一个圆贴片 1. 同轴内芯 2. 填充材料 他这里直接使用和介质基板一样的材料并且进行了合并,我就懒得再改了&#x…

使用Pytorch从零开始构建WGAN

引言 在考虑生成对抗网络的文献时,Wasserstein GAN 因其与传统 GAN 相比的训练稳定性而成为关键概念之一。在本文中,我将介绍基于梯度惩罚的 WGAN 的概念。文章的结构安排如下: WGAN 背后的直觉;GAN 和 WGAN 的比较;…

一点DETR学习

DETR: 主要是为了学习query。 主要从两个方面:加偏好和缩短序列长度

Docker Swarm总结(1/3)

目录 1、swarm 理论基础 1.1 简介 1.2 节点架构 1.3 服务架构 1.4 服务部署模式 2、swarm 集群搭建 2.1 需求 ​2.2 克隆主机 2.3 启动5个docker宿主机 2.4 查看 swarm 激活状态 2.5 关闭防火墙 2.6 swarm 初始化 2.7 添加 worker 节点 2.8 添加 manager 节点 3、…

鸿蒙4.0开发笔记之ArkTs语言基础与基本组件结构(四)

文章声明&#xff1a;本文关于HarmonyOS系统的部分内容和描述借鉴于华为官网的“HarmonyOS开发者学堂”&#xff0c;有需要的也可以进入官网查看。<HarmonyOS第一课>ArkTS开发语言介绍 一、ArkTs语言介绍 ArkTS是鸿蒙系统&#xff08;HarmonyOS&#xff09;优选的主力应…

老生常谈之 JavaScript 中 0.1 + 0.2 != 0.3 的原因

先来一个模棱两可的说法&#xff1a;因为精度丢失、存储溢出的问题 先复习一下二进制的转换方法&#xff1a; 整数&#xff1a;除以基数&#xff0c;取余&#xff0c;自底向上小数&#xff1a;乘以基数&#xff0c;取整&#xff0c;自顶向下 接着&#xff0c;复习一下双精度…

二叉搜索树java实现

顾名思义&#xff0c;二叉搜索树是一棵二叉树&#xff0c;每个节点就是一个对象&#xff0c;这个对象包含属性left、right和parent。left指向节点的左孩子&#xff0c;right指向节点的右孩子&#xff0c;parent指向节点的父节点&#xff08;双亲&#xff09;。如果某个孩子节点…

MySql表中添加emoji表情

共五处需要修改。 语句执行修改&#xff1a; ALTER TABLE xxxxx CONVERT TO CHARACTER SET utf8mb4;