ABB机器人欧拉角与四元数的相互转化以及旋转矩阵的求法

这篇具有很好参考价值的文章主要介绍了ABB机器人欧拉角与四元数的相互转化以及旋转矩阵的求法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

做项目时用到ABB机器人,直接通过ABB内置的函数可以轻松实现四元数读数与欧拉角的相互转化。但实际项目需要从示教器读出相关位置并自行计算,尤其需要计算旋转矩阵。

本文以ABB IRB120机器人(不确定其他机器人是否与ABB机器人一致)为例如下姿态为例来描述上述几个量的计算。
abb机器人欧拉角转换,数学算法,机器人,矩阵,matlab
图1 机器人在Robot studio中的姿态
abb机器人欧拉角转换,数学算法,机器人,矩阵,matlab
图2 示教器中四元数读数

abb机器人欧拉角转换,数学算法,机器人,矩阵,matlab
图3 示教器中欧拉角读数
值得注意的是,ABB机器人的欧拉角是ZYX欧拉角。

1. 求旋转矩阵

(1) 已知四元数求旋转矩阵

此处给出matlab代码:

q=[0.27367, 0.75058, 0.46598, 0.38025];
fprintf('Quaternion rotation matrix: \n');
disp(Rotation(q));

function R = Rotation(Q)
    Q = Q./sqrt(sum(Q.*Q));
    q0 = Q(1); q1 = Q(2); q2 = Q(3); q3 = Q(4);
    R = [q0^2 + q1^2 - q2^2 - q3^2, 2*(q1*q2 - q0*q3), 2*(q1*q3 + q0*q2);
             2*(q1*q2 + q0*q3), q0^2 - q1^2 + q2^2 - q3^2, 2*(q2*q3 - q0*q1);   
             2*(q1*q3 - q0*q2), 2*(q2*q3 + q0*q1), q0^2 - q1^2 - q2^2 + q3^2;
            ];
end

结果为:

Quaternion rotation matrix: 
    0.2765    0.4914    0.8259
    0.9076   -0.4159   -0.0564
    0.3158    0.7652   -0.5610
(2) 已知欧拉角求旋转矩阵

此处用到了Matlab Robotics Toolbox工具箱,这是一个机器人仿真和建模非常好用的工具箱,以下给出安装链接:

Matlab Robotics Toolbox工具箱安装教程
1.https://www.bilibili.com/read/cv14423551
2.https://petercorke.com/toolboxes/robotics-toolbox/

以下为matlab代码:

fprintf('Euler rotation matrix: \n');
disp(rotz(73.06,'deg')*roty(-18.41, 'deg')*rotx(126.25, 'deg'));

其中rotx,roty, rotz为Matlab Robotics Toolbox工具箱中的函数。
结果为:

Euler rotation matrix: 
    0.2765    0.4914    0.8259
    0.9077   -0.4159   -0.0563
    0.3158    0.7652   -0.5610

可以看到采用四元数与欧拉角算得的旋转矩阵一致(有细微的差别,推测来源于小数截断)。

2. 欧拉角、旋转矩阵与四元数转换

(1) 欧拉角转四元数

此处推荐一个python库transformations,安装方法:

pip install transformations

库的github链接:

https://github.com/cgohlke/transformations

直接调用库中函数即可实现转换,以下给出python代码:

import transformations
import numpy
import math


def euler(roll, pitch, yaw, axes='rzyx'):
    yaw = float(yaw) / 180 * numpy.pi
    pitch = float(pitch) / 180 * numpy.pi
    roll = float(roll) / 180 * numpy.pi
    return list(transformations.quaternion_from_euler(roll, pitch, yaw, axes=axes))

roll = 73.06#Ez
pitch = -18.41#Ey
yaw = 126.25#Ex
quaternion = euler(roll, pitch, yaw)
print(quaternion)

结果为:

