কম্পাস সহ অ্যান্ড্রয়েড ফোন ওরিয়েন্টেশন ওভারভিউ


107

আমি কিছুক্ষণের জন্য অ্যান্ড্রয়েড ওরিয়েন্টেশন সেন্সরগুলির আশেপাশে মাথা পেতে চেষ্টা করছিলাম। আমি ভেবেছিলাম আমি এটা বুঝতে পেরেছি। তখন বুঝতে পারলাম আমি করিনি। এখন আমি মনে করি (আশা করি) এর জন্য আমার আবার আরও ভাল অনুভূতি রয়েছে তবে আমি এখনও 100% নই। আমি এটি সম্পর্কে আমার দুর্দশাগ্রস্ত বোঝার চেষ্টা করব এবং আশা করব যে আমি যদি অংশগুলি ভুল হয়ে থাকি বা কোনও শূন্যস্থান পূরণ করি তবে লোকেরা আমাকে সংশোধন করতে সক্ষম হবে।

আমি কল্পনা করি যে আমি 0 ডিগ্রি দ্রাঘিমাংশ (প্রাইম মেরিডিয়ান) এবং 0 ডিগ্রি অক্ষাংশ (নিরক্ষীয়) এ দাঁড়িয়ে আছি। এই অবস্থানটি আসলে আফ্রিকার উপকূলের সমুদ্রের মধ্যে তবে আমার সহ্য করবে। আমি আমার ফোনটি আমার মুখের সামনে ধরে রাখি যাতে ফোনের নীচে আমার পায়ে ইশারা করে; আমি উত্তর দিকে মুখ করছি (গ্রিনউইচের দিকে তাকিয়ে) তাই ফোনের ডান দিকটি পূর্ব দিকে আফ্রিকার দিকে নির্দেশ করে। এই অরিয়েন্টেশনটিতে (নীচের চিত্রের রেফারেন্স সহ) আমার এক্স-অক্ষ রয়েছে পূর্ব দিকে নির্দেশ করছে, জেড-অক্ষটি দক্ষিণ এবং ওয়াই-অক্ষটি আকাশের দিকে নির্দেশ করছে।

এখন ফোনের সেন্সরগুলি আপনাকে এই পরিস্থিতিতে ডিভাইসের ওরিয়েন্টেশন (অবস্থান নয়) কাজ করতে দেয়। এই অংশটি আমাকে সর্বদা বিভ্রান্ত করেছে, সম্ভবত যেহেতু আমি বুঝতে চেয়েছিলাম কীভাবে কিছু কাজ করেছে তা গ্রহণ করার আগেই এটি ঠিক কাজ করে। দেখে মনে হচ্ছে ফোনটি দুটি ভিন্ন প্রযুক্তির সংমিশ্রণ ব্যবহার করে তার অভিমুখীকরণের কাজ করে।

আমি সেখানে পৌঁছানোর আগে, কল্পনা করুন যে ভূমির সেই কাল্পনিক টুকরোটি 0 ডিগ্রি অক্ষাংশ এবং দ্রাঘিমাংশের উপরে উল্লিখিত দিকে দাঁড়িয়ে আছে back আপনি চোখের পাতায় পড়ে আছেন এবং আপনার জুতাগুলি খেলার মাঠের চতুর্থ স্থানে স্থির রয়েছে Ima যদি কেউ আপনাকে পিছনে টান দেয় তবে আপনি সামনে (উত্তর দিকে) পড়ে যাবেন এবং আপনার পতন ভাঙতে উভয় হাত বাইরে রাখবেন। একইভাবে যদি কেউ আপনাকে বাম কাঁধে কাঁধ দেয় তবে আপনি ডান হাতের উপর পড়ে যাবেন। আপনার অভ্যন্তর কানের মধ্যে "মহাকর্ষ সেন্সর" রয়েছে (ইউটিউব ক্লিপ) যা আপনি যদি সামনে / পিছনে, বা বাম / ডানদিকে পড়ে যাচ্ছেন বা নিচে পড়ে যাচ্ছেন কিনা তা সনাক্ত করতে দেয় (বা উপরে !!)। সুতরাং মানুষ ফোনের মতো একই এক্স এবং জেড অক্ষের চারপাশে প্রান্তিককরণ এবং ঘূর্ণন সনাক্ত করতে পারে।

