ROS TF坐标变换 - 位姿描述与消息类型

2024-01-02 02:12

本文主要是介绍ROS TF坐标变换 - 位姿描述与消息类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、位姿描述
  • 二、位姿相关消息体类型
    • 2.1 geometry_msgs/TransformStamped
    • 2.2 geometry_msgs/PoseStamped

在机器人系统中,有许多运动机构和传感器,为了描述他们之间的相对位姿关系,分别为他们定义了各自的坐标系,通过坐标系转换,就可以知道每个时刻各个组件的位姿。

ROS中通过TF包封装了常用的坐标系转换工具,目前ROS使用的是TF2,早在ROS Hydro以前,ROS使用的是TF。TF2相对TF,更加易用,效率更高,功能更加丰富。

ROS中通过类似topic的形式发布(广播)与订阅(监听)各组件间的位姿关系,接下来我们介绍这一机制。

一、位姿描述

位姿,即位置和姿态角。在二维空间中,使用二维点和相对于x轴正向的夹角(弧度)描述一个位姿:
P o s e 2 D = ( x , y ; θ x ) Pose_{2D}=(x,y; \theta_{x}) Pose2D=(x,y;θx)
类似的,在三维空间中,应该使用三维点和相对于xyz三个轴的夹角(弧度)描述一个位姿:
P o s e 3 D = ( x , y , z ; θ x , θ y , θ z ) Pose_{3D}=(x,y,z; \theta_{x},\theta_{y},\theta_{z}) Pose3D=(x,y,z;θx,θy,θz)
但在执行三维位姿变换时,这种表示会有一些问题。其中相对三轴的角度表示方法我们称为欧拉角(该方法是数学家欧拉提出的),欧拉角变换,需要相对XYZ轴进行三次变换,如果第二次变换角为 ± 9 0 ∘ \pm90^\circ ±90 时,第一次变换和第三次变换使用同一个轴,这就是欧拉角的万向锁问题。

所以欧拉角并不适用于三维变换计算,但由于其直观性,通常出现在人机交互场景,内部计算通常使用四元数。

四元数是复数空间的定义,即我们升了一个维度来表示三维旋转,一个四元数由一个实部和三个虚部组成:
q = q 0 + q 1 i + q 2 j + q 3 k q=q_0+q_1i+q_2j+q_3k q=q0+q1i+q2j+q3k
其中 i , j , k i,j,k i,j,k 满足:
{ i 2 = j 2 = k 2 = − 1 i j = − j i = k j k = − k j = i k i = − i k = j \begin{cases} \ i^2=j^2=k^2=-1\\ \ ij=-ji=k\\ \ jk=-kj=i\\ \ ki=-ik=j \end{cases}  i2=j2=k2=1 ij=ji=k jk=kj=i ki=ik=j
ROS的TF2中提供了相关的消息体格式与计算接口。

二、位姿相关消息体类型

常用的消息体有:geometry_msgs/TransformStampedgeometry_msgs/PoseStamped

geometry_msgs/TransformStamped 用于表示变换的信息(平移+旋转)

geometry_msgs/PoseStamped 用于表示坐标点的位姿(位置+姿态角)

2.1 geometry_msgs/TransformStamped

geometry_msgs/TransformStamped.msg 的内容如下:

Header header
string child_frame_id # the frame id of the child frame
Transform transform

说明:

它由三部分组成,headerchild_frame_idtransform

其中,headerstd_msgs/Header 类型,通常用于记录时间戳和坐标系id,结构如下:

uint32 seq      # 序列号
time stamp      # 时间戳
string frame_id # 父坐标系id

child_frame_id 用于表示变换中的子坐标系id

transform 是该变换的信息,结构如下:

Vector3 translation # 一个三维向量,表示平移
Quaternion rotation # 一个四元数,表示旋转

使用 rosmsg info geometry_msgs/TransformStamped 可以查看 geometry_msgs/TransformStamped 的全部信息,如下:

在这里插入图片描述

2.2 geometry_msgs/PoseStamped

geometry_msgs/PoseStamped 的内容如下:

Header header
Pose pose

说明:

它由两部分组成,headerpose

同样,header 用于记录时间戳和坐标系id,

pose 是坐标点的位姿,结构如下:

Point position         # 一个三维坐标,表示位置
Quaternion orientation # 一个四元数,表示姿态角

同样,使用 rosmsg info geometry_msgs/PoseStamped 可以查看 geometry_msgs/PoseStamped 的全部信息,如下:

在这里插入图片描述

这篇关于ROS TF坐标变换 - 位姿描述与消息类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561061

相关文章

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取