[0.27362606284972685, 0.7505716495097842, 0.46601038304769293, 0.380270035071476]

此处也手动实现了欧拉角到四元数的转换,代码如下:

def self_euler_quaternion(roll, pitch, yaw):
    yaw = float(yaw) / 180 * numpy.pi
    pitch = float(pitch) / 180 * numpy.pi
    roll = float(roll) / 180 * numpy.pi
    r, p, y = roll/2, pitch/2, yaw/2

    sinr, sinp, siny = math.sin(r), math.sin(p), math.sin(y)
    cosr, cosp, cosy = math.cos(r), math.cos(p), math.cos(y)

    q0 = cosr * cosp * cosy + sinr * sinp * siny
    q3 = sinr * cosp * cosy - cosr * sinp * siny
    q2 = cosr * sinp * cosy + sinr * cosp * siny
    q1 = cosr * cosp * siny - sinr * sinp * cosy

    return numpy.array([q0, q1, q2, q3])
    
roll = 73.06#Ez
pitch = -18.41#Ey
yaw = 126.25#Ex
quaternion = euler(roll, pitch, yaw)
print(self_euler_quaternion(roll, pitch, yaw))

结果为:

[0.27362606 0.75057165 0.46601038 0.38027004]

可以看到,与示教器上的结果基本一致。

(2) 旋转矩阵转四元数

给出如下matlab代码:

function q = vgg_quat_from_rotation_matrix( R )
    % vgg_quat_from_rotation_matrix Generates quaternion from rotation matrix 
    % q = vgg_quat_from_rotation_matrix(R)
    q = [ (1 + R(1,1) + R(2,2) + R(3,3)) (1 + R(1,1) - R(2,2) - R(3,3)) (1 - R(1,1) + R(2,2) - R(3,3)) (1 - R(1,1) - R(2,2) + R(3,3)) ];
    %if ~issym(q)
    A = true;
    if ~A 
      % Pivot to avoid division by small numbers
      [b I] = max(abs(q));
    else
      % For symbolic quats, just make sure we're nonzero
      for k=1:4
        if q(k) ~= 0
          I = k;
          break
        end
      end
    end
    q(I) = sqrt(q(I)) / 2 ;
    if I == 1 
        q(2) = (R(3,2) - R(2,3)) / (4*q(I));
        q(3) = (R(1,3) - R(3,1)) / (4*q(I));
        q(4) = (R(2,1) - R(1,2)) / (4*q(I));
    elseif I==2
        q(1) = (R(3,2) - R(2,3)) / (4*q(I));
        q(3) = (R(2,1) + R(1,2)) / (4*q(I));
        q(4) = (R(1,3) + R(3,1)) / (4*q(I));
    elseif I==3
        q(1) = (R(1,3) - R(3,1)) / (4*q(I));
        q(2) = (R(2,1) + R(1,2)) / (4*q(I));
        q(4) = (R(3,2) + R(2,3)) / (4*q(I));
    elseif I==4
        q(1) = (R(2,1) - R(1,2)) / (4*q(I));
        q(2) = (R(1,3) + R(3,1)) / (4*q(I));
        q(3) = (R(3,2) + R(2,3)) / (4*q(I));
    end
end

测试代码为:

vgg_quat_from_rotation_matrix(rotz(95.03,'deg')*roty(-18.37, 'deg')*rotx(174.57, 'deg'))

结果为:

  0.0860   -0.6716   -0.7221   -0.1422

与示教器结果一致。

(3) 四元数转欧拉角

由于项目暂时没有这个需求,因此这部分没有实现,感兴趣的小伙伴可以提供相关代码。

3. 总结

本文以ABB IRB120机器人为例,给出了通过四元数、欧拉角计算旋转矩阵以及四元数到欧拉角的转换代码,实测与示教器的结果一致,相关代码可直接用于工程上坐标转换。文章来源地址https://www.toymoban.com/news/detail-779837.html

