2016-05-10 3 views
0

Я новичок в андроиде и с танго (я просто хотел сказать это, чтобы предотвратить возможные ошибки), и я использую Project Tango Tablet (Yellowstone). Я хочу сделать с ней хлопок, поэтому я хочу получить необработанные данные.Project Tango Raw Data (IMU и RGBD)

В настоящее время я знаю, как получить poseData и облако точки. Я читал, что получить IMU и RGBD невозможно. Но вместо RGBD изображение RGB, отображаемое некоторым образцом, может быть достаточным, но я не знаю, получить его. Я думаю, что он, вероятно, будет работать с «onFrameAvailable (int i)», но я действительно не знаю, как получить изображение RGB.

Для данных IMU я увидел, что существует EVENT_IMU с "onTangoEvent (TangoEvent tangoEvent)". Но это никогда не происходит/никогда не обрабатывается, когда это должно быть событие высокой частоты? Однако я обрабатываю EVENT_FEATURE_TRACKING (= 5) и EVENT_FISHEYE_CAMERA (= 2), поэтому работает «onTangoEvent (TangoEvent tangoEvent)». Так что мои вопросы таковы:

  1. Как я могу получить изображение RGB? (в матрице, буфере или что-то еще)
  2. Почему EVENT_IMU никогда не обрабатывается?
  3. Есть ли способ получить данные ИДУ или что-то подобное?

Спасибо за ваши ответы

ответ

3

Я забыл сказать, что это, но я решил мою проблему. API-интерфейс Tango не позволяет получать необработанные данные (IMU и RGBD). Но вы можете получить RGB с помощью c api через TangoImageBuffer. Вы получите изображение MV21. Вы сможете конвертировать каждый пиксель в «один пиксель RGB», а затем преобразовывать этот пиксель в данные RGBA.

Для ИДУ просто забудьте API-интерфейс Tango и используйте API android. Вы можете легко получить его, а затем перенести на сервер. В моем случае я делаю это, используя ros publisher. Благодаря этому я могу получить что-то вроде 500 поз/сек, 35 точек облака/сек и 900 IMU/сек. Если вас интересует использование ро, вы можете проверить это ROS Rviz visualization of Tango Pose data.

----- EDIT -------- Вот код из моего мерзавца (смотрите следующий вопрос в комментарии), как я удалю его:

import android.Manifest; 
import android.app.Activity; 
import android.content.Context; 

import android.content.pm.PackageManager; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 

import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 

import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 

public class IMU implements SensorEventListener { 
    private long timestampAccelerometerSensor, timestampLinearAccelerationSensor, timestampRotationSensor; 
    private long timestampGravitySensor, timestampGyroscopeSensor, timestampMagneticFieldSensor; 
    private String tAccelerometerSensor, tLinearAccelerationSensor, tRotationSensor; 
    private String tGravitySensor, tGyroscopeSensor, tMagneticFieldSensor, tGPS; 

    private long countAccelerometerSensor, countLinearAccelerationSensor, countRotationSensor; 
    private long countGravitySensor, countGyroscopeSensor, countMagneticFieldSensor; 

    //for GPS 
    private LocationManager locationManager; 
    private LocationListener locationListener; 
    private double longitude, latitude; 

    //for IMU 
    private SensorManager mSensorManager; 
    private Sensor accelerometerSensor; 
    private Sensor linearAccelerationSensor; 
    private Sensor rotationSensor; 
    private Sensor gravitySensor; 
    private Sensor gyroscopeSensor; 

    private Sensor magneticFieldSensor; 

    float accelerationForce[] = new float[3];//Including gravity, Acceleration force along x,y,z axis in m/s² 
    float linearAccelerationForce[] = new float[3];//Excluding gravity, Acceleration force along x,y,z axis in m/s² 
    float gravity[] = new float[3];//Force of gravity along x,y,z axis in m/s² 
    float gyroscope[] = new float[3];//Rate of rotation around x,y,z axis in rad/s 
    float rotation[] = new float[4]; //Rotation vector component along the x,y,z axis and Scalar component of the rotation vector 
    float magneticField[] = new float[3];//Geomagnetic field strength along x,y,z axis uT 


public void create(){ 
     mSensorManager = (SensorManager) mainActivity.getSystemService(Context.SENSOR_SERVICE); 

     locationManager = (LocationManager) mainActivity.getSystemService(Context.LOCATION_SERVICE); 
     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       //gpsView.setText("Longitude: " + location.getLongitude() + "\nLatitude: " + location.getLatitude()); 
       //Log.i("GPS","Longitude: " + location.getLongitude() + "\nLatitude: " + location.getLatitude()); 
       tGPS = TangoJNINative.getCurrentTimeMillisString(); 
       longitude = location.getLongitude(); 
       latitude = location.getLatitude(); 
      } 

      @Override 
      public void onStatusChanged(String provider, int status, Bundle extras) { 

      } 

