如何使用加速度计获得运动方向?

时间:2012-05-07 04:26:09

标签: android physics accelerometer direction

我正在开发一个Android应用程序,我想知道是否可以通过固定一个轴来检测移动方向。例如,我想把手机放在桌子上并在我移动它时检测方向(左,右,上和下)。距离没有必要,我只想知道准确的方向。

2 个答案:

答案 0 :(得分:23)

是。

使用SensorEventListener.onSensorChanged(SensorEvent event),您可以确定沿X&提供的值。 Y轴。您需要记录这些值,然后将它们与后续调用onSensorChanged方法时获得的任何新值进行比较,以获得delta值。如果一个轴上的增量值为正,则设备向一个方向移动,如果其为负,则其向相反方向移动。

您可能需要微调接收加速度计事件的速率和您考虑增量值的阈值,以指示方向的变化。

以下是我所说的快速代码示例:

public class AccelerometerExample extends Activity implements SensorEventListener {
    TextView textView;
    StringBuilder builder = new StringBuilder();

    float [] history = new float[2];
    String [] direction = {"NONE","NONE"};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
        setContentView(textView);

        SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
        manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        float xChange = history[0] - event.values[0];
        float yChange = history[1] - event.values[1];

        history[0] = event.values[0];
        history[1] = event.values[1];

        if (xChange > 2){
          direction[0] = "LEFT";
        }
        else if (xChange < -2){
          direction[0] = "RIGHT";
        }

        if (yChange > 2){
          direction[1] = "DOWN";
        }
        else if (yChange < -2){
          direction[1] = "UP";
        }

        builder.setLength(0);
        builder.append("x: ");
        builder.append(direction[0]);
        builder.append(" y: ");
        builder.append(direction[1]);

        textView.setText(builder.toString());
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // nothing to do here
    }
}

此代码仅为您提供手机移入的X和Y轴的大致方向。为了提供更细粒度的方向确定(例如,尝试模仿计算机鼠标的移动),您可能会发现手机的加速度计不适合用途。

为了尝试这一点,我首先将传感器延迟设置为SensorManager.SENSOR_DELAY_FAST并创建一个包含多个历史事件的列表,以便我可以检测到一段时间内的移动,而不会受到经常发生的相反方向的轻微移动的影响当在如此精细的水平上进行加速度计测量时。您还需要测量已经过去的时间量,以帮助计算评论中建议的准确移动度量。

答案 1 :(得分:0)

据我所知,使用传感器,人们只能检测到加速度和手机方向。因此,您可以轻松检测到运动的开始(以及在哪个方向上)和运动的停止,因为速度正在变化,因此存在加速度(当停止加速度与速度方向相反时)。

如果手机以恒定速度移动,加速度计将给出零值(线性加速度减去重力)。因此,为了知道手机是否在移动,您应该通过

计算每个瞬间的速度
V(t)=V(t0)+a*dt

其中:

  • V(t0)是前一时刻的已知速度,
  • V(t)是当前瞬间的速度,
  • a是加速度(考虑前一瞬间的加速度或 在前一瞬间和当前瞬间之间的平均加速度。)

问题在于,由于传感器值的不确定性,您可能最终会在每个瞬间对小误差求和,这将导致错误的速度值。可能你必须将低通滤波器调整为值。