我想要计算一个房间中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)值正在增加,但手机仍然存在。
这些是计算每个轴的移动平均值和每个测量值的减去后的位置。手机也是。
任何有关如何改进代码或其他方法来获得房间内大致位置的建议都是受欢迎的。
这个位置一直在增加。我在Matlab上绘制了测量值,平均值不为零。看起来有一个偏差,不断增加每个位置的价值。我可以尝试用平均过滤器删除它,但我想知道是否由于我的代码错误或累积错误。您是否有任何关于基于加速度和/或滤波(平均滤波器或其他类型)的定位的良好参考? – nabrugir
如果你正在打印event.values [index]的输出,那么你的代码如何导致偏见?在原始加速计测量中偏差也是正常的。我想不出有什么参考资料不会让你知道你不需要的细节。假设偏差在您的应用程序的整个生命周期中都是固定的,但不同于手机和手机。只需计算每个轴的[移动平均数](https://en.wikipedia.org/wiki/Moving_average),然后从测量结果中减去。 –
如果您担心在应用程序的一次运行过程中偏差会改变,您可以使用[指数移动平均数](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average)。选择一个介于0和1之间的alpha值。alpha的较大值意味着您的过滤器将更快地适应平均值的变化,但更容易受到噪音的影响。也许你可以在matlab中玩一些情节。如果你真的对滤波器理论感兴趣,我会从里昂理解数字信号处理开始。 –