车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

这篇具有很好参考价值的文章主要介绍了车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 概述

旋转矩阵、欧拉角、四元数主要用于表示坐标系中的旋转关系,通过三者之间的转换可以减小一些算法的复杂度。
本文主要概述旋转矩阵、欧拉角、四元数的基本理论、三者之间的转换关系以及三者转换在eigen、matlab和pathon上的方法实现。

2 原理

2.1 旋转矩阵

对于两个三维点p1p2
p 1 ( x 1 , y 1 , z 1 ) , p 2 ( x 2 , y 2 , z 2 ) p_1\left(x_1, y_1, z_1\right),p_2\left(x_2, y_2, z_2\right) p1(x1,y1,z1),p2(x2,y2,z2)
由点p1经过旋转矩阵R旋转到p2,则有:
R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] , [ x 2 y 2 z 2 ] = R [ x 1 y 1 z 1 ] R=\left[\begin{array}{lll} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{array}\right] , \left[\begin{array}{l} x_2 \\ y_2 \\ z_2 \end{array}\right]=R\left[\begin{array}{l} x_1 \\ y_1 \\ z_1 \end{array}\right] R= r11r21r31r12r22r32r13r23r33 , x2y2z2 =R x1y1z1

其中,旋转矩阵为正交矩阵RRT=E。

2.1.1 绕x轴旋转

R χ ( θ ) = [ 1 0 0 0 cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ ] R_\chi(\theta)=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta \\ 0 & \sin \theta & \cos \theta \end{array}\right] Rχ(θ)= 1000cosθsinθ0sinθcosθ

2.1.2 绕y轴旋转

R y ( θ ) = [ cos ⁡ θ 0 sin ⁡ θ 0 1 0 − sin ⁡ θ 0 cos ⁡ θ ] R_y(\theta)=\left[\begin{array}{ccc} \cos \theta & 0 & \sin \theta \\ 0 & 1 & 0 \\ -\sin \theta & 0 & \cos \theta \end{array}\right] Ry(θ)= cosθ0sinθ010sinθ0cosθ

2.1.3 绕z轴旋转

R z ( θ ) = [ cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ 0 0 0 1 ] R_z(\theta)=\left[\begin{array}{ccc} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{array}\right] Rz(θ)= cosθsinθ0sinθcosθ0001
三维空间内任意一个旋转可表示为依次绕着以上三个旋转轴旋3个角度的组合。这3个角度称为欧拉角。
这三个轴可以指固定的世界坐标系轴,也可以指被旋转的物体坐标系的轴。绕轴旋转次序不同,会导致结果也不同。

2.2 欧拉角

对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的,而坐标系则固定于刚体,随着刚体的旋转而旋转。

设定xyz-轴为参考系的参考轴。称xy-平面与XY-平面的相交为交线,用英文字母(N)代表。

车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

图中,三个欧拉角分别为:(α,β,γ),其中:

α ∈ [ 0 , 2 π ] , β ∈ [ 0 , Π ] , γ ∈ [ 0 , 2 π ] \alpha \in[0,2 \pi], \beta \in[0, \Pi], \gamma \in[0,2 \pi] α[0,2π],β[0,Π],γ[0,2π]蓝色的轴为:xyz轴。 红色的轴为:XYZ轴。 绿色的线为交线:N

2.2.1 基本思想

欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。所以,欧拉旋转的三个角,可以对应于Yaw、Pitch和Roll三个旋转矩阵。

  • Yaw(偏航):欧拉角向量的y轴;
  • Pitch(俯仰):欧拉角向量的x轴;
  • Roll(翻滚):欧拉角向量的z轴。
车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

2.2.2 欧拉角的缺点

  1. 欧拉角的表示方式不唯一。给定某个起始朝向和目标朝向,即使给定yaw、pitch、roll的顺序,也可以通过不同的yaw/pitch/roll的角度组合来表示所需的旋转。这主要是由于万向锁(Gimbal Lock)引起的;
  2. 欧拉角的插值比较难;
  3. 计算旋转变换时,一般需要转换成旋转矩阵,这时候需要计算很多sin, cos,略复杂。

