空间两向量之间的旋转角如何求?角度范围在0-360°

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了空间两向量之间的旋转角如何求?角度范围在0-360°相关的知识,希望对你有一定的参考价值。

参考技术A 空间两向量之间的旋转角如何求?角度范围在0-360°

已知两三维空间向量,求从一向量逆时针旋转至另一向量的旋转角,该角度范围在0-360°,

(1)利用公式求的两向量的夹角

(2)根据叉乘判断旋转方向即可

平面上三个点: 

p1(x1,y1) –>顶点 , 

p2(x2,y2) –>顶点 , 

p3(x3,y3) –>原点,

s(p1,p2,p3)=(x1-x3)*(y2-y3)-(x2-x3)*(y1-y3)

如果s>0 则说明 这连接这3个点时是按照逆时针的顺序,如果是s<0则说明连接这3个点是按照顺时针的顺序

二维矢量叉积

设矢量P = (x1,y1) ,Q = (x2,y2)

则矢量叉积定义为: P × Q = x1*y2 - x2*y1   得到的是一个标量,是所组成的平行四边形带符号的面积。

显然有性质 P × Q = - ( Q × P )   P × ( - Q ) = - ( P × Q )

如不加说明,下面所有的点都看作矢量,点的乘法看作矢量叉积;

叉乘的重要性质:

    > 若 P × Q > 0 , 则P 在Q的顺时针方向

    > 若 P × Q < 0 , 则P 在Q的逆时针方向

    > 若 P × Q = 0 , 则P 与Q共线,但可能同向也可能反向

(1)二维矢量

就像 点积 与角度的余弦成正比一样, 行列式 与其正弦成正比。所以你可以像这样计算角度:

dot = x1*x2 + y1*y2      # dot product between [x1, y1] and [x2, y2]det = x1*y2 - y1*x2      # determinantangle = atan2(det, dot)  # atan2(y, x) or atan2(sin, cos)

该角度的方向与坐标系的方向匹配。在 左手坐标系中 ,即 x 指向右和 y 向下是计算机图形常见的,这意味着你得到顺时针角度的正号。如果坐标系的方向是数学的 y 向上,则得到逆时针角度,就像数学中的惯例一样。更改输入的顺序将改变符号,因此如果您对符号不满意,只需交换输入。

atan2 比 atan 稳定。

在数学坐标系中,atan2 结果为正表示从 X 轴逆时针旋转的角度,结果为负表示从 X 轴顺时针旋转的角度。

(2)三维矢量

在3D中,两个任意放置的矢量定义它们自己的旋转轴,垂直于两者。该旋转轴没有固定方向,这意味着您无法唯一地固定旋转方向。一个常见的惯例是让角度始终为正,并使轴线以适合正角度的方式定向。在这种情况下,归一化矢量的点积足以计算角度。

dot = x1*x2 + y1*y2 + z1*z2    #between [x1, y1, z1] and [x2, y2, z2]lenSq1 = x1*x1 + y1*y1 + z1*z1

lenSq2 = x2*x2 + y2*y2 + z2*z2

angle = acos(dot/sqrt(lenSq1 * lenSq2))

三维坐标下的旋转

   三维坐标的旋转有以下几种常见的表示形式:旋转向量,旋转矩阵,欧拉角,四元数,下面对这四种表示形式及其之间的转换进行介绍

旋转向量

  通常为3x1的列向量,向量方向即为旋转轴,向量的模表示绕轴逆时针旋转的角度,如旋转向量v=[a,b,c],那么旋转角度theta=sqrt(a2+b2+c2),旋转轴z=[a/theta, b/theta, c/theta]

旋转矩阵

  旋转矩阵用3x3的矩阵表示,旋转矩阵是正交矩阵,且行列式是单位1            

      旋转矩阵性质   

       det(R)=1                                                       

  旋转向量与旋转矩阵可以通过罗德里格斯(Rodrigues)变换进行转换。opencv实现Rodrigues变换的函数是:


        int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );

 生成旋转矩阵的一种简单方式是把它作为三个基本旋转的序列复合,如下面要介绍的欧拉角的复合。
 