এখন কল্পনা করুন যে কেউ এখন আপনাকে 90 ডিগ্রি ঘুরতে ঘুরবে যাতে আপনি এখন প্রাচ্যের মুখোমুখি হন। আপনি Y অক্ষের চারপাশে ঘোরানো হচ্ছে। এই অক্ষটি আলাদা কারণ আমরা জৈবিকভাবে এটি সনাক্ত করতে পারি না। আমরা জানি আমরা একটি নির্দিষ্ট পরিমাণে কোণঠাসা হয়েছি কিন্তু আমরা গ্রহের চৌম্বকীয় উত্তর মেরুর সাথে সম্পর্কিত দিকটি জানি না। পরিবর্তে আমাদের একটি বাহ্যিক সরঞ্জাম ... একটি চৌম্বকীয় কম্পাস ব্যবহার করা দরকার। এটি আমাদের কোন দিকে মুখ করে রয়েছে তা নির্ধারণ করতে সহায়তা করে। আমাদের ফোনের ক্ষেত্রেও একই কথা।

এখন ফোনে 3-অক্ষের অ্যাক্সিলোমিটারও রয়েছে। আমার নেইতারা আসলে কীভাবে কাজ করে তবে আমি যেভাবে এটি কল্পনা করেছি তা হল মহাকর্ষকে আকাশ থেকে ধ্রুবক ও অভিন্ন 'বৃষ্টিপাত' হিসাবে কল্পনা করা এবং উপরের চিত্রটিতে অক্ষগুলি টিউব হিসাবে কল্পনা করা যা বৃষ্টিপাতের পরিমাণটি নির্ধারণ করতে পারে। ফোনটি সোজা হয়ে গেলে সমস্ত বৃষ্টি হবে ওয়াই 'টিউব' দিয়ে। যদি ফোনটি ধীরে ধীরে ঘোরানো হয় তবে এর স্ক্রিনটি আকাশের মুখোমুখি হবে ওয়াইয়ের মধ্য দিয়ে প্রবাহিত বৃষ্টিপাতের পরিমাণ হ্রাস পেয়ে শূন্যে নেমে যাবে এবং সর্বাধিক পরিমাণ বৃষ্টিপাত প্রবাহিত হওয়া অবধি Z এর মাধ্যমে ভলিউম অবিচ্ছিন্নভাবে বৃদ্ধি পাবে। একইভাবে যদি আমরা এখন ফোনটিকে তার পাশে টিপ করি তবে এক্স টিউব অবশেষে সর্বাধিক পরিমাণ বৃষ্টিপাত সংগ্রহ করবে। সুতরাং 3 টি টিউব দিয়ে প্রবাহিত বৃষ্টির পরিমাণ পরিমাপ করে ফোনের ওরিয়েন্টেশনের উপর নির্ভর করে আপনি ওরিয়েন্টেশনটি গণনা করতে পারেন।

ফোনে একটি বৈদ্যুতিন কম্পাসও রয়েছে যা একটি সাধারণ কম্পাসের মতো আচরণ করে - এর "ভার্চুয়াল সুই" চৌম্বকীয় উত্তরের দিকে নির্দেশ করে। অ্যান্ড্রয়েড মার্জ এই দুটি সেন্সর থেকে তথ্য যাতে যখনই কোন যে SensorEventএর TYPE_ORIENTATIONউৎপন্ন হয় values[3]অ্যারের হয়েছে
মান [0]: দিগ্বলয় - (চৌম্বক উত্তর কম্পাস ভারবহন পূর্ব)
মান [1]: পিচ প্রায় x- অক্ষ ঘূর্ণন (ফোন সামনে বা পিছনের দিকে ঝুঁকানো)
মানগুলি [২]: রোল, y- অক্ষের চারপাশে ঘূর্ণন (ফোনটি তার বাম বা ডানদিকে ঝুঁকছে)

