2016-05-13 6 views
0

Я работаю с Google Tango прямо сейчас, и до сих пор все работало нормально, но я наткнулся на несколько странных вещей.Невозможно узнать, как преобразовать облако точек танго

В примерах танго есть класс ScenePoseCalculator. И есть метод «toOpenGlCameraPose». При использовании камеры OpenGL, однако, настроен неправильно. Когда я двигаюсь вперед, камера движется назад. Слева и справа также меняются местами.

Но самое сложное - правильно преобразовать PointCloud. Я делаю следующее:

Создать Vector3-массив:

Vector3f [] vertices = new Vector3f[mPointCloud.getGeometry().getVertices().capacity()]; 
    for(int i=0; i<mPointCloud.getGeometry().getVertices().capacity(); i++) { 
     vertices[i] = new Vector3f(
      mPointCloud.getGeometry().getVertices().get(i*3), 
      mPointCloud.getGeometry().getVertices().get(i*3+1), 
      mPointCloud.getGeometry().getVertices().get(i*3+2)); 
    } 

В PointCloud обратный вызов от TangoListener я:

private void updateXYZIJ() { 

    try { 
     if(pcm.getLatestXyzIj().xyzCount<10) return; 

     TangoCoordinateFramePair fp = new TangoCoordinateFramePair(
      TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE, 
      TangoPoseData.COORDINATE_FRAME_DEVICE); 

     TangoXyzIjData xyzIj = pcm.getLatestXyzIj(); 
     depthArray = new float[xyzIj.xyzCount * 3]; 
     xyzIj.xyz.get(depthArray); 

     com.projecttango.rajawali.Pose p = 
      ScenePoseCalculator.toDepthCameraOpenGlPose(
       tangoProvider.getTango().getPoseAtTime( 
        xyzIj.timestamp, fp), this.setupExtrinsics()); 

     Pose cloudPose = this.rajawaliPoseToJMEPoseCLOUD(p); 

     currentPointCloudData = new PointCloudUpdate(
      new Date(), 
      depthArray, 
      xyzIj.xyzCount, 
      xyzIj.ijRows, 
      xyzIj.ijCols, 
      0, 
      cloudPose, 
      null 
     ); 

     // inform listeners 
     for (PointCloudListener listener : this.pointsListeners) { 
      listener.acceptMessage(tangoProvider, this.currentPointCloudData); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Превратить PointCloud я:

this.transformation = new Matrix4f(); 
    this.transformation.setRotationQuaternion(
     this.referencePose.orientation); 
    this.transformation.setTranslation(this.referencePose.place); 

absVertices = new Vector3f[vertices.length]; 
    for(int i=0; i<vertices.length; i++) { 

     // Create new Vertex 
     absVertices[i]=new Vector3f(
      vertices[i].x, 
      vertices[i].y, 
      vertices[i].z 
     ); 

     Vector3f v = absVertices[i]; 

     transformation.rotateVect(absVertices[i]); 
     transformation.translateVect(absVertices[i]); 
    } 

Но что бы я ни делал. Я все пробовал. Но это не будет выглядеть правильно. PointClouds сшиваются друг с другом или выглядят так, как будто они размещены без всякого смысла.

Надежда кто-то знает больше ...

ответ

1

Для всех по-прежнему ищет, чтобы узнать, как сделать это, я просто это удалось в jMOnkeyEngine3. Секрет заключается в том, что нужно использовать ИНВЕРСУ вращательного кватерниона, который предоставляет танго.

Хорошо, вот как это работает:

Получение данных о глубине с Обратным:

public void onXyzIjAvailable(TangoXyzIjData xyzIj) 

Созданием массива вершин из хуга-массива:

// Create new array, big enough to hold all vertices 
     depthArray = new float[xyzIj.xyzCount * 3]; 
     xyzIj.xyz.get(depthArray); 

     // Create Vertices 
     Vector3f[] vertices = new Vector3f[xyzIj.xyzCount]; 
     for(int i=0; i<xyzIj.xyzCount; i++) { 
      vertices[i] = new Vector3f(
       depthArray[i*3], 
       depthArray[i*3+1], 
       depthArray[i*3+2]); 
     } 

Используйте ScenePoseCalculator от Rajawali3d:

com.projecttango.rajawali.Pose p = ScenePoseCalculator 
      .toDepthCameraOpenGlPose(tangoProvider.getTango().getPoseAtTime( 
        xyzIj.timestamp, framePair_SS_D), this.setupExtrinsics()); 

Перед покупкой устройства необходимо заказать устройство, но не забудьте сделать это в корпусе TRY/CATCH.

После этого, получить Вращение кватерниона и Pose Vector3 от танго Поза:

Pose cloudPose = this.rajawaliPoseToJMEPoseCLOUD(p); 

Этот метод определяется здесь:

private Pose rajawaliPoseToJMEPoseCLOUD(com.projecttango.rajawali.Pose p) { 
    Pose pose = new Pose(
     new Vector3f(
      (float)p.getPosition().x, 
      (float)p.getPosition().y, 
      (float)p.getPosition().z), 
     new Quaternion(
      (float)p.getOrientation().x, 
      (float)p.getOrientation().y, 
      (float)p.getOrientation().z, 
      (float)p.getOrientation().w 
     )); 

    return pose; 
} 

Затем поместите вершины в узел и превратить этот узел с Поза Данные по данным XYZIJ-данных:

meshNode.setLocalRotation(pcu.referencePose.orientation.inverse()); 
    meshNode.setLocalTranslation(pcu.referencePose.place); 

Надеюсь, это поможет кому-то. Мне потребовалось 4 дня, чтобы понять это x (

Cheers

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

  • Нет связанных вопросов^_^