Прочитайте x y z координаты телефона android с помощью акселерометра - программирование
Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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-пространстве, имейте в виду, что предполагается, что телефон неподвижен, когда начинает отсчет.

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

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

Ответ 2

Прочитайте этот учебник.

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

сначала получите экземпляр 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];
}