অবস্থান সেন্সর

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

দ্রষ্টব্য: Android 2.2 (API লেভেল 8) এ ওরিয়েন্টেশন সেন্সর অবচয় করা হয়েছে এবং Android 4.4W (API লেভেল 20) এ ওরিয়েন্টেশন সেন্সর টাইপ অবচয় করা হয়েছে।

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

জিওম্যাগনেটিক ফিল্ড সেন্সর এবং অ্যাক্সিলোমিটার প্রতিটি SensorEvent জন্য সেন্সর মানের বহু-মাত্রিক অ্যারে প্রদান করে। উদাহরণস্বরূপ, জিওম্যাগনেটিক ফিল্ড সেন্সর একটি একক সেন্সর ই��েন্টের সময় তিনটি স্থানাঙ্ক অক্ষের প্রতিটির জন্য ভূ-চৌম্বকীয় ক্ষেত্রের শক্তির মান প্রদান করে। একইভাবে, অ্যাক্সিলোমিটার সেন্সর একটি সেন্সর ইভেন্টের সময় ডিভাইসে প্রয়োগ করা ত্বরণ পরিমাপ করে। সেন্সর দ্বারা ব্যবহৃত স্থানাঙ্ক সিস্টেম সম্পর্কে আরও তথ্যের জন্য, সেন্সর স্থানাঙ্ক সিস্টেমগুলি দেখুন। প্রক্সিমিটি সেন্সর প্রতিটি সেন্সর ইভেন্টের জন্য একটি একক মান প্রদান করে। সারণী 1 Android প্ল্যাটফর্মে সমর্থিত অবস্থান সেন্সরগুলির সংক্ষিপ্ত বিবরণ দেয়৷

সারণী 1. অবস্থান সেন্সর যা Android প্ল্যাটফর্মে সমর্থিত।

সেন্সর সেন্সর ইভেন্ট ডেটা বর্ণনা পরিমাপের একক
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 1 SensorEvent.values[0] আজিমুথ (z-অক্ষের চারপাশে কোণ)। ডিগ্রি
SensorEvent.values[1] পিচ (এক্স-অক্ষের চারপাশে কোণ)।
SensorEvent.values[2] রোল (y-অক্ষের চারপাশে কোণ)।
TYPE_PROXIMITY SensorEvent.values[0] বস্তু থেকে দূরত্ব। 2 সেমি

1 এই সেন্সরটি Android 2.2 (API লেভেল 8) এ অবচয়িত ছিল এবং এই সেন্সর প্রকারটি Android 4.4W (API লেভেল 20) এ অবচয়িত হয়েছে। সেন্সর ফ্রেমওয়ার্ক ডিভাইসের অভিযোজন অর্জনের জন্য বিকল্প পদ্ধতি প্রদান করে, যা ডিভাইসের অভিযোজন গণনাতে আলোচনা করা হয়েছে।

2 কিছু প্রক্সিমিটি সেন্সর শুধুমাত্র কাছাকাছি এবং দূরে প্রতিনিধিত্ব করে বাইনারি মান প্রদান করে।

গেম রোটেশন ভেক্টর সেন্সর ব্যবহার করুন

গেম রোটেশন ভেক্টর সেন্সরটি রোটেশন ভেক্টর সেন্সরের সাথে অভিন্ন, তবে এটি জিওম্যাগনেটিক ফিল্ড ব্যবহার করে না। তাই Y অক্ষ উত্তর নির্দেশ করে না বরং অন্য কোনো রেফারেন্সের দিকে নির্দেশ করে। জাইরোস্কোপ জেড অক্ষের চারপাশে প্রবাহিত হওয়ার মতো মাত্রার একই ক্রম অনুসারে সেই রেফারেন্সটিকে প্রবাহিত করার অনুমতি দেওয়া হয়।

যেহেতু গেম রোটেশন ভেক্টর সেন্সর চৌম্বক ক্ষেত্র ব্যবহার করে না, আপেক্ষিক ঘূর্ণনগুলি আরও সঠিক, এবং চৌম্বক ক্ষেত্রের পরিবর্তন দ্বারা প্রভাবিত হয় না। একটি গেমে এই সেন্সরটি ব্যবহার করুন যদি আপনি উত্তর কোথায় তা নিয়ে চিন্তা না করেন এবং চৌম্বক ক্ষেত্রের উপর নির্ভরতার কারণে স্বাভাবিক ঘূর্ণন ভেক্টর আপনার প্রয়োজনের সাথে খাপ খায় না।

নিম্নলিখিত কোডটি আপনাকে দেখায় কিভাবে ডিফল্ট গেম রোটেশন ভেক্টর সেন্সরের একটি উদাহরণ পেতে হয়:

