使用加速器传感器android获取方向

时间:2014-06-19 06:51:08

标签: android sensor android-sensors

我正在尝试制作一个简单的Android应用程序,当从右到左移动Android设备或将Android设备从Top移动到Button时,此应用程序将获得Direction。仅在2d的运动,例如桌面或棋盘上的Android设备。例如,当从左到右移动时,左值外壳为真,右边值为假,所以

onCreate方法代码

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

    tvLeft= (TextView) findViewById(R.id.textViewLeft);
    tvRight= (TextView) findViewById(R.id.textViewRight);
    tvTop= (TextView) findViewById(R.id.textViewTop);
    tvButton= (TextView) findViewById(R.id.textViewBoutton);
}

onSensorChanged方法代码

public void onSensorChanged(SensorEvent event) {
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];

        long curTime = System.currentTimeMillis();

        if ((curTime - lastUpdate) > 100) {
            lastUpdate = curTime;

            float diffX=last_x-x;
            float diffY=last_y-y;


            Log.d("Mhd",Float.toString(diffX)+" X Diff");
            Log.d("Mhd",Float.toString(diffY)+" y Diff");



            diffX = Float.parseFloat(String.format("%1$,.1f", diffX));
            diffY = Float.parseFloat(String.format("%1$,.1f", diffY));

            if(x>last_x && Math.abs(diffX) > 0.1){

                tvLeft.setText("T");
                tvRight.setText("F");
            }else if(x<last_x && Math.abs(diffX) > 0.1){

                tvRight.setText("T");
                tvLeft.setText("F");
            }

            if(y>last_y && Math.abs(diffY) > 0.1){
                tvTop.setText("T");
                tvButton.setText("F");

            }else if(y<last_y && Math.abs(diffY) > 0.1)

                tvButton.setText("T");
                tvTop.setText("F");
            }
            last_x = x;
            last_y = y;
            last_z = z;
        }
}

最后程序没有给出错误 但生成的数据不是真的,当Android设备稳定数据时 生成。

请改进我的代码。

1 个答案:

答案 0 :(得分:3)

您需要考虑加速度计的含义及其作用。它基本上是一个力计。它检测设备上的力,并测量它。它总是告诉你当前的力水平(由于重力,它实际上永远不会是0,除非你在外太空)。它不检测运动。它仅在移动时不返回值。它每次询问时都会返回值,SENSOR_DELAY_NORMAL表示每隔几百毫秒。

数据永远不会100%正确。数据总是有噪音,因为所有物理传感器都有。来自旧力量的混响,由于人们在房间里走动而产生的温和力量,你的桌子不是100%稳定 - 传感器将拾取所有这些微小的变化。每次都会有一些错误,因为它们只是如此准确。你只需要寻找大的变化,如果你正在寻找非常小的变化,你需要比手机更好的硬件。

最后,它捕获的力量不是运动。这意味着如果您要以恒定速度移动设备,则不会检测到任何变化 - 恒定速度的物体没有施加力。它只能捕捉速度加速度和减速度的变化。你需要寻找这些,而不是假设一个改变意味着它的移动。例如,向左移动设备会看到向左加速,然后是0加速,然后在停止时向右加速(实际上是减速),然后什么都没有。

您需要重新设计整个方法。您需要更高,更高的噪声阈值,并且您需要查找加速度和减速度以确定它是否在移动,否则您的减速将看起来像是在错误的方向上移动。它比你在这里复杂得多。