刚体姿态运动学(一)欧拉角、四元数、旋转矩阵及其转换

627 阅读11分钟

刚体运动学姿态推导——弄懂欧拉角、四元数、旋转矩阵(一)姿态表示

最近做项目用到了刚体姿态方面的知识,乱七八糟东西一堆,尤其用到速度表示的微分运动学,特别容易弄混,因此写个帖子方便复习和查找 。主要是记录机器人方向用到的知识。

旋转矩阵

对于空间中的两组坐标系[ x 1 x_1 x1​, y 1 y_1 y1​, z 1 z_1 z1​],[ x 0 x_0 x0​, y 0 y_0 y0​, z 0 z_0 z0​]我们可以用一个旋转矩阵来描述二者之间的姿态变化:
R 1 0 = ( x 1 ⋅ x 0 y 1 ⋅ x 0 z 1 ⋅ x 0 x 1 ⋅ y 0 y 1 ⋅ y 0 z 1 ⋅ y 0 x 1 ⋅ z 0 y 1 ⋅ z 0 z 1 ⋅ z 0 ) R_{1}^{0}=\left(\begin{array}{lll} x_{1} \cdot x_{0} & y_{1} \cdot x_{0} & z_{1} \cdot x_{0} \\ x_{1} \cdot y_{0} & y_{1} \cdot y_{0} & z_{1} \cdot y_{0} \\ x_{1} \cdot z_{0} & y_{1} \cdot z_{0} & z_{1} \cdot z_{0} \end{array}\right) R10​=⎝⎛​x1​⋅x0​x1​⋅y0​x1​⋅z0​​y1​⋅x0​y1​⋅y0​y1​⋅z0​​z1​⋅x0​z1​⋅y0​z1​⋅z0​​⎠⎞​
他的意思是,坐标系0经过 R 1 0 R_{1}^{0} R10​的旋转,姿态会和坐标系1相同。也就是说 R 1 0 R_{1}^{0} R10​表示了从0到1的旋转。上标是出发系,下标是目标系。 R 1 0 R_{1}^{0} R10​的具体数值由出发系的转置点乘目标系得到,即
R 1 0 = [ x 0 y 0 z 0 ] T ⋅ [ x 1 y 1 z 1 ] R_{1}^{0}=[x_{0} y_{0}z_{0}]^T \cdot [x_{1} y_{1}z_{1}] R10​=[x0​y0​z0​]T⋅[x1​y1​z1​]
当然,旋转矩阵除了表示坐标系之间的变换,还有其他的作用,首先,可以表示同一个点在不同系下坐标的关系。设点 p p p在0系下的坐标是 p 0 p^0 p0,在1系下的坐标是 p 1 p^1 p1,则:
p 0 = R 1 0 p 1 p^{0}=R_{1}^{0}p^{1} p0=R10​p1
此外,它还有第三层含义,即表示向量在同一个坐标系中的旋转。设有一个向量 v 0 v_{0} v0​,经过一个旋转 R 1 0 R_{1}^{0} R10​后变为向量 v 1 v_{1} v1​,则:
v 1 = R 0 1 v 0 v^{1}=R_{0}^{1}v^{0} v1=R01​v0
因此,R其实有三种含义:

  1. 表示点在不同坐标系下的转换
  2. 表示坐标系之间的旋转
  3. 表示向量之间的旋转 。
    使用时,要分清楚究竟是哪一层意思,从哪一系到哪一系,就能避免混淆。

欧拉角

