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

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

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

旋转矩阵

对于空间中的两组坐标系[ 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=x1x0x1y0x1z0y1x0y1y0y1z0z1x0z1y0z1z0
他的意思是,坐标系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=[x0y0z0]T[x1y1z1]
当然,旋转矩阵除了表示坐标系之间的变换,还有其他的作用,首先,可以表示同一个点在不同系下坐标的关系。设点 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=R10p1
此外,它还有第三层含义,即表示向量在同一个坐标系中的旋转。设有一个向量 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=R01v0
因此,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] BARXYZ(γ,β,α)=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] ABRZ/YX(γ,β,α)=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=1000cosθsinθ0sinθcosθRy=cosϕ0sinϕ010sinϕ0cosϕRz=cosψsinψ0sinψcosψ0001
得到:
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(1cos(θ))
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(1cosθ)xy(1cosθ)ysinθxy(1cosθ)cosθ+y2(1cosθ)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] 12y22z22xy2wz2xz+2wy2xy+2wz12x22z22yz2wx2xz2wy2yz+2wx12x22y2

旋转矩阵转四元数

旋转矩阵转四元数需要用到上面的结论:
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)+(2xy2wz)=4xym12m21=(2xy+2wz)(2xy2wz)=4wzm31+m13=(2xz+2wy)+(2xz2wy)=4xzm31m13=(2xz+2wy)(2xz2wy)=4wym23+m32=(2yz+2wx)+(2yz2wx)=4yzm23m32=(2yz+2wx)(2yz2wx)=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=2m11m22m33+1
y = − m 11 + m 22 − m 33 + 1 2 y=\frac{\sqrt{-m_{11}+m_{22}-m_{33}+1}}{2} y=2m11+m22m33+1
z = − m 11 − m 22 + m 33 + 1 2 z=\frac{\sqrt{-m_{11}-m_{22}+m_{33}+1}}{2} z=2m11m22+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β0cos2α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(q0q1+q2q3),12(q12+q22))arcsin(2(q0q2q1q3))atan2(2(q0q3+q1q2),12(q22+q32))

猜你喜欢

转载自blog.csdn.net/a735148617/article/details/114779406