精华内容
下载资源
问答
  • 旋转矩阵计算欧拉角

    2018-10-09 18:28:49
    旋转矩阵计算绕X、Y、Z轴旋转角度的计算公式,直接代入公式求解即可,适用于3*3旋转矩阵的计算。
  • 旋转矩阵计算欧拉角 从旋转矩阵中找到所有可能的欧拉角的简单方法,在计算机图形学、视觉学、机器人学和运动学中,欧拉角的确定有时是必要的一步。然而,解决方案可能是明显的,也可能不是。 旋转矩阵 我们从三个...

    从旋转矩阵计算欧拉角

    从旋转矩阵中找到所有可能的欧拉角的简单方法,在计算机图形学、视觉学、机器人学和运动学中,欧拉角的确定有时是必要的一步。然而,解决方案可能是明显的,也可能不是。

    旋转矩阵

    我们从三个主要轴的旋转的标准定义开始。

    绕x轴的弧度旋转 ψ \psi ψ被定义为:
    R x ( ψ ) = [ 1 0 0 0 cos ⁡ ψ − sin ⁡ ψ 0 sin ⁡ ψ cos ⁡ ψ ] R_{x}(\psi)=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos \psi & -\sin \psi \\ 0 & \sin \psi & \cos \psi \end{array}\right] Rx(ψ)=1000cosψsinψ0sinψcosψ
    类似地,绕y轴旋转的弧度定义为
    R x ( ψ ) = [ c o s θ 0 s i n θ 0 1 0 − s i n θ 0 c o s θ ] R_{x}(\psi)=\left[\begin{array}{ccc} cos\theta & 0 & sin\theta \\ 0 & 1 & 0 \\ -sin\theta & 0 & cos\theta \end{array}\right] Rx(ψ)=cosθ0sinθ010sinθ0cosθ
    最后,定义了沿z轴旋转的弧度为
    R z ( ϕ ) = [ cos ⁡ ϕ − sin ⁡ ϕ 0 sin ⁡ ϕ cos ⁡ ϕ 0 0 0 1 ] R_{z}(\phi)=\left[\begin{array}{ccc} \cos \phi & -\sin \phi & 0 \\ \sin \phi & \cos \phi & 0 \\ 0 & 0 & 1 \end{array}\right] Rz(ϕ)=cosϕsinϕ0sinϕcosϕ0001
    这三个角 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ是欧拉角

    广义旋转矩阵

    一般的旋转矩阵可以有这样的形式

    R z ( ϕ ) = [ R 11 R 12 R 13 R 21 R 22 R 23 R 31 R 32 R 33 ] R_{z}(\phi)=\left[\begin{array}{ccc} R_{11}&R_{12}&R_{13} \\ R_{21}&R_{22}&R_{23} \\ R_{31}&R_{32} &R_{33} \end{array}\right] Rz(ϕ)=R11R21R31R12R22R32R13R23R33
    这个矩阵可以被认为是一个三旋转的序列,每个主轴各一个。因为矩阵乘法不能交换,旋转的轴的顺序将影响结果。在这个分析中,我们先绕 x x x轴旋转,然后绕 y y y轴旋转,最后绕 z z z轴旋转。这样的旋转序列可以用矩阵乘积表示。
    R = R z ( ϕ ) R y ( θ ) R x ( ψ ) = [ cos ⁡ θ cos ⁡ ϕ sin ⁡ ψ sin ⁡ θ cos ⁡ ϕ − cos ⁡ ψ sin ⁡ ϕ cos ⁡ ψ sin ⁡ θ cos ⁡ ϕ + sin ⁡ ψ sin ⁡ ϕ cos ⁡ θ sin ⁡ ϕ sin ⁡ ψ sin ⁡ θ sin ⁡ ϕ + cos ⁡ ψ cos ⁡ ϕ cos ⁡ ψ sin ⁡ θ sin ⁡ ϕ − sin ⁡ ψ cos ⁡ ϕ − sin ⁡ θ sin ⁡ ψ cos ⁡ θ cos ⁡ ψ cos ⁡ θ ] \begin{aligned} R &=R_{z}(\phi) R_{y}(\theta) R_{x}(\psi) \\ &=\left[\begin{array}{ccc} \cos \theta \cos \phi & \sin \psi \sin \theta \cos \phi-\cos \psi \sin \phi & \cos \psi \sin \theta \cos \phi+\sin \psi \sin \phi \\ \cos \theta \sin \phi & \sin \psi \sin \theta \sin \phi+\cos \psi \cos \phi & \cos \psi \sin \theta \sin \phi-\sin \psi \cos \phi \\ -\sin \theta & \sin \psi \cos \theta & \cos \psi \cos \theta \end{array}\right] \end{aligned} R=Rz(ϕ)Ry(θ)Rx(ψ)=cosθcosϕcosθsinϕsinθsinψsinθcosϕcosψsinϕsinψsinθsinϕ+cosψcosϕsinψcosθcosψsinθcosϕ+sinψsinϕcosψsinθsinϕsinψcosϕcosψcosθ
    给定一个旋转矩阵 R R R,通过将 R R R中的每个元素与矩阵乘 R z ( ϕ ) , R y θ , R x ( ψ ) R_z(\phi),R_y{\theta},R_x(\psi) Rz(ϕ),Ryθ,Rx(ψ)中的相应元素等价,可以计算出欧拉角 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ。九个方程,可以用来找到欧拉角。

    求出两个可能的角度 θ \theta θ

    R 31 R_{31} R31开始,我们发现
    R 31 = − s i n θ R_{31}=-sin\theta R31=sinθ
    这个方程可以倒过来表示
    θ = − s i n − 1 ( R 31 ) \theta=-sin^{-1}(R_{31}) θ=sin1(R31)
    然而,在解释这个等式时必须谨慎。由于$sin(\pi-\theta)=sin(\theta),实际上有两个不同的值(对于 R 31 ≠ ± 1 R_{31} \not=\pm1 R31=±1)满足方程,因此,这两个值
    θ 1 = − s i n − 1 ( R 31 ) \theta{1}=-sin^{-1}(R_{31}) θ1=sin1(R31) θ 2 = π − θ 1 = π + s i n − 1 ( R 31 ) \theta_{2}=\pi-\theta_1=\pi+sin^{-1}(R_{31}) θ2=πθ1=π+sin1(R31)
    都是有效的解。我们将在后面处理 R 31 = ± 1 R_{31} =\pm1 R31=±1的特殊情况,因此使用旋转矩阵的R_{31}元素,我们能够确定两个可能的值。

    找到 ψ \psi ψ对应的角度

    想要找到 ψ \psi ψ的值,我们观察这一点
    R 32 R 33 = t a n ( ψ ) \frac{R_{32}}{R_{33}}=tan(\psi) R33R32=tan(ψ)
    我们用这个方程来解出
    ψ = a t a n 2 ( R 32 , R 33 ) \psi=atan2(R_{32},R_{33}) ψ=atan2(R32,R33)
    其中 a t a n 2 ( y , x ) atan2(y, x) atan2(y,x)是两个变量 x x x y y y a r c t a n arctan arctan,类似于计算 y x \frac{y}{x} xy a r c t a n arctan arctan,只是用两个参数的符号来确定结果的象限,其范围为 [ − π , π ] [-\pi,\pi] [π,π],函数 a t a n 2 atan2 atan2在许多编程语言中都可用。

    在解释方程 2 2 2时必须小心,如果 c o s ( θ ) > 0 cos(\theta)>0 cos(θ)>0,那么 ψ = a t a n 2 ( R 32 , R 33 ) \psi=atan2(R_{32},R_{33}) ψ=atan2(R32,R33)。然而,当 c o s ( θ ) < 0 cos(\theta)<0 cos(θ)<0 ψ = a t a n 2 ( − R 32 , − R 33 ) \psi=atan2(-R_{32},-R_{33}) ψ=atan2(R32,R33)。处理这个问题的一个简单方法是使用这个方程
    ψ = a t a n 2 ( R 32 c o s θ , R 33 c o s θ ) \psi=atan2(\frac{R_{32}}{cos\theta},\frac{R_{33}}{cos\theta}) ψ=atan2(cosθR32,cosθR33)
    去计算 ψ \psi ψ

    方程 3 3 3对除 c o s θ = 0 cos\theta = 0 cosθ=0之外的所有情况都有效。
    ψ = a t a n 2 ( R 32 c o s θ 1 , R 33 c o s θ 1 ) \psi=atan2(\frac{R_{32}}{cos\theta_{1}},\frac{R_{33}}{cos\theta_{1}}) ψ=atan2(cosθ1R32,cosθ1R33) ψ = a t a n 2 ( R 32 c o s θ 2 , R 33 c o s θ 2 ) \psi=atan2(\frac{R_{32}}{cos\theta_{2}},\frac{R_{33}}{cos\theta_{2}}) ψ=atan2(cosθ2R32,cosθ2R33)

    求出 ϕ \phi ϕ对应的角度

    类似的分析也适用于寻找。我们观察到
    R 21 R 11 = t a n ϕ \frac{R_{21}}{R_{11}}=tan\phi R11R21=tanϕ
    我们用这个方程解出了 ϕ \phi ϕ
    ψ = a t a n 2 ( R 21 c o s θ 1 , R 11 c o s θ 1 ) \psi=atan2(\frac{R_{21}}{cos\theta_{1}},\frac{R_{11}}{cos\theta_{1}}) ψ=atan2(cosθ1R21,cosθ1R11) ψ = a t a n 2 ( R 21 c o s θ 2 , R 11 c o s θ 2 ) \psi=atan2(\frac{R_{21}}{cos\theta_{2}},\frac{R_{11}}{cos\theta_{2}}) ψ=atan2(cosθ2R21,cosθ2R11)

    c o s θ ≠ 0 cos\theta\not=0 cosθ=0时的两个解

    对于 c o s θ ≠ 0 cos\theta\not=0 cosθ=0的情况,我们现在有两个三个一组的欧拉角再现了旋转矩阵,为
    ψ 1 , θ 1 , ϕ 1 \psi_1,\theta_1,\phi_1 ψ1,θ1,ϕ1 ψ 2 , θ 2 , ϕ 2 \psi_2,\theta_2,\phi_2 ψ2,θ2,ϕ2
    这两个解都是有效的。

    如果 c o s θ = 0 cos\theta=0 cosθ=0呢?

    如果旋转矩阵的 R 31 R_{31} R31元素为 1 1 1 − 1 −1 1,对应的 θ = − π 2 \theta=-\frac{\pi}{2} θ=2πor θ = π 2 \theta=\frac{\pi}{2} θ=2π c o s θ = 0 cos\theta=0 cosθ=0上述就不起作用。当我们尝试使用上述技术来解决可能的值 ψ , ϕ \psi,\phi ψ,ϕ问题发生了,因为 R 11 , R 21 , R 32 和 R 33 R_{11},R_{21},R_{32}和R_{33} R11,R21,R32R33可能值为 0 0 0,因此 ψ , ϕ \psi,\phi ψ,ϕ变为
    ψ = a t a n 2 ( 0 0 , 0 0 ) \psi=atan2(\frac{0}{0},\frac{0}{0}) ψ=atan2(00,00) ϕ = a t a n 2 ( 0 0 , 0 0 ) \phi=atan2(\frac{0}{0},\frac{0}{0}) ϕ=atan2(00,00)
    这种情况下, R 11 、 R 21 、 R 32 R11、R21、R32 R11R21R32 R 33 R33 R33没有约束 ψ , ϕ \psi,\phi ψ,ϕ这些值。因此,我们必须利用旋转矩阵的不同元素来计算 ψ , ϕ \psi,\phi ψ,ϕ

    θ = π 2 \theta=\frac{\pi}{2} θ=2π
    R 12 = sin ⁡ ψ cos ⁡ ϕ − cos ⁡ ψ sin ⁡ ϕ = sin ⁡ ( ψ − ϕ ) R 13 = cos ⁡ ψ cos ⁡ ϕ + sin ⁡ ψ sin ⁡ ϕ = cos ⁡ ( ψ − ϕ ) R 22 = sin ⁡ ψ sin ⁡ ϕ + cos ⁡ ψ cos ⁡ ϕ = cos ⁡ ( ψ − ϕ ) = R 13 R 23 = cos ⁡ ψ sin ⁡ ϕ − sin ⁡ ψ cos ⁡ ϕ = − sin ⁡ ( ψ − ϕ ) = − R 12 \begin{array}{l} R_{12}=\sin \psi \cos \phi-\cos \psi \sin \phi=\sin (\psi-\phi) \\ R_{13}=\cos \psi \cos \phi+\sin \psi \sin \phi=\cos (\psi-\phi) \\ R_{22}=\sin \psi \sin \phi+\cos \psi \cos \phi=\cos (\psi-\phi)=R_{13} \\ R_{23}=\cos \psi \sin \phi-\sin \psi \cos \phi=-\sin (\psi-\phi)=-R_{12} \end{array} R12=sinψcosϕcosψsinϕ=sin(ψϕ)R13=cosψcosϕ+sinψsinϕ=cos(ψϕ)R22=sinψsinϕ+cosψcosϕ=cos(ψϕ)=R13R23=cosψsinϕsinψcosϕ=sin(ψϕ)=R12
    任意的 ψ \psi ψ ϕ \phi ϕ都满足方程。我们会发现
    ( ψ − ϕ ) = a t a n 2 ( R 12 , R 13 ) (\psi-\phi)=atan2(R_{12},R_{13}) (ψϕ)=atan2(R12,R13) ψ = ϕ + a t a n 2 ( R 12 , R 13 ) \psi=\phi+atan2(R_{12},R_{13}) ψ=ϕ+atan2(R12,R13)
    θ = − π 2 \theta=-\frac{\pi}{2} θ=2π
    R 12 = − sin ⁡ ψ cos ⁡ ϕ − cos ⁡ ψ sin ⁡ ϕ = − sin ⁡ ( ψ + ϕ ) R 13 = − cos ⁡ ψ cos ⁡ ϕ + sin ⁡ ψ sin ⁡ ϕ = − cos ⁡ ( ψ + ϕ ) R 22 = − sin ⁡ ψ sin ⁡ ϕ + cos ⁡ ψ cos ⁡ ϕ = cos ⁡ ( ψ + ϕ ) = − R 13 R 23 = − cos ⁡ ψ sin ⁡ ϕ − sin ⁡ ψ cos ⁡ ϕ = − sin ⁡ ( ψ + ϕ ) = R 12 \begin{array}{l} R_{12}=-\sin \psi \cos \phi-\cos \psi \sin \phi=-\sin (\psi+\phi) \\ R_{13}=-\cos \psi \cos \phi+\sin \psi \sin \phi=-\cos (\psi+\phi) \\ R_{22}=-\sin \psi \sin \phi+\cos \psi \cos \phi=\cos (\psi+\phi)=-R_{13} \\ R_{23}=-\cos \psi \sin \phi-\sin \psi \cos \phi=-\sin (\psi+\phi)=R_{12} \end{array} R12=sinψcosϕcosψsinϕ=sin(ψ+ϕ)R13=cosψcosϕ+sinψsinϕ=cos(ψ+ϕ)R22=sinψsinϕ+cosψcosϕ=cos(ψ+ϕ)=R13R23=cosψsinϕsinψcosϕ=sin(ψ+ϕ)=R12
    同样
    ( ψ + ϕ ) = a t a n 2 ( − R 12 , − R 13 ) (\psi+\phi)=atan2(-R_{12},-R_{13}) (ψ+ϕ)=atan2(R12,R13) ψ = − ϕ + a t a n 2 ( − R 12 , − R 13 ) \psi=-\phi+atan2(-R_{12},-R_{13}) ψ=ϕ+atan2(R12,R13)

    伪代码:

     if  ( R 31 ≠ ± 1 ) θ 1 = − asin ⁡ ( R 31 ) θ 2 = π − θ 1 ψ 1 = atan ⁡ 2 ( R 32 cos ⁡ θ 1 , R 33 cos ⁡ θ 1 ) ψ 2 = atan ⁡ 2 ( R 32 cos ⁡ θ 2 , R 33 cos ⁡ θ 2 ) ϕ 1 = atan ⁡ 2 ( R 21 cos ⁡ θ 1 , R 11 cos ⁡ θ 1 ) ϕ 2 = atan ⁡ 2 ( R 21 cos ⁡ θ 2 , R 11 cos ⁡ θ 2 )  else  ϕ =  anything; can set to  0  if  ( R 31 = − 1 ) θ = π / 2 ψ = ϕ + atan ⁡ 2 ( R 12 , R 13 )  else  θ = − π / 2 ψ = − ϕ + atan ⁡ 2 ( − R 12 , − R 13 )  end if   end if  \begin{array}{l} \text { if }\left(R_{31} \neq\pm 1\right) \\ \theta_{1}=-\operatorname{asin}\left(R_{31}\right) \\ \theta_{2}=\pi-\theta_{1} \\ \psi_{1}=\operatorname{atan} 2\left(\frac{R_{32}}{\cos \theta_{1}}, \frac{R_{33}}{\cos \theta_{1}}\right) \\ \psi_{2}=\operatorname{atan} 2\left(\frac{R_{32}}{\cos \theta_{2}}, \frac{R_{33}}{\cos \theta_{2}}\right) \\ \phi_{1}=\operatorname{atan} 2\left(\frac{R_{21}}{\cos \theta_{1}}, \frac{R_{11}}{\cos \theta_{1}}\right) \\ \phi_{2}=\operatorname{atan} 2\left(\frac{R_{21}}{\cos \theta_{2}}, \frac{R_{11}}{\cos \theta_{2}}\right) \\ \text { else } \\ \begin{array}{c} \phi=\text { anything; can set to } 0 \\ \text { if }\left(R_{31}=-1\right) \\ \theta=\pi / 2 \\ \psi=\phi+\operatorname{atan} 2\left(R_{12}, R_{13}\right) \\ \text { else } \\ \quad \quad \theta=-\pi / 2 \\ \quad \psi=-\phi+\operatorname{atan} 2\left(-R_{12},-R_{13}\right) \\ \text { end if } \end{array} \\ \text { end if } \end{array}  if (R31=±1)θ1=asin(R31)θ2=πθ1ψ1=atan2(cosθ1R32,cosθ1R33)ψ2=atan2(cosθ2R32,cosθ2R33)ϕ1=atan2(cosθ1R21,cosθ1R11)ϕ2=atan2(cosθ2R21,cosθ2R11) else ϕ= anything; can set to 0 if (R31=1)θ=π/2ψ=ϕ+atan2(R12,R13) else θ=π/2ψ=ϕ+atan2(R12,R13) end if  end if 

    实际例子

    下面提供了一个例子,演示了从一个旋转矩阵中计算出 ψ , θ , ϕ \psi,\theta, \phi ψ,θ,ϕ
    假设要求我们找出产生这个矩阵的欧拉角
    R z ( ϕ ) = [ . 5 − . 1464 . 8536 . 5 . 8536 − . 1464 − . 7071 . 5 . 5 ] R_{z}(\phi)=\left[\begin{array}{ccc} .5&-.1464&.8536 \\ .5&.8536&-.1464\\ -.7071&.5&.5 \end{array}\right] Rz(ϕ)=.5.5.7071.1464.8536.5.8536.1464.5
    首先,求出可能 θ \theta θ的取值
    θ 1 = − s i n ( − . 7071 ) = π 4 \theta_1=-sin(-.7071)=\frac{\pi}{4} θ1=sin(.7071)=4π
    θ 2 = π − θ 1 = 3 π 4 \theta_2=\pi-\theta_1=\frac{3\pi}{4} θ2=πθ1=43π
    然后,我们找到相应的数值
    ψ 1 = atan ⁡ 2 ( . 5 cos ⁡ ( π / 4 ) , . 5 cos ⁡ ( π / 4 ) ) = π 4 ψ 2 = atan ⁡ 2 ( . 5 cos ⁡ ( 3 π / 4 ) , . 5 cos ⁡ ( 3 π / 4 ) ) = − 3 π 4 \begin{array}{l} \psi_{1}=\operatorname{atan} 2\left(\frac{.5}{\cos (\pi / 4)}, \frac{.5}{\cos (\pi / 4)}\right)=\frac{\pi}{4} \\ \psi_{2}=\operatorname{atan} 2\left(\frac{.5}{\cos (3 \pi / 4)}, \frac{.5}{\cos (3 \pi / 4)}\right)=-\frac{3 \pi}{4} \end{array} ψ1=atan2(cos(π/4).5,cos(π/4).5)=4πψ2=atan2(cos(3π/4).5,cos(3π/4).5)=43π

    ϕ 1 = atan ⁡ 2 ( . 5 cos ⁡ ( π / 4 ) , . 5 cos ⁡ ( π / 4 ) ) = π 4 ϕ 2 = atan ⁡ 2 ( . 5 cos ⁡ ( 3 π / 4 ) , . 5 cos ⁡ ( 3 π / 4 ) ) = − 3 π 4 \begin{array}{l} \phi_{1}=\operatorname{atan} 2\left(\frac{.5}{\cos (\pi / 4)}, \frac{.5}{\cos (\pi / 4)}\right)=\frac{\pi}{4} \\ \phi_{2}=\operatorname{atan} 2\left(\frac{.5}{\cos (3 \pi / 4)}, \frac{.5}{\cos (3 \pi / 4)}\right)=-\frac{3 \pi}{4} \end{array} ϕ1=atan2(cos(π/4).5,cos(π/4).5)=4πϕ2=atan2(cos(3π/4).5,cos(3π/4).5)=43π
    因此,解为
    ( π 4 , π 4 , π 4 ) , ( − 3 π 4 , 3 π 4 , − 3 π 4 ) (\frac{\pi}{4},\frac{\pi}{4},\frac{\pi}{4}),(-\frac{3\pi}{4},\frac{3\pi}{4},-\frac{3\pi}{4}) (4π,4π,4π),(43π,43π,43π)

    展开全文
  • 旋转矩阵计算欧拉角 (phi1,Phi,phi2) 与邦吉约定。 它适用于大小为 [3 3] 和 [3 3 P] 的数组。 在后一种情况下,转换是按深度执行的。 参考论文: D. 德普里斯特。 从旋转矩阵计算欧拉角与邦吉约定。 2018年托管...
  • % 此函数返回沿 x、y 和 z 方向的旋转% 旋转矩阵 %输入: % R= 3x3 旋转矩阵%输出: % rx= 以弧度为单位沿 x 方向旋转% ry= 以弧度为单位沿 y 方向旋转% rz= 以弧度为单位沿 z 方向旋转% R = % % [ cos(ry)*cos(rz...
  • 通过3维旋转矩阵计算欧拉角

    万次阅读 2015-01-21 17:19:58
    在得到3D模型的旋转矩阵(Rotation Matrix)后,需要求取3D模型的相对于各个轴的角度,有以下资料可查: 可参考的资料: 简易版:...

    在得到3D模型的旋转矩阵(Rotation Matrix)后,需要求取3D模型的相对于各个轴的角度,有以下资料可查:

    可参考的资料:

    简易版:点击打开链接

    通用版:点击打开链接

    因为实验过程中,没有超过+-90°的情况出现,我在这里使用了简单版。

    展开全文
  • 旋转矩阵计算欧拉角的方法

    千次阅读 2018-09-21 12:22:56
    版权声明:本文为博主原创文章,...//将投影矩阵分解为旋转矩阵和相机(内参)矩阵 Debug( "Euler Angle" ); Debug(euler_angles); } 无需判断奇异性,直接调用库函数,相对简单 转载自: ...
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lircsszz/article/details/80118051

    算法一:直接法

    
        
    1. bool isRotationMatrix(cv::Mat &R)
    2. {
    3. cv::Mat R_t;
    4. cv::transpose(R,R_t);
    5. cv::Mat shouldBeIdentity=R_t*R;
    6. cv::Mat I = cv::Mat::eye( 3, 3,shouldBeIdentity.type());
    7. return norm(I,shouldBeIdentity)< 1e-6;
    8. }
    9. void getEulerAngles(cv::Mat matrix)
    10. {
    11. assert(isRotationMatrix(matrix));
    12. float sy= sqrt(matrix.at< double>( 0, 0)*matrix.at< double>( 0, 0)+matrix.at< double>( 1, 0)*matrix.at< double>( 1, 0));
    13. bool singular = sy< 1e-6;
    14. if(!singular)
    15. {
    16. theta_x= atan2(matrix.at< double>( 2, 1),matrix.at< double>( 2, 2));
    17. //theta_x= theta_x*180.0/3.1416 ;
    18. theta_y= atan2(-matrix.at< double>( 2, 0), sy);
    19. //theta_y= theta_y*180.0/3.1416 ;
    20. theta_z= atan2(matrix.at< double>( 1, 0), matrix.at< double>( 0, 0));
    21. //theta_z= theta_z*180.0/3.1416 ;
    22. }
    23. else
    24. {
    25. theta_x= atan2(-matrix.at< double>( 1, 2), matrix.at< double>( 1, 1));
    26. //theta_x= theta_x*180.0/3.1416 ;
    27. theta_y= atan2(-matrix.at< double>( 2, 0), sy);
    28. //theta_y= theta_y*180.0/3.1416 ;
    29. theta_z= 0;
    30. //theta_z= theta_z*180.0/3.1416 ;
    31. }
    32. Debug( "theta_x");
    33. Debug(theta_x);
    34. Debug( "theta_y");
    35. Debug(theta_y);
    36. Debug( "theta_z");
    37. Debug(theta_z);
    38. }

    NOTE:需要判断奇异性(singularity)!

    算法二:拆分法

    
        
    1. void getEulerAngles(cv::Mat &R,cv::Mat &t,cv::Mat &euler_angles)
    2. {
    3. cv::Mat camMatrix,rotMatrix,transVect,theta_x,theta_y,theta_z;
    4. cv::Mat rotation_vec;
    5. cv::Mat projMatrix = cv::Mat( 3, 4,CV_64FC1);
    6. //cv::Mat euler_angles = cv::Mat(3,1,CV_64FC1);
    7. cv::Mat out_intrinsics = cv::Mat( 3, 3,CV_64FC1);
    8. cv::Mat out_rotation = cv::Mat( 3, 3,CV_64FC1);
    9. cv::Mat out_translation = cv::Mat( 4, 1,CV_64FC1);
    10. cv::hconcat(R,t,projMatrix); //将R、t拼接维投影矩阵
    11. cv::decomposeProjectionMatrix(projMatrix,out_intrinsics,out_rotation,out_translation,
    12. cv::noArray(),cv::noArray(),cv::noArray(),euler_angles);
    13. //将投影矩阵分解为旋转矩阵和相机(内参)矩阵
    14. Debug( "Euler Angle");
    15. Debug(euler_angles);
    16. }

    无需判断奇异性,直接调用库函数,相对简单


    转载自:https://blog.csdn.net/lircsszz/article/details/80118051

    展开全文
  • 两种由旋转矩阵计算欧拉角的办法

    千次阅读 2018-04-28 11:06:30
    算法一:直接法 bool isRotationMatrix(cv::Mat &R) ... //将投影矩阵分解为旋转矩阵和相机(内参)矩阵 Debug("Euler Angle"); Debug(euler_angles); } 无需判断奇异性,直接调用库函数,相对简单

    算法一:直接法

    bool isRotationMatrix(cv::Mat &R)
    {
    	cv::Mat R_t;
    	cv::transpose(R,R_t);
    	cv::Mat shouldBeIdentity=R_t*R;
    	cv::Mat I = cv::Mat::eye(3,3,shouldBeIdentity.type());
    	return norm(I,shouldBeIdentity)< 1e-6;
    } 
    
     void getEulerAngles(cv::Mat matrix)
    {
    
    	assert(isRotationMatrix(matrix));
    	
    	float sy=sqrt(matrix.at<double>(0,0)*matrix.at<double>(0,0)+matrix.at<double>(1,0)*matrix.at<double>(1,0));
    
    	bool singular = sy<1e-6;
    	
    	if(!singular)
    	{
    		theta_x=atan2(matrix.at<double>(2,1),matrix.at<double>(2,2));
    		//theta_x= theta_x*180.0/3.1416 ;
    		theta_y=atan2(-matrix.at<double>(2,0), sy);
    		//theta_y= theta_y*180.0/3.1416 ;
    		theta_z=atan2(matrix.at<double>(1,0), matrix.at<double>(0,0));
    		//theta_z= theta_z*180.0/3.1416 ;
    	}
    	else
    	{
    		theta_x=atan2(-matrix.at<double>(1,2), matrix.at<double>(1,1));
    		//theta_x= theta_x*180.0/3.1416 ;
    		theta_y=atan2(-matrix.at<double>(2,0), sy);
    		//theta_y= theta_y*180.0/3.1416 ;
    		theta_z=0;
    		//theta_z= theta_z*180.0/3.1416 ;
    	}
    	Debug("theta_x");
    	Debug(theta_x);
    	Debug("theta_y");
    	Debug(theta_y);
    	Debug("theta_z");
    	Debug(theta_z); 
    }

    NOTE:需要判断奇异性(singularity)!

    算法二:拆分法

      void getEulerAngles(cv::Mat &R,cv::Mat &t,cv::Mat &euler_angles)
    {
    	cv::Mat camMatrix,rotMatrix,transVect,theta_x,theta_y,theta_z;
    	cv::Mat rotation_vec;
    	cv::Mat projMatrix 		= cv::Mat(3,4,CV_64FC1);
    	//cv::Mat euler_angles 	= cv::Mat(3,1,CV_64FC1);
    	cv::Mat out_intrinsics  = cv::Mat(3,3,CV_64FC1);
    	cv::Mat out_rotation	= cv::Mat(3,3,CV_64FC1);
    	cv::Mat out_translation = cv::Mat(4,1,CV_64FC1);
    	cv::hconcat(R,t,projMatrix);//将R、t拼接维投影矩阵
    	cv::decomposeProjectionMatrix(projMatrix,out_intrinsics,out_rotation,out_translation,
    								  cv::noArray(),cv::noArray(),cv::noArray(),euler_angles);
    	//将投影矩阵分解为旋转矩阵和相机(内参)矩阵
    	Debug("Euler Angle");  
    	Debug(euler_angles);
    } 

    无需判断奇异性,直接调用库函数,相对简单



    展开全文
  • 旋转矩阵欧拉角

    2015-09-06 20:40:22
    旋转矩阵欧拉角, 用于有已知的旋转矩阵推算旋转角度。 对于任何形式的旋转矩阵有一定的参考价值。
  • 旋转矩阵欧拉角、四元数理论及其转换关系

    万次阅读 多人点赞 2017-05-21 12:18:48
    旋转矩阵欧拉角、四元数理论及其转换关系author@jason_ql(lql0716) http://blog.csdn.net/lql07161、概述旋转矩阵欧拉角、四元数主要用于表示坐标系中的旋转关系,它们之间的转换关系可以减小一些算法的...
  • rotx(10)*roty(20)*rotz(30)这个是动态的旋转矩阵计算方法,即绕每次旋转之后的坐标系进行旋转。 旋转矩阵到欧拉角: dcm2angle()主要用这个函数进行,但是要区分是静态欧拉角还是动态的欧拉角。 如果是静态的欧拉角...
  • 旋转矩阵欧拉角

    2018-05-15 23:51:51
    三维空间中的旋转:旋转矩阵欧拉角考虑这样一个问题:如何计算三维空间中一个点绕着某一条向量旋转一个特定角度之后的坐标?旋转矩阵欧拉角和四元数都是用来解决这个问题的方法。关于四元数的内容可以看平面等距...
  • 根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现1 旋转矩阵转换为欧拉角(Euler Angles)2 欧拉角转换为旋转矩阵 相机标定过程中,...
  • 六轴机器人空间旋转矩阵欧拉角之间转换公式,算法在实际应用中得到了验证。
  • 今天小编就为大家分享一篇python 和c++实现旋转矩阵欧拉角的变换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 旋转矩阵欧拉角概述欧拉角旋转矩阵欧拉角转为旋转矩阵旋转矩阵转为欧拉角总结 概述 本篇博客,主要给出如何将3x3的旋转矩阵转换成欧拉角的讨论和代码。 什么是旋转矩阵欧拉角呢? 欧拉角 我们应该知道,对于...
  • Eigen中旋转矩阵欧拉角的转换Eigen中旋转矩阵欧拉角的转换Eigen中欧拉角转换旋转矩阵功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的...
  • 三维空间中的旋转:旋转矩阵欧拉角 参考自:http://blog.miskcoo.com/2016/12/rotation-in-3d-space 考虑这样一个问题:如何计算三维空间中一个点绕着某一条向量旋转一个特定角度之后的坐标? 旋转矩阵欧拉角和...
  • 定角(Fixed angles) 围绕固定的坐标系转动。固定坐标系的原点,坐标系再围绕已经固定的轴转动,全程原坐标系不动。...由角度推旋转矩阵旋转矩阵推角度 欧拉角(Euler angles) “自旋转..
  • 3. 旋转矩阵欧拉角之间的关系; 4. 旋转矩阵欧拉角之间的转换及其代码; 5. decomposeProjectionMatrix函数中的欧拉角的单位是弧度还是角度,pitch/yaw/roll三者的顺序又是如何对应的? pitch = ...
  • 旋转矩阵欧拉角1 关于欧拉角2 转换公式推导2.1 由欧拉角构造旋转矩阵2.2 由旋转矩阵推算欧拉角2.2.1 一般情况2.2.2 约束滚转角3 转换代码(C++)3.1 欧拉角-->旋转矩阵3.2 旋转矩阵-->欧拉角3.2.1 一般情况...
  • 旋转矩阵欧拉角、四元数 【如果有错的地方记得提醒我,感谢】 一、左右手坐标系 主要各种相机传感器坐标方向其实都不太一致,左手坐标系旋转90度还是左手坐标系,这里分左右手【关注的是三个坐标轴组合方式】。 ...
  • opencascade获取四元数、旋转矩阵欧拉角 如图,计算结果与PowerMill中的结果进行对照 在opencascade中当我们想要获取两个坐标轴之间的旋转关系时,如旋转矩阵、旋转四元数以及欧拉角等可以按照如下步骤进行: ...
  • 这篇博客将会分享旋转矩阵欧拉角的相互转换。 三维旋转矩阵有三个自由度,旋转能够使用多种方法表示,比如一个3x3的矩阵,比如四元数,甚至可以将旋转表示为三个数字,即绕三个轴x,y,z的旋转角度。在原始的欧拉角...
  • 1、旋转向量与旋转矩阵 https://blog.csdn.net/qq_31806429/article/details/87920597 2、旋转矩阵欧拉角 https://www.jianshu.com/p/5e130c04a602
  • 旋转矩阵欧拉角、四元数主要用于:向量的旋转、坐标系之间的转换、角位移计算、方位的平滑插值计算旋转矩阵欧拉角、四元数比较 不同的方位表示方法适用于不同的情况。下面是我们对合理选择格式的...
  • 旋转矩阵欧拉角之间互换公式

    千次阅读 2018-06-11 10:49:22
    */#define PAI 3.141592653589793#define RADIAN (PAI / 180.0 ) //弧度 = 角度 * π / 180#define ANGLE (180.0 / PAI ) //角度 = 弧度 * 180 / π 2、旋转矩阵转换为欧拉角 /** * @brief 已知旋转矩阵欧拉角 ...
  • 文章目录旋转的基础知识总结旋转矩阵欧拉角3D 人脸最好使用的欧拉角为 ...通过相机位置算出旋转矩阵的验证 旋转的基础知识总结 一般表示旋转有以下几种方式 旋转矩阵 R(似乎对应唯一的旋转, 可以看这里的说明). ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,488
精华内容 1,395
关键字:

旋转矩阵计算欧拉角