সুতরাং আমি মনে করি (তৃতীয় অ্যাকসিলোমিটার পড়ার চেয়ে অ্যান্ড্রয়েড অজিমুথ (কম্পাস বিয়ারিং) দেওয়ার কারণটি মনে করে যে কম্পাস ভারবহন কেবল আরও দরকারী। আমি নিশ্চিত নই কেন তারা এই ধরণের সেন্সরটিকে অবহেলা করেছিল কারণ এখন মনে হচ্ছে আপনাকে সিস্টেমের SensorEventধরণের জন্য কোনও শ্রোতার রেজিস্ট্রেশন করতে হবে TYPE_MAGNETIC_FIELD। ঘূর্ণন ম্যাট্রিক্স (নীচে দেখুন) যা পদ্ধতিতে পাস করা হয় তার value[]জন্য ইভেন্টের অ্যারেটিকে SensorManger.getRotationMatrix(..)পদ্ধতিতে অতিক্রম করতে হবে SensorManager.getOrientation(..)। কেউ কি জানেন যে অ্যান্ড্রয়েড দলটি কেন হতাশ হয়েছিল Sensor.TYPE_ORIENTATION? এটা কি দক্ষতার জিনিস? অনুরূপ প্রশ্নের একটি মন্তব্যে এটিই অন্তর্ভুক্ত তবে আপনাকে এখনও ভিন্ন ধরণের শ্রোতার নিবন্ধ করতে হবেবিকাশ / নমুনা / কম্পাস / এসসিআর / কম / উদাহরণ / অ্যান্ড্রয়েড / কম্পাস / কম্পাসঅ্যাক্টিভিটি.জভা উদাহরণ।

আমি এখন রোটেশন ম্যাট্রিক্স সম্পর্কে কথা বলতে চাই। (এটি এখানে আমি সবচেয়ে অনিশ্চিত) সুতরাং উপরে আমাদের কাছে অ্যান্ড্রয়েড ডকুমেন্টেশন থেকে তিনটি চিত্র রয়েছে, আমরা তাদের এ, বি এবং সি বলব'll

এ = সেন্সর ম্যানেজার.গেটরোটেশনম্যাট্রিক্স (..) পদ্ধতি চিত্র এবং বিশ্বের সমন্বিত সিস্টেমের প্রতিনিধিত্ব করে

বি = সেন্সরইভেন্ট এপিআই দ্বারা ব্যবহৃত সমন্বয় ব্যবস্থা।

সি = সেন্সর-ম্যানেজ.জেট ওরিয়েন্টেশন (..) পদ্ধতির চিত্র

সুতরাং আমার বোধগম্যতা হ'ল এটি "বিশ্বের সমন্বিত ব্যবস্থা" উপস্থাপন করে যা আমি অনুমান করি যে গ্রহের অবস্থানগুলিকে যেভাবে একটি latচ্ছিক (উচ্চতা) সহ একটি (অক্ষাংশ, দ্রাঘিমাংশ) দম্পতি হিসাবে দেওয়া হয়েছে তা বোঝায়। এক্স হ'ল "ইস্টিটিং" কো-অর্ডিনেটেট, ওয়াই হ'ল "নরথিং" কো-অর্ডিনেটেট। জেড আকাশের দিকে নির্দেশ করে এবং উচ্চতার প্রতিনিধিত্ব করে।

ফোন কো-অর্ডিনেট সিস্টেমটি চিত্রের বিতে দেখানো হয়েছে এটি স্থির হয়েছে। এর Y অক্ষটি সর্বদা শীর্ষকে নির্দেশ করে। ঘূর্ণন ম্যাট্রিক্স ফোন দ্বারা নিয়মিত গণনা করা হচ্ছে এবং দুজনের মধ্যে ম্যাপিংয়ের অনুমতি দেয়। তাহলে আমি কি এই ভেবে সঠিকভাবে আছি যে ঘূর্ণন ম্যাট্রিক্স বি এর সমন্বিত সিস্টেমকে সি তে রূপান্তরিত করে? সুতরাং আপনি যখন SensorManager.getOrientation(..)পদ্ধতিটি কল করবেন তখন আপনি values[]অঙ্কটি সি এর সাথে মানগুলির সাথে অ্যারে ব্যবহার করবেন যখন ফোন আকাশের দিকে নির্দেশ করা হবে তখন ঘূর্ণন ম্যাট্রিক্সটি আইডেন্টিটি ম্যাট্রিক্স (1 এর ম্যাট্রিক্স গাণিতিক সমতুল্য) যার অর্থ ডিভাইসটি সারিবদ্ধ হওয়ার সাথে সাথে কোনও ম্যাপিং প্রয়োজন নেই বিশ্বের সমন্বিত সিস্টেমের সাথে।

ঠিক আছে. আমি মনে করি আমি এখনই থামি। যেমনটি আমি আশা করার আগে বলেছিলাম যে লোকেরা আমাকে বলবে আমি কোথায় লোককে বিভ্রান্ত করেছি বা সাহায্য করেছি (বা আরও বিভ্রান্ত মানুষ!)


25
আমি এই প্রশ্নটি সত্যিই পছন্দ করি। আমি এর উত্তর দিতে পারছি না তবে আমি এটি পছন্দ করি।
অষ্টাভিয়ান এ ডামিয়ান

4
টিম, আপনি কি কখনও উত্তর পেয়েছেন? আমি একই সাথে আমার মাথা আঁচড়ান। এটি আমার মধ্যে দেখা সবচেয়ে দুর্বল নথিভুক্ত এপিআই of
পিয়েরে-লুক পাওর

আসলেই আমি ভয় পাই না। আমাকে এগিয়ে যেতে হয়েছিল। কোনও দিন আমি এই ইস্যুতে ফিরে আসব।
টিম

1
এখানে আমার প্রায় একই প্রশ্ন আছে? এবং প্রতিক্রিয়া, সমাধানও । মেড প্রকাশ্য আমার কোড গিটহাব করেন।

আমি যে বিষয়টি নিয়ে ভাবছি, আমি একটি অ্যান্ড্রয়েড ডিভাইসে একটি কম্পাস বাস্তবায়ন করেছি এবং যদি আমি ইন্টারনেটের সাহায্য গ্রহণ করি তবে এটি ঠিকঠাক কাজ করছে তবে বিভ্রান্তিকর জিনিসটি ... ... ধরুন আমার ডিভাইস স্থলভাগে অবস্থান করছে আমার এবং এটির উত্তরের দিকে এখন আমি নিজের মোবাইলটি তুলে আমার মাথার উপরে উল্লম্বভাবে রাখলাম এবং মুখটি এখনও আমার দিকে। প্রথমত সূচকে তার দিক পরিবর্তন করা উচিত এবং কেন। আমি মতে যাচ্ছি আমি এটি আমার দিকনির্দেশ পরিবর্তন করি নি তবে এটি করা উচিত নয় তবে এটি আমার অ্যাপ্লিকেশন এবং ডাউনলোড করা অন্যান্য সমস্ত অ্যাপে পরিবর্তিত হচ্ছে। কেন কেউ ব্যাখ্যা করতে পারেন?
সৈয়দ রাজা মেহেদী

উত্তর:


26

আপনি ওয়ান স্ক্রিন টার্নটি অন্য একটি নিবন্ধের দাবিদার হতে পারেন । এটি আপনাকে কেন ঘোরানোর ম্যাট্রিক্সের প্রয়োজন তা ব্যাখ্যা করে।

সংক্ষেপে, ফোনের সেন্সরগুলি সর্বদা একই সমন্বয় ব্যবস্থা ব্যবহার করে, ডিভাইসটি ঘোরানো হলেও।

যে অ্যাপ্লিকেশনগুলিতে একটি একক অভিমুখে লক করা হয়নি, আপনি যখন ডিভাইসটি ঘোরান তখন স্ক্রিনের সমন্বয়কারী সিস্টেমের পরিবর্তন হয়। সুতরাং, ডিভাইসটি যখন তার ডিফল্ট ভিউ মোড থেকে ঘোরানো হয়, সেন্সর স্থানাঙ্ক সিস্টেম আর স্ক্রিনের সমন্বয় সিস্টেমের মতো হয় না। এই ক্ষেত্রে রোটেশন ম্যাট্রিক্স A এ সি তে রূপান্তর করতে ব্যবহৃত হয় (বি সর্বদা স্থির থাকে)।

এটি কীভাবে ব্যবহার করা যায় তা দেখানোর জন্য এখানে একটি কোড স্নিপেট।

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// Register this class as a listener for the accelerometer sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
// ...and the orientation sensor
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                    SensorManager.SENSOR_DELAY_NORMAL);

