zoukankan      html  css  js  c++  java
  • 机器人学——1.8-单位四元数

    四元数是复数的一种扩展,或叫超复数,记作一个标量加上一个向量:
    q˚=s+v=s+v1i+v2j+v3k egin{array}{rl} mathring{q}&=s+v\ &=s+v_1i+v_2j+v_3k end{array} 其中,sRsinmathbb{R}vR3vinmathbb{R}^3,正交复数 iijjkk 的定义如下
    i2=j2=k2=ijk=1 i^2=j^2=k^2=ijk=-1 我们将一个四元数表示为
    q˚=s<v1,v2,v3> mathring{q}=s<v_1, v_2, v_3>
    早期反对四元数的一-个理由是其乘法不可交换,但正如我们在上面看到的,这种不可交换性正好符合坐标系旋转的情况。除去最初的争论不说,四元数以其格式优雅、功能强大、计算简单已被广泛应用于机器人、计算机视觉、计算机图形学以及航空航天惯性导航领域。

    在机器人工具箱中,四元数是由名为Quaternion的类来实现的。构造函数将传递的参数转换为四元数,例如:

    >> q = Quaternion(rpy2tr(0.1, 0.2, 0.3))
    q = 
    0.98186 < 0.064071, 0.091158, 0.15344 >
    

    为了描述坐标系的旋转,我们使用单位四元数。这些四元数为一个单位大小,即 q˚=1|mathring{q}| =1s2+v12+v22+v32=1s^2+v_1^2+v_2^2+v_3^2=1。例如:

    >> q.norm
    ans =
         1
    

    单位四元数具有一个特殊属性,它可以被看作是绕单位向量 n^hat{n} 旋转了 θ heta 角,该旋转与四元数组的关系为
    s=cosθ2,v=(sinθ2)n^ s=cosfrac{ heta}{2}, quad v = left(sinfrac{ heta}{2} ight)hat{n} 绕任意向量旋转相似。
    Quaternion类可以重载一些标准方法和函数。四元数的乘法通过重载乘法运算符调用:

    >> q = q * q;
    

    求一个四元数的共轭为

    >> q.inv()
    ans = 
    0.98186 < -0.064071, -0.091158, -0.15344 >
    

    一个四元数乘以它的逆四元数为

    >> q * q.inv()
    ans = 
    1 < 0, 0, 0 >
    

    或者

    >> q / q
    ans = 
    1 < 0, 0, 0 >
    

    得出一个单位四元数,它代表一个无效旋转。
    一个四元数可以用以下方式转化为一个正交旋转矩阵:

    >> q.R
    ans =
        0.9363   -0.2896    0.1987
        0.3130    0.9447   -0.0978
       -0.1593    0.1538    0.9752
    

    我们也可以用以下函数绘制一个四元数所指的方向:

    >> q.plot()
    

    在这里插入图片描述

    在四元数的情况下,广义位姿是 ξq˚Qxi sim mathring{q} in mathbb{Q},且
    q1˚q2˚s1s2v1v2,<s1v2+s2v1+v1×v2> mathring{q_1}oplusmathring{q_2}mapsto s_1s_2-v_1cdot v_2,<s_1v_2+s_2v_1+v_1 imes v_2> 上式被称为四元数积或汉密尔顿积,并有
    q˚q˚1=s,<v> ominusmathring{q}mapstomathring{q}^{-1}=s,<-v> 这是四元数的共轭。零位姿 01<0,0,0>0mapsto1<0,0,0>,为单位四元数。一个向量 vR3vinmathbb{R}^3 被旋转,表示为 q˚vq˚q˚(v)q˚1mathring{q}cdot vmapstomathring{q}mathring{q}(v)mathring{q}-1,其中 q˚(v)=0,<v>mathring{q}(v)=0, <v> 被称为纯四元数。

    将一个三元向量传递给构造函数,将产生一个纯四元数:

    >> Quaternion([1 2 3])
    ans = 
    0 < 1, 2, 3 >
    

    其中的标量为 00。使用重载的乘法运算符,一个向量可以被一个四元数旋转:

    >> q*[1 0 0]'
    ans =
        0.9363
        0.3130
       -0.1593
    
  • 相关阅读:
    淘宝首页性能优化实践
    Ubuntu16.04下搭建Go语言环境
    ubuntu下nvm,node以及npm的安装与使用
    idea 新建/导入的xml 报文头报错 URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
    Spring Boot 请求返回字符串中文乱码
    Java 从FTP下载.上传文件
    Spring boot 定时器
    spring boot集成mybatis 自动生成实体类和mapper文件、Dao层
    Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found
    Oracle中创建序列
  • 原文地址:https://www.cnblogs.com/thewaytotheway/p/12847247.html
Copyright © 2011-2022 走看看