2015-08-13 4 views
4

Заранее прошу прощения за мой длинный пост.Как использовать экспериментальный API-интерфейс с проектом Tango Project

Моя цель - создать сетчатое приложение для проекта Tango Yellowstone для создания 3D-карты строительных интерьеров. Я намерен использовать экспериментальный API-интерфейс, добавленный в последних версиях кода танго-примеров-c.

Я использую точку помутнения-JNI-пример (Тьюринга) в качестве отправной точки и до сих пор сделано следующее:

  1. Установить параметр config_experimental_enable_scene_reconstruction танго конфигурации в point_cloud_app.cc (см docs)

    // Enable scene reconstruction 
    ret = TangoConfig_setBool(tango_config_, 
         config_experimental_enable_scene_reconstruction", true); 
        if (ret != TANGO_SUCCESS) { 
         LOGE("PointCloudApp:   config_experimental_enable_scene_reconstruction() failed" 
          "with error code: %d", ret); 
         return ret; 
    } 
    
  2. Добавлена ​​extractMesh нативный метод в TangoJNINative.java

    // Extracts the full mesh from the scene reconstruction. 
    public static native float extractMesh(); 
    
  3. Добавлено соответствие extractMesh функции к jni_interface.cc

    JNIEXPORT void JNICALL 
    Java_com_projecttango_experiments_nativepointcloud_TangoJNINative_extractMesh(
    JNIEnv*, jobject) { 
        app.ExtractMesh(); 
    } 
    
  4. метод

    Добавлено ExtractMesh в point_cloud_app.cc

    void PointCloudApp::ExtractMesh() { 
    // see line 1245 of tango_client_api.h 
        mesh_ptr = new TangoMesh_Experimental(); 
        TangoService_Experimental_extractMesh(mesh_ptr); 
        mesh = *mesh_ptr; 
        LOGE("PointCloudApp: num_vertices: %d", mesh.num_vertices); 
    
        float float1, float2, float3; 
        float1 = mesh.vertices[1][0]; 
        float2 = mesh.vertices[1][1]; 
        float3 = float1 + float2; // these lines show I can use the vertex data 
        LOGE("PointCloudApp: First vertex, x: %f", mesh.vertices[1][0]); // this line causes app to crash; printing the vertex data seems to be the problem 
    } 
    
  5. Добавлено TangoMesh_Experimental объявление в point_cloud_app.h

    // see line 1131 of tango_client_api.h 
    TangoMesh_Experimental* mesh_ptr; 
    TangoMesh_Experimental mesh; 
    
  6. Добавлена ​​дополнительная кнопка для вызова собственного метода extractMesh. (Не показывая этот, как это довольно просто)

Для справки, здесь TangoMesh_Experimental STRUCT из API:

// A mesh, described by vertices and face indices, with optional per-vertex 
    // normals and colors. 
    typedef struct TangoMesh_Experimental { 
    // Index into a three-dimensional fixed grid. 
    int32_t index[3]; 

    // Array of vertices. Each vertex is an {x, y, z} coordinate triplet, in 
    // meters. 
    float (*vertices)[3]; 

    // Array of faces. Each face is an index triplet into the vertices array. 
    uint32_t (*faces)[3]; 

    // Array of per-vertex normals. Each normal is a normalized {x, y, z} vector. 
    float (*normals)[3]; 

    // Array of per-vertex colors. Each color is a 4-tuple of 8-bit {R, G, B, A} 
    // values. 
    uint8_t (*colors)[4]; 

    // Number of vertices, describing the size of the vertices array. 
    uint32_t num_vertices; 

    // Number of faces, describing the size of the faces array. 
    uint32_t num_faces; 

    // If true, each vertex will have an associated normal. In that case, the 
    // size of the normals array will be equal to num_vertices. Otherwise, the 
    // size of the normals array will be 0. 
    bool has_normals; 

    // If true, each vertex will have an associated color. In that case, the size 
    // of the colors array will be equal to num_vertices. Otherwise, the size of 
    // the colors array will be 0. 
    bool has_colors; 
    } TangoMesh_Experimental; 

Мое текущее понимание этой структуры является:

  1. Три указателя в float (*vertices)[3]; указывают на адреса в начале трех комментариев ry для координат x, y и z для вершин для сетки (то же самое верно для цветов нормалей и цветов). Конкретная вершина состоит из компонентов x, y и z, найденных в определенном индексе в трех массивах.

  2. Аналогично, массив uint32_t (*faces)[3] имеет три указателя на начало трех фрагментов памяти, но вместо этого здесь имеет место набор из трех элементов, которые указывают номера из трех вершин (из массива вершин (каждый с тремя координатами)) составляют это лицо.

Текущее состояние я могу извлечь сетку, и напечатать некоторые из них на консоль, а затем выходит из строя без ошибок

PointCloudApp: PointCloudApp: num_vertices: 8044 

Если я опускаю последнюю строку я добавил в point_cloud_app.cc (# 4, выше), приложение не сбой.Я могу получить доступ к данным вершин и сделать с ним что-то, но распечатать его с помощью LOGE приводит к сбою в 9 раз из 10. Иногда он корректно печатает значение без сбоев. Могут ли данные вершин иметь отверстия или недопустимые значения?

Я попытался вернуть test_float из JNI обратно в java, но он снова сработает, когда я попытаюсь это сделать.

Предложения?

+1

_ «Предложения?» _ - Правильно инициализируйте аргументы, которые вы передаете функции - т. Е. ** не ** передайте ему значение нулевого указателя, оно не принимает его. Исправьте свой код, вместо того чтобы беспокоиться об изменении кода. –

+0

Спасибо, @CaptainObvlious. Я получил его, добавив эту строку 'mesh_ = new TangoMesh_Experimental();' в point_cloud_app.cc перед вызовом 'TangoService_Experimental_extractMesh (mesh_)'. – Nate

+0

Теперь застрял на извлечении данных вершин. – Nate

ответ

1

vertices - динамический массив точек, где каждая точка является float[3]. Попробуйте этот пример:

for (int i = 0; i < mesh.num_vertices; ++i) { 
    printf("%d: x=%f y=%f z=%f\n", i, mesh.vertices[i][0], 
     mesh.vertices[i][1], mesh.vertices[i][2]); 
} 

Если посмотреть на макет памяти, было бы x0 y0 z0 x1 y1 z1 и т.д., каждый из которых поплавок.

+0

Спасибо, Иван! Я обновил вопрос, чтобы использовать двойные скобки. Я могу получить доступ к данным вершин и что-то сделать с ним (см. Изменения на шаге 4), но когда я пытаюсь напечатать значения вершин с помощью LOGE, приложение выйдет из строя. Я могу печатать другие значения с плавающей точкой. Интересно, что он успешно печатает примерно 1 из 10 раз без сбоев. Могут ли поплавки в данных вершин отличаться от поплавков, которые ожидает LOGE? Это действительно меня озадачило. – Nate

+0

Я бы предложил проверить возвращаемое значение вызова 'TangoService_Experimental_extractMesh' –

+0

Я пытаюсь посмотреть на переменные, но мне нужно получить [отладка ndk] (http://stackoverflow.com/questions/32193244/cant-debug-ndk -samples-with-android-studio-1-3-2-on-windows) (не простая задача!). Как только я могу посмотреть содержимое и тип mesh.vertices [1] [0] в отладчике, я думаю, что все будет иметь больше смысла. – Nate

Смежные вопросы