1

我在 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
    }
}
4

3 回答 3

1

在这里查看我的答案:平滑来自传感器的数据

在将加速度计和磁力计事件值传递给SensorManager.getRotationMatrix(). 我认为这种算法的优点是不必保留大量历史值,只需保留先前的低通输出数组。

该算法源自此 Wikipedia 条目:http ://en.wikipedia.org/wiki/Low-pass_filter#Algorithmic_implementation

于 2011-08-24T12:24:48.683 回答
0

我从这里使用卡尔曼滤波器做到了这一点: Greg Czerniak's Website

我正在将数据发送到 udp 端口​​并使用 python 在 PC 上对其进行平滑处理。但我想你可以在那里找到适用于 java/android 的卡尔曼滤波器实现。

于 2012-10-22T13:40:58.647 回答
0

你看到的是真实的东西——大多数手机上的方向传感器只能给你一个粗略的指南针方向。

如果您想平滑显示的值,以便它给您一些似乎不会随机变化的东西,我建议在该方向结果上实现http://en.wikipedia.org/wiki/Moving_average或 Java 中的其他平滑过滤器。

为了获得最高性能,您可以使用 NDK 编写过滤器并使用 Boost Accumulators 库: http: //www.boost.org/doc/libs/1_46_1/doc/html/accumulators.html

于 2011-06-28T20:14:20.580 回答