旋转矩阵、欧拉角、四元数、轴/角之间的转换

本文介绍了机器人学中四种常用的旋转表示方法及其相互转换公式,包括旋转矩阵、欧拉角、四元数和轴/角表示。这些转换对于实现精确的坐标变换至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在机器人学中,表示旋转的有四种方式。不同的人可能习惯于用不同的方法,现将四种方式之间的转换整理出来如下。

  • 旋转矩阵
旋转矩阵R表示坐标系`O-x'y'z'`中的向量坐标变换为同一向量在坐标系`O-xyz`中的坐标的变换矩阵(transformation matrix)。
p=Rp' 
p'=R'p

旋转矩阵属于特殊正交群(special orthonormal group);正交矩阵,每一列为单位矩阵,行列式为1。

- 描述了两个坐标系之间的相对指向。

- 表示了同一点在不同坐标系下(原点相同,即只有转动,没用平动)的坐标之间的坐标变换。

- 是将向量在同一坐标系下进行旋转的算子。	
  • 欧拉角(RPY)

    Z轴旋转称为回转(Roll),绕Y轴旋转称为俯仰(Pitch),绕X轴旋转称为偏转(Yaw)。

    {A}为参考坐标系,将{A}分别按顺序沿xA,yA,zAx_A,y_A,z_AxA,yA,zA旋转γ,β,α\gamma, \beta, \alphaγ,β,α后,和{B}重合,{A}和{B}之间的旋转方程:
    BARxyz=(γ,β,α)=R(zA,α)R(yA,β)R(xA,α) _B^A R_{xyz} = (\gamma, \beta, \alpha) = R(z_A, \alpha)R(y_A, \beta)R(x_A,\alpha )BARxyz=(γ,β,α)=R(zA,α)R(yA,β)R(xA,α)

  • 四元数

      是角/轴的扩展。
    
  • 轴/角

      描述一个坐标系沿某一条直线旋转一定的角度,即与另一个坐标系重合。
    

经常要用到他们之间的相互转换。

##一、旋转矩阵

###1、旋转矩阵转换为欧拉角

BARxyz(γ,β,α)=[r11r12r13r21r22r23r31r32r33] _B^A R_{xyz} (\gamma, \beta, \alpha)= \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix}BARxyz(γ,β,α)=r11r21r31r12r22r32r13r23r33

{β=atan2(−r31,r112+r212)α=atan2(r21,r11),ifβ∈[−π/2,π/2]γ=atan2(r32,r33),ifβ∈[−π/2,π/2]\begin{cases} \beta = atan2(-r_{31}, \sqrt{r_{11}^2 + r_{21}^2}) \\ \alpha = atan2(r_{21}, r_{11}), if \beta \in [-\pi/2,\pi/2]\\ \gamma = atan2(r_{32},r_{33}), if \beta \in [-\pi/2,\pi/2] \end{cases}β=atan2(r31,r112+r212)α=atan2(r21,r11),ifβ[π/2,π/2]γ=atan2(r32,r33),ifβ[π/2,π/2]
或者:
{β=atan2(−r31,r112+r212)α=atan2(−r21,−r11),ifβ∈[π/2,3π/2]γ=atan2(−r32,−r33),ifβ∈[π/2,3π/2]\begin{cases} \beta = atan2(-r_{31}, \sqrt{r_{11}^2 + r_{21}^2}) \\ \alpha = atan2(-r_{21}, -r_{11}), if \beta \in [\pi/2,3\pi/2]\\ \gamma = atan2(-r_{32},-r_{33}), if \beta \in [\pi/2,3\pi/2] \end{cases}β=atan2(r31,r112+r212)α=atan2(r21,r11),ifβ[π/2,3π/2]γ=atan2(r32,r33),ifβ[π/2,3π/2]

###2、旋转矩阵转化为 角/轴

R=[r11r12r13r21r22r23r31r32r33] R= \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix}R=r11r21r31r12r22r32r13r23r33

θ=acos(r11+r22+r33−12)\theta =acos(\frac{ r_{11} + r_{22} + r_{33} -1}{2})θ=acos(2r11+r22+r331)
r→=12sinθ[r32−r23r13−r31r21−r12]\overrightarrow r = \frac{1}{2sin \theta}\begin{bmatrix} r_{32}-r_{23} \\ r_{13}-r_{31} \\ r_{21} - r_{12} \end{bmatrix}r=2sinθ1r32r23r13r31r21r12

###3、旋转矩阵转化为四元数

R=[r11r12r13r21r22r23r31r32r33] R= \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix}R=r11r21r31r12r22r32r13r23r33

