【问题标题】:How do axis-angle rotation vectors work and how do they compare to rotation matrices?轴角旋转向量如何工作以及它们与旋转矩阵相比如何?
【发布时间】:2015-12-05 18:57:25
【问题描述】:

我在理解在 3D 空间中旋转矢量时如何使用轴角旋转矢量时遇到了一些麻烦。为什么要使用它们以及它们与旋转矩阵有何关系?

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

MathWorks explanations 非常有限,如下:

将旋转从轴角转换为矩阵表示

m = vrrotvec2mat(r) 返回由轴角旋转向量 r 定义的旋转矩阵表示。

m = vrrotvec2mat(r,options) 返回由轴角旋转向量 r 定义的旋转矩阵表示,默认算法参数由选项中定义的值替换。

options 结构包含参数 epsilon,表示低于该值的数字将被视为零(默认值为 1e-12)。

旋转向量r是一个由四个元素组成的行向量,其中前三个元素指定旋转轴,最后一个元素定义角度。

要旋转包含三个元素的列向量,请将其乘以旋转矩阵。 >要旋转三个元素的行向量,请将其乘以转置的旋转矩阵。

【问题讨论】:

  • 在我看来 vrrotvec 应该给你所需的r

标签: matlab matrix linear-algebra rotational-matrices


【解决方案1】:

如果你想了解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 旋转公式来旋转物体,是因为在某些应用中,您经常绕着一个不以原点为中心的轴旋转,也不是随相对于标准 xyz 轴。

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

来源:Rodrigues' Rotation formula

vrrotvec2mat 存在的原因是因为您可以在旋转向量的轴角表示和线性代数中相对于原点旋转的旋转矩阵之间进行转换。然后,您可以应用相同的线性代数理论在给定此旋转矩阵的情况下在 3D 空间中旋转向量/点。您可以分别使用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

如果您查看在笛卡尔空间中围绕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

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

【讨论】:

  • 感谢您提供非常详细且解释清楚的答案!
  • @Pedro77 - 没问题 :) 祝你好运!
  • 我感觉自己获得了线性代数博士学位。
  • @LuddensDesir :D 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 2013-02-07
相关资源
最近更新 更多