我将开发需要在 3D 空间上读取手机的 x,y,z 坐标的Android 应用程序。
我想写一个简单的代码并在设备上测试..
我在设备和模拟器上都使用姜饼。
我将开发需要在 3D 空间上读取手机的 x,y,z 坐标的Android 应用程序。
我想写一个简单的代码并在设备上测试..
我在设备和模拟器上都使用姜饼。
要从加速度中获取位置,您需要对其进行两次积分。
积分加速度为您提供速度,积分速度为您提供位置。
请记住,集成噪声会产生漂移,而集成漂移会产生大量漂移,Android 传感器往往会产生大量噪声。
在我的 Galaxy S3 上,我已经能够使用 Google 的线性加速度计复合传感器在 5 秒内将位置漂移降低到 0.02 m。
我不确定您是否可以在姜饼上使用线性加速度计传感器。如果不能,则必须在积分之前消除重力。
如果您还没有,请在此处阅读所有内容 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 空间中的位置,请记住它假定手机在开始采样时是静止的。
如果你不消除重力,它很快就会很远。
这根本不会过滤数据,并且会产生很多漂移。
阅读本教程。
上面给出的教程的简要总结::
首先获取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];
}