w=r11+r22+r33+12w = \frac {\sqrt { r_{11} + r_{22} + r_{33} +1}}{2}w=2r11+r22+r33+1

v→=12[sgn(r32−r23)r11−r22−r33+1sgn(r13−r31)r22−r11−r33+1sgn(r21−r12)r33−r22−r11+1]\overrightarrow v = \frac{1}{2}\begin{bmatrix} sgn (r_{32}-r_{23}) \sqrt {r_{11} - r_{22} - r_{33} +1} \\ sgn(r_{13}-r_{31}) \sqrt {r_{22} - r_{11} - r_{33} +1}\\ sgn(r_{21}-r_{12}) \sqrt {r_{33} - r_{22} - r_{11} +1} \end{bmatrix}v=21sgn(r32r23)r11r22r33+1sgn(r13r31)r22r11r33+1sgn(r21r12)r33r22r11+1

##二、欧拉角(RPY)

1、欧拉角转换为旋转矩阵

BARxyz(γ,β,α)=[cαcβcαsβsγ−sαcγcαsβcγ−sαsγsαcβsαsβsγ−cαcγsαsβcγ−cαsγ−sβcβsγcβcγ] _B^A R_{xyz} (\gamma, \beta, \alpha) = \begin{bmatrix} 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 c_ \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{bmatrix}BARxyz(γ,β,α)=cαcβsαcβ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γ

##三、四元数

1、四元数转化为旋转矩阵

R=[2(w2+vx2)−12(vxvy−wvz)2(vxvz+wvx)2(vxvy+wvz)2(w2+vy2)−12(vyvz−wvx)2(vxvz−wvx)2(vyvz+wvx)2(w2+vz2)−1]R= \begin{bmatrix} 2(w^2+v_x^2)-1 & 2(v_xv_y-wv_z) & 2(v_xv_z+wv_x) \\ 2(v_xv_y+wv_z) & 2(w^2+v_y^2)-1 & 2(v_yv_z-wv_x) \\ 2(v_xv_z-wv_x) & 2(v_yv_z+wv_x) & 2(w^2+v_z^2)-1 \end{bmatrix}R=2(w2+vx2)12(vxvy+wvz)2(vxvzwvx)2(vxvywvz)2(w2+vy2)12(vyvz+wvx)2(vxvz+wvx)2(vyvzwvx)2(w2+vz2)1

##四、轴/角

1、轴/角 转化为旋转矩阵

R=[rx2(1−cθ)+cθrxry(1−cθ)−rzsθrxrz(1−cθ)+rysθrxry(1−cθ)+rzsθry2(1−cθ)+cθryrz(1−cθ)−rxsθrxrz(1−cθ)−rysθryrz(1−cθ)+rxsθrz2(1−cθ)+cθ] R= \begin{bmatrix} r_x^2(1-c\theta) + c\theta & r_xr_y(1-c\theta) -r_zs\theta & r_xr_z(1-c\theta) +r_ys\theta \\ r_xr_y(1-c\theta) +r_zs\theta & r_y^2(1-c\theta) + c\theta & r_yr_z(1-c\theta) -r_xs\theta \\ r_xr_z(1-c\theta) -r_ys\theta & r_yr_z(1-c\theta) +r_xs\theta & r_z^2(1-c\theta) + c\theta \end{bmatrix}R=rx2(1cθ)+cθrxry(1cθ)+rzsθrxrz(1cθ)rysθrxry(1cθ)rzsθry2(1cθ)+cθryrz(1cθ)+rxsθrxrz(1cθ)+rysθryrz(1cθ)rxsθrz2(1cθ)+cθ

