【问题标题】:getOrientation to detect turning around x-axis; getRotationMatrix returning all zerosgetOrientation 检测绕 x 轴转动; getRotationMatrix 返回全零
【发布时间】:2015-03-10 02:11:34
【问题描述】:

我正在使用 getOrientation (R, I, Gravity, magVals) 来检测绕 x 轴转动。现在我只是想在屏幕上显示 x 值读数,但该值始终为零,我不知道为什么。

编辑:经过更多调查,我发现 getRotationMatrix 总是返回全零。加速度计和磁场参数很好。我仍然不知道为什么。

编辑:我添加了 ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION 权限,结果还是一样。 请注意,我还检查了过去所有可以找到的涉及 getRotationMatrix 问题的问题,但没有解决我的问题。

我的实现方法:
1. 添加加速度计和磁场监听器
2. 每次发生加速度计/磁场事件时调用 getRotationMatrix
3. 将旋转矩阵传递给 getOrientation 调用(也可以在事件发生时调用)

这是我的片段中处理方向的 onCreateView 部分:

        TextView xRotation = new TextView(rootView.getContext());

        //Magnetic Sensor
        Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        SensorEventListener magneticSel = new OtherSensorEventListener (xRotation);
        sensorManager.registerListener(magneticSel, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);

        //Accelerometer
        Sensor accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        SensorEventListener accelSel = new OtherSensorEventListener(xRotation);
        sensorManager.registerListener(accelSel, accelSensor, SensorManager.SENSOR_DELAY_NORMAL);

        layout.addView(xRotation);
        layout.setOrientation(LinearLayout.VERTICAL);
        return rootView;

这是 OtherSensorEventListener() 类:

    public static class OtherSensorEventListener implements SensorEventListener {

    float [] magVals = new float[3];
    float [] accelVals = new float [3];
    float [] RMatrix;
    TextView output;

    public OtherSensorEventListener(TextView output) {
        this.output = output;
    }


    @Override
    public void onSensorChanged(SensorEvent event) {            
        switch(event.sensor.getType()) {

        case Sensor.TYPE_MAGNETIC_FIELD:
            magVals = event.values.clone();
            break;
        case Sensor.TYPE_ACCELEROMETER:
            accelVals = event.values.clone();
            break;
        default:
            break;
        }

        if (accelVals != null && magVals != null) {

            RMatrix = new float[16];

            SensorManager.getRotationMatrix(RMatrix, null, accelVals, magVals);
            SensorManager.getOrientation(RMatrix, orientation);
            output.setText("X Rotation: " + orientation[1]);

        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}

这些是方向全局变量(在 MainActivity 中声明):

    static float [] orientation = new float[3];

我是 Android 新手。我不知道是否有比 getOrientation 更好的方法来做到这一点,但我必须将它用作我实验室的一部分。注意:我不是要你帮我做我的实验,我只是需要调试方面的帮助

【问题讨论】:

    标签: java android android-sensors


    【解决方案1】:

    你传入了两个不同的监听器

    new OtherSensorEventListener (xRotation);
    

    因此参数accelValsmagVals 中的任何一个始终是零数组,因此getOrientation 始终返回0

    试试

    SensorEventListener sensorEventListener = new OtherSensorEventListener (xRotation);
    sensorManager.registerListener(sensorEventListener, magneticSensor, SensorManager.SENSOR_DELAY_NORMAL);
    sensorManager.registerListener(sensorEventListener, accelSensor, SensorManager.SENSOR_DELAY_NORMAL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2011-02-27
      • 2017-09-03
      • 1970-01-01
      • 2021-07-12
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多