অ্যান্ড্রয়েড প্ল্যাটফর্মে দুটি সেন্সর রয়েছে যা আপনাকে একটি ডিভাইসের অবস্থান নির্ধারণ করতে দেয়: জিওম্যাগনেটিক ফিল্ড সেন্সর এবং অ্যাক্সিলোমিটার। অ্যান্ড্রয়েড প্ল্যাটফর্মে একটি সেন্সরও রয়েছে যা আপনাকে নির্ধারণ করতে দেয় যে কোনও ডিভাইসের মুখটি কোনও বস্তুর ( যা প্রক্সিমিটি সেন্সর নামে পরিচিত) কতটা কাছাকাছি। জিওম্যাগনেটিক ফিল্ড সেন্সর এবং প্রক্সিমিটি সেন্সর হার্ডওয়্যার-ভিত্তিক। বেশিরভাগ হ্যান্ডসেট এবং ট্যাবলেট নির্মাতারা একটি জিওম্যাগনেটিক ফিল্ড সেন্সর অন্তর্ভুক্ত করে। একইভাবে, হ্যান্ডসেট নির্মাতারা সাধারণত একটি প্রক্সিমিটি সেন্সর অন্তর্ভুক্ত করে যা নির্ধারণ করে যে কখন একটি হ্যান্ডসেট ব্যবহারকারীর মুখের কাছে রাখা হচ্ছে (উদাহরণস্বরূপ, ফোন কলের সময়)। কোনও ডিভাইসের অবস্থান নির্ধারণের জন্য, আপনি ডিভাইসের অ্যাক্সিলোমিটার এবং জিওম্যাগনেটিক ফিল্ড সেন্সর থেকে প্রাপ্ত রিডিং ব্যবহার করতে পারেন।
দ্রষ্টব্য: অ্যান্ড্রয়েড ২.২ (এপিআই লেভেল ৮) তে ওরিয়েন্টেশন সেন্সরটি বন্ধ করা হয়েছিল, এবং অ্যান্ড্রয়েড ৪.৪W (এপিআই লেভেল ২০) তে ওরিয়েন্টেশন সেন্সরের ধরণটি বন্ধ করা হয়েছিল।
পজিশন সেন্সরগুলি বিশ্বের রেফারেন্স ফ্রেমে একটি ডিভাইসের ভৌত অবস্থান নির্ধারণের জন্য কার্যকর। উদাহরণস্বরূপ, আপনি চৌম্বকীয় উত্তর মেরুর সাপেক্ষে একটি ডিভাইসের অবস্থান নির্ধারণ করতে অ্যাক্সিলোমিটারের সাথে জিওম্যাগনেটিক ফিল্ড সেন্সর ব্যবহার করতে পারেন। আপনি আপনার অ্যাপ্লিকেশনের রেফারেন্স ফ্রেমে একটি ডিভাইসের ওরিয়েন্টেশন নির্ধারণ করতেও এই সেন্সরগুলি ব্যবহার করতে পারেন। পজিশন সেন্সরগুলি সাধারণত ডিভাইসের নড়াচড়া বা গতি, যেমন ঝাঁকুনি, কাত বা থ্রাস্ট নিরীক্ষণের জন্য ব্যবহৃত হয় না (আরও তথ্যের জন্য, মোশন সেন্সর দেখুন)।
ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর এবং অ্যাক্সিলোমিটার প্রতিটি SensorEvent জন্য সেন্সর মানের বহুমাত্রিক অ্যারে প্রদান করে। উদাহরণস্বরূপ, ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর একটি একক সেন্সর ইভেন্টের সময় তিনটি স্থানাঙ্ক অক্ষের জন্য ভূ-চৌম্বকীয় ক্ষেত্র শক্তি মান প্রদান করে। একইভাবে, অ্যাক্সিলোমিটার সেন্সর একটি সেন্সর ইভেন্টের সময় ডিভাইসে প্রয়োগ করা ত্বরণ পরিমাপ করে। সেন্সর দ্বারা ব্যবহৃত স্থানাঙ্ক সিস্টেম সম্পর্কে আরও তথ্যের জন্য, সেন্সর স্থানাঙ্ক সিস্টেম দেখুন। প্রক্সিমিটি সেন্সর প্রতিটি সেন্সর ইভেন্টের জন্য একটি একক মান প্রদান করে। সারণী 1 অ্যান্ড্রয়েড প্ল্যাটফর্মে সমর্থিত অবস্থান সেন্সরগুলির সংক্ষিপ্তসার করে।
সারণী ১। অ্যান্ড্রয়েড প্ল্যাটফর্মে সমর্থিত অবস্থান সেন্সর।
| সেন্সর | সেন্সর ইভেন্ট ডেটা | বিবরণ | পরিমাপের একক |
|---|---|---|---|
TYPE_GAME_ROTATION_VECTOR | SensorEvent.values[0] | x অক্ষ বরাবর ঘূর্ণন ভেক্টর উপাদান (x * sin(θ/2))। | ইউনিটহীন |
SensorEvent.values[1] | y অক্ষ বরাবর ঘূর্ণন ভেক্টর উপাদান (y * sin(θ/2))। | ||
SensorEvent.values[2] | z অক্ষ বরাবর ঘূর্ণন ভেক্টর উপাদান (z * sin(θ/2))। | ||
TYPE_GEOMAGNETIC_ROTATION_VECTOR | SensorEvent.values[0] | x অক্ষ বরাবর ঘূর্ণন ভেক্টর উপাদান (x * sin(θ/2))। | ইউনিটহীন |
SensorEvent.values[1] | y অক্ষ বরাবর ঘূর্ণন ভেক্টর উপাদান (y * sin(θ/2))। | ||
SensorEvent.values[2] | z অক্ষ বরাবর ঘূর্ণন ভেক্টর উপাদান (z * sin(θ/2))। | ||
TYPE_MAGNETIC_FIELD | SensorEvent.values[0] | x অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি। | μT এর মান |
SensorEvent.values[1] | y অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি। | ||
SensorEvent.values[2] | z অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি। | ||
TYPE_MAGNETIC_FIELD_UNCALIBRATED | SensorEvent.values[0] | x অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি (কঠিন লোহার ক্রমাঙ্কন ছাড়াই)। | μT এর মান |
SensorEvent.values[1] | y অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি (কঠিন লোহার ক্রমাঙ্কন ছাড়াই)। | ||
SensorEvent.values[2] | z অক্ষ বরাবর ভূ-চৌম্বকীয় ক্ষেত্রের শক্তি (কঠিন লোহার ক্রমাঙ্কন ছাড়াই)। | ||
SensorEvent.values[3] | x অক্ষ বরাবর লোহার পক্ষপাতের অনুমান। | ||
SensorEvent.values[4] | y অক্ষ বরাবর লোহার পক্ষপাতের অনুমান। | ||
SensorEvent.values[5] | z অক্ষ বরাবর লোহার পক্ষপাত অনুমান। | ||
TYPE_ORIENTATION ১ | SensorEvent.values[0] | দিগ্বলয় (z-অক্ষের চারপাশে কোণ)। | ডিগ্রি |
SensorEvent.values[1] | পিচ (x-অক্ষের চারপাশে কোণ)। | ||
SensorEvent.values[2] | ঘূর্ণন (y-অক্ষের চারপাশে কোণ)। | ||
TYPE_PROXIMITY | SensorEvent.values[0] | বস্তু থেকে দূরত্ব। ২ | সেমি |
১ এই সেন্সরটি অ্যান্ড্রয়েড ২.২ (এপিআই লেভেল ৮) তে অবচিত ছিল, এবং অ্যান্ড্রয়েড ৪.৪ডব্লিউ (এপিআই লেভেল ২০) তে এই সেন্সরের ধরণটি অবচিত ছিল। সেন্সর ফ্রেমওয়ার্কটি ডিভাইস ওরিয়েন্টেশন অর্জনের জন্য বিকল্প পদ্ধতি প্রদান করে, যা ডিভাইসের ওরিয়েন্টেশন গণনা করুন -এ আলোচনা করা হয়েছে।
2 কিছু প্রক্সিমিটি সেন্সর শুধুমাত্র কাছাকাছি এবং দূরের প্রতিনিধিত্বকারী বাইনারি মান প্রদান করে।
গেম রোটেশন ভেক্টর সেন্সর ব্যবহার করুন
গেম রোটেশন ভেক্টর সেন্সরটি রোটেশন ভেক্টর সেন্সরের মতোই, তবে এটি ভূ-চৌম্বকীয় ক্ষেত্র ব্যবহার করে না। অতএব Y অক্ষটি উত্তর দিকে নির্দেশ করে না বরং অন্য কোনও রেফারেন্সের দিকে নির্দেশ করে। জাইরোস্কোপ Z অক্ষের চারপাশে যেভাবে প্রবাহিত হয়, সেই রেফারেন্সটি একই মাত্রার ক্রম অনুসারে প্রবাহিত হতে পারে।
যেহেতু গেম রোটেশন ভেক্টর সেন্সর চৌম্বক ক্ষেত্র ব্যবহার করে না, তাই আপেক্ষিক ঘূর্ণনগুলি আরও নির্ভুল এবং চৌম্বক ক্ষেত্রের পরিবর্তনের দ্বারা প্রভাবিত হয় না। যদি আপনি উত্তর কোথায় তা নিয়ে চিন্তিত না হন এবং চৌম্বক ক্ষেত্রের উপর নির্ভরতার কারণে স্বাভাবিক ঘূর্ণন ভেক্টর আপনার প্রয়োজনের সাথে খাপ খায় না, তাহলে এই সেন্সরটি একটি গেমে ব্যবহার করুন।
নিম্নলিখিত কোডটি আপনাকে দেখায় কিভাবে ডিফল্ট গেম রোটেশন ভেক্টর সেন্সরের একটি উদাহরণ পেতে হয়:
কোটলিন
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR)
জাভা
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
ভূ-চৌম্বকীয় ঘূর্ণন ভেক্টর সেন্সর ব্যবহার করুন
জিওম্যাগনেটিক রোটেশন ভেক্টর সেন্সরটি রোটেশন ভেক্টর সেন্সরের মতোই, তবে এটি জাইরোস্কোপ ব্যবহার করে না। এই সেন্সরের নির্ভুলতা স্বাভাবিক রোটেশন ভেক্টর সেন্সরের চেয়ে কম, তবে বিদ্যুৎ খরচ কম হয়। খুব বেশি ব্যাটারি ব্যবহার না করে পটভূমিতে রোটেশন তথ্য সংগ্রহ করতে চাইলেই এই সেন্সরটি ব্যবহার করুন। ব্যাচিংয়ের সাথে ব্যবহার করা হলে এই সেন্সরটি সবচেয়ে কার্যকর।
নিম্নলিখিত কোডটি আপনাকে দেখায় কিভাবে ডিফল্ট জিওম্যাগনেটিক রোটেশন ভেক্টর সেন্সরের একটি উদাহরণ পেতে হয়:
কোটলিন
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR)
জাভা
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
ডিভাইসের ওরিয়েন্টেশন গণনা করুন
একটি ডিভাইসের ওরিয়েন্টেশন গণনা করে, আপনি পৃথিবীর রেফারেন্স ফ্রেমের (বিশেষ করে, চৌম্বকীয় উত্তর মেরু) সাপেক্ষে ডিভাইসের অবস্থান পর্যবেক্ষণ করতে পারেন। নিম্নলিখিত কোডটি আপনাকে দেখায় কিভাবে একটি ডিভাইসের ওরিয়েন্টেশন গণনা করতে হয়:
কোটলিন
private lateinit var sensorManager: SensorManager ... // Rotation matrix based on current readings from accelerometer and magnetometer. val rotationMatrix = FloatArray(9) SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading) // Express the updated rotation matrix as three orientation angles. val orientationAngles = FloatArray(3) SensorManager.getOrientation(rotationMatrix, orientationAngles)
জাভা
private SensorManager sensorManager; ... // Rotation matrix based on current readings from accelerometer and magnetometer. final float[] rotationMatrix = new float[9]; SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // Express the updated rotation matrix as three orientation angles. final float[] orientationAngles = new float[3]; SensorManager.getOrientation(rotationMatrix, orientationAngles);
সিস্টেমটি ডিভাইসের জিওম্যাগনেটিক ফিল্ড সেন্সর এবং ডিভাইসের অ্যাক্সিলোমিটার ব্যবহার করে ওরিয়েন্টেশন কোণ গণনা করে। এই দুটি হার্ডওয়্যার সেন্সর ব্যবহার করে, সিস্টেমটি নিম্নলিখিত তিনটি ওরিয়েন্টেশন কোণের জন্য ডেটা সরবরাহ করে:
- আজিমুথ (-z অক্ষের চারপাশে ঘূর্ণনের ডিগ্রি)। এটি ডিভাইসের বর্তমান কম্পাস দিক এবং চৌম্বকীয় উত্তরের মধ্যে কোণ। যদি ডিভাইসের উপরের প্রান্তটি চৌম্বকীয় উত্তরের দিকে মুখ করে থাকে, তাহলে আজিমুথ 0 ডিগ্রি হয়; যদি উপরের প্রান্তটি দক্ষিণের দিকে মুখ করে থাকে, তাহলে আজিমুথ 180 ডিগ্রি হয়। একইভাবে, যদি উপরের প্রান্তটি পূর্ব দিকে মুখ করে থাকে, তাহলে আজিমুথ 90 ডিগ্রি হয় এবং যদি উপরের প্রান্তটি পশ্চিমের দিকে মুখ করে থাকে, তাহলে আজিমুথ 270 ডিগ্রি হয়।
- পিচ (x অক্ষের চারপাশে ঘূর্ণনের মাত্রা)। এটি ডিভাইসের স্ক্রিনের সমান্তরাল একটি সমতল এবং মাটির সমান্তরাল একটি সমতলের মধ্যে কোণ। যদি আপনি ডিভাইসটিকে মাটির সমান্তরালভাবে ধরে রাখেন এবং নীচের প্রান্তটি আপনার সবচেয়ে কাছে রাখেন এবং ডিভাইসের উপরের প্রান্তটি মাটির দিকে কাত করেন, তাহলে পিচ কোণটি ধনাত্মক হয়ে ওঠে। বিপরীত দিকে কাত হওয়ার ফলে - ডিভাইসের উপরের প্রান্তটি মাটি থেকে দূরে সরে যাওয়ার ফলে - পিচ কোণটি ঋণাত্মক হয়ে যায়। মানের পরিসর -৯০ ডিগ্রি থেকে ৯০ ডিগ্রি।
- ঘূর্ণন (y অক্ষের চারপাশে ঘূর্ণনের মাত্রা)। এটি ডিভাইসের স্ক্রিনের লম্ব একটি সমতল এবং মাটির লম্ব একটি সমতলের মধ্যে কোণ। যদি আপনি ডিভাইসটিকে মাটির সমান্তরালে ধরেন এবং নীচের প্রান্তটি আপনার সবচেয়ে কাছে রাখেন এবং ডিভাইসের বাম প্রান্তটি মাটির দিকে কাত করেন, তাহলে ঘূর্ণন কোণটি ধনাত্মক হয়ে ওঠে। বিপরীত দিকে কাত হওয়ার ফলে—ডিভাইসের ডান প্রান্তটি মাটির দিকে সরানোর ফলে—রোলের কোণটি ঋণাত্মক হয়ে যায়। মানের পরিসর -১৮০ ডিগ্রি থেকে ১৮০ ডিগ্রি।
দ্রষ্টব্য: জিওসেন্সর ইকোসিস্টেমের বেশিরভাগ বাস্তবায়ন প্রতিফলিত করার জন্য সেন্সরের রোল সংজ্ঞা পরিবর্তিত হয়েছে।
মনে রাখবেন যে এই কোণগুলি বিমান চলাচলে ব্যবহৃত স্থানাঙ্ক ব্যবস্থার চেয়ে ভিন্ন একটি স্থানাঙ্ক ব্যবস্থার উপর কাজ করে (ইয়াও, পিচ এবং রোলের জন্য)। বিমান চলাচল ব্যবস্থায়, x অক্ষটি সমতলের দীর্ঘ পাশ বরাবর, লেজ থেকে নাক পর্যন্ত থাকে।
ওরিয়েন্টেশন সেন্সর অ্যাক্সিলোমিটার এবং জিওম্যাগনেটিক ফিল্ড সেন্সর থেকে কাঁচা সেন্সর ডেটা প্রক্রিয়াকরণ করে তার ডেটা সংগ্রহ করে। এতে জড়িত ভারী প্রক্রিয়াকরণের কারণে, ওরিয়েন্টেশন সেন্সরের নির্ভুলতা এবং নির্ভুলতা হ্রাস পায়। বিশেষ করে, এই সেন্সরটি কেবল তখনই নির্ভরযোগ্য যখন রোল অ্যাঙ্গেল 0 হয়। ফলস্বরূপ, অ্যান্ড্রয়েড 2.2 (API লেভেল 8) এ ওরিয়েন্টেশন সেন্সরটি অবচিত করা হয়েছিল এবং অ্যান্ড্রয়েড 4.4W (API লেভেল 20) এ ওরিয়েন্টেশন সেন্সরের ধরণ অবচিত করা হয়েছিল। ওরিয়েন্টেশন সেন্সর থেকে কাঁচা ডেটা ব্যবহার করার পরিবর্তে, আমরা সুপারিশ করছি যে আপনি getRotationMatrix() পদ্ধতিটি getOrientation() পদ্ধতির সাথে মিলিয়ে ওরিয়েন্টেশন মান গণনা করুন, যেমনটি নিম্নলিখিত কোড নমুনায় দেখানো হয়েছে। এই প্রক্রিয়ার অংশ হিসাবে, আপনি আপনার অ্যাপ্লিকেশনের রেফারেন্স ফ্রেমে ওরিয়েন্টেশন মানগুলি অনুবাদ করতে remapCoordinateSystem() পদ্ধতি ব্যবহার করতে পারেন।
কোটলিন
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private val accelerometerReading = FloatArray(3) private val magnetometerReading = FloatArray(3) private val rotationMatrix = FloatArray(9) private val orientationAngles = FloatArray(3) public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } override fun onResume() { super.onResume() // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer -> sensorManager.registerListener( this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField -> sensorManager.registerListener( this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI ) } } override fun onPause() { super.onPause() // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this) } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. override fun onSensorChanged(event: SensorEvent) { if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size) } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size) } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. fun updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix( rotationMatrix, null, accelerometerReading, magnetometerReading ) // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles) // "orientationAngles" now has up-to-date information. } }
জাভা
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private final float[] accelerometerReading = new float[3]; private final float[] magnetometerReading = new float[3]; private final float[] rotationMatrix = new float[9]; private final float[] orientationAngles = new float[3]; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } @Override protected void onResume() { super.onResume(); // Get updates from the accelerometer and magnetometer at a constant rate. // To make batch operations more efficient and reduce power consumption, // provide support for delaying updates to the application. // // In this example, the sensor reporting delay is small enough such that // the application receives an update before the system checks the sensor // readings again. Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null) { sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } Sensor magneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); if (magneticField != null) { sensorManager.registerListener(this, magneticField, SensorManager.SENSOR_DELAY_NORMAL, SensorManager.SENSOR_DELAY_UI); } } @Override protected void onPause() { super.onPause(); // Don't receive any more updates from either sensor. sensorManager.unregisterListener(this); } // Get readings from accelerometer and magnetometer. To simplify calculations, // consider storing these readings as unit vectors. @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.length); } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.length); } } // Compute the three orientation angles based on the most recent readings from // the device's accelerometer and magnetometer. public void updateOrientationAngles() { // Update rotation matrix, which is needed to update orientation angles. SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerReading, magnetometerReading); // "rotationMatrix" now has up-to-date information. SensorManager.getOrientation(rotationMatrix, orientationAngles); // "orientationAngles" now has up-to-date information. } }
সেন্সরের স্থানাঙ্ক সিস্টেমকে আপনার অ্যাপ্লিকেশনের রেফারেন্স ফ্রেমে অনুবাদ করা ছাড়া সাধারণত ডিভাইসের কাঁচা ওরিয়েন্টেশন কোণগুলির কোনও ডেটা প্রক্রিয়াকরণ বা ফিল্টারিং করার প্রয়োজন হয় না।
ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর ব্যবহার করুন
ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর আপনাকে পৃথিবীর চৌম্বক ক্ষেত্রের পরিবর্তনগুলি পর্যবেক্ষণ করতে দেয়। নিম্নলিখিত কোডটি আপনাকে ডিফল্ট ভূ-চৌম্বকীয় ক্ষেত্র সেন্সরের একটি উদাহরণ কীভাবে পেতে হয় তা দেখায়:
কোটলিন
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
জাভা
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
দ্রষ্টব্য: যদি আপনার অ্যাপটি Android 12 (API লেভেল 31) বা তার উচ্চতর ভার্সনকে টার্গেট করে, তাহলে এই সেন্সরটি রেট-লিমিটেড ।
এই সেন্সরটি তিনটি স্থানাঙ্ক অক্ষের প্রতিটির জন্য কাঁচা ক্ষেত্র শক্তি ডেটা (μT তে) সরবরাহ করে। সাধারণত, আপনাকে সরাসরি এই সেন্সরটি ব্যবহার করার প্রয়োজন হয় না। পরিবর্তে, আপনি কাঁচা ঘূর্ণন গতি নির্ধারণ করতে ঘূর্ণন ভেক্টর সেন্সর ব্যবহার করতে পারেন অথবা আপনি getRotationMatrix() পদ্ধতির সাথে অ্যাক্সিলোমিটার এবং ভূ-চৌম্বকীয় ক্ষেত্র সেন্সর ব্যবহার করে ঘূর্ণন ম্যাট্রিক্স এবং প্রবণতা ম্যাট্রিক্স পেতে পারেন। এরপর আপনি getOrientation() এবং getInclination() পদ্ধতির সাথে এই ম্যাট্রিক্সগুলি ব্যবহার করে আজিমুথ এবং ভূ-চৌম্বকীয় প্রবণতা ডেটা পেতে পারেন।
দ্রষ্টব্য: আপনার অ্যাপটি পরীক্ষা করার সময়, আপনি ডিভাইসটিকে চিত্র-৮ প্যাটার্নে নাড়িয়ে সেন্সরের নির্ভুলতা উন্নত করতে পারেন।
আনক্যালিব্রেটেড ম্যাগনেটোমিটার ব্যবহার করুন
আনক্যালিব্রেটেড ম্যাগনেটোমিটারটি জিওম্যাগনেটিক ফিল্ড সেন্সরের মতোই, তবে চৌম্বক ক্ষেত্রে কোনও শক্ত লোহার ক্রমাঙ্কন প্রয়োগ করা হয় না। কারখানার ক্রমাঙ্কন এবং তাপমাত্রা ক্ষতিপূরণ এখনও চৌম্বক ক্ষেত্রে প্রয়োগ করা হয়। খারাপ শক্ত লোহার অনুমান পরিচালনা করার জন্য আনক্যালিব্রেটেড ম্যাগনেটোমিটার কার্যকর। সাধারণভাবে, geomagneticsensor_event.values[0] uncalibrated_magnetometer_event.values[0] - uncalibrated_magnetometer_event.values[3] এর কাছাকাছি হবে। অর্থাৎ,
calibrated_x ~= uncalibrated_x - bias_estimate_x
দ্রষ্টব্য: আনক্যালিব্রেটেড সেন্সরগুলি আরও কাঁচা ফলাফল প্রদান করে এবং কিছু পক্ষপাত অন্তর্ভুক্ত করতে পারে, তবে তাদের পরিমাপে ক্যালিব্রেশনের মাধ্যমে প্রয়োগ করা সংশোধন থেকে কম লাফ থাকে। কিছু অ্যাপ্লিকেশন এই আনক্যালিব্রেটেড ফলাফলগুলিকে মসৃণ এবং আরও নির্ভরযোগ্য হিসাবে পছন্দ করতে পারে। উদাহরণস্বরূপ, যদি কোনও অ্যাপ্লিকেশন নিজস্ব সেন্সর ফিউশন পরিচালনা করার চেষ্টা করে, তাহলে ক্যালিব্রেশন প্রবর্তন আসলে ফলাফলগুলিকে বিকৃত করতে পারে।
চৌম্বক ক্ষেত্র ছাড়াও, আনক্যালিব্রেটেড ম্যাগনেটোমিটার প্রতিটি অক্ষে আনুমানিক হার্ড লৌহ পক্ষপাতও প্রদান করে। নিম্নলিখিত কোডটি আপনাকে দেখায় কিভাবে ডিফল্ট আনক্যালিব্রেটেড ম্যাগনেটোমিটারের একটি উদাহরণ পেতে হয়:
কোটলিন
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED)
জাভা
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
প্রক্সিমিটি সেন্সর ব্যবহার করুন
প্রক্সিমিটি সেন্সর আপনাকে নির্ধারণ করতে দেয় যে কোনও বস্তু একটি ডিভাইস থেকে কত দূরে। নিম্নলিখিত কোডটি আপনাকে দেখায় কিভাবে ডিফল্ট প্রক্সিমিটি সেন্সরের একটি উদাহরণ পেতে হয়:
কোটলিন
private lateinit var sensorManager: SensorManager private var sensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
জাভা
private SensorManager sensorManager; private Sensor sensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
প্রক্সিমিটি সেন্সর সাধারণত হ্যান্ডসেট ডিভাইসের মুখ থেকে একজন ব্যক্তির মাথা কত দূরে তা নির্ধারণ করতে ব্যবহৃত হয় (উদাহরণস্বরূপ, যখন একজন ব্যবহারকারী ফোন কল করছেন বা গ্রহণ করছেন)। বেশিরভাগ প্রক্সিমিটি সেন্সর পরম দূরত্ব, সেমিতে ফেরত দেয়, তবে কিছু কেবল কাছাকাছি এবং দূরের মান ফেরত দেয়।
দ্রষ্টব্য: কিছু ডিভাইস মডেলে, প্রক্সিমিটি সেন্সরটি স্ক্রিনের নীচে অবস্থিত থাকে, যা স্ক্রিন চালু থাকাকালীন সক্ষম করা হলে স্ক্রিনে একটি ব্লিঙ্কিং ডট দেখা দিতে পারে।
নিম্নলিখিত কোডটি আপনাকে প্রক্সিমিটি সেন্সর কীভাবে ব্যবহার করবেন তা দেখায়:
কোটলিন
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var proximity: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { val distance = event.values[0] // Do something with this sensor data. } override fun onResume() { // Register a listener for the sensor. super.onResume() proximity?.also { proximity -> sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL) } } override fun onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause() sensorManager.unregisterListener(this) } }
জাভা
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor proximity; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); proximity = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float distance = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); sensorManager.registerListener(this, proximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); sensorManager.unregisterListener(this); } }
দ্রষ্টব্য: কিছু প্রক্সিমিটি সেন্সর বাইনারি মান প্রদান করে যা "কাছাকাছি" বা "দূর" প্রতিনিধিত্ব করে। এই ক্ষেত্রে, সেন্সর সাধারণত দূর অবস্থায় তার সর্বোচ্চ পরিসরের মান এবং কাছাকাছি অবস্থায় তার কম মান প্রদান করে। সাধারণত, দূরের মান 5 সেমি থেকে বেশি হয়, তবে এটি সেন্সর থেকে সেন্সরে পরিবর্তিত হতে পারে। আপনি getMaximumRange() পদ্ধতি ব্যবহার করে একটি সেন্সরের সর্বোচ্চ পরিসর নির্ধারণ করতে পারেন।