到了这里,关于ABB机器人欧拉角与四元数的相互转化以及旋转矩阵的求法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

     效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

    2024年04月14日
    浏览(73)
  • 【学习笔记】空间坐标系旋转与四元数

      最近在学惯性器件,想着先把理论知识脉络打通,于是便开始学习空间坐标系旋转和四元数,正好结合刚刚结课的课程《机器人控制技术》,记录一下学习心得。 旋转矩阵和齐次变换矩阵部分主要参考自教材 《机器人学导论》 中的第2章 【有需要的可以去z-library上免费

    2024年02月01日
    浏览(41)
  • 《动手学机器人学》7.2.4姿态之间的互相转换,Python&&C++支持四元数,欧拉角旋转矩阵、轴角

    本系列教程作者:小鱼 公众号:鱼香ROS QQ交流群:139707339 教学视频地址:小鱼的B站 完整文档地址:鱼香ROS官网 版权声明:如非允许禁止转载与商业用途。 上一节小鱼带你一起学习了四种姿态表示方式,这节课我们就利用相关的开源库,来完成姿态的不同表示方式之间的转

    2024年02月02日
    浏览(47)
  • 数学概率 | 旋转矩阵、欧拉角、四元数

    目录 一,旋转矩阵 二维旋转矩阵 三维旋转矩阵 二,欧拉角 三,四元数 四,矩阵、欧拉角、四元数相互转换 四元数转矩阵 矩阵转四元数 欧拉角转矩阵 矩阵转欧拉角 欧拉角转四元数 四元数转欧拉角 二维旋转矩阵 R() =  推导,以二维平面为例旋转:  = cos( + ) = coscos - si

    2024年02月06日
    浏览(48)
  • Unity旋转 欧拉角和四元数

    Unity中的旋转最为常知的是Transform.rotation,但其内部实现是由 Quaternion (四元数)进行计算处理,而Inspactor中显示的旋转值是由 EulerAngles (欧拉角)处理。 Unity使用四元数对实际的旋转值进行计算和存储,使用欧拉角对基于世界空间坐标的旋转进行描述和显示,而Inspacetor中显示

    2024年02月13日
    浏览(47)
  • 欧拉角,轴角,四元数与旋转矩阵详解

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 目录 一、欧拉角 1、静态定义 2、欧拉角的表示  3、欧拉角表示的优缺点  4、欧拉角的万向节死锁(静态不存在万向锁的问题) 二、四元数 1、提出意义和定

    2024年01月17日
    浏览(46)
  • 四元数,旋转矩阵,欧拉角互转(python)

    运行代码之前需要安装pyquaternion和scipy。 pip install pyquaternion pip install scipy 代码之前放下面,main函数有使用的方式

    2024年02月12日
    浏览(45)
  • 四元数,欧拉角和旋转矩阵相互转换

    打印输出: 在线转换网站:1、三维在线旋转变换网站 https://www.andre-gaschler.com/rotationconverter/ 2、 Rotation Conversion Tool https://danceswithcode.net/engineeringnotes/quaternions/conversion_tool.html 3、角度、弧度在线转换工具 https://www.osgeo.cn/app/sc210 参考链接:https://www.jianshu.com/p/4fda4c34b829 https://

    2024年02月14日
    浏览(43)
  • 【Eigen库使用】角轴、旋转矩阵、欧拉角、四元数转换

    在slam中经常用到的四种描述机器人orientation的变量,他们之间可以相互转化,使用Eigen库可以很容易的做到这一点, 需要特别关注的是:欧拉角与其余量之间的转换关系 : 1)首先要明确的是, 必须要明确欧拉角的旋转次序 ,你可以选择RPY、YPR等方式,在相同的orientation下,

    2024年01月18日
    浏览(50)
  • ABB机器人注解

    🔥一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去🎶 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 ✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦 写注释是一个良好的习惯,这个也是看似笨拙,其实可以长久

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包