2.3 四元数

三维空间的任意旋转,都可以用绕三维空间的某个轴旋转过某个角度来表示,即所谓的Axis-Angle表示方法。这种表示方法里,Axis可用一个三维向量(x,y,z)来表示,θ可以用一个角度值来表示,直观来讲,一个四维向量(θ,x,y,z)就可以表示出三维空间任意的旋转。注意,这里的三维向量(x,y,z)只是用来表示axis的方向朝向,因此更紧凑的表示方式是用一个单位向量来表示方向axis,而用该三维向量的长度来表示角度值θ。这样以来,可以用一个三维向量(θx,θy,θz)就可以表示出三维空间任意的旋转,前提是其中(x,y,z)是单位向量。这就是旋转向量(Rotation Vector)的表示方式,OpenCV里相机标定部分的rvec就是用这种方法来表示旋转。

单位向量(x,y,z)旋转角度θ后的四元数:
( cos ⁡ θ 2 , x ∗ sin ⁡ θ 2 , y ∗ sin ⁡ θ 2 , z ∗ sin ⁡ θ 2 ) \left(\cos \frac{\theta}{2}, x * \sin \frac{\theta}{2}, y * \sin \frac{\theta}{2}, z * \sin \frac{\theta}{2}\right) (cos2θ,xsin2θ,ysin2θ,zsin2θ)
对于三维坐标的旋转,可以通过四元数乘法直接操作,与旋转矩阵操作可以等价,但是表示方式更加紧凑,计算量也可以小一些。

2.3.1 四元数的复数定义

q = q 0 + q 1 i + q 2 j + q 3 k = [ s , v ] \mathbf{q}=q_0+q_1 i+q_2 j+q_3 k=[s, \mathbf{v}] q=q0+q1i+q2j+q3k=[s,v]

其中,q0, q1, q2, q3均为实数,s=q0, v=[q1, q2, q3],i2=j2=k2=-1 。

对于i,j,k本身的几何含义可以理解为一种旋转,其中i代表x轴与y轴相交平面中x轴正向向y轴正向的旋转,j旋转代表z轴与x轴相交平面中z轴正向向x轴正向的旋转,k旋转代表y轴与z轴相交平面中y轴正向向z轴正向的旋转,-i,-j,-k分别代表i,j,k的反向旋转。

2.3.2 四元数的缺点

  1. 非奇异表达(和欧拉角之类的表示相比);
  2. 比矩阵更紧凑(更快速);
  3. 单位四元数的对可以表示四维空间中的一个旋转。

3 三者转换计算公式

车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

由欧拉角求旋转矩阵

设三个轴x,y,z的欧拉角分别为θx,θy,θz,正弦值、余弦值分别为sx,cx,sy,cy,sz,cz。那么旋转矩阵为:
R ( θ x , θ y , θ z ) = R z ( θ z ) R y ( θ y ) R x ( θ x ) = [ C y C z C z S x S y − C x S z S x S z + C x C z S y C y S z C x C z + S x S y S z C x S y S z − C z S z − S y C y S x C x C y ] \begin{array}{l} R\left(\theta_x, \theta_y, \theta_z\right)=R_z\left(\theta_z\right) R_y\left(\theta_y\right) R_x\left(\theta_x\right) \\ =\left[\begin{array}{ccc} C_y C_z & C_z S_x S_y-C_x S_z & S_x S_z+C_x C_z S_y \\ C_y S_z & C_x C_z+S_x S_y S_z & C_x S_y S_z-C_z S_z \\ -S_y & C_y S_x & C_x C_y \end{array}\right] \end{array} R(θx,θy,θz)=Rz(θz)Ry(θy)Rx(θx)= CyCzCySzSyCzSxSyCxSzCxCz+SxSySzCySxSxSz+CxCzSyCxSySzCzSzCxCy

3.2 由旋转矩阵求欧拉角

