【问题标题】:Android SensorManager.getRotationMatrix yields wrong valuesAndroid SensorManager.getRotationMatrix 产生错误的值
【发布时间】:2017-01-02 11:38:11
【问题描述】:

我正在构建一个 android 应用程序,它将 gps 坐标的位置显示为相机图片上画布上的点,但我无法确定 gps 坐标可以通过的 2d 点(在手机屏幕上)可见。

据我所知,投影是通过将相机矩阵与应投影的点相乘来实现的。相机矩阵可以通过乘以内在矩阵得到(我使用这个问题的选择答案计算焦距:Converting Focal Length in millimeters to pixels - Android;我手机的屏幕分辨率是1920x1080, 540 = 1080/2, 960 = 1920/2)

/ 935    0  540 \
|   0  935  960 |
\   0    0    1 /

使用外部矩阵(本质上是旋转矩阵,因为我将相机设置为原点 0|0|0)。

我已经计算出相机与 gps 坐标(在东北上坐标中)的相对位置,即 13|-4|2。


为了检查它是否正常工作,我旋转了手机,使屏幕左上角可以看到位置(我在那里放了一盏灯)并记下旋转矩阵。然后我对右上、右下、左下和中心重复了这个过程。旋转矩阵是:

Upper left:
    -0.17288628   0.77568847  -0.6069743
     0.19706762   0.6310352    0.75030595
     0.9650258    0.010102619 -0.2619604

Upper right:
     0.16115496   0.65267444   -0.7403008
    -0.13548408   0.75763404    0.6384627
     0.9775853   -0.0025924728  0.21052347

Lower right:
     0.18777268  -0.31702965  -0.9296416
     0.04068178   0.9481752   -0.31513295
     0.9813697    0.021353884  0.19093873

Lower left:
    -0.25916395   -0.19289172  -0.94637567
    -0.033540796   0.9810605   -0.19077612
     0.96525085   -0.017700095 -0.26072523

Center:
    -0.003970425   0.33063367  -0.94375074
    -0.011958062   0.94367504   0.33065745
     0.99992067    0.01259828   0.000206947

使用上面的旋转矩阵投影坐标 (13|-4|2) 给了我这些坐标:

Upper left:   27 | 1069
Upper right: 397 |  698
Lower right: 682 |  673
Lower left:  203 |  586
Center:      308 |  711

由于多种原因,这没有意义。一个例子是右上和左下不应该(大致)具有相同的 Y 坐标。 点 (13|-4|2) 是正确的,因此我认为要么旋转矩阵错误,要么我误解了它们。

任何帮助表示赞赏!提前致谢。


我使用以下代码检索了旋转矩阵:

private SensorManager sensorManager;
private Sensor accelerometer;
private Sensor magnetometer;
private float[] gravityValues = new float[3];
private float[] geomagneticValues = new float[3];
private float[] rotationMatrix = new float[16];

/* constructor */ {
    sensorManager = (SensorManager) activity.getSystemService(SENSOR_SERVICE);
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

    sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    sensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
public void onSensorChanged(SensorEvent event) {
    switch (event.sensor.getType()) {
        case Sensor.TYPE_ACCELEROMETER:
            gravityValues = Arrays.copyOf(event.values, event.values.length);
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomagneticValues = Arrays.copyOf(event.values, event.values.length);
        default:
            break;
    }

    SensorManager.getRotationMatrix(rotationMatrix, null, gravityValues, geomagneticValues);
}

public float[] getRotationMatrix() {
    return rotationMatrix;
}

(https://developer.android.com/reference/android/hardware/SensorManager.html#getRotationMatrix(float[],%20float[],%20float[],%20float[]))

【问题讨论】:

    标签: android math matrix projection


    【解决方案1】:

    根据Android sensor: getRotationMatrix() returns wrong values, why? SensorManager.getRotationMatrix 如果设备正在加速,可能会返回不准确的值。在我的测试中不是这样,但这意味着我不能使用这种方法来获取我的旋转矩阵。

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2015-07-17
      • 2021-06-01
      • 2017-07-28
      相关资源
      最近更新 更多