我無法獲得良好的方向傳感器讀數。傳感器讀數似乎不可靠,所以我測試了兩個免費的傳感器測試應用程序(Sensor Tester (Dicotomica)和Sensor Monitoring (R's Software))我的代碼。我發現雖然我的閱讀經常與傳感器測試應用程序達成一致,但偶爾會有方位角/偏航值和滾動值相差達40度,儘管俯仰讀數大部分是一致的。這兩個免費應用程序似乎總是彼此認同。Android在方位角/偏航和滾轉方向上傳感器值不一致
我把我的代碼放到一個小的Android活動中,並得到相同的不一致性。代碼如下:
public class MainActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private float[] AccelerometerValues;
private float[] MagneticFieldValues;
private float[] RotationMatrix;
private long nextRefreshTime; // used to ensure dump to LogCat occurs no more than 4 times a second
private DecimalFormat df; // used for dumping sensors to LogCat
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager)getSystemService(android.content.Context.SENSOR_SERVICE);
Sensor SensorAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, SensorAccelerometer, SensorManager.SENSOR_DELAY_UI);
Sensor SensorMagField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mSensorManager.registerListener(this, SensorMagField, SensorManager.SENSOR_DELAY_UI);
AccelerometerValues = new float[3];
MagneticFieldValues = new float[3];
RotationMatrix = new float[9];
nextRefreshTime = 0;
df = new DecimalFormat("#.00");
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
System.arraycopy(event.values, 0, AccelerometerValues, 0, AccelerometerValues.length);
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
System.arraycopy(event.values, 0, MagneticFieldValues, 0, MagneticFieldValues.length);
if (AccelerometerValues != null && MagneticFieldValues != null) {
if(SensorManager.getRotationMatrix(RotationMatrix, null, AccelerometerValues, MagneticFieldValues)) {
float[] OrientationValues = new float[3];
SensorManager.getOrientation(RotationMatrix, OrientationValues);
// chance conventions to match sample apps
if (OrientationValues[0] < 0) OrientationValues[0] += 2*(float)Math.PI;
OrientationValues[2] *= -1;
// dump to logcat 4 times a second
long currentTimeMillis = System.currentTimeMillis();
if (currentTimeMillis > nextRefreshTime) {
nextRefreshTime = currentTimeMillis+250;
Log.i("Sensors", // arrange output so that numbers line up in columns :-)
"(" + AngleToStr(OrientationValues[0]) + "," + AngleToStr(OrientationValues[1]) + "," + AngleToStr(OrientationValues[2])
+ ") ("+FloatToStr(AccelerometerValues[0]) + "," + FloatToStr(AccelerometerValues[1]) + "," + FloatToStr(AccelerometerValues[2])
+ ") ("+FloatToStr(MagneticFieldValues[0]) + "," + FloatToStr(MagneticFieldValues[1]) + "," + FloatToStr(MagneticFieldValues[2])+")");
}
}
}
}
private String AngleToStr(double AngleInRadians) {
String Str = " "+Integer.toString((int)Math.toDegrees(AngleInRadians));
return Str.substring(Str.length() - 3);
}
private String FloatToStr(float flt) {
String Str = " "+df.format(flt);
return Str.substring(Str.length() - 6);
}
@Override
protected void onDestroy() {
super.onDestroy();
mSensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) { }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
我正在使用Galaxy Note 2運行Jelly Bean 4.1.1。誰能告訴我我做錯了什麼?
更新24-Mar-2013:更多信息。 (1)我已禁用清單中縱向和橫向之間的切換,因此getWindowManager()。getDefaultDisplay()。getRotation()始終爲零。因此,我不認爲remapCoordSystem在這裏會有所幫助,因爲這是爲了切換座標軸,而我所看到的錯誤並不是很大的錯誤,它們更加微妙。 (2)我檢查了精確度的靈敏度,當兩個傳感器都聲稱具有高精度時會出現不一致。
作爲我看到的不一致的一個例子,當上面的代碼給我(方位角,俯仰角,滾動角)=(235,-52,-11)時,兩個免費應用程序顯示相似的值。但是當我看到(278,-58,-52)應用程序顯示(256,-58,-26)時,方位角和滾動角度差異很大,儘管俯仰看起來不錯。
它只從-90度到90度提供方位角。從北方移動時,如何獲得0到359度範圍內的方位角。 – Master 2014-03-22 17:13:07
@Hoosier很好的問題,因爲正如你所說,通常的反正切返回該地區的數字-90到90度。答案是使用Atan2(http://en.wikipedia.org/wiki/Atan2),它使用我使用的兩種語言(即C#和Java)。 – Stochastically 2014-03-23 07:47:09
謝謝。如果它有效,我會嘗試使用它。 – Master 2014-03-23 08:08:28