我如何计算所有将机器人末端执行器放置在该球壳上并使末端执行器指向中心对象的变换矩阵。



我一直都知道物体相对于末端执行器的距离,球的半径是我想要的物体与末端执行器之间的期望距离。

我想通过反向运动学以球形轨迹围绕该对象平移。

每个变换矩阵应在球体上包含不同的位置,并且旋转方向应定向为使手臂看着对象。

位置应该相对容易计算,因为我已经知道到物体的距离以及球体的半径。

但是每个位置的旋转矩阵对我来说仍然是个谜。

评论

在球坐标系中也许更容易。

@ BendingUnit22您是否愿意详细说明您的想法,如何使用球面坐标形成旋转矩阵?

您想将哪个末端执行器轴指向中心?

末端执行器上有一个摄像头,所以我想使摄像头面向对象。.

@照相机的Z轴应该面向对象

#1 楼

请记住,旋转矩阵的列只是指示每个轴指向何处的单位向量。假设您的末端执行器为$ p_e =(x_e,y_e,z_e)$,圆心为$ p_o =(x_o,y_o,z_o)$。您没有完全回答我有关末端执行器轴的评论,所以我假设您希望$ z_e $指向该对象。这是您应该采取的步骤。

首先,一些符号。从世界框架到所需的最终执行者的转换是:
$$
T ^ {world} _ {ee} = \ begin {bmatrix} R_e&p_e \\ 0&1 \ end { bmatrix}
$$

其中$ R_e $是所讨论的旋转矩阵。它由3个列向量组成:

$$
R_e = \ begin {bmatrix} R_ {x_e}&R_ {y_e}&R_ {z_e} \ end {bmatrix}
$$


旋转矩阵的第三(Z)列只是$ R_ {z_e} = \ widehat {p_o-p_e} $。
选择自然相机的方向。也许$ y_e $下降了。因此,请考虑一下由世界下轴和$ R_ {z_e} $创建的飞机。现在$ x_e $必须垂直于该平面。假设世界下轴为$ down =(0,0,-1)$。现在$ R_ {x_e} = \ widehat {down \ times R_ {z_e}} $。这是旋转矩阵的第一(X)列。 (注意:请注意避免退化的情况,例如当相机直接位于对象上方时($ z_e = z_o $)。您需要对此情况进行测试并以不同的方式处理。)
最后,Y轴您的新框架必须是其他两个框架的叉积,因此:$ R_ {y_e} = R_ {z_e} \ times R_ {x_e} $。这是新旋转矩阵的第二(Y)列。

这为球体上的每个位置提供了单个方向,在该位置物体将在相机图像中直立。

您的问题对于这是否足够还是您是否希望为球体上的每个点有多个方向都有些模糊。由于摄像头可以绕其聚焦轴旋转,因此手臂和摄像头仍将指向该对象。但是,对象将在图像中旋转。

有无限数量的方向可以满足每个点的约束,但是您可以通过从0到360度之间选取一些角度,然后简单地将末端执行器框架绕其Z轴旋转来获得离散集。轴按此量。

$$
T ^ {world} _ {newee} = T ^ {world} _ {ee} * \ begin {bmatrix}
\ cos \ theta&-\ sin \ theta&0&0 \\
\ sin \ theta&\ cos \ theta&0&0 \\
0&0&1&0 \\
0&0&0 &1 \\
\ end {bmatrix}
$$

所以现在$ T ^ {world} _ {newee} $如果选择$,对象将倒置例如,\ theta = 180 ^ {\ circ} $。

下面是一些简单的Python代码,实现了此解决方案(无需任意旋转),并使用OpenRave显示帧。

#! /usr/bin/env python

import numpy as np
from openravepy import *

# set up OpenRave environment
env = Environment()
env.SetViewer('qtcoin')

# center of sphere
p_o = np.array([0.0, 0.0, 0.0])

# radius of sphere
r = 1.0

# down vector
down = np.array([0.0, 0.0, -1.0])

# large coordinate frame at the center of the sphere
originaxes = misc.DrawAxes(env, [1, 0, 0, 0, p_o[0], p_o[1], p_o[2]], dist=1, linewidth=2)

# all other frames
axes = []

for i in range(200):

    # get a random point on the sphere
    p_e = np.random.uniform(-1, 1, 3)
    p_e *= r / np.linalg.norm(p_e)
    p_e += p_o

    # Z column
    R_z = (p_o - p_e)
    R_z /= np.linalg.norm(R_z)

    # X column
    R_x = np.cross(down, R_z)
    R_x /= np.linalg.norm(R_x)

    # Y column
    R_y = np.cross(R_z, R_x)

    # Full transformation matrix
    T = np.array([[ R_x[0], R_y[0], R_z[0], p_e[0] ],
                  [ R_x[1], R_y[1], R_z[1], p_e[1] ],
                  [ R_x[2], R_y[2], R_z[2], p_e[2] ],
                  [      0,      0,      0,      1]])

    # draw it
    axes.append(misc.DrawAxes(env, T, dist=0.2, linewidth=1))


这应该为您提供整个球体的框架,例如:


评论


$ \ begingroup $
感谢您的回答:) ..我要问几件事...首先..为什么$ |是p_0-p_e | $而不是$ R_z $的$ p_0-p_e $?
$ \ endgroup $
–测试
16-4-24在18:26



