解决方案 »

  1.   

    实际上 姿态传感器 Sensor.TYPE_ORIENTATION 的值并非为直接的 与水平面的夹角 所以不能直接这样使用三角函数计算重力加速度在Android文档中 建议使用高通滤波来除去的重力的影响It should be apparent that in order to measure the real acceleration of the device, the contribution of the force of gravity must be eliminated. This can be achieved by applying a high-pass filter. Conversely, a low-pass filter can be used to isolate the force of gravity.
    很明显,为了测量设备的实际加速度,必须消除重力的影响。这可以用过高通滤波器来实现。相反的,低通滤波器和一用来分离重力。
    相应的代码如下:
     public void onSensorChanged(SensorEvent event)
         {
              // alpha is calculated as t / (t + dT)
              // with t, the low-pass filter's time-constant
              // and dT, the event delivery rate          final float alpha = 0.8;          gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
              gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
              gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];          linear_acceleration[0] = event.values[0] - gravity[0];
              linear_acceleration[1] = event.values[1] - gravity[1];
              linear_acceleration[2] = event.values[2] - gravity[2];
         }
      

  2.   


    多谢前辈,再请问这个gravity[0]是指由gravity传感器收集到的数据吗?
      

  3.   

    我把您写的linear_acceleration认为是实际的加速度,另外,对于高通滤波器的不太理解;没有这个硬件,希望能够有某个算法,然后直接将收集到的数据分析得出实际加速度.请问这样可行吗?
      

  4.   

    这里的滤波器不是一个设备 整个算法是低通滤波的实现 
    所谓低通滤波 是指只有低频信号可以通过的装置或者处理过程
    因为重力只有在设备旋转的时候会发生变化 因此一定是低频信号
    通过对传感器三轴的测量值进行低通滤波 可以获得重力在各个轴上的分量
    然后再在三轴测量值上减去重力的分量 即可获得设备实际的加速度值alpha是滤波参数 可以根据需要进行更改
    event.values 是传感器收集到数据
    gravity 是重力加速度在三轴上的分量
    linear_acceleration 是三轴线性加速度
      

  5.   

    点错了评价,sorry.手机在静止的时候加速度的值一直在发生变化,要怎么样才可以更精确呢?这里的滤波器不是一个设备 整个算法是低通滤波的实现 
    所谓低通滤波 是指只有低频信号可以通过的装置或者处理过程
    因为重力只有在设备旋转的时候会发生变化 因此一定是低频信号
    通过对传感器三轴的测量值进行低通滤波 可以获得重力在各个轴上的分量
    然后再在三轴测量值上减去重力的分量 即可获得设备实际的加速度值alpha是滤波参数 可以根据需要进行更改
    event.values 是传感器收集到数据
    gravity 是重力加速度在三轴上的分量
    linear_acceleration 是三轴线性加速度
      

  6.   

    谢谢,对于这个可以控制,XYZ三个值的加速度,要计算位移的话,我要取哪一个值呢?你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应
    这个阈值应该会比较小才对
      

  7.   

    你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应
    这个阈值应该会比较小才对
    如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了
    如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和
      

  8.   

    是说取出x y轴各自的位移,去求他们的向量和吗?
    你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应
    这个阈值应该会比较小才对
    如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了
    如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和
      

  9.   

    你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应
    这个阈值应该会比较小才对
    如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了
    如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和还有一个问题,我在debug的时候,一开始Z轴的加速度很大,将近10,受重力加速度的影响。这个怎么解决呢
      

  10.   

    大神,求助 
     // 用低通滤波器分离出重力加速度
      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];gravity 是重力加速度在三轴上的分量
    linear_acceleration 是三轴线性加速度gravity怎样求出来?
      

  11.   


    多谢前辈,再请问这个gravity[0]是指由gravity传感器收集到的数据吗?请问这样算下来,gravity永远等于event.values,那这样获得的加速度岂不是永远等于0