很烦,每次见到仿真环境中的旋转表示总是弄不清楚,总感觉旋转次序和主动被动对象乱乱的,今天重新再整理一遍吧..

  1. 旋转与姿态表示的初始形态:旋转矩阵

    无论是旋转还是姿态的描述,本质上都是两个坐标轴之间的角度关系,即 $O_0$ 和 $O_1$ 的 $x,y,z$ 三个轴之间两两对应的角度值,只需要这 9 个角度,我们就可以唯一确定两个坐标轴之间的关系。

    如果将这个“关系”应用到姿态表示上,该“关系”就可以解释为:物体的 local 坐标系和某个 global 坐标系之间的角度关系(投影分量)。

    如果将这个“关系”应用到旋转上,该 “关系” 就可以解释为:物体的 新姿态 $O_1$ 和旧姿态 $O_0$ 之间的各个轴的线性组合权重(投影分量)。

    旋转矩阵的元素其实很简单,就是 9 个 cos 量,但比较复杂或者比较乱的是着 9 个余弦量是怎么排列组合的。但这个排列顺序和旋转矩阵本身是没有关系,决定其排列顺序的是这个旋转矩阵的应用目标,或者说哪个向量会被这个旋转矩阵相乘。在运算成立的情况下,以列向量 $v$ 为例,旋转矩阵的行向量表示的就是另外一个坐标系的 $X$ 轴在 $v$ 所在的坐标系中的投影分量,这个是固定不变的。

  2. 内旋和外旋,左乘还是右乘

    如果我们把向量定义成列向量,那旋转矩阵只能对列向量进行左乘。

    1. 如果我们要讨论对某个物体(向量)施加旋转,那无论旋转多少次,在这个语境中只会有两个坐标系,观察坐标系 $O_0$ 或者是 global 坐标系,本体坐标系 $O_1$ 或者说 local 坐标系。local 坐标系是和物体(向量)固连的,local 坐标系和 global 坐标系之间的关系,便是物体的姿态。

    2. 为什么向量可以表示物体?因为我们可以取物体上的一个点的坐标来代表这个物体。实际上我们对物体施加旋转的时候,应该是对他的每个点进行变换。

    3. 对于初始状态(也就是旧姿态,这时候物体的姿态一般就直接定义为 $I$,因此也就等同于 global 坐标系 $O_0$,或者根据某个约定(比如物体的某个点要沿着 global 坐标系的某个轴进行绑定)对初始姿态进行控制。

    4. 那旋转矩阵便是“新姿态 $O_1$ 和旧姿态 $O_0$ 之间的各个轴的线性组合权重”

    5. 而新姿态 $O_1$ ,物体的新的 local 坐标系 global 坐标系之间的关系

    6. 因此当我们使用旋转矩阵对物体(向量)进行左乘的时候,就是去计算,经过旋转之后,物体的新的 local 坐标系的各个轴应该怎么组合成 global 坐标系下的 $X$ 轴,$Y$ 轴以及 $Z$ 轴?或者说经过旋转变化之后,我们还是想在 global 坐标系去描述物体上的各个点,那旋转矩阵的 行向量 其实就是旋转后的物体的各个点在 global 坐标系下的 $X$ 应该由原始的坐标表示怎么组合起来。矩阵的每一列,就是 local 坐标系的 $X$、$Y$、$Z$ 轴在 global 里的样子(比如列1就是 global 各个坐标轴在 local 坐标系的 $X$ 轴的投影)。左乘运算,就是在计算: 用了多少个 local $X$(列1) + 多少个 local $Y$(列2) + … 最终拼出了 global 的位置。

    7. 这就称之为外旋,旋转顺序是从右到左的,每次运算都是在计算物体在 global 坐标系下的新的坐标表示。

    8. 那如果我们要从左向右运算呢?那这种情况只会发生在两个旋转矩阵之间,比如 $R_1^2$ 表示姿态 $O_2$ 和 $O_1$ 之间的关系,$R_2^3$ 同理。

      1. 那 $R_1^2 \cdot R_2^3$ 展开会是什么样的?

      2. 我们把 $R_1^2$ 的 $r_1$ 定义为 $O_1$ 的 $X$ 轴在 $O_2$ 的各个坐标系中的投影(当然定义成 $O_2$ 在 $O_1$ 中的投影也是可以的,只是取决于右侧的向量是在哪个坐标系中)

      3. 统一规则下,我们把 $R_2^3$ 的 $c_1$ 定义为 $O_3$ 的 $X$ 轴在 $O_2$ 的各个坐标系中的投影。

      4. 向量的点积的几何含义为两个向量之间的夹角

      5. 这样,$r_1 \cdot c_1$ 就会变成,两个坐标系的 $X$ 轴在一个公共的坐标系 $O_2$ 中的夹角,也就是 $O_1$ 的 $X$ 轴与 $O_3$ 的 $X$ 轴的夹角

      6. 以此类推,可以得到 $R_1^2 \cdot R_2^3$ 的行向量 $r_1^3$ 是 $O_1$ 的 $X$ 轴在 $O_3$ 的各个坐标系中的投影

      7. 这样 $R_1^2 \cdot R_2^3$ 就可以按照上面同样的规则写作 $R_1^3$,表示姿态 $O_3$ 和 $O_1$ 之间的关系

      8. 这个过程就是内旋,我们把姿态 $O_1$ 与 $O_2$ 的关系,经过一个旋转矩阵变换到了 $O_3$ 中,

        为什么这代表了内旋 (Mobile/Intrinsic Rotation)?

        让我们回头看一眼右边的矩阵 $R_2^3$。

        • 数学定义上:$R_2^3$ 表示的是 $O_3$ 相对于 $O_2$ 的姿态。这意味着,这一步旋转的参考基准 是 $O_2$。

        • 物理过程上:

          1. 先有了 $R_1^2$:物体(或坐标系)已经从 $O_1$ 变换到了 $O_2$。此时,$O_2$ 就是物体当前的姿态。
          2. 再乘上 $R_2^3$:我们是在 $O_2$ 的基础上继续旋转的。

        因为第二个旋转矩阵 $R_2^3$ 是定义在 $O_2$(上一步旋转的结果)之上的,而不是定义在 $O_1$(最开始的坐标系)之上的。

        既然 $O_2$ 是跟随物体运动的“动坐标系”,那么基于 $O_2$ 进行的旋转 $R_2^3$,自然就是绕着动轴的旋转(内旋)。

        这就是为什么从左向右的矩阵连乘(右乘),对应着动轴旋转:每一次新的旋转,都发生在“上一次旋转形成的新坐标系”里。

    9. 所以会有一个特性,外旋的变换顺序会相当于内旋的反方向变换

    10. 对于 $R_1^2$ 这个矩阵有两种解读方法:

      1. 作为动作:它表示把一个物体从 1 的姿态旋转到 2 的姿态

      2. 作为坐标计算:它表示把 2 中的坐标数值 变换为 1 中的坐标数值

        1. 我想知道 $v$ 在 1 中是多少 ($v_1$)。

        2. 我知道 $v$ 在 2 中是多少 ($v_2$)。

        3. 因为 2 这个坐标系本身 就是由 1 这个坐标系 经过 $R_{12}$ 旋转(Active) 得到的。

        4. 所以,位于 2 中的向量 $v_2$,本质上就是把位于 1 中的同名向量 $v$ 跟着坐标系一起转了 $R_{12}$ 那么多。

        5. 因此,计算 $v_1$ 的公式就是:让 $v_2$ 的数值经历一次 $R_{12}$ 的旋转动作。

          $$ v_1 = R_{12} \cdot v_2 $$
  3. 四元数和旋转矩阵是同构的(Hamilton Convention),因此四元数之间的乘法顺序和内旋外旋的关系和旋转矩阵是一致的。