Android 罗盘和加速度计精度

Android 罗盘和加速度计精度,android,accelerometer,compass-geolocation,sensors,Android,Accelerometer,Compass Geolocation,Sensors,我用Android开发了自己的应用程序,使用指南针和加速计传感器来显示设备的旋转度和倾斜度。我初始化了所有我需要的侦听器和对象(我遵循了一些教程),现在我可以按照我的意愿捕获这些度。问题在于传感器返回的测量值不准确。我的意思是,即使我试图对从传感器捕捉到的度数进行四舍五入,它们每分之一秒都会在-/+7(或8)度之间振荡,即使我呆在远离任何干扰源的草地上。我想要的是一个精确的度数测量,类似于一种对我从传感器接收到的值进行四舍五入的方法 float[] mags = null; fl

我用Android开发了自己的应用程序,使用指南针和加速计传感器来显示设备的旋转度和倾斜度。我初始化了所有我需要的侦听器和对象(我遵循了一些教程),现在我可以按照我的意愿捕获这些度。问题在于传感器返回的测量值不准确。我的意思是,即使我试图对从传感器捕捉到的度数进行四舍五入,它们每分之一秒都会在-/+7(或8)度之间振荡,即使我呆在远离任何干扰源的草地上。我想要的是一个精确的度数测量,类似于一种对我从传感器接收到的值进行四舍五入的方法

    float[] mags = null;
    float[] accels = null;
    float[] R = new float[matrix_size];
    float[] outR = new float[matrix_size];
    float[] I = new float[matrix_size];
    float[] values = null;

    private void startSensor() {
    sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
    sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);

}

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
        return;
    }

    switch (event.sensor.getType()) {
    case Sensor.TYPE_MAGNETIC_FIELD:
        mags = event.values.clone();
        break;
    case Sensor.TYPE_ACCELEROMETER:
        accels = event.values.clone();
        break;
    }

    if (mags != null && accels != null) {
        SensorManager.getRotationMatrix(R, I, accels, mags);
        // Correct if screen is in Landscape
        SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X,
                SensorManager.AXIS_Z, outR);

        SensorManager.getOrientation(outR, values);
        azimuth = (float) Math.round((Math.toDegrees(values[0]))*7)/7;
        azimuth = ( azimuth + 360)%360; 
        //here is inclination. The problem is just the same with compass
        //inclination=-Math.round((float) (values[1]*(360/(2*Math.PI))));

        //other code to update my view
        //in azimuth i have the degree value. It changes continuously
        //even if i aim still the same direction
    }
}

你所看到的是真实的东西——大多数手机上的方位传感器只能给你一个粗略的罗盘方位

如果您希望平滑显示的值,这样它就可以提供一些看起来不会随机更改的内容,我建议在该方向结果上用Java实现一个或其他平滑过滤器


为了获得最高的性能,您可以使用NDK编写过滤器,并使用Boost累加器库:

您看到的是真实的东西-大多数手机上的方位传感器只足以为您提供粗略的指南针航向

如果您希望平滑显示的值,这样它就可以提供一些看起来不会随机更改的内容,我建议在该方向结果上用Java实现一个或其他平滑过滤器

要获得最高性能,您可以使用NDK编写过滤器,并使用增压蓄能器库:

请参见我的答案:

在将加速计和magetometer事件值传递给
SensorManager.getRotationMatrix()
之前,我在加速计和magetometer事件值上运行此过滤器。我认为该算法的优点是不必保留大量历史值,只需保留先前的低通输出数组

该算法源于维基百科的以下条目:

请参见我的答案:

在将加速计和magetometer事件值传递给
SensorManager.getRotationMatrix()
之前,我在加速计和magetometer事件值上运行此过滤器。我认为该算法的优点是不必保留大量历史值,只需保留先前的低通输出数组


该算法是从维基百科的条目中衍生出来的:

我在这里使用了卡尔曼滤波器:

我将数据发送到udp端口,并在PC上使用python平滑数据。
但是我想你可以在那里找到java/android的卡尔曼滤波器实现。

我在这里使用卡尔曼滤波器:

我将数据发送到udp端口,并在PC上使用python平滑数据。
但是我想你可以在那里找到java/android的卡尔曼滤波实现。

那么你看了原始传感器数据,它疯狂地波动着?或者只是在你试图处理数据之后?所以你看了原始的传感器数据,它在疯狂地波动?还是仅在您尝试处理数据之后?