轴角旋转向量如何工作以及它们与旋转矩阵的比较如何?

How do axis-angle rotation vectors work and how do they compare to rotation matrices?

我有点难以理解在 3D 中旋转矢量时如何使用轴角旋转矢量 space。为什么使用这些以及它们与旋转矩阵有何关系?

我还发现了一个名为 vrrotvec2mat 的函数,它似乎可以满足我的需求,但我无法理解其文档。具体来说,有人可以对输入参数 roptions 给出更清楚的解释(通过一些例子)吗?

MathWorks explanations非常有限,如下:

Convert rotation from axis-angle to matrix representation

m = vrrotvec2mat(r) returns a matrix representation of the rotation defined by the axis-angle rotation vector, r.

m = vrrotvec2mat(r,options) returns a matrix representation of rotation defined by the axis-angle rotation vector r, with the default algorithm parameters replaced by values defined in options.

The options structure contains the parameter epsilon that represents the value below which a number will be treated as zero (default value is 1e-12).

The rotation vector, r, is a row vector of four elements, where the first three elements specify the rotation axis, and the last element defines the angle.

To rotate a column vector of three elements, multiply it by the rotation matrix. >To rotate a row vector of three elements, multiply it by the transposed rotation matrix.

如果你想了解 vrrotvec2mat 函数,你需要在我们深入研究这个函数之前了解旋转的轴角表示是如何工作的。具体来说,您正在了解 Rodrigues Rotation formula,也称为 轴角旋转公式 。我先给大家介绍一下。

在线性代数中,旋转点的最标准方法,无论是 2D 还是 3D,都是使用 rotation matrix 预乘(即 y = A*x 其中 x是您在列向量中表示的点)与此旋转矩阵的 2D 或 3D 坐标。这将围绕坐标系的原点旋转该点。您也可以将其视为旋转 向量 v,其中尾部位于原点,头部位于 2D 或 3D 中的点 space。

然而,另一种方法是提供仅在 3D space 中有效的所谓 轴角 表示。该轴由一个单位向量 k 描述,该向量描述一个旋转轴,向量 v 围绕该轴旋转一个角度 right-hand rule

这是我从维基百科获得的图片示例:

来源:Rodrigues' Rotation formula

在我们的例子中,矢量 k 指向正上方,矢量 v 指向西北 45 度角。我们希望围绕由向量 k 定义的轴将此向量旋转 180 度,因此如果这样做,vrot 就是生成的向量。 v||v_|_v相对于向量k的平行和垂直投影。这些被证明是推导出 Rodrigues 公式的,我不会在这里详细介绍。如果你想要完整的推导,我会让你参考这篇文章。

之所以提出罗德里格斯旋转公式来旋转物体,是因为在某些应用中,您经常绕着 不以原点为中心 的轴旋转,您也不会相对于标准 xyz 轴旋转。

事实上,如果你看维基百科的文章,你不需要转换成矩阵形式来旋转东西。你可以直接使用单位向量和旋转角度来旋转你的向量,这就引出了他的旋转公式:

来源:Rodrigues' Rotation formula

之所以存在vrrotvec2mat是因为你可以在旋转向量的轴角表示和线性代数中相对于原点旋转的旋转矩阵之间进行转换。然后,您可以应用相同的线性代数理论在给定此旋转矩阵的情况下在 3D space 中旋转 vector/point。您可以分别使用 vrrotvec2matvrrotmat2vec 在正常旋转矩阵和罗德里格斯公式表示之间来回转换。

轴角表示本质上是一个 4 元素向量,其中前三个元素是单位向量 kxyz 分量定义您的旋转轴,最后一个元素是旋转角度 theta,它使您的矢量相对于该轴旋转。 vrrotvec2mat 在这里没有什么不同,需要一个按照我刚才谈到的顺序的 4 元素向量。但是,快速查看源代码,theta 以弧度定义的


如果你想看到这个工作的具体例子,让我们以上图为例。单位矢量 kz 轴上指向上方,因此前三个分量是 (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

如果您查看笛卡尔 space 绕 z 轴的标准旋转矩阵,这将准确定义绕 z 轴旋转 180 度。如果你还记得这个旋转矩阵,它是:

如果在上面的矩阵中替换 theta = pi,您将得到与 vrrot2vec2mat 函数中看到的 M 相同的结果。但是,忽略第一行第二列的符号,因为它是由于数值精度...这导致我们得到第二个参数 options。基本上,当使用罗德里格斯旋转公式计算旋转矩阵值时,有时矩阵中的值会非常小。 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

总而言之,它只是另一种绕任意轴旋转向量的方法,而不仅限于标准的xyz