旋转矩阵的求解

假如我们已知一个旋转矩阵为 R ,则如何求出当初是通过三个轴怎么样的旋转得来的呢。即此时问题就是如何将旋转矩阵转换成旋转角的问题。

已知围绕Z轴旋转的公式为:

\left[\begin{matrix} x_2 \\ y_2 \\ z_2 \end{matrix}\right] = \left[\begin{matrix} cos(\alpha) & -sin(\alpha) & 0 \\ sin(\alpha) & cos(\alpha) & 0 \\ 0 & 0 & 1 \\ \end{matrix}\right] \cdot \left[\begin{matrix} x_1 \\ y_1 \\ z_1 \end{matrix}\right]

围绕Y轴旋转的公式为:

\left[\begin{matrix} x_2 \\ y_2 \\ z_2 \end{matrix}\right] = \left[\begin{matrix} cos(\beta) & 0 & sin(\beta) \\ 0 & 1 & 0 \\ -sin(\beta) & 0 & cos(\beta) \\ \end{matrix}\right] \cdot \left[\begin{matrix} x_1 \\ y_1 \\ z_1 \end{matrix}\right]

围绕X轴旋转的公式为:

\left[\begin{matrix} x_2 \\ y_2 \\ z_2 \end{matrix}\right] = \left[\begin{matrix} 1 & 0 & 0 \\ 0 & cos(\gamma) & -sin(\gamma) \\ 0 & sin(\gamma) & cos(\gamma) \\ \end{matrix}\right] \cdot \left[\begin{matrix} x_1 \\ y_1 \\ z_1 \end{matrix}\right]

统一的旋转记做:

R_{zyx} = R_z(\alpha) \cdot R_y(\beta) \cdot R_x(\gamma)

我们可以总结得到:

\left[\begin{matrix} x_2 \\ y_2 \\ z_2 \end{matrix}\right] = R_{zyx} \cdot \left[\begin{matrix} x_1 \\ y_1 \\ z_1 \end{matrix}\right]

这里我们将 {^w_r}R_{zyx} 展开可得:

\begin{aligned} {^w_r}R_{zyx} &= \left[\begin{matrix} cos(\alpha) & -sin(\alpha) & 0 \\ sin(\alpha) & cos(\alpha) & 0 \\ 0 & 0 & 1 \\ \end{matrix}\right] \cdot \left[\begin{matrix} cos(\beta) & 0 & sin(\beta) \\ 0 & 1 & 0 \\ -sin(\beta) & 0 & cos(\beta) \\ \end{matrix}\right] \cdot \left[\begin{matrix} 1 & 0 & 0 \\ 0 & cos(\gamma) & -sin(\gamma) \\ 0 & sin(\gamma) & cos(\gamma) \\ \end{matrix}\right] \\ &= \left[\begin{matrix} cos(\alpha)cos(\beta) & -sin(\alpha) & cos(\alpha)sin(\beta) \\ sin(\alpha)cos(\beta) & cos(\alpha) & sin(\alpha)sin(\beta) \\ -sin(\beta) & 0 & cos(\beta) \\ \end{matrix}\right] \cdot \left[\begin{matrix} 1 & 0 & 0 \\ 0 & cos(\gamma) & -sin(\gamma) \\ 0 & sin(\gamma) & cos(\gamma) \\ \end{matrix}\right] \\ &= \left[\begin{matrix} cos(\alpha)cos(\beta) & -sin(\alpha)cos(\gamma) + cos(\alpha)sin(\beta)sin(\gamma) & sin(\alpha)sin(\gamma) + cos(\alpha)sin(\beta)cos(\gamma) \\ sin(\alpha)cos(\beta) & cos(\alpha)cos(\gamma) + sin(\alpha)sin(\beta)sin(\gamma) & -cos(\alpha)sin(\gamma) + sin(\alpha)sin(\beta)cos(\gamma) \\ -sin(\beta) & cos(\beta)sin(\gamma) & cos(\beta)cos(\gamma) \\ \end{matrix}\right] \end{aligned}

为了简化式子,我们将sin简写为S, 将cos简写为C, 那么我们可以简写为:

