简洁明了的搞清楚四元数和旋转矩阵的关系及使用 | 您所在的位置:网站首页 › 矩阵的转置与矩阵的逆的关系 › 简洁明了的搞清楚四元数和旋转矩阵的关系及使用 |
文章目录
1 混淆的哪里?2 两种旋转2.1 回答第一个问题2.2 回答第二个问题
3 总结
1 混淆的哪里?
关于四元数和旋转矩阵,使用过程中很容易迷糊,很重要的原因是没有区分好『坐标系的旋转』和『向量的旋转』。 不想看详细的说明过程可以直接看总结部分。 2 两种旋转下面首先来区分这两种旋转。以一个飞机为例,假设惯性系为N(XYZ)系(下图中的黑色坐标系),B系(X’Y’Z’)与飞机固连(下图中的蓝色坐标系)。t0时刻,飞机的B系与N系完全重合。 向量的旋转: R向量从初始位置旋转到了R’的位置,对应的四元数为q,如下图所示。 从上面可以看出,旋转可以指坐标系的旋转,也可以指向量的旋转,他们代表的含义是完全不同的,所以当谈到旋转时,一定要搞清楚这个前提条件:究竟是『谁』被旋转了。 2.1 回答第一个问题 V向量在B系中的坐标是多少? V向量在空间中的位置并没有变,只是它在B系中有另一个坐标表示方法。V’ = q-1 * V * q 上式中,由于四元数quaternion并不能与vector直接运算,需要把V转换为纯四元,即实部为0的四元数。如果使用eigen来实现,有几种的不同的方法,但是最终的结果都是一样的。 // 场景一:N系中的向量Vn_in_N在B系表示 float angle = 30 * (3.1415926 / 180.f); Vector3f Vn_in_N = { 0, 0, 1 }; Quaternionf q(AngleAxisf(angle, Vector3f::UnitX())); // 方法1: Vector3f Vn_in_B = (q.conjugate() * Quaternionf(0, Vn_in_N.x(), Vn_in_N.y(), Vn_in_N.z()) * q).vec(); cout |
CopyRight 2018-2019 实验室设备网 版权所有 |