【问题标题】:(Project Tango) Rotation and translation of point clouds with area learning(Project Tango)点云的旋转和平移与区域学习
【发布时间】:2016-06-21 16:06:36
【问题描述】:

我有一个 java 应用程序,当我按下一个按钮时,它会记录点云 xyz 坐标以及正确的姿势。

我想要的是选择一个对象,在前面记录一个点云,在后面记录一个,然后合并两个云。

显然,为了获得合理的结果,我需要平移和旋转我记录的一个或两个云。但我是 Tango Project 的新手,有些东西我应该错过。

我在this post 上读到过这个。

在那里,@Jason Guo 谈到了那些矩阵:

start_service_T_device, imu_T_device, imu_T_depth

第一个矩阵是从服务开始设备,但我使用的是区域学习,所以我的BaseFrame是TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION

  • 在我的情况下是否也可以使用相同的策略?
  • 只是将start_service_T_device 替换为area_description_T_device 之类的东西?

附加问题

我想将此方法扩展到对象的 3D 重建。
我想获得同一对象的不同视图的几个点云,将它们旋转并平移到一些固定轴上。然后我假设 2 个点 (x,y,z) 和 (x',y',z') 如果 x~=x' && y~=y' && z~=z' 是同一个点。 这样我应该能够得到整个对象的点云,对吗?

  • 这种方法合适吗?
  • 有更好的选择吗?

【问题讨论】:

    标签: java android google-project-tango


    【解决方案1】:

    原来的帖子有点过时了。以前,我们没有getMatrixTransformAtTime()。所以你必须使用Tango.getPoseAtTime 来查询每个转换,然后使用矩阵将它们链接起来。

    但是现在有了getMatrixTransformAtTime,你可以直接查询area_description_T_depth,甚至在opengl框架中。为了在opengl中将点云转换为ADF框架,您可以使用以下代码(伪代码):

    TangoSupport.TangoMatrixTransformData transform =
      TangoSupport.getMatrixTransformAtTime(pointCloud.timestamp,
              TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
              TangoPoseData.COORDINATE_FRAME_CAMERA_DEPTH,
              TangoSupport.TANGO_SUPPORT_ENGINE_OPENGL,
              TangoSupport.TANGO_SUPPORT_ENGINE_TANGO);
    
    // Convert it into the matrix format you use in render.
    // This is a pure data structure conversion, transform is
    // in opengl world frame already.
    Matrix4x4 model_matrix = ConvertMatrix(transform);
    
    foreach (Point p in pointCloud) {
      p = model_matrix * p;
    }
    
    // Now p is in opengl world frame.
    

    但请注意,您必须有一个有效的区域描述框架才能根据区域描述查询姿势,即在使用 ADF 重新定位或处于学习模式之后。

    【讨论】:

    • 非常感谢。还有一件事:我假设您的pointCloudTangoXyzIjData(我说的对吗?)。 pointCloud.xyz 中的点被 3 x 3 打包,因此一个点可以用 Vector3 或类似的数据结构表示。所以myMatrix4x4 * myVector3 将是一个非法的表达。 Point 和我想的不一样吗?
    • 是的,点云是 TangoXyzIj。为了让矩阵变换,您需要通过在第四个值上加 1.0 将其转换为 vector4。通常类似于 'vec4 v = vec4(p.x, p.y, p.z, 1.0f);'
    • 谢谢。我试了又试,但在尝试计算变换矩阵时总是得到 TangoInvalidException。我收到此错误:E/tango: support_jni.cc:865 TangoSupport: problem calculating Matrix Transform`E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.xxx.yyy, PID: 14455 com.google.atap.tangoservice.TangoInvalidException`
    • 我只使用了 C Tango 支持 API,因此 Java 可能会有所不同,但在使用 getMatrixTransformAtTime 函数之前,您必须调用一个初始化函数。我认为对于 Java,它是 TangoSupport.initialize()。
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多