2

我想要计算一个房间中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)值正在增加,但手机仍然存在。 enter image description here

这些是计算每个轴的移动平均值和每个测量值的减去后的位置。手机也是。 enter image description here

任何有关如何改进代码或其他方法来获得房间内大致位置的建议都是受欢迎的。

回答

4

加速计中存在不可避免的测量误差。这些是由表中的微小振动,制造过程中的缺陷等引起的。随着时间的推移累积这些误差导致Random Walk。这就是定位系统只能使用加速度计作为定位辅助的原因。他们仍然需要某种形式的航位推算法,例如GPS(这在门内不能很好地工作)。

目前室内定位系统的研究有很多。对可利用现有基础设施的系统进行研究的一些领域是WiFi和LED照明定位。目前还没有明显的解决方案,但我相信我们需要专门的解决方案来实现准确可靠的室内定位。

你说这个位置一直在增加。你的意思是说,即使经过多次重置,x,y和z分量才会变为正值。或者你的意思是这个位置从零开始偏离?

如果您输出原始加速度测量值时手机仍然应该看到测量误差。将一堆这些测量结果放入Excel电子表格中。计算均值和标准差。所有轴的平均值应为零。如果没有,可以使用简单的平均过滤器在代码中删除偏差(计算运行平均值并从每个结果中减去)。标准偏差将告诉您在N个时间步后,每个轴可能有多少漂移,如standard_deviation * sqrt(N)。这应该有助于以数学方式确定作为时间函数(或N个时间步长)的预期精度。

+0

这个位置一直在增加。我在Matlab上绘制了测量值,平均值不为零。看起来有一个偏差,不断增加每个位置的价值。我可以尝试用平均过滤器删除它,但我想知道是否由于我的代码错误或累积错误。您是否有任何关于基于加速度和/或滤波(平均滤波器或其他类型)的定位的良好参考? – nabrugir

+0

如果你正在打印event.values [index]的输出,那么你的代码如何导致偏见?在原始加速计测量中偏差也是正常的。我想不出有什么参考资料不会让你知道你不需要的细节。假设偏差在您的应用程序的整个生命周期中都是固定的,但不同于手机和手机。只需计算每个轴的[移动平均数](https://en.wikipedia.org/wiki/Moving_average),然后从测量结果中减去。 –

+0

如果您担心在应用程序的一次运行过程中偏差会改变,您可以使用[指数移动平均数](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average)。选择一个介于0和1之间的alpha值。alpha的较大值意味着您的过滤器将更快地适应平均值的变化,但更容易受到噪音的影响。也许你可以在matlab中玩一些情节。如果你真的对滤波器理论感兴趣,我会从里昂理解数字信号处理开始。 –

2

布赖恩是对的,已经部署了室内定位系统,可以在几乎任何房间内找到基础设施。 已被证明是最可靠的解决方案之一是WiFi指纹识别。我建议你看看indoo.rs - www.indoo.rs - 他们是这个行业的先驱,并且已经有一个非常发达的系统。

0

这可能不是最优雅或可靠的解决方案,但在我的情况下,它的目的。

注意在我的情况,我抓住了用户之前的位置,甚至可以进入需要室内定位的活动..而我只关心的是多少,他们已经移出了一个粗略的估计。

我有一个传感器管理器,基于设备方向创建旋转矩阵。 (使用Sensor.TYPE_ROTATION_VECTOR)这显然不会给我前进,后退或左右移动,而只是设备方向。在设备方向上,我很好地了解了用户的方位角度(他们面对的方向),并使用KitKat 4.4中提供的Sensor_Step_Detector,我假设用户正面对的方向是1米。

同样,我知道这是不是充分证明还是很准确的,但根据你的目的,这也可能是一个简单的解决方案..

每次检测到步我基本上调用这个函数:

public void computeNewLocationByStep() { 
     Location newLocal = new Location(""); 
     double vAngle = getBearingInDegrees(); // returns my users bearing 
     double vDistance = 1/g.kEarthRadiusInMeters; //kEarthRadiusInMeters = 6353000; 
     vAngle = Math.toRadians(vAngle); 

     double vLat1 = Math.toRadians(_location.getLatitude()); 
     double vLng1 = Math.toRadians(_location.getLongitude()); 

     double vNewLat = Math.asin(Math.sin(vLat1) * Math.cos(vDistance) + 
         Math.cos(vLat1) * Math.sin(vDistance) * Math.cos(vAngle)); 

     double vNewLng = vLng1 + Math.atan2(Math.sin(vAngle) * Math.sin(vDistance) * Math.cos(vLat1), 
           Math.cos(vDistance) - Math.sin(vLat1) * Math.sin(vNewLat)); 



     newLocal.setLatitude(Math.toDegrees(vNewLat)); 
     newLocal.setLongitude(Math.toDegrees(vNewLng)); 

     stepCount =0; 
     _location = newLocal; 

    }