1

我刚拿到平板电脑,以前我有手机。大多数人可能都知道,手机的 SDK 允许通过 android 相机回调来捕获超帧。如果正确解析,超帧包含所有相关的传感器数据。

在阿基米德,我尝试了以下方法。我做了一个实现 CameraPreviewListener 的活动:

public class MainActivity extends Activity implements CameraPreviewListener
{
    // Inside of this class we manage another object that implements PreviewCallback
    ...
}

这允许捕获相机图像,就像在任何其他 Android 设备上一样。(请注意,在 Peanut 手机上,这提供了超帧;这只是在平板电脑上提供了原始 RGB 缓冲区。)同样,来自 Tango 服务的回调的简单实现也可以正常工作。

public class MainActivity extends Activity
{
    private Tango mTango;
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        ...
        setTangoListeners();
    }
    private void setTangoListeners()
    {
        mTango.connectListener(framePairs, new OnTangoUpdateListener() {

        @Override
        public void onPoseAvailable(final TangoPoseData pose) 
        {
            System.out.println("Pose data received.");
        }
        @Override
        public void onXyzIjAvailable(final TangoXyzIjData xyzIj)
        {
            System.out.println("Cloud data received.");
        }
        @Override
        public void onTangoEvent(final TangoEvent event)
        {
            ...
        }
    }
}

但是,当我尝试将两者结合在一起时,就像这样,

public class MainActivity extends Activity implements CameraPreviewListener
{
    // Inside of this class we manage another object that implements PreviewCallback
    private Tango mTango;
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        ...
        setTangoListeners();
    }
    private void setTangoListeners()
    {
        mTango.connectListener(framePairs, new OnTangoUpdateListener() {

        @Override
        public void onPoseAvailable(final TangoPoseData pose) 
        {
            System.out.println("Pose data received.");
        }
        @Override
        public void onXyzIjAvailable(final TangoXyzIjData xyzIj)
        {
            System.out.println("Cloud data received.");
        }
        @Override
        public void onTangoEvent(final TangoEvent event)
        {
            ...
        }
    }
}

奇怪的事情发生了。相机回调触发得很好,我也得到了 onPoseAvailable 回调。但是,我不再收到对 onXyzIjAvailable 的任何回调。

所以我的问题是:

  1. 我是否正确假设 Tango 服务需要访问相机回调来生成 PointCloud 数据?

  2. 如果是这样,是否有任何方法可以让我大致同时获得 RGB 缓冲区和点云?(是的,我知道校准并非易事。)

  3. 如果 2 没有解决方案,是否有任何未来的 SDK 更新计划允许这样的事情?

  4. 我还没有探索过 C SDK。也许那里有办法做到这一点,如果是这样,有没有人有经验可以借?

理想情况下,我想访问原始 RGB 缓冲区、强度图像和鱼眼图像;我真的不在乎如何,只要它有效。

4

1 回答 1

2
  1. Tango 服务确实需要相机访问权限才能生成点云数据。您可以在应用程序的 android 清单文件中设置相机权限。

  2. Tango 服务需要 RGB-IR 摄像头上的句柄来接收来自onXyzIjAvailable. 根据我从您的代码中观察到的情况,您似乎正在尝试将 Android 相机 API 与 Tango 服务一起使用。这意味着 RGB-IR 摄像头已经被 Android 摄像头 API 使用,这意味着 Tango 服务不能再使用 RGB 红外摄像头来生成点云数据。但是,您仍然会收到onPoseAvailable回调,因为运动跟踪使用 FishEye 相机进行姿势估计。

此示例向您展示了一种使用connectSurface调用将 RGB 数据渲染到使用 Tango 服务的 Android Surface 的方法。使用此调用不会影响onXyzIjAvailable回调,因为它是 Tango 服务 API 的一部分。

tl:dr: 不要将 Android 相机 API 与 Tango 服务一起使用。而是使用该connectSurface(int cameraId, Surface surface)功能连接到您想要的相机。

于 2014-11-06T20:50:45.513 回答