2

我正在尝试将采样并存储在 XYZij 数据中的点云(根据文档,将数据存储在相机空间中)转换为世界坐标系,以便它们可以合并。我用于 Tango 监听器的帧对COORDINATE_FRAME_START_OF_SERVICE作为基本帧和COORDINATE_FRAME_DEVICE目标帧。

这是我实现转换的方式:

  1. 从as检索旋转四元数,从TangoPoseData.getRotationAsFloats()as检索q_r点位置。XYZijp

  2. 应用以下旋转,其中q_mult是计算两个四元数的 Hamilton 乘积的辅助方法(我已针对另一个数学库验证了此方法):

    p_transformed = q_mult(q_mult(q_r, p), q_r_conjugated);

  3. 将检索到的翻译添加TangoPoseData.getTranslationAsFloats()p_transformed

但最终,点p_transformed似乎总是以部分重叠的点云而不是对齐的合并点云而告终。

我在这里错过了什么吗?转换中是否存在概念错误?

提前致谢。

4

4 回答 4

2

肯和文森佐,感谢您的回复。

在单独使用姿势数据将它们转换为世界坐标后,我通过在单个点云上使用 CloudCompare 执行 ICP 注册以某种方式获得了更好的结果。以下是对电脑桌进行约 30 次扫描的示例结果。远端的点仍然有点偏离,但通过仔细调整参数,这可能会得到改善。CloudCompare 的命令行界面也使其适用于批处理。

除了需要纠正的不可避免的集成错误之外,我之前犯的一个错误是错误地将相机空间帧(设备上的相机),在文档中描述,与OpenGL相机帧相同,这与此处描述的设备框架相同。但他们不是。

此外,缓慢移动相机以获得两个相邻帧之间的更多重叠也有助于配准。良好的场景可见照明设置很重要,因为除了运动传感器外,Tango 还依靠其背面的鱼眼摄像头进行运动跟踪。

希望这些技巧也适用于我以外的更一般的情况。

在此处输入图像描述

于 2015-04-03T21:21:46.640 回答
1

四元数表示法有两种不同的“标准”形式。一个是旋转角度在前,即xijk,一个是旋转角度在后,即xyz w。Tango API 文档将 TangoPoseData::orientation 列为 xyz w。四元数的维基百科页面将它们列为 xij k。您可能想检查产品方法中假定的符号。

于 2015-03-30T15:26:10.337 回答
1

你的姿势数据来自哪里?您是在点云数据的回调中获取最新的姿势,还是要求与 XYZij 结构中的时间戳对应的姿势?您应该从 XYZij 结构中询问时间“时间戳”的姿势。

我试过了,它不起作用。我试图将姿势排成队列并找到离XYZij最近的姿势。

看蓝色 看蓝色的墙壁 的墙 真正的墙

真正的墙

于 2015-04-03T10:59:37.900 回答
0

我们来自 roomplan.de 创建了一个开源示例,如何在项目 tango 应用程序中使用 pcl。它记录点云并将它们转换为公共坐标系(服务开始框架)。您可以在此处找到示例代码:https ://github.com/roomplan/tango-examples-java/tree/master/PointCloudJava_with_PCL 具体功能在 jni/jni_part.cpp 函数中:Java_com_tangoproject_experiments_javapointcloud_PointCloudActivity_saveRotatedPointCloud

如果要编译示例,则需要克隆完整的文件夹并将 pcl 集成到您的项目中。可以在我们的网站上找到如何做到这一点的解决方案。

示例图片可以在 playstore 的演示应用程序中查看。(还不能在这里发布)https://play.google.com/store/apps/details?id=com.tangoproject.experiments.javapointcloud&hl=en

于 2015-07-02T08:05:53.907 回答