//...
// The following code inside a class implementing a SensorEventListener
// ...

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

double azimuth = 0;
double pitch = 0;
double roll = 0;

public void onSensorChanged(SensorEvent sensorEvent) {
    // If the sensor data is unreliable return
    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        return;

    // Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
        case Sensor.TYPE_ACCELEROMETER:
            gravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomag = sensorEvent.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) {
            SensorManager.getOrientation(inR, orientVals);
            azimuth = Math.toDegrees(orientVals[0]);
            pitch = Math.toDegrees(orientVals[1]);
            roll = Math.toDegrees(orientVals[2]);
        }
    }
}

4
কেবল উল্লেখ করুন যে আজিমুথ, পিচ এবং রোল অবহেলিত ওরিয়েন্টেশনসেন্সর থেকে বেরিয়ে আসার মতো নয়। orientation[0] = orientation[0] >= 0 ? orientation[0]: orientation[0] + 360;আজিমুথকে স্বাভাবিক করবে এবং if (orientation[1] <= -90) { orientation[1] += (-2*(90+orientation[1])); } else if(orientation[1] >= 90){ orientation[1] += (2*(90 - orientation[1])); }পিচটি স্বাভাবিক করবে
রাফায়েল টি

@ রফায়েলটি এবং রোলকে স্বাভাবিক করতে? বা এটা কোন মানে না?
ম্যাথিয়াস

