【问题标题】:Kalman implementation卡尔曼实现
【发布时间】:2015-04-15 19:18:33
【问题描述】:

也许我的问题看起来很愚蠢,但我是 Android 编码的新手。我有一个陀螺仪的代码,如果我将手机转动 60 度,它就会振动。因此,如果我将手机转动超过 -30 度和 +30 度,手机就会振动。但是我有噪音问题,我的传感器不能正常工作,如果我快速移动手机,即使没有完成 +-30 度的限制,手机也会振动。

下面是我的代码,如果有人可以帮助我,如何在该代码中实现卡尔曼滤波器?
我是否必须添加一些新类并以某种方式调用它?我会很感激举个例子,如果有人有的话。

public class AccessGyroscope extends Activity implements SensorEventListener
{

    private TextView tv;
    //the Sensor Manager
    private SensorManager sManager;

    private float valueX, valueY, valueZ;

    public Vibrator v;

    private float vibrateThreshold = 0;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //get the TextView from the layout file
        tv = (TextView) findViewById(R.id.tv);

        //get a hook to the sensor service
        sManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        vibrateThreshold = 30;

        //initialize vibration
        v = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
    }

    //when this Activity starts
    @Override
    protected void onResume() 
    {
        super.onResume();
        /*register the sensor listener to listen to the gyroscope sensor, use the 
         * callbacks defined in this class, and gather the sensor information as  
         * quick as possible*/
        sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);
    }

    //When this Activity isn't visible anymore
    @Override
    protected void onStop() 
    {
        //unregister the sensor listener
        sManager.unregisterListener(this);
        super.onStop();
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) 
    {
        //Do nothing
    }

    @Override
    public void onSensorChanged(SensorEvent event) 
    {
        //if sensor is unreliable, return void
        if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        {
            return;
        }

        valueX = event.values[2];
        valueY = event.values[1];
        valueZ = event.values[0];


        //else it will output the Roll, Pitch and Yawn values
        tv.setText("Orientation X (Roll) :"+ Float.toString(valueX) +"\n"+
                   "Orientation Y (Pitch) :"+ Float.toString(valueY) +"\n"+
                   "Orientation Z (Yaw) :"+ Float.toString(valueZ));



        vibrate(); //here I'm calling vibration calculation


    }

    public void vibrate(){
        if(valueX > vibrateThreshold || valueX < -vibrateThreshold){
            v.vibrate(50);
        }
    }
}

【问题讨论】:

    标签: android implementation kalman-filter


    【解决方案1】:

    我会使用一个免费的过滤器将加速度和磁传感器与陀螺仪融合在一起,以帮助改进您的测量。对于您想要完成的任务,卡尔曼滤波器可能是多余的。陀螺仪测量的质量在很大程度上取决于特定设备,但一般来说,陀螺仪对大量快速运动或振动的反应不佳。

    This project 演示了如何完成互补的过滤器传感器融合。在大多数情况下,它将显着提高测量的可靠性。具体来说,您需要 FusedGyroscopeSensor 类。您可以通过几行代码修改项目来满足您的要求。

    【讨论】:

      【解决方案2】:

      如果您需要一个工作示例,您可以查看来自 google cardboard api 的 Kalman-Filter。卡尔曼滤波器由 HeadTracker 类使用,CardboardView 类使用:

      https://github.com/raasun/cardboard/blob/master/src/com/google/vrtoolkit/cardboard/sensors/internal/OrientationEKF.java

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多