$ \ begingroup $
必须将旋转矩阵的列标准化为长度为1。我将切换到更合适的帽子符号。
$ \ endgroup $
–Ben♦
16年4月24日在18:39

$ \ begingroup $
啊..很有道理:)大多数事情都说得通,只是最后一件事。如果我正确理解,则$ T_ {world} ^ {ee} $是描述所需位置和方向的转换矩阵。.我不确定我是否理解最后一次乘法中最后一个矩阵的作用。您不是已经用$ T_ {world} ^ {ee} $做到了。
$ \ endgroup $
–测试
16-4-24在18:58



$ \ begingroup $
围绕z轴旋转。
$ \ endgroup $
–测试
16年4月24日在19:22

$ \ begingroup $
请参阅扩展答案。最后一步使您可以绕相机轴进行任意(但不连续)旋转。第1步到第3步为您提供了一个将物体直立的变换。我猜您可以在第2步中使用其他向量,而不是世界末日来获得不同的方向。但这对我来说似乎很困难,而且没有用。
$ \ endgroup $
–Ben♦
16年4月25日在23:45

#2 楼

当前,您的问题仍然具有一个自由度,即机器人的方向仍然可以围绕矢量滚动。现在,我假设您希望机器人的顶部尽可能保持朝上。

旋转矩阵可以看作是二阶张量,可以通过对多个张量求和来构造新旧基础向量的二元组,

$$
R = \ vec {e} _ {x1} \ vec {e} _ {x0} + \ vec {e} _ {y1} \ vec {e} _ {y0} + \ vec {e} _ {z1} \ vec {e} _ {z0}。
$$

因为每个基础都应该是正交的,然后取$ R $的点积与$ \ vec {e} _ {x0} $,$ \ vec {e} _ {y0} $或$ \ vec {e} _ {{z0} $分别得出基本向量$ \ vec {e} _ {x1} $,$ \ vec {e} _ {y1} $或$ \ vec {e} _ {z1} $。通过采用向量直接乘积,可以将每个二元组表示为一个矩阵。

现在您要做的就是找到一个初始和最终正交标准的表达式。由于您希望机器人面对球面的中心,因此可以在未应用旋转的情况下,通过机器人正面朝的方向定义$ \ vec {e} _ {x0} $,并定义$ \ vec {e } _ {x1} $作为指向球心的单位向量。通过对滚动使用附加约束,可以将$ \ vec {e} _ {y0} $定义为机器人顶部在未施加旋转的情况下所面向的方向,以及$ \ vec {e} _ {y1}相对于$ \ vec {e} _ {x1} $,取$ \ vec {e} _ {y0} $的正交分量,$

$$
\ vec { e} _ {y1} = \ frac {\ vec {e} _ {y0}-\ left(\ vec {e} _ {y0} \ cdot \ vec {e} _ {x1} \ right)\ vec {e } _ {x1}} {\ left \ | \ vec {e} _ {y0}-\ left(\ vec {e} _ {y0} \ cdot \ vec {e} _ {x1} \ right)\ vec { e} _ {x1} \ right \ |}。
$$

可以使用每个基数应为正交的事实来找到其余矢量,这可以通过简单地获取其他基矢量的叉积来实现。因此$ \ vec {e} _ {z0} = \ vec {e} _ {x0} \ times \ vec {e} _ {y0} $和$ \ vec {e} _ {{z1} = \ vec {e} _ {x1} \ times \ vec {e} _ {y1} $,您可以颠倒叉积中向量的顺序,但是对于$ \ vec {e} _ {z0} $和$ \ vec {e} _ {z1} $,因为否则,产生的“旋转”还将包含反射(机器人将旋转,但它本身也是镜像)。

#3 楼


确保您的轴与表示机器人方向的坐标系平行。
通过用红色标记的矢量投影来几何计算方向角。

我看不到需要任何旋转矩阵。

编辑:

这里是2D示例。相机在圆圈上移动,并且必须调整Z方向。 dx和dy可以通过圆方程计算得出,Z轴旋转为

$ Z_ {rot} = atan2(dy,dx)$



评论


$ \ begingroup $
可以举个例子吗?
$ \ endgroup $
–测试
16-4-24的7:13

$ \ begingroup $
我需要旋转矩阵来执行逆运动学,所以我对所需的变换有一个了解。
$ \ endgroup $
–测试
16年4月24日在7:15

$ \ begingroup $
您的逆运动学应该以角度作为输入,而不是旋转矩阵。如果由于某种原因它确实有一个旋转矩阵作为输入,则可以通过计算3个天使,然后将3个纯旋转矩阵(x,y,z旋转)相乘来获得它,并获得yout方向矩阵
$ \ endgroup $
– 50k4
16-4-24的7:27

$ \ begingroup $
,但您能举个例子吗?我很难理解...
$ \ endgroup $
–测试
16年4月24日在7:40

$ \ begingroup $
感谢您的示例..因此,给定dy,dx,您将沿z轴形成旋转。这是否意味着给定dy,dz会沿x轴旋转,而dz,dx会沿y轴旋转。因此给定所有角度来制作旋转矩阵?
$ \ endgroup $
–测试
16年4月24日在9:25