R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] = [ C y C z C z S x S y − C x S z S x S z + C x C z S y C y S z C x C z + S x S y S z C x S y S z − C z S z − S y C y S x C x C y ] \begin{array}{l} R=\left[\begin{array}{lcc} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{array}\right] \\ =\left[\begin{array}{ccc} C_y C_z & C_z S_x S_y-C_x S_z & S_x S_z+C_x C_z S_y \\ C_y S_z & C_x C_z+S_x S_y S_z & C_x S_y S_z-C_z S_z \\ -S_y & C_y S_x & C_x C_y \end{array}\right] \end{array} R= r11r21r31r12r22r32r13r23r33 = CyCzCySzSyCzSxSyCxSzCxCz+SxSySzCySxSxSz+CxCzSyCxSySzCzSzCxCy
解方程得:
θ x = atan ⁡ 2 ( r 32 , r 33 ) θ y = atan ⁡ 2 ( − r 31 , r 32 2 + r 33 2 ) θ z = atan ⁡ 2 ( r 21 , r 11 ) \begin{array}{c} \theta_x=\operatorname{atan} 2\left(r_{32}, r_{33}\right) \\ \theta_y=\operatorname{atan} 2\left(-r_{31}, \sqrt{r_{32}^2+r_{33}^2}\right) \\ \theta_z=\operatorname{atan} 2\left(r_{21}, r_{11}\right) \end{array} θx=atan2(r32,r33)θy=atan2(r31,r322+r332 )θz=atan2(r21,r11)

其中:atan2(y,x)求的是y/x的反正切,其返回值为[-pai, +pai]之间的一个数。

