UR机械臂位置数据旋转矢量与欧拉角变换

2024-04-24 04:44

本文主要是介绍UR机械臂位置数据旋转矢量与欧拉角变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UR机械臂位置数据旋转矢量与欧拉角变换

​ 本文介绍在UR机械臂控制过程在,使用函数返回的数据为旋转矢量,但是该数据对于控制非常不友好,我们需要将旋转转化为欧拉角的数据,才可以直观观察到工具端相对于不同轴旋转的角度。本文针对这一问题,描述旋转矢量与欧拉角转换的概念,以及如何通过Python代码进行两者之间相互转换的函数。

参考链接:https://forum.universal-robots.com/t/pose-rotation-order/223/2

旋转矢量->欧拉角

​ 欧拉角是用来描述刚体在固定坐标系下的方向的三个角任何方向都可以通过围绕一个坐标系的轴组成三个基本旋转来实现。具体来说,从参照系出发,分别沿X、Y、Z轴旋转γ、β、α的角度,就可以得到方向。参考框架以蓝色显示,旋转方向以红色显示。角γ, β和α也可以称为RPY(滚转,俯仰和偏航)。

在这里插入图片描述

​ 欧拉角用于理解机器人的方向,但它应该转换为旋转矩阵,以进行运动学和动力学等计算。给定欧拉角γ, β和α,旋转矩阵可由下式计算。

在这里插入图片描述
在这里插入图片描述

​ 给定旋转矩阵R,欧拉角由下式确定。

在这里插入图片描述

​ python解算代码如下所示:

# 将旋转矢量转为欧拉角
def rotvec2rpy(self, pose):rx, ry, rz = posetheta = np.sqrt(rx * rx + ry * ry + rz * rz)kx = rx / thetaky = ry / thetakz = rz / thetacth = np.cos(theta)sth = np.sin(theta)vth = 1 - np.cos(theta)r11 = kx * kx * vth + cthr12 = kx * ky * vth - kz * sthr13 = kx * kz * vth + ky * sthr21 = kx * ky * vth + kz * sthr22 = ky * ky * vth + cthr23 = ky * kz * vth - kx * sthr31 = kx * kz * vth - ky * sthr32 = ky * kz * vth + kx * sthr33 = kz * kz * vth + cthbeta = np.arctan2(-r31, np.sqrt(r11 * r11 + r21 * r21))# 这里需要判断分母为cos(beta)=0的情况if beta > np.deg2rad(89.99):beta = np.deg2rad(89.99)alpha = 0gamma = np.arctan2(r12, r22)elif beta < -np.deg2rad(89.99):beta = -np.deg2rad(89.99)alpha = 0gamma = -np.arctan2(r12, r22)else:cb = np.cos(beta)alpha = np.arctan2(r21 / cb, r11 / cb)gamma = np.arctan2(r32 / cb, r33 / cb)rpy = np.zeros(3)rpy[0] = gammarpy[1] = betarpy[2] = alphareturn rpy

欧拉角->旋转矢量

​ 轴角表示通过一个单位向量𝑢表示旋转轴的方向,一个角度e .描述绕轴旋转的大小来参数化线性空间中的旋转轴角表示可以定义两个方向之间的关系。

在这里插入图片描述

​ 如果我们有一个固定的参考系,比如UR机器人的基本框架,我们可以用四个数字来表示任何方向:三个元素代表单位方向矢量和一个角度。如果我们乘以单位方向矢量的每个元素的角度,我们可以减少到三个数值,我们可以称之为旋转矢量

在这里插入图片描述

​ 轴角表示在机器人控制中很有用,因为它不受欧拉角的连续性和旋转序列问题的限制。然而,物理方向与旋转矢量的数值之间很难匹配。在UR机器人中,我们使用旋转向量来表示机器人姿势的方向。要转换为旋转矩阵,旋转矢量应分为角度矢量和单位方向矢量。

在这里插入图片描述

然后,需要进一步计算如下。

在这里插入图片描述

给定一个旋转矩阵,旋转向量可以计算如下:

在这里插入图片描述

​ python解算代码如下所示:

# 将欧拉角转为旋转矢量
def rpy2rotvec(self, pose):gamma, beta, alpha = poseca = np.cos(alpha)cb = np.cos(beta)cg = np.cos(gamma)sa = np.sin(alpha)sb = np.sin(beta)sg = np.sin(gamma)rotation_matrix = np.zeros((3, 3))rotation_matrix[0, 0] = ca * cbrotation_matrix[0, 1] = ca * sb * sg - sa * cgrotation_matrix[0, 2] = ca * sb * cg + sa * sgrotation_matrix[1, 0] = sa * cbrotation_matrix[1, 1] = sa * sb * sg + ca * cgrotation_matrix[1, 2] = sa * sb * cg - ca * sgrotation_matrix[2, 0] = -sbrotation_matrix[2, 1] = cb * sgrotation_matrix[2, 2] = cb * cgtheta = np.arccos((rotation_matrix[0, 0] + rotation_matrix[1, 1] + rotation_matrix[2, 2] - 1) / 2)sth = np.sin(theta)if sth == 0:return np.zeros(3)kx = (rotation_matrix[2, 1] - rotation_matrix[1, 2]) / (2 * sth)ky = (rotation_matrix[0, 2] - rotation_matrix[2, 0]) / (2 * sth)kz = (rotation_matrix[1, 0] - rotation_matrix[0, 1]) / (2 * sth)rovetc = np.zeros(3)rovetc[0] = theta * kxrovetc[1] = theta * kyrovetc[2] = theta * kzreturn rovetc

如有表述错误或侵权,请指正,谢谢

这篇关于UR机械臂位置数据旋转矢量与欧拉角变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat