2012-11-08 12 views
13

मैं एक्सेलोरोमीटर और चुंबकीय क्षेत्र सेंसर का उपयोग करके एंड्रॉइड के साथ एक कंपास प्रोग्राम करने की कोशिश कर रहा हूं, अब मैं सोच रहा हूं कि मेरे कंपास के लिए सही कोण कैसे प्राप्त करें।एंड्रॉइड में कम्पास

मैं एक्सेलेरोमीटर के मूल्यों और क्रमशः "एसील" और "मैग्ने" में चुंबकीय क्षेत्र सेंसर के मूल्यों में पढ़ता हूं।

float R[] = new float[9]; 
float I[] = new float[9]; 
boolean success = SensorManager.getRotationMatrix(R, I, accele, magne); 
     if(success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      azimuth = orientation[0]; // contains azimuth, pitch, roll 
          .... 
बाद में

, मैं एक रोटेशन मैट्रिक्स का उपयोग अपने सुई डाल करने के लिए: कोण पाने के लिए, मैं निम्नलिखित प्रदर्शन

rotation.setRotate(azimuth, compass.getWidth()/2, compass.getHeight()/2); 
canvas.drawBitmap(needle, rotation, null); 

अब, getOrientation के प्रलेखन का कहना है, कि उन्मुखीकरण [0] जेड-अक्ष के चारों ओर घूर्णन होना चाहिए। TYPE_ORIENTATION के लिए प्रलेखन बताता है कि "अजीमुथ, चुंबकीय उत्तर दिशा और वाई-अक्ष के बीच कोण, ज़ेड-अक्ष (0 से 35 9) के आसपास कोण। 0 = उत्तर, 9 0 = पूर्व, 180 = दक्षिण, 270 = पश्चिम"।

मेरा अजिमथ 0 और 35 9 के बीच नहीं है, बल्कि लगभग 2 से 2 के बीच नहीं है। GetOrientation से azimuth वास्तव में क्या है और मैं इसे कोण में कैसे परिवर्तित कर सकता हूं?

उत्तर

20

लिए उपयोग डिग्री मिलता है देख सकते हैं रेडियन में दिए गए दिगंश से परिवर्तित करने के लिए निम्न (-PI , + पीआई) डिग्री (0 करने के लिए, 360)

float azimuthInRadians = orientation[0]; 
float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians); 
if (azimuthInDegress < 0.0f) { 
    azimuthInDegress += 360.0f; 
} 

चर सुविधा के लिए उपयोग होने वाले नाम ;-)

+0

धन्यवाद :) आखिरी अगर कथन के लिए वास्तव में क्या है? – user1809923

+0

Math.toDegrees() आपको -180 और 180 के बीच एक -पीआई और + पीआई रेडियंस कोण से कोण देगा। यह सब कुछ सकारात्मक दिशा में डाल दिया। – rgrocha

+0

यह सही जवाब है। –

2

मैं गूगल के ApiDemos में यह पाया:

/* 
* Copyright (C) 2007 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.example.android.apis.graphics; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.*; 
import android.hardware.SensorListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.os.SystemClock; 
import android.util.Config; 
import android.util.Log; 
import android.view.View; 

public class Compass extends GraphicsActivity { 

    private static final String TAG = "Compass"; 

    private SensorManager mSensorManager; 
    private SampleView mView; 
    private float[] mValues; 

    private final SensorListener mListener = new SensorListener() { 

     public void onSensorChanged(int sensor, float[] values) { 
      if (Config.LOGD) Log.d(TAG, "sensorChanged (" + values[0] + ", " + values[1] + ", " + values[2] + ")"); 
      mValues = values; 
      if (mView != null) { 
       mView.invalidate(); 
      } 
     } 

     public void onAccuracyChanged(int sensor, int accuracy) { 
      // TODO Auto-generated method stub 

     } 
    }; 

    @Override 
    protected void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 
     mView = new SampleView(this); 
     setContentView(mView); 
    } 

    @Override 
    protected void onResume() 
    { 
     if (Config.LOGD) Log.d(TAG, "onResume"); 
     super.onResume(); 
     mSensorManager.registerListener(mListener, 
       SensorManager.SENSOR_ORIENTATION, 
       SensorManager.SENSOR_DELAY_GAME); 
    } 

    @Override 
    protected void onStop() 
    { 
     if (Config.LOGD) Log.d(TAG, "onStop"); 
     mSensorManager.unregisterListener(mListener); 
     super.onStop(); 
    } 

    private class SampleView extends View { 
     private Paint mPaint = new Paint(); 
     private Path mPath = new Path(); 
     private boolean mAnimate; 
     private long mNextTime; 

     public SampleView(Context context) { 
      super(context); 

      // Construct a wedge-shaped path 
      mPath.moveTo(0, -50); 
      mPath.lineTo(-20, 60); 
      mPath.lineTo(0, 50); 
      mPath.lineTo(20, 60); 
      mPath.close(); 
     } 

     @Override protected void onDraw(Canvas canvas) { 
      Paint paint = mPaint; 

      canvas.drawColor(Color.WHITE); 

      paint.setAntiAlias(true); 
      paint.setColor(Color.BLACK); 
      paint.setStyle(Paint.Style.FILL); 

      int w = canvas.getWidth(); 
      int h = canvas.getHeight(); 
      int cx = w/2; 
      int cy = h/2; 

      canvas.translate(cx, cy); 
      if (mValues != null) {    
       canvas.rotate(-mValues[0]); 
      } 
      canvas.drawPath(mPath, mPaint); 
     } 

     @Override 
     protected void onAttachedToWindow() { 
      mAnimate = true; 
      super.onAttachedToWindow(); 
     } 

     @Override 
     protected void onDetachedFromWindow() { 
      mAnimate = false; 
      super.onDetachedFromWindow(); 
     } 
    } 
} 

आप आप के बीच 0 360

+0

यह बहुत अच्छा होगा, अगर आपने समझाया :) – user1809923

+0

ठीक है, मैं अपना जवाब संपादित करूंगा। –

+0

नमस्ते, यह एक दिलचस्प दृष्टिकोण है, हालांकि मुझे लगता है कि यह बहुत सटीक नहीं हो सकता है, क्योंकि मैंने अनुमान लगाया है कि -2 से 2. – user1809923

7

https://github.com/iutinvg/compass

से यह एक कोड स्निपेट प्राप्त किया जा सकता है यह बहिष्कृत सामग्री का उपयोग नहीं करता है, कम-पास फ़िल्टर लागू होता है।

+0

'अंतिम फ्लोट अल्फा = 0.97 एफ; ' तय करने के मानदंड क्या हैं आपने 0.97 फ़िल्टर स्थिर के रूप में उपयोग किया है, google 0.8 का उपयोग किया है। – DeltaCap

+1

यह तीर रोटेशन की वेग को प्रभावित करेगा। तो पसंद दृश्य भावना पर आधारित है: अधिक चिकनी आंदोलन। – iutinvg

संबंधित मुद्दे