3.3 由四元数求旋转矩阵

  • 情况1:

    将四元数转化为轴角θ与向量(x,y,z):
    q = ( θ x y z ) T \mathbf{q}=\left(\begin{array}{llll} \theta & x & y & z \end{array}\right)^T q=(θxyz)T
    利用Rodrigues公式可以由单位向量旋转角度θ后的四元数求得旋转矩阵R
    R = e ω θ = I + ω × sin ⁡ θ + ω × 2 ( 1 − cos ⁡ θ ) = [ cos ⁡ θ + x 2 ( 1 − cos ⁡ θ ) − z sin ⁡ θ + x y ( 1 − cos ⁡ θ ) y sin ⁡ θ + x z ( 1 − cos ⁡ θ ) z sin ⁡ θ + x y ( 1 − cos ⁡ θ ) cos ⁡ θ + y 2 ( 1 − cos ⁡ θ ) − x sin ⁡ θ + y z ( 1 − cos ⁡ θ ) − y sin ⁡ θ + x z ( 1 − cos ⁡ θ ) x sin ⁡ θ + y z ( 1 − cos ⁡ θ ) cos ⁡ θ + z 2 ( 1 − cos ⁡ θ ) ] \begin{array}{c} R=e^{\omega \theta}=I+\omega_{\times} \sin \theta+\omega_{\times}^2(1-\cos \theta)= \\ {\left[\begin{array}{ccc} \cos \theta+x^2(1-\cos \theta) & -z \sin \theta+x y(1-\cos \theta) & y \sin \theta+x z(1-\cos \theta) \\ z \sin \theta+x y(1-\cos \theta) & \cos \theta+y^2(1-\cos \theta) & -x \sin \theta+y z(1-\cos \theta) \\ -y \sin \theta+x z(1-\cos \theta) & x \sin \theta+y z(1-\cos \theta) & \cos \theta+z^2(1-\cos \theta) \end{array}\right]} \end{array} R=eωθ=I+ω×sinθ+ω×2(1cosθ)= cosθ+x2(1cosθ)zsinθ+xy(1cosθ)ysinθ+xz(1cosθ)zsinθ+xy(1cosθ)cosθ+y2(1cosθ)xsinθ+yz(1cosθ)ysinθ+xz(1cosθ)xsinθ+yz(1cosθ)cosθ+z2(1cosθ)

  • 情况2:

    已知四元数为,
    q = q 0 + q 1 i + q 2 j + q 3 k = [ s , v ] \mathbf{q}=q_0+q_1 i+q_2 j+q_3 k=[s, \mathbf{v}] q=q0+q1i+q2j+q3k=[s,v]
    利用Rodrigues公式可以由四元数求得旋转矩阵R
    q = q 0 + q 1 i + q 2 j + q 3 k = [ s , v ] \mathbf{q}=q_0+q_1 i+q_2 j+q_3 k=[s, \mathbf{v}] q=q0+q1i+q2j+q3k=[s,v]
    R R R
    = [ 1 − 2 q 2 2 − 2 q 3 2 2 q 1 q 2 − 2 q 0 q 3 2 q 1 q 3 + 2 q 0 q 2 2 q 1 q 2 + 2 q 0 q 3 1 − 2 q 1 2 − 2 q 3 2 2 q 2 q 3 − 2 q 0 q 1 2 q 1 q 3 − 2 q 0 q 2 2 q 2 q 3 + 2 q 0 q 1 1 − 2 q 1 2 − 2 q 2 2 =\left[\begin{array}{ccc} 1-2 q_2^2-2 q_3^2 & 2 q_1 q_2-2 q_0 q_3 & 2 q_1 q_3+2 q_0 q_2 \\ 2 q_1 q_2+2 q_0 q_3 & 1-2 q_1^2-2 q_3^2 & 2 q_2 q_3-2 q_0 q_1 \\ 2 q_1 q_3-2 q_0 q_2 & 2 q_2 q_3+2 q_0 q_1 & 1-2 q_1^2-2 q_2^2 \end{array}\right. = 12q222q322q1q2+2q0q32q1q32q0q22q1q22q0q312q122q322q2q3+2q0q12q1q3+2q0q22q2q32q0q112q122q22

3.4 由旋转矩阵求四元数

q 0 = 1 + r 11 + r 22 + r 33 2 . q 1 = r 32 − r 23 4 q 0 . q 2 = r 13 − r 31 4 q 0 q 3 = r 21 − r 12 4 q 0 . \begin{array}{c} q_0=\frac{\sqrt{1+r_{11}+r_{22}+r_{33}}}{2} . \\ q_1=\frac{r_{32}-r_{23}}{4 q_0} . \\ q_2=\frac{r_{13}-r_{31}}{4 q_0} \\ q_3=\frac{r_{21}-r_{12}}{4 q_0} . \end{array} q0=21+r11+r22+r33 .q1=4q0r32r23.q2=4q0r13r31q3=4q0r21r12.
其中, 要满足 q 0 ≠ 0 , 1 + r 11 + r 22 + r 33 > 0 q_0 \neq 0,1+r_{11}+r_{22}+r_{33}>0 q0=0,1+r11+r22+r33>0, 即 1 + tr ⁡ ( R ) > 1+\operatorname{tr}(R)> 1+tr(R)> 0。若 q 0 q_0 q0 趋近于 0, 则求解结果略有不同。

3.5 由四元数求欧拉角

如依次绕 z , y , x z, y, x z,y,x 分别旋转一个固定角度, 使用 yaw, pitch, roll 分别表示物体绕, x , y , z x, y, z x,y,z 的旋转角度, 记为 ψ , θ , ϕ 。  \psi, \theta, \phi_{\text {。 }} ψ,θ,ϕ 
[ ϕ θ ψ ] = [ arctan ⁡ 2 ( q 0 q 1 + q 2 q 3 ) 1 − 2 ( q 1 2 + q 2 2 ) arcsin ⁡ ( 2 ( q 0 q 2 − q 3 q 1 ) ) arctan ⁡ 2 ( q 0 q 3 + q 1 q 2 ) 1 − 2 ( q 2 2 + q 3 2 ) ] \left[\begin{array}{l} \phi \\ \theta \\ \psi \end{array}\right]=\left[\begin{array}{c} \arctan \frac{2\left(q_0 q_1+q_2 q_3\right)}{1-2\left(q_1^2+q_2^2\right)} \\ \arcsin \left(2\left(q_0 q_2-q_3 q_1\right)\right) \\ \arctan \frac{2\left(q_0 q_3+q_1 q_2\right)}{1-2\left(q_2^2+q_3^2\right)} \end{array}\right] ϕθψ = arctan12(q12+q22)2(q0q1+q2q3)arcsin(2(q0q2q3q1))arctan12(q22+q32)2(q0q3+q1q2)
注意, arctan ⁡ \arctan arctan arcsin ⁡ \arcsin arcsin 的结果 [ − Π 2 , Π 2 ] \left[-\frac{\Pi}{2}, \frac{\Pi}{2}\right] [2Π,2Π], 这并不能覆盖所有朝向(对 于 θ \theta θ [ − Π 2 , Π 2 ] \left[-\frac{\Pi}{2}, \frac{\Pi}{2}\right] [2Π,2Π] 的取值范围已经满足), 因此需要用 atan2 来代替 arctan ⁡ ∘ \arctan _{\circ} arctan
[ ϕ θ ψ ] = [ atan ⁡ 2 ( 2 ( q 0 q 1 + q 2 q 3 ) , 1 − 2 ( q 1 2 + q 2 2 ) ) asin ⁡ ( 2 ( q 0 q 2 − q 3 q 1 ) ) atan ⁡ 2 ( 2 ( q 0 q 3 + q 1 q 2 ) , 1 − 2 ( q 2 2 + q 3 2 ) ) ] \left[\begin{array}{c} \phi \\ \theta \\ \psi \end{array}\right]=\left[\begin{array}{c} \operatorname{atan} 2\left(2\left(q_0 q_1+q_2 q_3\right), 1-2\left(q_1^2+q_2^2\right)\right) \\ \operatorname{asin}\left(2\left(q_0 q_2-q_3 q_1\right)\right) \\ \operatorname{atan} 2\left(2\left(q_0 q_3+q_1 q_2\right), 1-2\left(q_2^2+q_3^2\right)\right) \end{array}\right] ϕθψ = atan2(2(q0q1+q2q3),12(q12+q22))asin(2(q0q2q3q1))atan2(2(q0q3+q1q2),12(q22+q32))
其中, atan ⁡ 2 ( y , x ) \operatorname{atan} 2(y, x) atan2(y,x) C + + \mathrm{C}++ C++ 中的函数, 求的是 y / x \mathrm{y} / \mathrm{x} y/x 的反正切, 其返 回值为 [ − Π , + Π ] [-\Pi,+\Pi] [Π,+Π] 之间的一个数。

3.6 由欧拉角求四元数

q I B = [ cos ⁡ ( ψ / 2 ) 0 0 sin ⁡ ( ψ / 2 ) ] [ cos ⁡ ( θ / 2 ) 0 sin ⁡ ( θ / 2 ) 0 ] [ cos ⁡ ( ϕ / 2 ) sin ⁡ ( ϕ / 2 ) 0 0 ] = [ cos ⁡ ( ϕ / 2 ) cos ⁡ ( θ / 2 ) cos ⁡ ( ψ / 2 ) + sin ⁡ ( ϕ / 2 ) sin ⁡ ( θ / 2 ) sin ⁡ ( ψ / 2 ) sin ⁡ ( ϕ / 2 ) cos ⁡ ( θ / 2 ) cos ⁡ ( ψ / 2 ) − cos ⁡ ( ϕ / 2 ) sin ⁡ ( θ / 2 ) sin ⁡ ( ψ / 2 ) cos ⁡ ( ϕ / 2 ) sin ⁡ ( θ / 2 ) cos ⁡ ( ψ / 2 ) + sin ⁡ ( ϕ / 2 ) cos ⁡ ( θ / 2 ) sin ⁡ ( ψ / 2 ) cos ⁡ ( ϕ / 2 ) cos ⁡ ( θ / 2 ) sin ⁡ ( ψ / 2 ) − sin ⁡ ( ϕ / 2 ) sin ⁡ ( θ / 2 ) cos ⁡ ( ψ / 2 ) ] \begin{array}{c} \mathbf{q}_{\mathrm{IB}}=\left[\begin{array}{c} \cos (\psi / 2) \\ 0 \\ 0 \\ \sin (\psi / 2) \end{array}\right]\left[\begin{array}{c} \cos (\theta / 2) \\ 0 \\ \sin (\theta / 2) \\ 0 \end{array}\right]\left[\begin{array}{c} \cos (\phi / 2) \\ \sin (\phi / 2) \\ 0 \\ 0 \end{array}\right] \\ =\left[\begin{array}{l} \cos (\phi / 2) \cos (\theta / 2) \cos (\psi / 2)+\sin (\phi / 2) \sin (\theta / 2) \sin (\psi / 2) \\ \sin (\phi / 2) \cos (\theta / 2) \cos (\psi / 2)-\cos (\phi / 2) \sin (\theta / 2) \sin (\psi / 2) \\ \cos (\phi / 2) \sin (\theta / 2) \cos (\psi / 2)+\sin (\phi / 2) \cos (\theta / 2) \sin (\psi / 2) \\ \cos (\phi / 2) \cos (\theta / 2) \sin (\psi / 2)-\sin (\phi / 2) \sin (\theta / 2) \cos (\psi / 2) \end{array}\right] \end{array} qIB= cos(ψ/2)00sin(ψ/2) cos(θ/2)0sin(θ/2)0 cos(ϕ/2)sin(ϕ/2)00 = cos(ϕ/2)cos(θ/2)cos(ψ/2)+sin(ϕ/2)sin(θ/2)sin(ψ/2)sin(ϕ/2)cos(θ/2)cos(ψ/2)cos(ϕ/2)sin(θ/2)sin(ψ/2)cos(ϕ/2)sin(θ/2)cos(ψ/2)+sin(ϕ/2)cos(θ/2)sin(ψ/2)cos(ϕ/2)cos(θ/2)sin(ψ/2)sin(ϕ/2)sin(θ/2)cos(ψ/2)

4 三者转换Eigen实现

车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现

Eigen库中三种形式可表示为:

  • 旋转矩阵(3X3):Eigen::Matrix3d
  • 欧拉角(3X1):Eigen::Vector3d
  • 四元数(4X1):Eigen::Quaterniond
// 初始化旋转矩阵
Eigen::Matrix3d rotation_matrix;
rotation_matrix<<x_00,x_01,x_02,x_10,x_11,x_12,x_20,x_21,x_22;
// 初始化欧拉角
Eigen::Vector3d eulerAngle(yaw,pitch,roll);
// 初始化四元数
Eigen::Quaterniond quaternion(w,x,y,z);

4.1 由欧拉角求旋转矩阵

Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ())); 
Eigen::Matrix3d rotation_matrix;
rotation_matrix=yawAngle*pitchAngle*rollAngle;

