के लिए एंड्रॉइड पर असंगत अभिविन्यास सेंसर मान मुझे अच्छा अभिविन्यास सेंसर रीडिंग प्राप्त करने में परेशानी हो रही है। सेंसर रीडिंग अविश्वसनीय लगती थी, इसलिए मैंने दो कोड मुफ्त सेंसर परीक्षण ऐप्स (Sensor Tester (Dicotomica) और Sensor Monitoring (R's Software)) के खिलाफ अपना कोड परीक्षण किया। मैंने पाया कि मेरे रीडिंग अक्सर सेंसर परीक्षण ऐप्स के साथ सहमत होते हैं, कभी-कभी एजीमुथ/यॉ के लिए मान, और रोल 40 डिग्री तक भिन्न होते हैं, हालांकि पिच पढ़ने पर ज्यादातर सहमत होते हैं। दो मुफ्त ऐप्स हमेशा एक-दूसरे से सहमत होते थे।एंड्रॉइड पर एज़िमथ/यॉ और रोल
मैंने अपना कोड एक छोटी एंड्रॉइड गतिविधि में डाल दिया और एक ही असंगतता प्राप्त की। कोड निम्नानुसार है:
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;
}
}
मैं गैलेक्सी नोट 2 का उपयोग कर जेली बीन 4.1.1 चला रहा हूं। क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं?
अपडेट 24-मार्च-2013: अधिक जानकारी। (1) मैंने मैनिफेस्ट में पोर्ट्रेट और लैंडस्केप के बीच स्विच अक्षम कर दिए हैं, इसलिए GetWindowManager()। GetDefaultDisplay()। GetRotation() हमेशा शून्य होता है। इसलिए मुझे नहीं लगता कि remapCoordSystem यहां मदद करेगा, क्योंकि यह axes को स्विच करने के लिए है, जबकि जो त्रुटियां मैं देख रहा हूं वे बड़ी त्रुटियां नहीं हैं, वे बहुत अधिक सूक्ष्म हैं। (2) मैंने सटीकता संवेदनशीलता की जांच की है, और असंगतता तब होती है जब दोनों सेंसर उच्च सटीकता का दावा करते हैं।
मैं देख रहा विसंगतियों का एक उदाहरण के रूप में, जब उपरोक्त कोड मुझे (एजीमुथ, पिच, रोल) = (235, -52, -11) देता है तो दो फ्री ऐप्स समान मान दिखाते हैं। लेकिन जब मैं देखता हूं (278, -58, -52) ऐप्स दिखाते हैं (256, -58, -26), तो अजीमुथ और रोल दोनों में इतने बड़े अंतर, हालांकि पिच ठीक लगता है।
यह केवल अजीमुथ को -90 से 90 डिग्री तक देता है। उत्तर से आगे बढ़ते समय मैं 0 से 35 9 डिग्री तक अज़ीमुथ कैसे प्राप्त कर सकता हूं। – Master
@ हूसीयर अच्छा सवाल है, क्योंकि जैसा कि आप कहते हैं, सामान्य व्यस्त टेंगेंट क्षेत्र -90 से 9 0 डिग्री में संख्या देता है। जवाब Atan2 (http://en.wikipedia.org/wiki/Atan2) का उपयोग करना है जो कि मैं उपयोग की जाने वाली दोनों भाषाओं में उपलब्ध हूं (अर्थात् सी # और जावा)। – Stochastically
धन्यवाद। अगर यह काम करता है तो मैं इसका इस्तेमाल करने की कोशिश करूंगा। – Master