gpt4 book ai didi

rotation - 使用getRotationMatrix()和getOrientation()查找方向

转载 作者:行者123 更新时间:2023-12-04 03:40:58 36 4
gpt4 key购买 nike

我试图获得指向摄像机的矢量相对于磁北的方向。我的印象是我需要使用从getOrientation()返回的值,但是我不确定它们代表什么。我从getOrientation()得到的值不预测的地改变当我改变了电话的朝向(旋转90度,不被改变90度的值)。我需要知道getOrientation()返回的值是什么意思。我到目前为止所写的内容如下:

package com.example.orientation;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;

public class Orientation extends Activity{

private SensorManager mSM;
private mSensorEventListener mSEL;

float[] inR = new float[16];
float[] outR= new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];

final float pi = (float) Math.PI;
final float rad2deg = 180/pi;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mSM = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSEL = new mSensorEventListener();

mSM.registerListener(mSEL,
mSM.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);

mSM.registerListener(mSEL,
mSM.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_NORMAL);

}



private class mSensorEventListener implements SensorEventListener{

@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {}

@Override
public void onSensorChanged(SensorEvent event) {

// If the sensor data is unreliable return
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
return;

// Gets the value of the sensor that has been changed
switch (event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
gravity = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
geomag = event.values.clone();
break;
}

// If gravity and geomag have values then find rotation matrix
if (gravity != null && geomag != null){

// checks that the rotation matrix is found
boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag);
if (success){

// Re-map coordinates so y-axis comes out of camera
SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X,
SensorManager.AXIS_Z, outR);

// Finds the Azimuth and Pitch angles of the y-axis with
// magnetic north and the horizon respectively
SensorManager.getOrientation(outR, orientVals);
float azimuth = orientVals[0]*rad2deg;
float pitch = orientVals[1]*rad2deg;
float roll = orientVals[2]*rad2deg;

// Displays a pop up message with the azimuth and inclination angles
String endl = System.getProperty("line.separator");
Toast.makeText(getBaseContext(),
"Rotation:" +
outR[0] + " " + outR[1] + " " + outR[2] + endl +
outR[4] + " " + outR[5] + " " + outR[6] + endl +
outR[8] + " " + outR[9] + " " + outR[10] + endl +endl +
"Azimuth: " + azimuth + " degrees" + endl +
"Pitch: " + pitch + " degrees" + endl +
"Roll: " + roll + " degrees",
Toast.LENGTH_LONG).show();
} /*else
Toast.makeText(getBaseContext(),
"Get Rotation Matrix Failed", Toast.LENGTH_LONG).show();*/
}
}

}

}

我看了sensorManager类的文档,但是并没有帮助解决这个问题。如果有人可以帮助我从中获得意义,我将不胜感激。我正在运行Android 2.1的Nexus One上进行测试

最佳答案

因为我是Android的新手,所以我使用Toast在屏幕上显示信息。我将其更改为仅更新 View 上的文本,这似乎可以解决问题。我还发现我假设的orientVals实际上是正确的。对于我所需要的,不使用卷。也没有意识到有一种方法可以将rad转换为内置的deg,所以我只是使用了这种方法。

关于rotation - 使用getRotationMatrix()和getOrientation()查找方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020048/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com