【问题标题】:How do I export Point Cloud Data (Project Tango)?如何导出点云数据(Project Tango)?
【发布时间】:2020-12-13 08:56:33
【问题描述】:

刚刚获得了 Project Tango 开发套件平板电脑,并完成了一些演示和示例。

一些较早的博客文章使用来自“Tango Mapper”应用程序的日志文件,该应用程序应预加载到设备上。

很遗憾,“Tango Mapper”应用程序没有预装在我的设备上,而且我似乎无法在 Play 商店中找到它。

是否有其他方法可以简单地导出或检索 PointCloud 数据以进行下游渲染?

[型号:yellowstone,Tango Core 版本:1.1:2014.11.14-bernoulli-release]

【问题讨论】:

    标签: android google-project-tango


    【解决方案1】:

    不确定您是否曾经解决过这个问题,但我能够找到 APK 以及使用 Tango 更新的平板电脑版本导出的方法。我使用此博客中描述的方法成功导出了点云数据。

    http://www.kitware.com/blog/home/post/838

    编辑

    过程下载 APK 或使用在 GITHUB 项目文件夹中找到的源代码。

    完成后,像往常一样启动应用程序。会有一个滑块记录和自动。如果您滑动记录,它只会等到您点击快照按钮来记录您当前正在查看的点云数据。

    如果您滑动自动,它将连续记录点云数据并创建文件,因为它会跟踪您移动的位置。请记住,文件越大,保存为 zip 所需的文件就越大。

    一旦完成滑动记录,它会提示您保存并发送。

    我发现保存到 Google 云端硬盘更容易,因为其他方法有时无法发送。

    完成后下载免费的 Paraview 应用程序找到 http://www.paraview.org/download/ 加载您的点云数据。

    它应该是两个文件,一个是您的姿势数据,另一个是点云。 (您可以在导入之前使用您看到的折叠箭头单独加载每个数据。)

    您将能够看到您的数据并实际播放您录制​​它的动画,因为您收集了您的姿势数据。

    (只是因为您正在寻找一种更简单的方法来导出数据而写出来)这可能是最简单的。你可以拿这些数据,根据收集到的姿态数据开始重建房间。)

    源代码和教程的所有功劳都归于 The Kitware 博客

    如果链接损坏,请私信我,我会将文件发送给您。

    APK 在这里找到

    APK DOWNLOAD

    他们还在博客底部列出了他们的源代码。它基于应用商店中的 tango Explorer。

    【讨论】:

    • 您也应该在回答中描述链接的过程;有一天链接可能会损坏,但您的答案应该仍然可以在这里找到。
    【解决方案2】:

    Tango Mapper 是一个内部工具,目前不向开发人员公开。我认为记录点云数据的最佳方式是使用提供的 c 或 java 示例代码,并且可能进行一些小的修改以将数据记录到文件中。

    c 示例:https://github.com/googlesamples/tango-examples-c

    java 示例:https://github.com/googlesamples/tango-examples-java

    【讨论】:

    • 谢谢。已经在这样做了,但想确保没有更简单的方法
    • 好的,但是如果您想导出适当的点云,通常还需要进行跟踪,而不仅仅是记录距离
    【解决方案3】:

    稀疏映射:https://www.youtube.com/watch?v=x5C_HNnW_3Q

    更多室内测绘:https://www.youtube.com/watch?v=3BNOsxMZD14

    似乎有不少 Tango 项目的贡献者被谷歌雇佣或收购。例如,Hidof 的大多数代码和/或文章的链接都是 MIA,只剩下一个几乎没有线索的 facebook 页面。互联网档案馆的 Wayback 机器上有一些他们网站的快照,供好奇的人使用。

    【讨论】:

      【解决方案4】:

      去看看 GitHub 上的 Java Point Cloud 示例 - 你想看的函数是 PointCloudActivity 中的 onXyzIsAvailable。提取一些相关的行......

      public void onXyzIjAvailable(final TangoXyzIjData xyzIj) {
      ....
                     byte[] buffer = new byte[xyzIj.xyzCount * 3 * 4];
                     FileInputStream fileStream = new FileInputStream(
                              xyzIj.xyzParcelFileDescriptor.getFileDescriptor());
                      try {
                          fileStream.read(buffer,
                                  xyzIj.xyzParcelFileDescriptorOffset, buffer.length);
                          fileStream.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
      

      此时buffer 包含点云数据 - 我强烈建议您通过二进制服务调用将其从设备上发送出去,因为我认为让可怜的东西尝试将其转换为 JSON 或 XML 会使事情变慢比你想要的

      【讨论】:

        【解决方案5】:

        感谢马克的建议。我是一名新手程序员,这是我第一次使用 java... 我有兴趣将 Tango 获取的 PointCloud 数据导出到文件中,我想征求您对我的方法的反馈(我创建了一个保存按钮,onClick 数据将保存到外部驱动器上的文件中)。请在下面找到应该保存 xyzIj 数据的部分的代码:

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            ...
                case R.id.save_button:
                    savePointCloud();
                    break;
                default:
                    Log.w(TAG, "Unrecognized button click.");
                }
        }
        
        
        private static void savePointCloud(final TangoXyzIjData xyzIj, String file) {
            File directoryName =  getAlbumStorageDir(file);
            FileOutputStream out = new FileOutputStream(directoryName,"text.txt");
            byte[] buffer = new byte[xyzIj.xyzCount * 3 * 4];
            FileInputStream fileStream = new FileInputStream(
                    xyzIj.xyzParcelFileDescriptor.getFileDescriptor());
            int read;
               while ((read=fileStream.read(buffer))!=1){
                   try{
                   out.write(buffer, 0, read);
                   out.close();
                   System.out.println("Printed to file");
               }catch(IOException e){e.printStackTrace();}
               }
        }
        
        public File getAlbumStorageDir(String dirName) {
            if (!isExternalStorageWritable()) {
                return null;
            } else {
                // Get the directory for the user's public downloads directory.
                File file = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_DOWNLOADS), dirName);
                if (!file.mkdirs() || !file.exists()) {
                    Log.e(TAG, "Directory not created");
                    return null;
                }
                return file;
            }
        }
        
        public boolean isExternalStorageWritable() {
            String state = Environment.getExternalStorageState();
            if ((Environment.MEDIA_MOUNTED.equals(state)
                    && Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))) {
                return true;
            } else {
                Log.e(TAG, "External storage is not mounted READ/WRITE.");
                return false;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-23
          • 2015-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-06
          • 1970-01-01
          • 2016-10-01
          相关资源
          最近更新 更多