如果你想了解vrrotvec2mat 函数,在我们深入研究这个函数之前,你需要知道旋转的轴角表示是如何工作的。具体来说,您正在了解Rodrigues Rotation formula,也称为轴角旋转公式。我先用一些介绍给你解释一下。
在线性代数中,旋转点的最标准方法,无论是 2D 还是 3D,都是在预乘的位置使用 rotation matrix(即 y = A*x,其中 x 是表示在列向量中的点) 这个旋转矩阵的 2D 或 3D 坐标。这将围绕坐标系的原点旋转该点。您也可以将其视为旋转 vector v,其中尾部位于原点,头部位于 2D 或 3D 空间中的点。
但是,另一种方法是提供所谓的 轴角 表示,该表示仅在 3D 空间中有效。该轴由单位矢量k 描述,该单位矢量描述了一个旋转轴,矢量v 围绕该轴旋转一个角度,right-hand rule。
这是我从 Wikipedia 获得的一个图示示例:
来源:Rodrigues' Rotation formula
在我们的例子中,向量 k 指向正上方,向量 v 指向西北 45 度角。我们希望将这个向量围绕由向量k 定义的轴旋转 180 度角,所以如果你这样做,vrot 就是结果向量。 v|| 和 v_|_ 是 v 相对于向量 k 的平行和垂直投影。这些被证明是为了推导出罗德里格斯公式,我不会在这里介绍。如果你想要一个完整的推导,我会给你参考这篇文章。
之所以提出 Rodrigues 旋转公式来旋转物体,是因为在某些应用中,您经常绕着一个不以原点为中心的轴旋转,也不是随相对于标准 x、y 和 z 轴。
其实,如果你看维基百科的文章,你不需要转换成矩阵形式来旋转东西。你可以直接使用单位向量和旋转角度来旋转你的向量,这就引出了他的旋转公式:
来源:Rodrigues' Rotation formula
vrrotvec2mat 存在的原因是因为您可以在旋转向量的轴角表示和线性代数中相对于原点旋转的旋转矩阵之间进行转换。然后,您可以应用相同的线性代数理论在给定此旋转矩阵的情况下在 3D 空间中旋转向量/点。您可以分别使用vrrotvec2mat 和vrrotmat2vec 在正常旋转矩阵和罗德里格斯公式表示之间来回转换。
轴角表示本质上是一个 4 元素向量,其中前三个元素是定义旋转轴的单位向量 k 的 x、y 和 z 分量,最后一个元素是旋转角度theta,使您的矢量相对于该轴旋转。 vrrotvec2mat 在这里没有什么不同,它需要一个 4 元素向量,按照我刚才谈到的顺序。但是,快速查看源代码,theta以弧度定义。
如果你想要一个具体的例子来看看这个作品,让我们以上面的图表为例。单位向量k 在z 轴上指向上方,因此前三个分量是(0,0,1)。我们希望旋转 180 度,所以第四个参数是 pi... 等等:
>> M = vrrotvec2mat([0 0 1 pi])
M =
-1.0000 -0.0000 0
0.0000 -1.0000 0
0 0 1.0000
如果您查看在笛卡尔空间中围绕z 轴的标准旋转矩阵,这正好定义了围绕z 轴的180 度旋转。如果你回忆一下这个旋转矩阵,它是:
如果您将theta = pi 替换为上述矩阵,您将得到与M 相同的结果,如vrrot2vec2mat 函数中所示。但是,忽略第一行第二列的符号,因为它是由于数值精度......这导致我们进入第二个参数options。基本上,当使用 Rodrigues Rotation 公式计算旋转矩阵值时,有时矩阵中的值会非常小。 options 结构有一个名为 epsilon 的字段,您可以在其中指定任何小于此阈值的值,在计算完矩阵后将其视为零。 1e-12 的默认值非常适合恕我直言。
如果您想更改默认 epsilon,只需创建一个结构,该结构具有单个元素 epsilon 以更改此阈值并使用此额外的第二个参数调用该函数......就像这样:
>> options.epsilon = 1e-15;
>> M = vrrotvec2mat([0 0 1 pi], options);
无论如何,回到我们之前的讨论,假设我们给定的向量v 与上图相关,并且它指向西北——特别是(x,y,z) = (1,0,1)。如果我们使用这个旋转矩阵并旋转这个点,我们应该得到它平行于xz平面并指向相反的方向,所以我们应该得到(x,y,z) = (-1,0,1):
>> M*[1;0;1]
ans =
-1.0000
0.0000
1.0000
您也可以使用罗德里格斯旋转公式得到相同的结果:
>> v = [1;0;1];
>> k = [0;0;1];
>> theta = pi;
>> vrot = v*cos(theta) + cross(k,v)*sin(theta) + k*(k.'*v)*(1-cos(theta))
vrot =
-1.0000
0.0000
1.0000
总而言之,它只是围绕任意轴旋转矢量的另一种方式,不仅限于标准的x、y 或z。