2016-05-13 9 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)); 
    } 

私はTangoListenerのPointCloudコールバックで:

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でそれを管理します。秘密は、タンゴが提供するローテーションクォータニオンのINVERSEを使用しなければならないということです。

コールバックと深度データを取得:

// 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]); 
     } 

用途:

public void onXyzIjAvailable(TangoXyzIjData xyzIj) 

はXYZ-アレイから頂点の配列を作成し、それがどのように動作するか

オーケーは、ここにありますRajawali3dのScenePoseCalculator:

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

デバイスイントリンシクスは、その前に注文する必要がありますが、TRY/CATCHエンクロージャで行う必要があります。その後

、回転クォータニオンを取得し、タンゴからの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日間かかりました。(

乾杯

関連する問題