4

我刚刚将我的设备更新到最新的 (Leibniz) 版本,这里有一些观察/问题:

1)我的应用程序中现在存在长时间(2-3s)的间歇期,其中姿势数据无效。我认为问题出在驱动程序中,因为问题也出现在 Tango Explorer 中。只需启动资源管理器并让它坐在那里会导致“运动跟踪丢失”对话框弹出和弹出。谁能证实这一点?

2) TangoService_connectOnFrameAvailable() 回调中的颜色缓冲区现在又回来了,但在 YUV420SP 中,如发行说明中所述。任何探戈开发者都可以发布将其转换为 RGB 的代码。我知道我可以用谷歌搜索这些东西,但如果有一个与 TangoImageBuffer 宽度、高度、步幅等相关的样本会很好。

4

4 回答 4

2

很快,这是我用于 Tango 的 YUV 代码

// http://en.wikipedia.org/wiki/YUV
int halfi, uvOffset, halfj, uvOffsetHalfj;
float y_scaled, v_scaled, u_scaled;
const float Umax = 0.436f;
const float Vmax = 0.615f;

unsigned char* pData = TangoData::cameraImageBuffer;
unsigned char* iData = TangoData::cameraImageBufferRGBA;
float invByte = 0.0039215686274509803921568627451;  // ( 1 / 255)

is_image_dirty = false;
int size = (int)(TangoData::imageBufferStride * TangoData::imageBufferHeight);

int uOffset = size / 4 + size;
int halfstride = TangoData::imageBufferStride / 2;
for (int i = 0; i < TangoData::imageBufferHeight; ++i)
{
    halfi = i / 2;
    uvOffset = halfi * halfstride;
    for (int j = 0; j < TangoData::imageBufferWidth; ++j)
    {
        halfj = j / 2;
        uvOffsetHalfj = uvOffset + halfj;
        y_scaled = pData[i * TangoData::imageBufferStride + j] * invByte;
        v_scaled = 2 * (pData[uvOffsetHalfj + size] * invByte - 0.5f) * Vmax;
        u_scaled = 2 * (pData[uvOffsetHalfj + uOffset] * invByte - 0.5f) * Umax;
        *iData++ = (unsigned char)((y_scaled + 1.13983f * v_scaled) * 255.0);;
        *iData++ = (unsigned char)((y_scaled - 0.39465f * u_scaled - 0.58060f * v_scaled) * 255.0);
        *iData++ = (unsigned char)((y_scaled + 2.03211f * u_scaled) * 255.0);
        *iData++ = 255;
    }
}

现在,当返回格式发生先前未宣布的更改时,我对其进行了深入研究,更改并询问这是否会保持一致 - 像往常一样,蟋蟀。然后两个版本前他们破坏了整个图像返回,显然没有注意到它,再一次,当被问到......蟋蟀!亲爱的 Google 开发人员,我真的不想这么说,但这不是我的第一次牛仔竞技表演。我从 Tango 开始并且非常兴奋,但由于完全缺乏沟通,以及发布周期中明显的混乱,我现在已经变得幻想破灭,并且担心我可能会继续完全反感。我认为我们这些在谷歌之外寻找 AR 工具的人可能真的需要考虑其他途径。坦率地说,Google 开发人员,如果你为自己的进步感到自豪,那你就不应该这样做——这甚至不是一个学术研究项目的 A 级。我真的很抱歉这么说,但这已经持续了太久,而且你变得更糟了。把它关掉!

于 2015-04-19T23:02:39.657 回答
1

不幸的是,我没有解决方案,但我也注意到了类似的问题。在我正在开发的应用程序中,我不断收到重复的 Tango 服务异常,并显示“服务故障将重新启动”消息。有时它会重新启动,有时它不会,我需要重新启动设备。我最终收到的姿势数据是无效的——例如,方向的 NaN。

于 2015-04-19T20:32:43.683 回答
0

冒着听起来轻率的风险:再次尝试更新。