欧拉角

  欧拉角度的基本思想是将旋转分解为绕三个互相垂直轴的三个旋转组成的序列。使用欧拉角,就要指明坐标系系统以及旋转顺序。最常用的约定,即所谓“roll-pitch-yaw”系统。偏航角——Yaw,俯仰角——Pitch,翻滚角——Rool

  下面讨论欧拉角与旋转矩阵之间的转换,绕x,y,或z轴旋转θ的矩阵为:

     

  要计算最终的旋转,只需按一定的顺序将Rx(θ),Ry(θ),Rz(θ)做矩阵乘法,所以顺序不同,最终的旋转矩阵结果也不同。如果规定了坐标系以及旋转顺序,那么旋转矩阵是惟一的。

  欧拉角表示的旋转会造成万向节锁(Gimbal Lock)的现象。所谓万向节锁简单的说是指(经过绕某个轴的旋转后)物体的两个旋转轴指向同一个方向,从而失去一维自由度,接下来无论如何也旋转不出某种状态。由于万向节锁的存在,欧拉旋转无法实现球面平滑插值。

四元数

  一个四元数可以表示为q = w + xi + yj + zk,i、j、k是一种特殊的虚数单位(类比虚数表示中的i,j),并有以下运算规则:i0=j0=k0=1,i2=j2=k2=-1, |q|2=w2+x2+y2+z2=1,四元数的其他性质不在一一叙述。

       四元数指明了旋转的角度和旋转轴,如旋转轴的方向余弦为(cosβx,cosβy,cosβz),旋转角为α,则对应的四元数q=[q0,q1,q2,q3],其中 

                      

   四元数与旋转矩阵之间的转换关系(注意利用模为1的性质有一下两种表示方法)

            R = \\begin{bmatrix}
 1- 2(q_2^2 + q_3^2) &  2(q_1 q_2 - q_0 q_3) &  2(q_0 q_2 + q_1 q_3) \\\\
2(q_1 q_2 + q_0 q_3) & 1 - 2(q_1^2 + q_3^2)  &  2(q_2 q_3 - q_0 q_1) \\\\
2(q_1 q_3 - q_0 q_2) & 2( q_0 q_1 + q_2 q_3) &  1 - 2(q_1^2 + q_2^2)
\\end{bmatrix}                或                  R = \\begin{bmatrix}
q_0^2 + q_1^2 - q_2^2 - q_3^2 &  2(q_1 q_2 - q_0 q_3) &  2(q_0 q_2 + q_1 q_3) \\\\
2(q_1 q_2 + q_0 q_3) & q_0^2 - q_1^2 + q_2^2 - q_3^2 &  2(q_2 q_3 - q_0 q_1) \\\\
2(q_1 q_3 - q_0 q_2) & 2( q_0 q_1 + q_2 q_3) & q_0^2 - q_1^2 - q_2^2 + q_3^2 
\\end{bmatrix}

    旋转矩阵转换为四元数:

      

    mij表示旋转矩阵中第i行k列的元素

           四元数转换为欧拉角:

    首先定义

     Roll – \\phi: rotation about the X-axis

            Pitch – \\theta: rotation about the Y-axis

            Yaw – \\psi: rotation about the Z-axis

            则对应的转换为

            \\begin{bmatrix}
\\phi \\\\ \\theta \\\\ \\psi
\\end{bmatrix} =
\\begin{bmatrix}
\\mbox{atan2}  (2(q_0 q_1 + q_2 q_3),1 - 2(q_1^2 + q_2^2)) \\\\
\\mbox{arcsin} (2(q_0 q_2 - q_3 q_1)) \\\\
\\mbox{atan2}  (2(q_0 q_3 + q_1 q_2),1 - 2(q_2^2 + q_3^2))
\\end{bmatrix}

            如果已知欧拉角求四元数,可以先将欧拉角转化为旋转矩阵,再由旋转矩阵求四元数

 

原创文章,转载请注明出处

 

 
 

以上是关于空间两向量之间的旋转角如何求?角度范围在0-360°的主要内容,如果未能解决你的问题,请参考以下文章

旋转矩阵的三维空间

给定 3D 旋转矩阵和 3D 方向向量求角度差

计算几何学习7

一个硬写的旋转约束问题解决

二维向量的旋转

视觉SLAM三维空间刚体运动的描述