我有一个机器人手臂和一个Microsoft Kinect 2.0。 Kinect可以输出3D点云,它会被Kinects的原点和旋转所抵消。机器人手臂可以将其最外侧的手腕移动到以mm为单位的XYZ位置(和旋转)。
想象一下,Kinect安装在手臂上。 机器人移动到位置X:0,Y:570,Z:-950,并旋转手腕,使Kinect直接指向下方(绕Z轴旋转-90度)。
如果我从Kinect获得ColorMesh,我将如何旋转和偏移网格以使其位于机器人空间而不是3D相机空间?我对此并不了解,所以感谢任何帮助。
我认为这个课程看起来像这样:
public class CameraToRobotCalibrator
{
//offset in mm compared to robot origo
public const float x_offset = 0f;
public const float y_offset = 570f;
public const float z_offset = -950f;
//camera rotated around its own origo
public const float x_rotation = 0f;
public const float y_rotation = 0f;
public const float z_rotation = -90f;
public ColorMesh ConvertToRobospace(ColorMesh mesh)
{
//?
}
}
我猜测它是否适用于1点它不会太难,但我不知道整个网格有顶点和面?
答案 0 :(得分:1)
鉴于机器人的规格及其自由度,您通常可以计算一个4x4矩阵来描述末端因素的位置和方向。这特定于机器人的设计。我们称这个矩阵为E
。
然后,您需要将Kinect安装在末端执行器上。这将引入另一种翻译,并可能引入轮换。因此,您需要另一个矩阵M
来表示Kinect如何安装在末端执行器上。它是从末端执行器坐标系到Kinect坐标系的转换。理想情况下,该矩阵将以某种方式校准。可以通过测量来得出良好的初始猜测。
然后,从机器人的根坐标系到Kinect坐标系的整体变换是T = R * M
(假设是列主矩阵)。
这是转换网格所需的矩阵。转换网格就像转换单个点一样。但现在,您将变换所有顶点位置(将1添加为w分量)和所有顶点法线(将0添加为w分量)。保持面部指数不变。
答案 1 :(得分:0)
对于那些对我的实施感兴趣的人,请看这里: http://pastebin.com/zfCdVFNE
你可以找到一些更好的矩阵库,我只使用Kinect的API中的Matrix4。
在现实生活中测量属性,然后在用机器人和Kinect进行测试后进行校准。
我想有人可能会在某一天偶然发现这个问题然后去了,但是代码在哪里?'
我遵循了本指南,它基本上是假人的矩阵:http://www.codinglabs.net/article_world_view_projection_matrix.aspx