旋转矩阵用9个元素表示一个三维的运动(旋转),显然是包含约束的。这样使用非常不方便。因此提出了一种只用三个元素的表示方法,欧拉角。欧拉角表示刚体按顺序绕三个轴依次旋转,这三个轴有很多选择,既可以选则固定轴,又可以选择旋转后的轴。因此,广义上的欧拉角有非常多种,Z-X-Z,X-Y-Z等等。在机器人学中,常用的是两种:

  1. RPY角:刚体绕固定系的X轴转γ角,再绕固定系的Y轴旋转β角,最后绕固定系的Z轴旋转α角,三次都是绕固定系。
    B A R X Y Z ( γ , β , α ) = R Z ( α ) R Y ( β ) R X ( γ ) = [ c α c β c α s β s γ − s α c γ c α s β c γ + s α s ν s α s β s α s β s γ + c α c γ s α s β c γ − c α s γ − s β c β s γ c β c γ ] { }_{B}^{A} R_{X Y Z}(\gamma, \beta, \alpha)=R_{Z}(\alpha) R_{Y}(\beta) R_{X}(\gamma)=\left[\begin{array}{ccc} c \alpha c \beta & c \alpha s \beta s \gamma-s \alpha c \gamma & c \alpha s \beta c \gamma+s \alpha s \nu \\ s \alpha s \beta & s \alpha s \beta s \gamma+c \alpha c \gamma & s \alpha s \beta c \gamma-c \alpha s \gamma \\ -s \beta & c \beta s \gamma & c \beta c \gamma \end{array}\right] BA​RXYZ​(γ,β,α)=RZ​(α)RY​(β)RX​(γ)=⎣⎡​cαcβsαsβ−sβ​cαsβsγ−sαcγsαsβsγ+cαcγcβsγ​cαsβcγ+sαsνsαsβcγ−cαsγcβcγ​⎦⎤​
    因为是绕固定系,所以每次是左乘。这种方法测出的三个角为roll(绕x轴),pitch(绕y轴),yaw(绕z轴)。
  2. ZYX角,刚体绕绕自身的Z轴旋转α,然后绕自身的Y轴旋转β ,最后绕自身的X轴旋转γ,后两次旋转是绕旋转后的系。
    A B R Z / Y ′ X ′ ( γ , β , α ) = R Z ( α ) R Y ( β ) R X ( γ ) = [ c α c β c α s β s γ − s α c γ c α s β c γ + s α s γ s α s β s α s β s γ + c α c γ s α s β c γ − c α s γ − s β c β s γ c β c γ ] A_{B} R_{Z / Y \prime X \prime}(\gamma, \beta, \alpha)=R_{Z}(\alpha) R_{Y}(\beta) R_{X}(\gamma)=\left[\begin{array}{ccc} c \alpha c \beta & c \alpha s \beta s \gamma-s \alpha c \gamma & c \alpha s \beta c \gamma+s \alpha s \gamma \\ s \alpha s \beta & s \alpha s \beta s \gamma+c \alpha c \gamma & s \alpha s \beta c \gamma-c \alpha s \gamma \\ -s \beta & c \beta s \gamma & c \beta c \gamma \end{array}\right] AB​RZ/Y′X′​(γ,β,α)=RZ​(α)RY​(β)RX​(γ)=⎣⎡​cαcβsαsβ−sβ​cαsβsγ−sαcγsαsβsγ+cαcγcβsγ​cαsβcγ+sαsγsαsβcγ−cαsγcβcγ​⎦⎤​
    我们发现,这两种方法是等价的。也就是说,只要绕对应轴转动的角度相同,虽然顺序不同,但转动的结果也是相同的。因此,之后对这两种方法不再区分 。
    欧拉角有一个很重要的问题,那就是万向节死锁。当绕y轴旋转90度时,我们发现,之前绕x轴转和之后绕z轴转,转动方向是一致的。也就是说,这两个运动其实是在一个自由度上。那么势必有些姿态就无法达到,也就无法用欧拉角表示了。因此,我们提出了四元数的方法。

四元数

四元素用四个数来表示旋转。即 Q = { η , ε } \mathrm{Q}=\{\eta, \varepsilon\} Q={η,ε}
η = cos ⁡ θ 2 ε x = sin ⁡ θ 2 r x ε y = sin ⁡ θ 2 r y ε z = sin ⁡ θ 2 r z \begin{aligned} \eta &=\cos \frac{\theta}{2} \\ \varepsilon_{x} &=\sin \frac{\theta}{2} r_{x}\\ \varepsilon_{y} &=\sin \frac{\theta}{2} r_{y}\\ \varepsilon_{z} &=\sin \frac{\theta}{2} r_{z} \end{aligned} ηεx​εy​εz​​=cos2θ​=sin2θ​rx​=sin2θ​ry​=sin2θ​rz​​
四元数不存在奇异点,但比较抽象,不容易理解。

旋转矩阵与欧拉角的转换

欧拉角转旋转矩阵

欧拉角其实就是三次独立的旋转,每次旋转的矩阵为:
R x = [ 1 0 0 0 cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ ] R y = [ cos ⁡ ϕ 0 sin ⁡ ϕ 0 1 0 − sin ⁡ ϕ 0 cos ⁡ ϕ ] R z = [ cos ⁡ ψ − sin ⁡ ψ 0 sin ⁡ ψ cos ⁡ ψ 0 0 0 1 ] R_{x}=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta \\ 0 & \sin \theta & \cos \theta \end{array}\right]\\ R_{y}=\left[\begin{array}{ccc} \cos \phi & 0 & \sin \phi \\ 0 & 1 & 0 \\ -\sin \phi & 0 & \cos \phi \end{array}\right]\\ R_{z}=\left[\begin{array}{ccc} \cos \psi & -\sin \psi & 0 \\ \sin \psi & \cos \psi & 0 \\ 0 & 0 & 1 \end{array}\right] Rx​=⎣⎡​100​0cosθsinθ​0−sinθcosθ​⎦⎤​Ry​=⎣⎡​cosϕ0−sinϕ​010​sinϕ0cosϕ​⎦⎤​Rz​=⎣⎡​cosψsinψ0​−sinψcosψ0​001​⎦⎤​
得到:
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 ⁡ θ ] 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 \theta & \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 \theta \\ -\sin \theta & \sin \psi \cos \theta & \cos \psi \cos \theta \end{array}\right] 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θ​⎦⎤​