4.2 由旋转矩阵求欧拉角

// Z-Y-X,即RPY
Eigen::Vector3d eulerAngle=rotation_matrix.eulerAngles(2,1,0);

4.3 由四元数求旋转矩阵

Eigen::Matrix3d rotation_matrix;
rotation_matrix=quaternion.matrix();
// 两种方法均可
Eigen::Matrix3d rotation_matrix;
rotation_matrix=quaternion.toRotationMatrix(); 

4.4 由旋转矩阵求四元数

Eigen::Quaterniond quaternion(rotation_matrix);
// 两种方法均可
Eigen::Quaterniond quaternion;quaternion=rotation_matrix;

4.5 由四元数求欧拉角

Eigen::Vector3d eulerAngle=quaternion.matrix().eulerAngles(2,1,0);

4.6 由欧拉角求四元数

Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2),Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1),Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0),Vector3d::UnitZ())); 
Eigen::Quaterniond quaternion;
quaternion=yawAngle*pitchAngle*rollAngle;

5 三者转换matlab实现

5.1 由欧拉角求旋转矩阵

eul2rotm()

5.2 由旋转矩阵求欧拉角

rotm2eul()

5.3 由四元数求旋转矩阵

quat2rotm()

5.4 由旋转矩阵求四元数

rotm2quat()