### 旋转矩阵欧拉角四元数的关系及转换方法 #### 一、基本概念 旋转矩阵 \(R\) 是一种用于描述三维空间中刚体姿态的工具,它是一个正交矩阵且行列式为1。欧拉角是一种通过依次绕三个不同旋转来表示物体方向的方法,通常分为内在旋转(Z-Y-X顺序)或外在旋转(X-Y-Z顺序)。四元数则是一种扩展实数系统的代数结构,常用来高效表达三维空间中的旋转变换。 #### 二、从旋转矩阵四元数转换 给定一个标准形式的3×3旋转矩阵\(R=[r_{ij}]\),可以按照以下方式将其转化为单位四元数\(q=(w, x, y, z)\)[^1]: - 首先定义变量\(\text{tr}\)作为矩阵迹(trace):\[ \text{tr}=r_{00}+r_{11}+r_{22} \] - 如果\(\text{tr}>0\),那么:\[ w=\frac{\sqrt{\text{tr}+1}}{2},\quad x=\frac{(r_{21}-r_{12})}{4w},\quad y=\frac{(r_{02}-r_{20})}{4w},\quad z=\frac{(r_{10}-r_{01})}{4w}. \] - 若某个对线元素较大,则可利用其他路径计算以提高数值稳定性。例如当\(r_{00}\geq r_{11}\)且\(r_{00}\geq r_{22}\): \[ x=\frac{\sqrt{1+r_{00}-r_{11}-r_{22}}}{2}, \] 其余分量依此类推。 #### 三、从四元数转至欧拉角 假设已知四元数\(q=(w,x,y,z)\),可以通过下面公式求得对应的滚转(roll),俯仰(pitch)偏航(yaw)度: 对于Tait-Bryan angles (即XYZ intrinsic rotations): -\(yaw (\psi)=atan2(2(wx+yz),(w^2-x^2-y^2+z^2))\), -\(pitch (\theta)=arcsin(-2(xy-wz))\), -\(roll (\phi)=atan2(2(wy+xz),(w^2+x^2-y^2-z^2))\). 注意这里采用的是弧度制而非度数制,并需考虑反正切函数返回值范围可能带来的歧义处理问题. #### 四、从欧拉角构建旋转矩阵欧拉角分别为\((\alpha,\beta,\gamma)\)(对应于绕固定框架下的xyz转动的度序列),其合成后的整体变换可用如下连乘积形式给出旋转矩阵\(R\): 如果遵循 ZYX convention: \[ R_z(\alpha) = \begin{bmatrix} cos(\alpha)& -sin(\alpha) & 0\\ sin(\alpha) & cos(\alpha) & 0 \\ 0& 0 & 1 \end{bmatrix}; R_y(\beta) = \begin{bmatrix} cos(\beta) & 0 & sin(\beta)\\ 0 & 1 & 0\\ -sin(\beta) & 0 & cos(\beta) \end{bmatrix}; R_x(\gamma) = \begin{bmatrix} 1 & 0 & 0\\ 0 & cos(\gamma) & -sin(\gamma)\\ 0 & sin(\gamma) & cos(\gamma) \end{bmatrix} \] 最终得到总旋转矩阵为\(R=R_z(\alpha)*R_y(\beta)*R_x(\gamma)\)[^3]. ```python import numpy as np def euler_to_rotation_matrix(alpha,beta,gamma): Rx=np.array([[1,0,0],[0,np.cos(gamma),-np.sin(gamma)],[0,np.sin(gamma),np.cos(gamma)]]) Ry=np.array([[np.cos(beta),0,np.sin(beta)],[0,1,0],[-np.sin(beta),0,np.cos(beta)]]) Rz=np.array([[np.cos(alpha),-np.sin(alpha),0],[np.sin(alpha),np.cos(alpha),0],[0,0,1]]) return np.dot(Rz,np.dot(Ry,Rx)) ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值