@ রাফেলটি: আপনার আজিমুথের স্বাভাবিককরণের প্রভাব আছে বলে মনে হচ্ছে: মানগুলি [-180,180] থেকে [0, 360] এ চলে যায়। তবে আমি যে পিচ মানগুলি পেয়েছি সেগুলি ইতিমধ্যে [-90,90] এ রয়েছে তাই আপনার প্রস্তাবিত স্বাভাবিকায়নের কোনও প্রভাব নেই।
ম্যাথিয়াস

আমি যদি ট্যাবলেটটি কীভাবে সরিয়ে নিই তবে জিওগ্যাগের মান সর্বদা 0 হয় (মাধ্যাকর্ষণ! = নাল && জিওম্যাগ! = নাল) পরীক্ষা করার পরে এর অর্থ কী? জিওম্যাগ সেন্সর ছাড়াই ট্যাবলেট হতে পারে?
উন্নত

3

রোলটি মাধ্যাকর্ষণ একটি ফাংশন, একটি 90 ডিগ্রি রোল সমস্ত মাধ্যাকর্ষণ এক্স রেজিস্টারে রাখে।

পিচ একই, 90 ডিগ্রি পিচ আপ মাধ্যাকর্ষণ সমস্ত উপাদান y রেজিস্টারে রাখে।

ইয়াও / শিরোনাম / আজিমুথের মহাকর্ষের উপর কোনও প্রভাব নেই, এটি মহাকর্ষের সর্বদা সঠিক কোণে থাকে তাই অতএব আপনি যেভাবে মাধ্যাকর্ষণটির মুখোমুখি হন তা আপত্তিজনক নয়।

এজন্য আপনার মূল্যায়ন করার জন্য একটি কম্পাসের প্রয়োজন কেন, সম্ভবত এটি বোধগম্য হয়?



0

আমার এই সমস্যাটি ছিল তাই আমি বিভিন্ন দিক থেকে কী ঘটে তা ম্যাপ করেছিলাম। ডিভাইসটি যদি ল্যান্ডস্কেপ ফ্যাশনে মাউন্ট করা থাকে, যেমন কোনও গাড়ীতে কমপাস থেকে 'ডিগ্রি' মাউন্ট করা 260 (পশ্চিম এবং উত্তরের মধ্যে) থেকে 0-275 (ঘড়ির কাঁটার দিকে) runর্ধ্বমুখী বলে মনে হচ্ছে এটি -90 থেকে 0 অবধি পিছনের দিকে গন্য হয় 0 থেকে 269 পর্যন্ত ফরোয়ার্ড 27 270 -90 হয়

তবু ল্যান্ডস্কেপে কিন্তু ডিভাইসটির পিছনে পড়ে থাকা আমার সেন্সরটি 0-360 দেয়। এবং প্রতিকৃতি মোডে এটি 0-360 উভয়ই তার পিছনে শুয়ে এবং প্রতিকৃতিতে দাঁড়িয়ে থাকে।

আশা করি যে কাউকে সাহায্য করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.