Прочитайте координаты xyz телефона android с помощью акселерометра

Я собираюсь разработать приложение для Android, которое должно читать координаты x, y, z телефона на трехмерном пространстве .

Я хотел бы написать простой код и тест на устройстве.

Я использую имбирный хлеб как на устройстве, так и на эмуляторе.

Solutions Collecting From Web of "Прочитайте координаты xyz телефона android с помощью акселерометра"

Чтобы получить позицию от ускорения, вам нужно интегрировать ее дважды.

Интеграция ускорения дает вам скорость и интегрирование скорости дает вам положение.

Имейте в виду, что интеграция шума создает дрейф и интегрирование дрейфа создает много дрейфа, а андроидные датчики, как правило, генерируют довольно много шума.

На моей Galaxy S3 я смог получить дрейф в позиции до 0,02 м за 5 секунд с помощью композитного датчика линейного акселерометра компании Google.

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

Если вы еще этого не сделали, прочитайте все здесь http://developer.android.com/guide/topics/sensors/sensors_motion.html

Отличный разговор о датчиках движения в андроиде

http://www.youtube.com/watch?v=C7JQ7Rpwn2k

Код:

static final float NS2S = 1.0f / 1000000000.0f; float[] last_values = null; float[] velocity = null; float[] position = null; long last_timestamp = 0; @Override public void onSensorChanged(SensorEvent event) { if(last_values != null){ float dt = (event.timestamp - last_timestamp) * NS2S; for(int index = 0; index < 3;++index){ velocity[index] += (event.values[index] + last_values[index])/2 * dt; position[index] += velocity[index] * dt; } } else{ last_values = new float[3]; velocity = new float[3]; position = new float[3]; velocity[0] = velocity[1] = velocity[2] = 0f; position[0] = position[1] = position[2] = 0f; } System.arraycopy(event.values, 0, last_values, 0, 3); last_timestamp = event.timestamp; } 

Теперь у вас есть позиция в 3D-пространстве, имейте в виду, что предполагается, что телефон неподвижен, когда начинает отсчет.

Если вы не устраните гравитацию, это скоро будет очень далеко.

Это не фильтрует данные вообще и будет генерировать много дрейфа.

Прочтите этот урок .

Краткое изложение приведенного выше учебника ::

Сначала получите экземпляр SensorManager и Sensor .
Внутри onCreate() ::

 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

После этого переопределите onSensorChanged(SensorEvent event) и используйте event.values[] чтобы получить координаты.

 @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; }