我正在尝试将采样并存储在XYZij数据中的点云(根据document,将数据存储在相机空间中)转换为世界坐标系,以便它们可以合并。我用于Tango监听器的帧对以COORDINATE_FRAME_START_OF_SERVICE
为基础框架,COORDINATE_FRAME_DEVICE
为目标框架。
这是我实施转型的方式:
将TangoPoseData.getRotationAsFloats()
的轮换四元数检索为q_r
,将XYZij
的磅位置检索为p
。
应用以下旋转,其中q_mult
是计算两个四元数的Hamilton乘积的辅助方法(我已经针对另一个数学库验证了此方法):
p_transformed = q_mult(q_mult(q_r, p), q_r_conjugated);
将从TangoPoseData.getTranslationAsFloats()
检索到的翻译添加到p_transformed
。
但最终,p_transformed
处的点似乎总是会出现部分重叠点云的混乱,而不是对齐的合并点云。
我在这里遗漏了什么?转型中是否存在概念上的错误?
提前致谢。
答案 0 :(得分:2)
肯&文森佐,谢谢你的回复。
通过使用CloudCompare在单个点云上执行ICP注册后,我可以通过单独使用姿势数据将其转换为世界坐标,从而获得更好的结果。以下是约30次扫描计算机桌面的示例结果。更远的点仍然有点偏,但仔细调整参数可能会有所改善。此外,CloudCompare的命令行界面使其适用于批处理。
除了需要纠正的不可避免的整合错误之外,我之前犯的错误是错误地将相机空间框架(设备上的摄像头)(描述为here in the documentation)与OpenGL相同相机帧,与here所述的设备帧相同。但他们不是。
此外,缓慢移动相机以在两个相邻帧之间获得更多重叠也有助于注册。并且场景的良好可见光设置很重要,因为除了运动传感器之外,Tango还依靠背面的鱼眼摄像头进行运动跟踪。
希望这些提示也适用于除我以外的更一般情况。
答案 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。
看看蓝色的墙 真正的墙
答案 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