【问题标题】:Determining constant velocity using androids accelerometer使用 androids 加速度计确定恒定速度
【发布时间】:2015-09-18 12:49:55
【问题描述】:

我正在尝试编写一个小应用程序,它可以根据手机的速度更新屏幕。它使用加速度计计算当前速度并将其写入屏幕。问题是移动手机后速度不会回到零速度。它会稳定在速度的最高点。我正在使用 LINEAR_ACCELEROMETER

这是代码:

public class AccelerometerUpSensor extends SensorAbstract{
private ExerciseFragment fragment;
private double v0 = 0;
private float lastX;
private float lastY;
private float lastZ;
private long interval;
private long lastEvent = System.currentTimeMillis();
public AccelerometerUpSensor(SensorManager sensorManager, ExerciseFragment fragment, int[] sensorTypes){
    super(sensorManager,sensorTypes);
    this.fragment = fragment;
}
@Override
public final void onSensorChanged(SensorEvent event) {
    lastX = event.values[0];
    lastY = event.values[1];
    lastZ = event.values[2];
    long now = System.currentTimeMillis();
    interval = (now - lastEvent);
    lastEvent = now;
    double acceleration = lastX+lastY+lastZ;
    double velocity = v0 + (acceleration*(interval/(double)1000));
    v0 = velocity;
    System.out.println(velocity);
}

【问题讨论】:

    标签: java android accelerometer velocity


    【解决方案1】:
    1. com.google.android.gmsActivityRecognition,您可以在其中跟踪不同类型的移动。

    2. Accelerometer

              mGravity = event.values.clone();
      
              float x = mGravity[0];
              float y = mGravity[1];
              float z = mGravity[2];
              mAccelLast = mAccelCurrent;
              mAccelCurrent =(float) Math.sqrt(x * x + y * y + z * z);
              float delta = mAccelCurrent - mAccelLast;
              mAccel = mAccel * 0.9f + delta;
      
      
              // Make this higher or lower according to how much motion you want to detect
              if (Math.abs(mAccel) > 2) {
      

    【讨论】:

    • 2.有没有办法用这个来计算速度?我尝试将这种方法合并到我自己的代码中,然后用公式计算速度:V = V0 + AT,结果是一个稳定的上升速度,当没有运动时。
    • 使用加速度计可以获得加速度。要获得速度,您需要跟踪时间和距离......
    • 正如我对上面的代码所做的那样......我想我已经明白了。当它是 100% 时会发布答案
    • ActivityRecognition - 您的选择,它在自身内部确实需要工作。
    【解决方案2】:
    private void calculateVelocity(float x, float y, float z){
        long now = System.currentTimeMillis();
        interval = (now - lastEvent);
        if(interval > 100){
            lastEvent = now;
            double acceleration = x+y+z-lastX-lastY-lastZ;
            double velocity = v0 + (acceleration*(interval/(double)1000));
            velocities.add(Math.abs(velocity));
            v0= velocity;
            lastX = x;
            lastY = y;
            lastZ = z;
        }
    }
    

    这是我用来计算每 100 毫秒速度的代码。速度数组用于计算每秒的平均速度,您可以忽略它。该方法的输入是 event.values

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多