5.5 由四元数求欧拉角

eul2quat()

5.6 由欧拉角求四元数

eul2quat()

6 三者转换python实现

可使用scipy包中的scipy.spatial.transform.Rotation实现。

6.1 由欧拉角求旋转矩阵

from_euler()
as_matrix()

6.2 由旋转矩阵求欧拉角

from_matrix()
as_euler()

6.3 由四元数求旋转矩阵

from_quat()
as_matrix()

6.4 由旋转矩阵求四元数

from_matrix()
as_quat()

6.5 由四元数求欧拉角

from_quat()
as_euler()

6.6 由欧拉角求四元数

from_euler()
as_quat()

如果觉得我的文章对你起到了些许的帮助,做下手指操点击下面的大拇指👍感谢~
我是专注自动驾驶、LiDAR感知、三维点云处理、激光SLAM领域的阿川,欢迎各位志同道合的朋友在下面积极留言。欲将心事付瑶琴,希望能在交流中收获知识、经验和挚友🌞文章来源地址https://www.toymoban.com/news/detail-410015.html

到了这里,关于车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 四元数,旋转矩阵,欧拉角互转(python)

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

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

    打印输出: 在线转换网站: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日
    浏览(29)
  • 欧拉角,轴角,四元数与旋转矩阵详解

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

    2024年01月17日
    浏览(32)
  • COLMAP中将旋转矩阵转为四元数的实现

          instant-ngp中执行scripts/colmap2nerf.py时,在colmap_text目录下会生成cameras.txt、images.txt、points3D.txt三个文件:       1.cameras.txt:       (1).该文件包含数据集中所有重构相机(all reconstructed cameras)的内在参数(intrinsic parameters),每个相机占用一行;       (2).参数的长度是可变的,

    2024年02月07日
    浏览(29)
  • 转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换

    由于在平时总是或多或少的遇到平移旋转的问题,每次都是现查资料,然后查了忘,忘了继续查,这次弄明白之后干脆写一篇文章,给人方便同时于己方便,后续如有扩充或变动也方便添加。 假设有两个向量 a 1 = ( x 1 , y 1 , z 1 ) a_1 = (x_1, y_1, z_1) a 1 ​ = ( x 1 ​ , y 1 ​ , z 1 ​

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

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

    2024年01月18日
    浏览(33)
  • 欧拉角,四元数和旋转矩阵互转代码【python版】

    欧拉角以 Roll、Pitch、Yaw 的顺序表示 四元数以[ q w q_w q w ​ , q x q_x q x ​ , q y q_y q y ​ , q z q_z q z ​ ]的顺序表示 代码包括了 欧拉角与四元数互转 , 旋转矩阵与四元数互转 , 欧拉角与旋转矩阵互转 ,输入参数均为 np.array 形式 代码内置了角度制和弧度制😃😃 当时因为这块

    2023年04月22日
    浏览(42)
  • 【数理知识】三维空间旋转矩阵的欧拉角表示法,四元数表示法,两者之间的转换,Matlab 代码实现

    序号 内容 1 【数理知识】自由度 degree of freedom 及自由度的计算方法 2 【数理知识】刚体 rigid body 及刚体的运动 3 【数理知识】刚体基本运动,平动,转动 4 【数理知识】向量数乘,内积,外积,matlab代码实现 5 【数理知识】最小二乘法,从线性回归出发,数值举例并用最小

    2024年02月12日
    浏览(38)
  • ROS系列——使用python的transforms3d、numpy库实现四元数、旋转矩阵、欧拉角、轴角等的相互转换

    pip3 install transforms3d 四元数模块在transforms3d.quaternions里,直接导入即可使用 2.1.1四元数转旋转矩阵 2.1.2 旋转矩阵转四元数 2.2.1 四元数转轴角 2.2.2 轴角转四元数 四元数模块在transforms3d.euler里,直接导入即可使用 3.1.1 固定轴欧拉角转四元数 3.1.2 四元数转固定轴欧拉角 3.2.1 固定

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

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

    2024年02月13日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包