我试图让矢量的方向指向相机,相对于磁北。我的印象是我需要使用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
答案 0 :(得分:4)
因为我是android的新手,所以我使用toast在屏幕上显示信息。我把它更改为只更新视图上的文本,这似乎解决了它。我也发现我认为orientVals实际上是正确的。我需要的是不使用滚筒。还没有意识到有一种方法可以从rad转换为deg内置,所以我只是使用它。
答案 1 :(得分:3)
您可以查看屏幕上显示原始值的logger application。在其描述中,您将找到源代码的链接,以便您可以了解它如何访问传感器。
HTH, 丹尼尔
答案 2 :(得分:3)
您需要获取设备的方向(横向/纵向) 并做出一些补偿。
SensorManager.getOrientation(R, values);
mHeading = (int) Math.toDegrees(values[0]);
Display display =
((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int compensation = display.getRotation() * 90;
mHeading = mHeading+compensation;
答案 3 :(得分:1)
我认为你应该使用getInclination来获取方向而不是获取方向。因为getRotationMatrix是基于重力和地磁场进行计算的,你将直接从磁场中获得定位。
答案 4 :(得分:1)
我认为你应该在行getOrientation
中将outR更改为inRboolean 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(inR, orientVals);**