{^w_r}R_{zyx} = \left[\begin{matrix} C_z(\alpha)C_y(\beta) & C_z(\alpha)S_y(\beta)S_x(\gamma) - S_z(\alpha)C_x(\gamma) & S_z(\alpha)S_x(\gamma) + C_z(\alpha)S_y(\beta)C_x(\gamma) \\ S_z(\alpha)C_y(\beta) & C_z(\alpha)C_x(\gamma) + S_z(\alpha)S_y(\beta)S_x(\gamma) & S_z(\alpha)S_y(\beta)C_x(\gamma) - C_z(\alpha)S_x(\gamma) \\ -S_y(\beta) & C_y(\beta)S_x(\gamma) & C_y(\beta)C_x(\gamma) \\ \end{matrix}\right]

为了方便计算,我们为这个 3x3 矩阵每个元素起一个名字,如下:

{^w_r}R_{zyx} = \left[\begin{matrix} R_{11} & R_{12} & R_{13} \\ R_{21} & R_{22} & R_{23} \\ R_{31} & R_{32} & R_{33} \\ \end{matrix}\right]

三角函数中,有如下等式变换规则:

\frac{sin(\theta)}{cos(\theta)} = tan(\theta)

则如果要求解一个角度值,可以通过如下方式得到旋转的角度(单位为弧度):

\theta = atan2(sin(\theta), cos(\theta))

α 求解

R_z(\alpha) 绕Z轴旋转的角度 ,观察R_{11}R_{21}, 他们分别是 cos(\alpha) \cdot cos(\beta)sin(\alpha) \cdot cos(\beta).

我们发现:

\begin{aligned} \frac {R_{21}} {R_{11}} = \frac {sin(\alpha) \cdot cos(\beta)} {cos(\alpha) \cdot cos(\beta)} = \frac {sin(\alpha)} {cos(\alpha)} \end{aligned}

我们可以得到以下结论:

\alpha = atan2(R_{21}, R_{11})

β 求解

R_y(\beta) 绕Y轴旋转的角度 ,由我们已知的公式:

\beta = atan2(sin(\beta), cos(\beta))

那么:

\beta = atan2(-R_{31}, cos(\beta))

我们继续观察 R_{11}R_{21}, 他们分别是 cos(\alpha) \cdot cos(\beta)sin(\alpha) \cdot cos(\beta).

我们尝试:

\sqrt {R_{11}^2 + R_{21}^2} = \sqrt {cos(\alpha)^2 \cdot cos(\beta)^2 + sin(\alpha)^2 \cdot cos(\beta)^2} \\ = \sqrt {(cos(\alpha)^2 + sin(\alpha)^2) \cdot cos(\beta)^2}

化简完成后,发现一个结论:

cos(\beta) = \sqrt {R_{11}^2 + R_{21}^2}

总结前面的计算,我们可以得到以下结论:

\beta = atan2(-R_{31}, \sqrt {R_{11}^2 + R_{21}^2})

γ 求解

R_x(\gamma) 绕X轴旋转的角度 ,观察R_{32}R_{33}, 他们分别是cos(\beta) \cdot sin(\gamma)cos(\beta) \cdot cos(\gamma).

我们发现:

\begin{aligned} \frac {R_{32}} {R_{33}} = \frac {cos(\beta) \cdot sin(\gamma)} {cos(\beta) \cdot cos(\gamma)} = \frac {sin(\gamma)} {cos(\gamma)} \end{aligned}

我们可以得到以下结论:

\gamma = atan2(R_{32}, R_{33})

奇异值情况求解

这里根据以下值是否等于0(小于一个阈值)来判断此时的旋转矩阵是否是奇异矩阵,如果是奇异矩阵,则结果有所差异

cos(\beta) = \sqrt {R_{11}^2 + R_{21}^2}

如果 cos(\beta) = 0 或接近零,说明其在 Pitch轴为90°,此时产生万向节死锁,求解方式有所差异,具体如下:

{\gamma}_x = -atan2(R_{23}, R_{22}) \\ {\beta}_y = atan2(-R_{31}, \sqrt {R_{11}^2 + R_{21}^2}) \\ {\alpha}_z = 0

参见:机器人运动学3D | 坐标系旋转综合