Android SensorManager.getRotationMatrix生成错误的值
我正在构建一个android应用程序,它将gps坐标的位置显示为相机图片画布上的点,但我在计算可以看到gps坐标的2d点(在手机屏幕上)时遇到了问题 据我所知,投影的工作原理是将相机矩阵与应该投影的点相乘。相机矩阵可以通过乘以固有矩阵得到(我使用这个问题的选择答案计算焦距:;我手机的屏幕分辨率是1920x1080,540=1080/2,960=1920/2) 使用外部矩阵(本质上是旋转矩阵,因为我将相机设置为原点0 | 0 | 0) 我已经计算了相机相对于gps坐标的相对位置(在东北向上的坐标中),即13 |-4 | 2Android SensorManager.getRotationMatrix生成错误的值,android,math,matrix,projection,Android,Math,Matrix,Projection,我正在构建一个android应用程序,它将gps坐标的位置显示为相机图片画布上的点,但我在计算可以看到gps坐标的2d点(在手机屏幕上)时遇到了问题 据我所知,投影的工作原理是将相机矩阵与应该投影的点相乘。相机矩阵可以通过乘以固有矩阵得到(我使用这个问题的选择答案计算焦距:;我手机的屏幕分辨率是1920x1080,540=1080/2,960=1920/2) 使用外部矩阵(本质上是旋转矩阵,因为我将相机设置为原点0 | 0 | 0) 我已经计算了相机相对于gps坐标的相对位置(在东北向上的坐标中
为了检查它是否工作,我旋转手机,使屏幕左上角可以看到位置(我在那里放了一盏灯),并写下旋转矩阵。然后我对右上角、右下角、左下角和中间重复了这个过程。旋转矩阵为:
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;
}
()根据SensorManager。如果设备正在加速,getRotationMatrix可能返回不准确的值。在我的测试中,情况并非如此,但这意味着我无法使用此方法获得旋转矩阵
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;
}