简洁明了的搞清楚四元数和旋转矩阵的关系及使用 您所在的位置:网站首页 矩阵的转置与矩阵的逆的关系 简洁明了的搞清楚四元数和旋转矩阵的关系及使用

简洁明了的搞清楚四元数和旋转矩阵的关系及使用

2024-07-11 13:37| 来源: 网络整理| 查看: 265

文章目录 1 混淆的哪里?2 两种旋转2.1 回答第一个问题2.2 回答第二个问题 3 总结

1 混淆的哪里?

关于四元数和旋转矩阵,使用过程中很容易迷糊,很重要的原因是没有区分好『坐标系的旋转』和『向量的旋转』。

不想看详细的说明过程可以直接看总结部分。

2 两种旋转

下面首先来区分这两种旋转。以一个飞机为例,假设惯性系为N(XYZ)系(下图中的黑色坐标系),B系(X’Y’Z’)与飞机固连(下图中的蓝色坐标系)。t0时刻,飞机的B系与N系完全重合。 在这里插入图片描述 坐标系的旋转: N系的XYZ旋转到B系的X’Y’Z’,对应的四元数为q,V并没随着B系的转动而转动,如上图所示。坐标系旋转后,有1个信息是我们想知道的:

V向量在B系中的坐标是多少?(第一个问题)

向量的旋转: R向量从初始位置旋转到了R’的位置,对应的四元数为q,如下图所示。 在这里插入图片描述 向量旋转后,同样有1个信息是我们想知道的:

R’向量在N系中新的坐标是多少?(第二个问题)

从上面可以看出,旋转可以指坐标系的旋转,也可以指向量的旋转,他们代表的含义是完全不同的,所以当谈到旋转时,一定要搞清楚这个前提条件:究竟是『谁』被旋转了。

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 实验室设备网 版权所有