      @Override 
      public void onProviderEnabled(String provider) { 
       //gpsStatusView.setText("GPS ---> On"); 
      } 

      @Override 
      public void onProviderDisabled(String provider) { 
       //gpsStatusView.setText("GPS ---> Off"); 
      } 
     }; 

     if (ActivityCompat.checkSelfPermission(mainActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mainActivity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

     String locationProvider = LocationManager.NETWORK_PROVIDER; 
     Location firstLocation = locationManager.getLastKnownLocation(locationProvider); 
     longitude = firstLocation.getLongitude(); 
     latitude = firstLocation.getLatitude(); 

     setSensors(); 
     setSensorsListeners(); 
    } 

public void pause(){ 
     mSensorManager.unregisterListener(this); 
    } 

    public void resume(){ 
     setSensorsListeners(); 
    } 

    private void setSensors(){ 
     accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     linearAccelerationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); 
     rotationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); 
     gravitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); 
     gyroscopeSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 

     magneticFieldSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    } 

    private void setSensorsListeners(){ 
     mSensorManager.registerListener(this, accelerometerSensor , SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, linearAccelerationSensor , SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, rotationSensor , SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, gravitySensor , SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, gyroscopeSensor , SensorManager.SENSOR_DELAY_NORMAL); 

     mSensorManager.registerListener(this, magneticFieldSensor , SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     getIMU(event); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    private void getIMU(SensorEvent e){ 
     switch(e.sensor.getType()){ 
      case Sensor.TYPE_ACCELEROMETER: 
       accelerationForce[0] = e.values[0]; 
       accelerationForce[1] = e.values[1]; 
       accelerationForce[2] = e.values[2]; 
       countAccelerometerSensor++; 
       timestampAccelerometerSensor = e.timestamp; 
       tAccelerometerSensor = TangoJNINative.getCurrentTimeMillisString(); 
       break; 
      case Sensor.TYPE_LINEAR_ACCELERATION: 
       linearAccelerationForce[0] = e.values[0]; 
       linearAccelerationForce[1] = e.values[1]; 
       linearAccelerationForce[2] = e.values[2]; 
       countLinearAccelerationSensor++; 
       timestampLinearAccelerationSensor = e.timestamp; 
       tLinearAccelerationSensor = TangoJNINative.getCurrentTimeMillisString(); 
       break; 
      case Sensor.TYPE_ROTATION_VECTOR: 
       rotation[0] = e.values[0]; 
       rotation[1] = e.values[1]; 
       rotation[2] = e.values[2]; 
       rotation[3] = e.values[3]; 
       countRotationSensor++; 
       timestampRotationSensor = e.timestamp; 
       tRotationSensor = TangoJNINative.getCurrentTimeMillisString(); 
       break; 
      case Sensor.TYPE_GRAVITY: 
       gravity[0] = e.values[0]; 
       gravity[1] = e.values[1]; 
       gravity[2] = e.values[2]; 
       countGravitySensor++; 
       timestampGravitySensor = e.timestamp; 
       tGravitySensor = TangoJNINative.getCurrentTimeMillisString(); 
       break; 
      case Sensor.TYPE_GYROSCOPE: 
       gyroscope[0] = e.values[0]; 
       gyroscope[1] = e.values[1]; 
       gyroscope[2] = e.values[2]; 
       countGyroscopeSensor++; 
       timestampGyroscopeSensor= e.timestamp; 
       tGyroscopeSensor = TangoJNINative.getCurrentTimeMillisString(); 
       break; 
      case Sensor.TYPE_MAGNETIC_FIELD: 
       magneticField[0] = e.values[0]; 
       magneticField[1] = e.values[1]; 
       magneticField[2] = e.values[2]; 
       countMagneticFieldSensor++; 
       timestampMagneticFieldSensor = e.timestamp; 
       tMagneticFieldSensor = TangoJNINative.getCurrentTimeMillisString(); 
       break; 
     } 
    } 
} 
0

может быть, это слишком поздно спросить тебя. Но есть ли шанс, что вы можете дать мне свой код, чтобы получить IMU-измерения и RGB-видео от Project-Tango. Сейчас я имею дело с этой проблемой. Tks много!

+0

Возможно, вы задали вопрос, как комментарий ниже, даже как личное сообщение .... Последнее, но не менее важное: вы могли указать @NAME :-) Хорошо в следующий раз;) –

+0

Да, у меня все еще есть это , Поскольку это было на битбакете, я поместил часть IMU в документ google, чтобы поделиться ею. Вы можете найти мой класс IMU здесь https://drive.google.com/open?id=1VxOMwSzRWssoqUwFrohPrBYOvaNdH0fCNKeirBXIIYk. Вам не нужно будет вызывать 'TangoJNINative.getCurrentTimeMillisString();' как и я, это было для измерения точности временной метки, предоставляемой API android. Надеюсь, это будет полезно :-) – Bastienm

+0

Tks много для помощи ур: D – manuntn08

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