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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

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语句✅ 基本语