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

Project Tango: Converting between coordinate systems and merging point clouds

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

这是我实现转换的方式:

  1. TangoPoseData.getRotationAsFloats()中检索旋转四元数为q_r,从XYZij中检索点位置为p

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

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

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

但最终,p_transformed 处的点似乎总是以部分重叠的点云杂乱无章结束,而不是对齐的合并点云。

我在这里遗漏了什么吗?是不是转换概念有误?

提前致谢。

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

Where is your pose data coming from? Are you getting the most recent pose after you are in the callback for the point cloud data or are you asking for the pose that corresponds to the timestamp in the XYZij struct? You should be asking for the pose at time "timestamp" from the XYZij struct.

我试过了,不行。 我尝试对姿势进行排队并获得最接近 XYZij 的姿势。

看看蓝墙 真正的墙

Ken & Vincenzo,感谢您的回复。

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

除了需要更正不可避免的集成错误外,我之前犯的一个错误是错误地拍摄了相机space帧(设备上的相机),描述为here in the documentation, to be the same as the OpenGL camera frame, which is the same as the device frame as described here。但他们不是。

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

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

我们 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 的演示应用程序中查看。 (不能post他们在这里)https://play.google.com/store/apps/details?id=com.tangoproject.experiments.javapointcloud&hl=en