কোটলিন

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 অক্ষ সম্পর্কে ঘূর্ণনের ডিগ্রি)। এটি ডিভাইসের পর্দার সমান্তরাল সমতল এবং মাটির সমান্তরাল সমতলের মধ্যে কোণ। আপনি যদি যন্ত্রটিকে মাটির সমান্তরালে নীচের প্রান্তটি আপনার সবচেয়ে কাছাকাছি ধরে রাখেন এবং ডিভাইসের উপরের প্রান্তটিকে মাটির দিকে কাত করেন, পিচ কোণটি ইতিবাচক হয়ে যায়। বিপরীত দিকে কাত করা - যন্ত্রের উপরের প্রান্তটি মাটি থেকে দূরে সরানো - পিচ কোণটি ঋণাত্মক হয়ে যায়। মানের পরিসীমা -90 ডিগ্রী থেকে 90 ডিগ্রী।
  • রোল (y অক্ষ সম্পর্কে ঘূর্ণনের ডিগ্রি)। এটি ডিভাইসের স্ক্রিনের লম্ব এবং ভূমিতে লম্ব একটি সমতলের মধ্যে কোণ। আপনি যদি ডিভাইসটিকে মাটির সমান্তরালে নীচের প্রান্তটি আপনার সবচেয়ে কাছাকাছি ধরে রাখেন এবং ডিভাইসের বাম প্রান্তটিকে মাটির দিকে কাত করেন, রোল কোণটি ধনাত্মক হয়ে যায়। বিপরীত দিকে কাত করা - যন্ত্রের ডান প্রান্তটিকে মাটির দিকে সরানো - রোল কোণটি ঋণাত্মক হয়ে যায়। মানের পরিসীমা -180 ডিগ্রী থেকে 180 ডিগ্রী।

দ্রষ্টব্য: জিওসেন্সর ইকোসিস্টেমের বেশিরভাগ বাস্তবায়নকে প্রতিফলিত করতে সেন্সরের রোল সংজ্ঞা পরিবর্তিত হয়েছে।

লক্ষ্য করুন যে এই কোণগুলি বিমান চালনায় ব্যবহৃত একটি (ইয়াও, পিচ এবং রোলের জন্য) থেকে একটি ভিন্ন স্থানাঙ্ক সিস্টেমের কাজ করে। বিমান চলাচল ব্যবস্থায়, x অক্ষটি লেজ থেকে ��াক পর্যন্ত সমতলের দীর্ঘ পাশে থাকে।

অরিয়েন্টেশন সেন্সরটি এক্সেলেরোমিটার এবং জিওম্যাগনেটিক ফিল্ড সেন্সর থেকে কাঁচা সেন্সর ডেটা প্রক্রিয়াকরণ করে তার ডেটা সংগ্রহ করে। ভারী প্রক্রিয়াকরণ জড়িত থাকার কারণে, ওরিয়েন্টেশন সেন্সরের নির্ভুলতা এবং নির্ভুলতা হ্রাস পেয়েছে। বিশেষত, এই সেন্সরটি তখনই নির্ভরযোগ্য যখন রোল অ্যাঙ্গেল 0 হয়। ফলস্বরূপ, Android 2.2 (API লেভেল 8) এ ওরিয়েন্টেশন সেন্সর অবচয় করা হয়েছে এবং Android 4.4W (API লেভেল 20) এ ওরিয়েন্টেশন সেন্সর টাইপ অবচয় করা হয়েছে। ওরিয়েন্টেশন সেন্সর থেকে কাঁচা ডেটা ব্যবহার করার পরিবর্তে, আমরা সুপারিশ করি যে আপনি নিচের কোড নমুনায় দেখানো হয়েছে, অভিযোজন মান গণনা করতে getOrientation() পদ্ধতির সাথে একযোগে getRotationMatrix() পদ্ধতি ব্যবহার করুন। এই প্রক্রিয়ার অংশ হিসেবে, আপনি 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() পদ্ধতির সাথে এই ম্যাট্রিক্সগুলি ব্যবহার করতে পারেন।

দ্রষ্টব্য: আপনার অ্যাপটি পরীক্ষা করার সময়, আপনি একটি চিত্র-8 প্যাটার্নে ডিভাইসটি নাড়ানোর মাধ্যমে সেন্সরের নির্ভুলতা উন্নত করতে পারেন।

ক্যালিব্রেটেড ম্যাগনেটোমিটার ব্যবহার করুন

আনক্যালিব্রেটেড ম্যাগনেটোমিটারটি জিওম্যাগনেটিক ফিল্ড সেন্সরের অনুরূপ, তবে চৌম্বক ক্ষেত্রের ক্ষেত্রে কোন শক্ত লোহার ক্রমাঙ্কন প্রয়োগ করা হয় না। কারখানার ক্রমাঙ্কন এবং তাপমাত্রা ক্ষতিপূরণ এখনও চৌম্বক ক্ষেত্রে প্রয়োগ করা হয়। অক্যালিব্রেটেড ম্যাগনেটোমিটার খারাপ শক্ত লোহার অনুমান পরিচালনা করতে কার্যকর। সাধারণভাবে, 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() পদ্ধতি ব্যবহার করে আপনি একটি সেন্সরের সর্বোচ্চ পরিসীমা নির্ধারণ করতে পারেন।

আপনারও পড়া উচিত