将点云从一个空间转换为另一个空间

时间:2016-10-26 14:10:15

标签: c# 3d rotation transform mesh

我有一个机器人手臂和一个Microsoft Kinect 2.0。 Kinect可以输出3D点云,它会被Kinects的原点和旋转所抵消。机器人手臂可以将其最外侧的手腕移动到以mm为单位的XYZ位置(和旋转)。

想象一下,Kinect安装在手臂上。 机器人移动到位置X:0,Y:570,Z:-950,并旋转手腕,使Kinect直接指向下方(绕Z轴旋转-90度)。

如果我从Kinect获得ColorMesh,我将如何旋转和偏移网格以使其位于机器人空间而不是3D相机空间?我对此并不了解,所以感谢任何帮助。

以下是对现实生活设置的说明: 球体表示手臂的工作空间范围。 enter image description here

我认为这个课程看起来像这样:

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点它不会太难,但我不知道整个网格有顶点和面?

2 个答案:

答案 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