旋转矩阵转欧拉角

做一些简单的代数运算即可得到:
θ 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​)​

旋转矩阵与四元数的转换

四元数转旋转矩阵

推导过程比较复杂,首先,利用罗德里格旋转公式获得从角轴到旋转矩阵的转换,对于单位向量 ( x , y , z ) (x,y,z) (x,y,z)旋转 θ \theta θ角后得到的旋转矩阵:
R = I + ω ^ sin ⁡ ( θ ) + ω ^ 2 ( 1 − cos ⁡ ( θ ) ) R=I+\widehat{\omega} \sin (\theta)+\widehat{\omega}^{2}(1-\cos (\theta)) R=I+ω sin(θ)+ω 2(1−cos(θ))
R = [ cos ⁡ θ + x 2 ( 1 − cos ⁡ θ ) x y ( 1 − cos ⁡ θ ) y sin ⁡ θ x y ( 1 − cos ⁡ θ ) cos ⁡ θ + y 2 ( 1 − cos ⁡ θ ) − x sin ⁡ θ − y sin ⁡ θ x sin ⁡ θ cos ⁡ θ ] R=\left[\begin{array}{ccc} \cos \theta+x^{2}(1-\cos \theta) & x y(1-\cos \theta) & y \sin \theta \\ x y(1-\cos \theta) & \cos \theta+y^{2}(1-\cos \theta) & -x \sin \theta \\ -y \sin \theta & x \sin \theta & \cos \theta \end{array}\right] R=⎣⎡​cosθ+x2(1−cosθ)xy(1−cosθ)−ysinθ​xy(1−cosθ)cosθ+y2(1−cosθ)xsinθ​ysinθ−xsinθcosθ​⎦⎤​
再从角轴转化为四元数:
[ 1 − 2 y 2 − 2 z 2 2 x y + 2 w z 2 x z − 2 w y 2 x y − 2 w z 1 − 2 x 2 − 2 z 2 2 y z + 2 w x 2 x z + 2 w y 2 y z − 2 w x 1 − 2 x 2 − 2 y 2 ] \left[\begin{array}{ccc} 1-2 y^{2}-2 z^{2} & 2 x y+2 w z & 2 x z-2 w y \\ 2 x y-2 w z & 1-2 x^{2}-2 z^{2} & 2 y z+2 w x \\ 2 x z+2 w y & 2 y z-2 w x & 1-2 x^{2}-2 y^{2} \end{array}\right] ⎣⎡​1−2y2−2z22xy−2wz2xz+2wy​2xy+2wz1−2x2−2z22yz−2wx​2xz−2wy2yz+2wx1−2x2−2y2​⎦⎤​

旋转矩阵转四元数

旋转矩阵转四元数需要用到上面的结论:
m 12 + m 21 = ( 2 x y + 2 w z ) + ( 2 x y − 2 w z ) = 4 x y m 12 − m 21 = ( 2 x y + 2 w z ) − ( 2 x y − 2 w z ) = 4 w z m 31 + m 13 = ( 2 x z + 2 w y ) + ( 2 x z − 2 w y ) = 4 x z m 31 − m 13 = ( 2 x z + 2 w y ) − ( 2 x z − 2 w y ) = 4 w y m 23 + m 32 = ( 2 y z + 2 w x ) + ( 2 y z − 2 w x ) = 4 y z m 23 − m 32 = ( 2 y z + 2 w x ) − ( 2 y z − 2 w x ) = 4 w x \begin{array}{l} m_{12}+m_{21}=(2 x y+2 w z)+(2 x y-2 w z)=4 x y \\ m_{12}-m_{21}=(2 x y+2 w z)-(2 x y-2 w z)=4 w z \\ m_{31}+m_{13}=(2 x z+2 w y)+(2 x z-2 w y)=4 x z \\ m_{31}-m_{13}=(2 x z+2 w y)-(2 x z-2 w y)=4 w y \\ m_{23}+m_{32}=(2 y z+2 w x)+(2 y z-2 w x)=4 y z \\ m_{23}-m_{32}=(2 y z+2 w x)-(2 y z-2 w x)=4 w x \end{array} m12​+m21​=(2xy+2wz)+(2xy−2wz)=4xym12​−m21​=(2xy+2wz)−(2xy−2wz)=4wzm31​+m13​=(2xz+2wy)+(2xz−2wy)=4xzm31​−m13​=(2xz+2wy)−(2xz−2wy)=4wym23​+m32​=(2yz+2wx)+(2yz−2wx)=4yzm23​−m32​=(2yz+2wx)−(2yz−2wx)=4wx​
于是:
w = m 11 + m 22 + m 33 + 1 2 w=\frac{\sqrt{m_{11}+m_{22}+m_{33}+1}}{2} w=2m11​+m22​+m33​+1 ​​
x = m 11 − m 22 − m 33 + 1 2 x=\frac{\sqrt{m_{11}-m_{22}-m_{33}+1}}{2} x=2m11​−m22​−m33​+1 ​​
y = − m 11 + m 22 − m 33 + 1 2 y=\frac{\sqrt{-m_{11}+m_{22}-m_{33}+1}}{2} y=2−m11​+m22​−m33​+1 ​​
z = − m 11 − m 22 + m 33 + 1 2 z=\frac{\sqrt{-m_{11}-m_{22}+m_{33}+1}}{2} z=2−m11​−m22​+m33​+1 ​​

