刚买了一个Project Tango开发套件平板电脑,并完成了一些演示和示例。
一些较旧的博客文章使用来自" Tango Mapper"的日志文件。应该预装在设备上的应用程序。
不幸的是," Tango Mapper"应用程序没有预先加载到我的设备上,我似乎无法在Play商店中找到它。
是否有其他方法可以简单地导出或检索PointCloud数据以进行下游渲染?
[型号:黄石,Tango核心版本:1.1:2014.11.14-bernoulli-release]
答案 0 :(得分:8)
不确定你是否必须解决这个问题,但我能够找到APK以及使用Tango更新的平板电脑版本导出的方法。我使用本博客中描述的方法成功导出了点云数据。
http://www.kitware.com/blog/home/post/838
修改的
过程下载APK或使用在GITHUB项目文件夹中找到的源代码。
一旦完成,就像平常一样启动应用程序。将有一个滑块记录和auto。如果您滑动记录,它将只等到您点击快照按钮以记录您当前正在查看的点云数据。
如果您滑动自动,它将连续记录点云数据,并在跟踪您移动的位置时创建文件。请记住,文件越大,保存为zip就越大。
完成后,滑动记录,它会提示您保存并发送。
我发现保存到Google云端硬盘更容易,因为其他方法有时无法发送。
完成后,下载免费的Paraview应用程序http://www.paraview.org/download/加载您的Point云数据。
它应该是两个文件,一个是你的姿势数据,另一个是云。 (您可以使用导入之前看到的折叠箭头单独加载每个数据。)
这将是您能够看到您的数据并实际回放您录制它的动画,因为您收集了姿势数据。
(只写出来因为你正在寻找一种更简单的方法来导出数据)这可能是最简单的。您可以根据收集的姿势数据获取所述数据并开始重建房间。)
源代码和教程的所有功劳都归功于The Kitware博客
如果链接中断,DM我和我会将文件发送给您。
APK在这里找到
他们还在博客底部列出了他们的源代码。它基于应用程序商店中的探戈资源管理器。
答案 1 :(得分:5)
Tango Mapper是一个内部工具,它目前尚未公开给开发人员。我认为记录点云数据的最佳方法是使用提供的c或java示例代码,并可能做一些小修改以将数据记录到文件中。
例如:https://github.com/googlesamples/tango-examples-c答案 2 :(得分:2)
稀疏映射:https://www.youtube.com/watch?v=x5C_HNnW_3Q
更多室内地图:https://www.youtube.com/watch?v=3BNOsxMZD14
似乎有超过几个Tango项目的贡献者被谷歌雇佣或购买。作为一个例子,Hidof的代码和/或文章的大多数链接都是MIA,只有一个很少提供线索的facebook页面。互联网档案的回归机器有一些好奇的网站快照。
答案 3 :(得分:1)
去看看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会使事情比你想要的慢
答案 4 :(得分:0)
谢谢马克的建议。我是一名新手程序员,这是我第一次使用java ...
我有兴趣将Tango获取的PointCloud数据导出到文件中,我想请求您对我的方法的反馈(我创建了一个Save按钮,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;
}
}