Read x y z coordinates of android phone using accelerometer

你说的曾经没有我的故事 提交于 2019-11-27 10:58:20

问题


I am going to develop Android application which needs to read x,y,z coordinates of phone on 3D space.

I would like to write a simple code and test on the device..

I am using ginger bread on both the device and emulator.


回答1:


To get position from acceleration you need to integrate it twice.

Integrating acceleration gives you velocity and integrating the velocity gives you the position.

Keep in mind that integrating noise creates drift and integrating drift creates A LOT of drift, the android sensors tend to generate quite a lot of noise.

On my Galaxy S3 I have been able to get the drift in position down to 0.02 m in 5 seconds using Google's Linear Accelerometer composite sensor.

I am not sure if you can use the linear accelerometer sensor on gingerbread. If you can't you will have to remove the gravity before integrating.

If you haven't already, read everything here http://developer.android.com/guide/topics/sensors/sensors_motion.html

A great talk about the motion sensors in android

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

Code:

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;
}

Now you have the position in 3d space, keep in mind it assumes that the phone is stationary when it starts sampling.

If you don't remove gravity it will soon be very far away.

This doesn't filter the data at all and will generate a lot of drift.




回答2:


Read this tutorial.

brief summary of the above given tutorial ::

first get an instance of SensorManager and Sensor.
Inside onCreate() ::

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

after this, override onSensorChanged(SensorEvent event) and use event.values[] to get the co-ordinates.

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


来源:https://stackoverflow.com/questions/11068671/read-x-y-z-coordinates-of-android-phone-using-accelerometer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!