我正在尝试计算房间中 Android 手机的大致位置。我尝试了不同的方法,例如定位(在室内非常糟糕)和陀螺仪+指南针。我只需要知道步行5-10秒后的大致位置,所以我认为线性加速度的积分就足够了。我知道由于错误的传播,错误很可怕,但它可能会在我的设置中起作用。我只需要大致位置即可将相机对准 Android 手机。
我对双重积分进行了编码,但我做错了。如果手机在桌子上是静止的,则位置 (x,y,z) 总是不断增加。问题是什么?
static final float NS2S = 1.0f / 1000000000.0f;
float[] last_values = null;
float[] velocity = null;
float[] position = null;
float[] acceleration = null;
long last_timestamp = 0;
SensorManager mSensorManager;
Sensor mAccelerometer;
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_LINEAR_ACCELERATION)
return;
if(last_values != null){
float dt = (event.timestamp - last_timestamp) * NS2S;
acceleration[0]=(float) event.values[0] - (float) 0.0188;
acceleration[1]=(float) event.values[1] - (float) 0.00217;
acceleration[2]=(float) event.values[2] + (float) 0.01857;
for(int index = 0; index < 3;++index){
velocity[index] += (acceleration[index] + last_values[index])/2 * dt;
position[index] += velocity[index] * dt;
}
}
else{
last_values = new float[3];
acceleration = 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(acceleration, 0, last_values, 0, 3);
last_timestamp = event.timestamp;
}
这些是我在手机放在桌子上时得到的位置(没有动作)。(x,y,z) 值在增加,但手机还在。
这些是计算每个轴的移动平均值并从每个测量值中减去后的位置。电话也还在。
如何改进代码或其他方法以获取房间内的大致位置?