Project Tango:在坐标系和合并点云之间转换

时间:2015-03-25 20:52:51

标签: android graphics geometry google-project-tango

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

这是我实施转型的方式:

  1. TangoPoseData.getRotationAsFloats()的轮换四元数检索为q_r,将XYZij的磅位置检索为p

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

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

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

  4. 但最终,p_transformed处的点似乎总是会出现部分重叠点云的混乱,而不是对齐的合并点云。

    我在这里遗漏了什么?转型中是否存在概念上的错误?

    提前致谢。

4 个答案:

答案 0 :(得分:2)

肯&文森佐,谢谢你的回复。

通过使用CloudCompare在单个点云上执行ICP注册后,我可以通过单独使用姿势数据将其转换为世界坐标,从而获得更好的结果。以下是约30次扫描计算机桌面的示例结果。更远的点仍然有点偏,但仔细调整参数可能会有所改善。此外,CloudCompare的命令行界面使其适用于批处理。

除了需要纠正的不可避免的整合错误之外,我之前犯的错误是错误地将相机空间框架(设备上的摄像头)(描述为here in the documentation)与OpenGL相同相机帧,与here所述的设备帧相同。但他们不是。

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

希望这些提示也适用于除我以外的更一般情况。

enter image description here

答案 1 :(得分:1)

四元数符号有两种不同的“标准”形式。一个具有旋转角度,即x i j k,并且一个具有最后的旋转角度,即x y z w。 Tango API文档将TangoPoseData :: orientation列为x y z w。四元数上的维基百科页面将它们列为x i j k。您可能想要检查产品方法中假设的符号。

答案 2 :(得分:1)

  
    

你的姿势数据来自哪里?在进行点云数据回调后,您是否获得了最新的姿势,或者您是否要求与XYZij结构中的时间戳对应的姿势?您应该在XYZij结构的时间“timestamp”中询问姿势。

  

我试过了,它不起作用。 我试图将姿势排队并将最近的一个放到XYZij。

看看蓝色的墙 Look at the blue wall 真正的墙

The real wall

答案 3 :(得分:0)

我们来自roomplan.de创建了一个开源示例如何在项目探戈应用中使用pcl。它记录了pointcloud并将它们转换为公共坐标框架(StartOf服务框架)。你可以在这里找到示例代码: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