四元数和向量相乘作用及其运算规则

0 四元数

四元数,是在1843 年爱尔兰数学家哈密顿提出来的一种数学概念,它是一
种由 4 个元素组成的简单超复数,由一个实数加上三个虚数i, j,k组成,其可以表示为:
a + b i + c j + d k a + bi + cj + dk a+bi+cj+dk
为了解决欧拉角在描述姿态中存在的万向锁等问题,通常采用四元数对姿态进行描述表示。四元数是复数的不可交换延伸,可以看作一个四维空间或相对于复数的二维空间,所以四元数需要了解超复数的相关规则:
在这里插入图片描述
从中可以看出如果b , c , d 都为0 的话,则上述四元数退化成实数,如果c,d
为0 则退化成复数,所以称四元数为超复数。我们可以将i、j、k 理解为三维空间中互相正交的三个单位矢量,可以将四元数 看作是标量部分加上矢量部分,也可以用一个矢量来表示四元数.
在这里插入图片描述
在这里插入图片描述


作用:四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量。

比如:向量vector3(0,0,10),绕着Y轴旋转90度,得到新的向量是vector3(10,0,0)。

在unity中表示为:
在这里插入图片描述运行结果为:
在这里插入图片描述
复合旋转就是四元数依次相乘,最后乘以向量

1 四元数乘积运算过程

将四元数的四个值分别计为:(w,x,y,z),unity中的四元数中的四个数字是(x,y,z,w),不影响下面的计算过程。

绕任意轴旋转任意角度的四元数为:
在这里插入图片描述
那么绕着Y轴旋转90度的四元数就是q = (√2/2 , 0 , √2/2 , 0);

(unity中这个Quaternion.Euler(0,90,0)打debug的话是(0,√2/2 , 0 , √2/2 ),因为排列顺序是(x,y,z,w),不影响下面的计算过程)

四元数乘以向量的运算规则为:

q ∗ v = ( q ) ∗ ( v ) ∗ ( q − 1 ) q * v = (q) *( v) *( q^{−1}) qv=q(v)q1

其中:

q = (√2/2 , 0 , √2/2 , 0);

v,将v向量扩充为四元数(0,v),也就是v = (0 , 0,0 , 10);

q−1是四元数q的逆,求逆过程如下:

共轭四元数:q*=(w,-x,-y,-z),也就是(√2/2 , 0 , -√2/2 , 0)
四元数的模:N(q) = √(x^2 + y^2 + z^2 +w^2),即四元数到原点的距离,计算结果为1
四元数的逆:q−1=q*/N(q),也就是q−1 = (√2/2 , 0 , -√2/2 , 0)

q ∗ v q * v qv = q * v * q−1 = (√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10)*(√2/2 , 0, -√2/2 , 0);

四元数乘法公式:
在这里插入图片描述
按照上述计算公式: q * v = q * v * q−1

(√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10) = (0,5√2,0,5√2)

(0,5√2,0,5√2) * (√2/2 , 0 , -√2/2 , 0)=(0,10,0,0);

将最后得到的四元数(0,10,0,0)变为向量(0,newV),就是newV(10,0,0)。

转自https://www.cnblogs.com/jeason1997/p/9822353.html

2 欧拉角到四元数的转换

利用欧拉角也可以实现一个物体在空间的旋转,它按照既定的顺序,如依次绕z,y,x分别旋转一个固定角度,使用yaw,pitch,roll分别表示物体绕,x,y,z的旋转角度,记为 ψ \psi ψ θ \theta θ ϕ \phi ϕ,可以利用三个四元数依次表示这三次旋转,即:

Q 1 = c o s ( ψ / 2 ) + s i n ( ψ / 2 ) k Q_1=cos(\psi /2 ) +sin(\psi /2) k Q1=cos(ψ/2)+sin(ψ/2)k

Q 2 = c o s ( θ / 2 ) + s i n ( θ / 2 ) j Q_2=cos(\theta /2 ) +sin(\theta /2) j Q2=cos(θ/2)+sin(θ/2)j

Q 3 = c o s ( ϕ / 2 ) + s i n ( ϕ / 2 ) i Q_3=cos(\phi /2 ) +sin(\phi /2) i Q3=cos(ϕ/2)+sin(ϕ/2)i
在这里插入图片描述
在这里插入图片描述
(利用上述四元数叉乘公式)

% MATLAB测试欧拉角到四元数之间的转换
% addpath('utils'); %函数路径
 
syms pitch0  % x
syms roll0   % y
syms yaw0    % z 
q_x=[cos(pitch0/2),1*sin(pitch0/2),0,0]; % x轴:[1,0,0] 绕x轴旋转pitch0
q_y=[cos(roll0/2),0,1*sin(roll0/2),0];   % y轴:[0,1,0] 绕y轴旋转roll0
q_z=[cos(yaw0/2),0,0,1*sin(yaw0/2)];     % z轴:[0,0,1] 绕z轴旋转yaw0
 
q= quaternProd(quaternProd(q_z, q_x),q_y)
 
% q的最终结果
% cos(pitch0/2)*cos(roll0/2)*cos(yaw0/2) - sin(pitch0/2)*sin(roll0/2)*sin(yaw0/2),
% cos(roll0/2)*cos(yaw0/2)*sin(pitch0/2) - cos(pitch0/2)*sin(roll0/2)*sin(yaw0/2), 
% cos(pitch0/2)*cos(yaw0/2)*sin(roll0/2) + cos(roll0/2)*sin(pitch0/2)*sin(yaw0/2), 
% cos(pitch0/2)*cos(roll0/2)*sin(yaw0/2) + cos(yaw0/2)*sin(pitch0/2)*sin(roll0/2)]

% 下面函数是四元数乘法
% 四元数相乘
function ab = quaternProd(a, b)
 
    ab(1) = a(1).*b(1)-a(2).*b(2)-a(3).*b(3)-a(4).*b(4);
    ab(2) = a(1).*b(2)+a(2).*b(1)+a(3).*b(4)-a(4).*b(3);
    ab(3) = a(1).*b(3)-a(2).*b(4)+a(3).*b(1)+a(4).*b(2);
    ab(4) = a(1).*b(4)+a(2).*b(3)-a(3).*b(2)+a(4).*b(1);
    
end

3 四元数转欧拉角

挖坑
https://blog.csdn.net/xiaoma_bk/article/details/79082629
https://zhuanlan.zhihu.com/p/103622849?from_voters_page=true

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值