轴角旋转矢量如何工作以及它们如何与旋转矩阵进行比较?

时间:2015-09-09 17:22:55

标签: matlab matrix linear-algebra rotational-matrices

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

我还发现了一个名为vrrotvec2mat的函数,似乎可以按我的意愿行事,但我无法理解文档。具体来说,有人可以对输入参数roptions做出更明确的解释(有一些例子)吗?

MathWorks explanations非常有限,如下:

  

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

     

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

     

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

     

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

     

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

     

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

1 个答案:

答案 0 :(得分:12)

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

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

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

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

来源:Rodrigues' Rotation formula

我们案例中的向量k指向上方,向量v指向西北45度角。我们希望围绕由向量k定义的轴旋转此向量180度角,因此如果执行此操作,vrot就是结果向量。 v||v_|_v相对于向量k的平行和垂直投影。这些被证明可以得出罗德里格斯公式,我不会在这里通过。如果你想要一个完整的推导,我会引用你的文章。

罗德里格斯旋转公式被提议用于旋转物体的原因是因为非常频繁地,存在围绕不在原点的轴旋转的应用,也不是在旋转尊重标准xyz轴。

事实上,如果你看一下维基百科的文章,你就不需要转换成矩阵形式来旋转东西。您可以直接使用单位矢量和旋转角度来旋转矢量,这会将我们引导到他的旋转公式:

来源:Rodrigues' Rotation formula

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

轴角表示本质上是一个4元素向量,其中前三个元素是单位向量x的{​​{1}},yz组件,它们定义旋转轴和最后一个元素是旋转角度k,它使矢量相对于此轴旋转。 theta在这里没有什么不同,并且按照我刚才谈到的顺序需要一个4元素向量。但是,快速查看来源,vrrotvec2mat 以弧度定义。

如果您想要查看此工作的具体示例,请使用上图作为示例。单位向量theta向上指向k轴,因此前三个组件为z。我们希望旋转180度,因此第四个参数是(0,0,1) ......所以:

pi

如果您查看>> M = vrrotvec2mat([0 0 1 pi]) M = -1.0000 -0.0000 0 0.0000 -1.0000 0 0 0 1.0000 轴周围笛卡尔空间中的标准旋转矩阵,则可精确定义围绕z轴的180度旋转。如果您为此回忆起旋转矩阵,那就是:

enter image description here

如果您在上面的矩阵中替换z,您将获得与theta = pi函数中显示的M相同的内容。但是,由于数值精度,忽略了第一行,第二列的符号......这导致我们进入第二个参数vrrot2vec2mat。基本上,当使用Rodrigues旋转公式计算旋转矩阵值时,有时矩阵中的值将非常小。 options结构有一个名为options的字段,您可以在计算矩阵后指定小于此阈值的任何值。 epsilon的默认值非常适合恕我直言。

如果您想更改默认1e-12,只需创建一个具有单个元素epsilon的结构,该元素会更改此阈值并使用此额外的第二个参数调用该函数...所以像:

epsilon

无论如何,回到我们所谈论的内容,让我们说我们给定的向量>> options.epsilon = 1e-15; >> M = vrrotvec2mat([0 0 1 pi], options); 与上图有关,它指向西北 - 特别是在{ {1}}。如果我们使用此旋转矩阵并旋转此点,我们应该使它与v平面平行并指向相反方向,因此我们应该得到(x,y,z) = (1,0,1)

xz

使用Rodrigues旋转公式也可以获得相同的结果:

(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