如何使用智能手机加速度计的样本计算距离?

时间:2015-07-09 08:10:34

标签: algorithm accelerometer physics smartphone

如果您有加速度计坐标中的样本值列表。

accel[0]= {accelX0, accelY0, accelZ0}
...
accel[t]= {accelXt, accelYt, accelZt}
...
accel[tMax] = {accelXmax, accelYmax, accelZmax}

其中t是时间戳。 如果用户朝着某个方向进行短暂而快速的移动,是否有办法了解他所采取的方向以及0和tMax之间的距离是多少? 我是否必须沿每个轴集成两次并选择最大结果? 我不需要特别的精度和准确度,只需要在现实生活中进行测试的通用值。我不会使用GPS。 我没有使用特定的语言或操作系统,我只是对算法感兴趣。

3 个答案:

答案 0 :(得分:2)

将加速度矢量积分一次将为您提供速度,第二次积分将为您提供距离(更好地使用Runge-Kutta方法或类似方法)。

如果你步行10米,停下来,顺时针转90度,再走10米,加速度计就不能说你偏航了。通过手机陀螺仪传感器的测量结果,最好用磁力计的测量值来获得传感器融合*加速度计测量所需的方向。

请注意,这些传感器非常不准确,不适合导航,结果会很快漂移。

*搜索IMU sensor fusion(惯性测量单位),6 DOF sensor fusion(不使用磁力计或使用9)。

答案 1 :(得分:1)

你必须将加速度矢量(3D)与“时间”相比进行两次整合。

对于每个测量计算:

  

速度:= acc * delta_t

     

距离:=速度* delta_t

所有距离。这样可以移动整个距离。

delta_t是两次测量之间的时间间隔。如果您的测量数据未在时间上等距采样(即不是在常规时间间隔),您可以采用“下一次测量的时间”和“先前测量的时间”的平均间隔

所有计算均以3D方式完成(即对于并行的x,y,z分量)

答案 2 :(得分:1)

您的问题的解决方案涉及两个必须处理的单独部分:

  1. 将加速度转换为距离
  2. 补偿数字加速度计的局限性。

    Acceleration to distance:这很简单 - 只需按时间整合两次:

  3. 选择一个间隔(如10ms,20ms等)并每隔一段时间从加速度计收集一次数据;这是你的DT。

  4. 做数学运算:

    示例代码:

    while(1)
    {
       start  = getTimeinMS();
    
       velocity += acceleration *DT;
       displacement += velocity *DT;
    
       stop = getTimeinMS()
    
       While (stop-start < DT)
       {
          usleep(100) 
       }
    
    }
    

    处理数字加速度计:第二部分有点棘手。你必须理解并补偿两件事:

  5. 加速度计是非常嘈杂的设备

  6. 惯性不是你的朋友;让我解释一下 - 如果你绘制加速度计输出,你会注意到从左到右的运动将是一个正弦波。左右左移也是一个正弦波。而且你没有简单的方法知道你何时停止左右移动并从右开始。我假设你不想要那个并且正在寻找左右移动的简单位移(或左右相同的逻辑)。

  7. 如果您理解并接受我到目前为止所说的内容,您只需处理加速度计噪音 - 这不是一项非常艰巨的任务,因为您可以找到有关数字滤波器的大量信息和示例。你可以从rolling average filter开始,如果需要,可以在以后更实用。

    希望这有帮助。