欧拉角与四元数之间的转换

欧拉角转四元数

欧拉角相当于三次绕定轴的旋转,每次选择都可以方便地用四元数进行转换,因此得到以下结果:
q = [ 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 ] q=\left[\begin{array}{c} \cos \frac{\gamma}{2} \\ 0 \\ 0 \\ \sin \frac{\gamma}{2} \end{array}\right]\left[\begin{array}{c} \cos \frac{\beta}{2} \\ 0 \\ \sin \frac{\beta}{2} \\ 0 \end{array}\right]\left[\begin{array}{c} \cos \frac{\alpha}{2} \\ \sin \frac{\alpha}{2} \\ 0 \\ 0 \end{array}\right]=\left[\begin{array}{c} \cos \frac{\alpha}{2} \cos \frac{\beta}{2} \cos \frac{\gamma}{2}+\sin \frac{\alpha}{2} \sin \frac{\beta}{2} \sin \frac{\gamma}{2} \\ \sin \frac{\alpha}{2} \cos \frac{\beta}{2} \cos \frac{\gamma}{2}-\cos \frac{\alpha}{2} \sin \frac{\beta}{2} \sin \frac{\gamma}{2} \\ \cos \frac{\alpha}{2} \sin \frac{\beta}{2} \cos \frac{\gamma}{2}+\sin \frac{\alpha}{2} \cos \frac{\beta}{2} \sin \frac{\gamma}{2} \\ \cos \frac{\alpha}{2} \cos \frac{\beta}{2} \sin \frac{\gamma}{2}-\sin \frac{\alpha}{2} \sin \frac{\beta}{2} \cos \frac{\gamma}{2} \end{array}\right] q=⎣⎢⎢⎡​cos2γ​00sin2γ​​⎦⎥⎥⎤​⎣⎢⎢⎡​cos2β​0sin2β​0​⎦⎥⎥⎤​⎣⎢⎢⎡​cos2α​sin2α​00​⎦⎥⎥⎤​=⎣⎢⎢⎡​cos2α​cos2β​cos2γ​+sin2α​sin2β​sin2γ​sin2α​cos2β​cos2γ​−cos2α​sin2β​sin2γ​cos2α​sin2β​cos2γ​+sin2α​cos2β​sin2γ​cos2α​cos2β​sin2γ​−sin2α​sin2β​cos2γ​​⎦⎥⎥⎤​

四元数转欧拉角

求得上述方程的逆解,即可求得欧拉角:
[ α β γ ] = [ atan ⁡ 2 ( 2 ( q 0 q 1 + q 2 q 3 ) , 1 − 2 ( q 1 2 + q 2 2 ) ) arcsin ⁡ ( 2 ( q 0 q 2 − q 1 q 3 ) ) atan ⁡ 2 ( 2 ( q 0 q 3 + q 1 q 2 ) , 1 − 2 ( q 2 2 + q 3 2 ) ) ] \left[\begin{array}{c} \alpha \\ \beta \\ \gamma \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) \\ \arcsin \left(2\left(q_{0} q_{2}-q_{1} q_{3}\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(q0​q1​+q2​q3​),1−2(q12​+q22​))arcsin(2(q0​q2​−q1​q3​))atan2(2(q0​q3​+q1​q2​),1−2(q22​+q32​))​⎦⎤​