我上周更新到 Leibnez 并遇到了同样的问题:NaN、探戈服务失败、无效状态代码。今晚,我正在研究探戈的设置,试图回滚到雅可比。当我检查更新时,我收到了 Leibnez 的“内部”OTA 更新消息。此消息看起来与主要更新消息不同。我让它更新,问题似乎解决了。我运行了大约 5 分钟没有失败...

我的设置现在报告:

构建:KOT49H.150414

于 2015-04-29T00:50:55.103 回答
0

我遇到了同样的问题。我使用点云示例作为编程的基础。在最初的几秒钟内没有姿势,此外,如果您尝试将视图更改为“前视图”,应用程序将崩溃(因为没有姿势,他可以将视图和位置更改为,我猜)。

你一个月前问过你的问题,所以我很好奇你是否能够捕捉到相机数据。我使用此代码从 NV12 转换为 RGB:

 int size = (int)(buffer->width * buffer->height);
 for (int i = 0; i < buffer->height; i++)
 {
   for (int j = 0; j < buffer->width; j++)
     {
     float y = buffer->data[i * buffer->stride + j];
     float u = buffer->data[size+2*((i / 2) * (buffer->stride / 2) + (j / 2))];
     float v = buffer->data[size+2*((i / 2) * (buffer->stride / 2) + (j / 2))+1];

            TangoData::GetInstance().color_buffer[3*(i*buffer->width+j)]=y;
            TangoData::GetInstance().color_buffer[3*(i*buffer->width+j)+1]=u;
            TangoData::GetInstance().color_buffer[3*(i*buffer->width+j)+2]=v;;
}
}

在宽度 x 高度中保存 Y 数据,然后是交替的 UV 数据。转换是在着色器中完成的(比在 FrameAvailable 方法中更快)使用已知的转换(Android YUV 格式):

attribute vec4 vertex;
attribute vec3 color;
uniform mat4 mvp;
varying vec4 v_color;
void main() {
gl_PointSize = 7.0;
gl_Position = mvp*vertex;
float r=color.x + (1.370705f * (color.z-128.0f));
float g=color.x - (0.698001f * (color.z-128.0f)) - (0.377633f * (color.y-128.0f));
float b=color.x + (1.732446f * (color.y-128.0f));
v_color = vec4(r/255.0f,g/255.0f,b/255.0f,1.0);

此代码不能完全工作。

  • 如果我尝试只捕获 Y 数据(亮度,因此我应该得到一个灰色图像),那么只有灰点,没有意义。此外,没有黑白点,只有对比度很小的灰点。
  • 如果我添加紫外线,我只会得到红色和黄色的颜色。如果我改变紫外线的位置,它都是很蓝的。我无法检测到任何物体或轮廓。
  • 几帧后,相机崩溃并出现以下异常(第一次出现异常时,它显示“RAW”而不是“YUV”):

     E/camera-metadata﹕ /home/ubuntu/jobs/redwood_internal/RedwoodInternal/Redwood/common/player-engine/‌​src/camera-metadata.cc:56 YUV failed to match frame 1545.014677
    

    -应用程序很慢,需要很多时间。我使用了互斥锁,但这并没有改变任何东西。有没有人解决过这个问题或者现在正在解决这个问题?

我稍微更改了配置,因为据说需要启用彩色相机。但我找不到任何关于这是如何完成的解释。我希望以下代码是正确的,它没有给我任何错误消息:

bool TangoData::SetConfig() {

[...]

if (TangoConfig_setBool(config_, "config_enable_color_camera", true) !=
    TANGO_SUCCESS) {
  LOGE("config_enable_color_camera Failed");
  return false;
}

if (TangoConfig_setInt32(config_, "config_color_exp", 300) !=
    TANGO_SUCCESS) {
  LOGE("config_color_exp Failed");
  return false;
}

[...]
return true;
}

希望这对您有所帮助,或者您已经在 Leibniz 版本中使用相机取得了良好的效果!

于 2015-05-15T11:18:24.523 回答