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

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2