মোবাইল ডিভাইসে অ্যাক্সেলারোমিটার হল একটি MEMS সেন্সর যা ডিভাইসের অরিএন্টেশন এবং গতি নির্ধারণের জন্য তিনটি অক্ষে রৈখিক ত্বরণ মাপে। Google Android Sensors Guide (2025) অনুযায়ী, অ্যাক্সেলারোমিটার মোবাইল অ্যাপ্লিকেশনে সবচেয়ে বেশি ব্যবহৃত সেন্সর। MEMS প্রযুক্তি সেন্সরটিকে 1 মিমি চিপে রাখার অনুমতি দেয় যা 1 mW এর কম শক্তি ব্যবহার করে।
মূখ্য বিষয়াবলী
অ্যাক্সেলারোমিটার হল একটি মাইক্রোইলেক্ট্রোমিক্যানিকাল (MEMS) সেন্সর যা তিনটি পরস্পর লম্ব অক্ষে ত্বরণের প্রক্ষেপ মাপে: X (অনুভূমিক, ডানে দিকে), Y (উল্লম্ব, উপরের দিকে) এবং Z (স্ক্রিন তলের লম্বভাবে)। বিশ্রামে, অ্যাক্সেলারোমিটার Z অক্ষে 9.8 m/s² দেখায় — এটি পৃথিবীর কেন্দ্রের দিকে নির্দেশিত মধ্যাকর্ষণ ত্বরণ। এই মানের উপর ভিত্তি করে, সিস্টেম ডিভাইসের অরিএন্টেশন নির্ধারণ করে: যদি Z মান 0 এর কাছাকাছি এবং Y মান -9.8 m/s² এর কাছাকাছি হয়, তাহলে ডিভাইসটি অনুভূমিকভাবে ঘুরানো আছে। অ্যাক্সেলারোমিটারের মাপ পরিসর সাধারণত চিপ মডেলের উপর নির্ভর করে ±2g, ±4g, ±8g বা ±16g হয়।
আধুনিক অ্যাক্সেলারোমিটার বেশ কিছু গুরুত্বপূর্ণ প্যারামিটার দ্বারা চিহ্নিত করা হয়: সংবেদনশীলতা (0.001 m/s² থেকে), নমুনা হার (1000 Hz পর্যন্ত), মাপ পরিসর এবং গর্মির স্তর। ফ্ল্যাগশিপ ডিভাইসে 1600 Hz পর্যন্ত ফরক্যুয়েন্সি এবং সক্রিয় মোডে 0.5 mW এর কম পাওয়ার ব্যবহার সহ STMicroelectronics LSM6DSO বা Bosch BMI270 সেন্সর ব্যবহার করে। নমুনা হার যত বেশি, অ্যাপ্লিকেশন তত বেশি বিস্তারিত সংকেত পায় — গেমের জন্য 200–400 Hz প্রয়োজন, যতক্ষণে পা গণনার জন্য 10–50 Hz যথেষ্ট। সেন্সরের গর্মি মাপের সঙ্গেততাকে প্রভাবিত করে এবং সাধারণত OS স্তরে লো-পাস ফিল্টার দ্বারা ক্ষতিপূর্তি করা হয়।
একটি MEMS অ্যাক্সেলারোমিটার আন্তরিকভাবে সিলিকনের একটি অণুবীক্ষণিক গঠন নিয়ে গঠিত: একটি প্রুফ মাস যা স্থির ইলেক্ট্রোডের মধ্যে ইলাস্টিক ক্যান্টিলিভারের উপর ঝুলন্ত থাকে। যখন ত্বরণ হয়, ভরটি সরে, গতিশীল এবং স্থির উপাদানের মধ্যে ধারিত্ব পরিবর্তন করে — এই পরিবর্তন মাপা হয় এবং একটি বৈদুতিক সংকেতে রূপান্তরিত হয়। একটি ক্লোজড-লূপ ফিডব্যাক সার্কিট ইলেক্ট্রোস্ট্যাটিক বল ব্যবহার করে ভরটিকে কেন্দ্রীয় অবস্থানে ধরে, সম্পূর্ণ পরিসরে রৈখিকতা নিশ্চিত করে। ওপন-লূপ সিস্টেমে, ভরটি স্বাধীনভাবে চলে, যা গণনা সহজ করলেও সঙ্গেততা কমায়। STMicroelectronics (2025) অনুযায়ী, ক্লোজড-লূপ অ্যাক্সেলারোমিটার 0.1 mg/°C এর কম তাপমাত্রা বিচ্যুতি সহ 0.001g পর্যন্ত সঙ্গেততা অর্জন করে।
অ্যাক্সেলারোমিটারের তিনটি অক্ষ তিনটি স্থানিক মাত্রার সঙ্গে মেলে: X (বাঁ-ডান হেল), Y (উপর-নীচে) এবং Z (স্ক্রিনের সাপেক্ষে সামনে-পিছনে)। যখন ডিভাইসটি স্ক্রিন উপর করে টেবিলে রাখা হয়, মধ্যাকর্ষণ বেক্টর Z অক্ষে 9.8 m/s² এ থাকে। যখন ডিভাইসটি কাতানো হয়, মধ্যাকর্ষণ প্রক্ষেপগুলি অক্ষগুলির মধ্যে পুনর্বিতরিত হয় — এই প্রক্ষেপগুলি থেকে, 0.1 ডিগ্রী পর্যন্ত সঙ্গেততার সাথে কাতানোর কোণ পরিগণিত করা যায়। মধ্যাকর্ষণের প্রভাব ছাড়া গতি শনাক্তের জন্য, ত্বরণের গতিশীল উপাদান (ডিভাইসের নিজস্ব গতি) কে স্থির উপাদান (মধ্যাকর্ষণ) থেকে আলাদা করতে একটি হাই-পাস ফিল্টার ব্যবহার করা হয়।
Android এ, অ্যাক্সেলারোমিটার এ প্রবেশ SensorManager ক্লাস এবং SensorEventListener ইন্টারফেসের মাধ্যমে প্রদান করা হয়। অ্যাপ্লিকেশন SENSOR_SERVICE সিস্টেম সার্ভিস প্রাপ্ত করে, TYPE_ACCELEROMETER সেন্সর অনুরোধ করে এবং একটি নির্দিষ্ট হারে একটি লিস্টনার পঞ্জীকৃত করে। সিস্টেম onSensorChanged কে প্রতিটি নতুন মাপের সাথে মানের একটি অ্যারে সহ ডাকে: values[0] = X, values[1] = Y, values[2] = Z। নীচে Kotlin এ অ্যাক্সেলারোমিটার ডেটা পড়ার একটি সম্পূর্ণ উদাহরণ দেওয়া হলো।
val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
val sensorEventListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
// কাতানোর কোণ পরিগণনা
val pitch = Math.atan2(
x.toDouble(),
Math.sqrt(y.toDouble() * y + z.toDouble() * z)
)
// নতুন কোণ সহ UI আপডেট
textViewAngle.text = "কাত: ${Math.toDegrees(pitch)}°"
}
override fun onAccuracyChanged(
sensor: Sensor, accuracy: Int
) { }
}
sensorManager.registerListener(
sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_GAME
)
উদাহরণে, SensorManager.SENSOR_DELAY_GAME আপডেট হার ~50 Hz এ সেট করে, যা গেম এবং ইন্টারাক্টিভ অ্যাপ্লিকেশনের জন্য ইশ্টম। পা গণনার জন্য, SENSOR_DELAY_NORMAL (~5 Hz) ব্যবহার করুন; সঙ্গেত মাপের জন্য, SENSOR_DELAY_FASTEST (~200 Hz) ব্যবহার করুন। onSensorChanged এ, event.values অ্যারেতে বর্তমান সেন্সর রিডিং থাকে। X, Y, Z মানের উপর ভিত্তি করে, atan2 ব্যবহার করে পিটচ কোণ পরিগণিত করা হয় — এটি অরিএন্টেশন সেন্সর ব্যবহার না করে ডিভাইসের অরিএন্টেশন নির্ধারণের মৌলিক সূত্র। ব্যাটারি বাঁচাতে onPause এ লিস্টনার অন়্জীকৃত করতে ভুলবেন না।
private val alpha = 0.8f
private val gravity = FloatArray(3)
private val linearAcceleration = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
// মধ্যাকর্ষণ নিস্কর্ষণের জন্য লো-পাস ফিল্টার (LPF)
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]
// মধ্যাকর্ষণ বিয়োগ — রৈখিক ত্বরণ পাওয়া
linearAcceleration[0] = event.values[0] - gravity[0]
linearAcceleration[1] = event.values[1] - gravity[1]
linearAcceleration[2] = event.values[2] - gravity[2]
}
alpha সঙ্গ্যা সহ একটি লো-পাস ফিল্টার মধ্যাকর্ষণ উপাদান (স্থির বেক্টর) নিস্কর্ষণ করে; এটি বিয়োগ করলে ডিভাইসের নির্মল ত্বরণ (রৈখিক ত্বরণ) পাওয়া যায়। অরিএন্টেশন কথা মাথায় না রেখে গতি শনাক্তের জন্য এটি প্রয়োজন — উদাহরণস্বরূপ, একটি পা, ঝাঁকি বা প্রভাব শনাক্তের জন্য। 0.8 এর alpha মানে হল ফিল্টারটি প্রায় 20% নতুন সংকেত পাস করে এবং 80% পূর্ববর্তী ধরে রাখে — গুরুতর্পূর্ণ বিলম্ব ছাড়া গর্মি দূর করার জন্য যথেষ্ট।
iOS এ, অ্যাক্সেলারোমিটার এ প্রবেশ CMMotionManager ক্লাসের মাধ্যমে Core Motion ফ্রেমওয়ার্ক দ্বারা প্রদান করা হয়। অ্যাপ্লিকেশন একটি ম্যানেজার ইনস্ট্যান্স তৈরি করে এবং একটি ক্যু এবং হ্যান্ডালার সহ startAccelerometerUpdates কে কল করে। ডেটা CMAccelerometerData আকারে ফিরে আসে, যাতে x, y এবং z ফিল্ড সহ একটি CMAcceleration স্ট্রাকচার থাকে। নীচে গর্মি ফিল্টারিং সহ Swift এ অ্যাক্সেলারোমিটার ডেটা পাওয়ার একটি উদাহরণ দেওয়া হলো।
import CoreMotion
let motionManager = CMMotionManager()
motionManager.accelerometerUpdateInterval = 1.0 / 60.0
guard motionManager.isAccelerometerAvailable else { return }
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) {
data, error in
guard let acceleration = data?.acceleration,
error == nil else { return }
// g এ মান (1 g = 9.8 m/s²)
let magnitude = sqrt(
acceleration.x * acceleration.x +
acceleration.y * acceleration.y +
acceleration.z * acceleration.z
)
// যদি magnitude > 2.5 g — ঝাঁকি শনাক্ত হয়েছে
if magnitude > 2.5 {
DispatchQueue.main.async {
self.handleShake()
}
}
}
উদাহরণে, accelerometerUpdateInterval 1/60 সেকেন্ড (~60 Hz) এ সেট করা হয় — মোটামুটি অ্যানিমেশন এবং গেমের জন্য ইশ্টম। isAccelerometerAvailable পদ্ধতি यাচাই করে যে সেন্সরটি ডিভাইসে উপলব্ধ কিনা। ত্বরণ মান g এককে ফিরে আসে (1 g = 9.8 m/s²)। magnitude বেক্টর তিনটি উপাদানের ইউক্লিডিয়ান নর্ম হিসাবে পরিগণিত হয় — যদি মান 2.5 g অতিক্রম করে, তাহলে এটিকে একটি ডিভাইস ঝাঁকি বলে ব্যাখ্যা করা হয়। আপডেট বন্ধ করতে, স্ক্রিন থেকে বাইরে যাওয়ার সময় সবসময় stopAccelerometerUpdates কল করুন।
অ্যাক্সেলারোমিটার মোবাইল অ্যাপ্লিকেশনের একটি বিস্তৃত পরিসরে ব্যবহৃত হয়। সবচেয়ে স্পষ্ট পরিদর্শন হল স্বচালিত স্ক্রিন ঘূর্ণন: সিস্টেম অ্যাক্সেলারোমিটার ডেটার উপর ভিত্তি করে পোর্ট্রেট এবং ল্যান্ডস্কেপের মধ্যে স্যংচ করে। গেমে, অ্যাক্সেলারোমিটার একটি নিয়ন্ত্রণ ইনপুট হিসাবে কাজ করে — ডিভাইস কাতানোর ফলে স্টিয়রিং ওয়ীল ঘুরে বা চরিত্র সরে। ফিটনেস অ্যাপ্লিকেশন হাঁটার সময় চারিত্রিক ত্বরণ শৃঙ্খলের উপর ভিত্তি করে পা গণনা করে। নীচে বিশিষ্ট পরিদর্শন এবং সেন্সর প্রয়োজনীয়তার একটি ছক দেওয়া হলো।
| পরিদর্শন | ফরক্যুয়েন্সি (Hz) | সঙ্গেততা | ফিল্টারিং |
|---|---|---|---|
| স্বচালিত স্ক্রিন ঘূর্ণন | 5–10 | কম | LPF |
| পা গণনা | 20–50 | মধ্যম | HPF + শৃঙ্খল ডিটেক্টর |
| গেম (রেসিং) | 50–200 | উচ্চ | ক্যালিব্রেশন + LPF |
| ক্যামেরা স্থিরীকরণ | 200–1000 | সর্বোচ্চ | পরিপূরক ফিল্টার |
| ইঙ্গিত শনাক্তি | 50–100 | মধ্যম | HPF + থ্রেশোল্ড ডিটেক্টর |
অ্যাক্সেলারোমিটার বাস্তবায়ন করার সময়, ডিভাইস গরম হওয়া এবং সেন্সরের বয়স রিডিং সঙ্গেততা প্রভাবিত করতে পারে বলে মনে রাখুন। গুরুতর্পূর্ণ মাপের (ভিডিও স্থিরীকরণ, কম্পাস) জন্য, সেন্সর ফিউজনের অংশ হিসাবে গাইরোস্কোপ এবং ম্যাগনেটোমিটার ব্যবহার করার সুপারিশ করা হয়।
অ্যাক্সেলারোমিটার বেশ কিছু ধরনের ত্রুটির সম্মুখীন হয়: শূন্য পক্ষপাত — যখন সেন্সর বিশ্রামে অশূন্য মান দেখায়; মাপকে গুণাঙ্ক ত্রুটি — যখন অক্ষগুলিতে সংবেদনশীলতা ভিন্ন হয়; এবং মাপ গর্মি, যা একটি রিডিংয়ের সঙ্গেততা হ্রাস করে। MEMS সেন্সর উৎপাদনের সময় ক্যালিব্রেট করা হয়, কিন্তু সময়ের সাথে তাপমাত্রা এবং যান্ত্রিক চাপের কারণে প্যারামিটার বিচ্যুত হতে পারে। অ্যাপ্লিকেশনে ক্ষতিপূর্তির জন্য, একটি সরল ক্যালিব্রেশন বাস্তবায়ন করা যায়: বিশ্রামে, গড় মান (পক্ষপাত) রিকর্ড করুন এবং এটি পরবর্তী সকল মাপ থেকে বিয়োগ করুন। আরও সঙ্গেত ক্যালিব্রেশনের জন্য ডিভাইসটিকে সকল অক্ষে ঘুরাতে হবে — এই পদ্ধতিটিকে ছট বিন্দু ক্যালিব্রেশন বলা হয় এবং এটি 0.5% এর কম ত্রুটি অর্জন করে।
সাধারণ জিজ্ঞাসা
স্মার্টফোনে অ্যাক্সেলারোমিটার হল প্রায় 1 মিমি আকারের একটি MEMS সেন্সর যা তিনটি অক্ষে ত্বরণ মাপে। এটি বাহ্যিক উৎস ব্যবহার না করে ডিভাইসের অরিএন্টেশন (পোর্ট্রেট বা ল্যান্ডস্কেপ), ঝাঁকি, পা এবং গতি নির্ধারণ করে।
অ্যাক্সেলারোমিটার রৈখিক ত্বরণ (মধ্যাকর্ষণ সহ) মাপে, যতক্ষণে গাইরোস্কোপ কোণিয় বেগ (ঘূর্ণন) মাপে। অ্যাক্সেলারোমিটার অরিএন্টেশন নির্ধারণ করে, গাইরোস্কোপ ঘূর্ণন শনাক্ত করে। একসাংগে তারা স্থানে সঙ্গেত গতি ট্রেকিং (সেন্সর ফিউজন) প্রদান করে।
সেন্সর পাওয়ার জন্য SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) ব্যবহার করুন, তারপর SensorEventListener এর সাথে registerListener করুন। onSensorChanged এ, event.values অ্যারেতে X, Y, Z মান m/s² এ থাকে। onPause এ সবসময় লিস্টনার অন়্জীকৃত করুন।
magnitude = sqrt(x² + y² + z²) পরিগণনা করুন। যদি মান 2–3 g (মধ্যাকর্ষণ ফিল্টারিংয়ের পর) অতিক্রম করে, তাহলে ডিভাইসটি ঝাঁকানো হয়েছে। iOS এ, 2.5 g এর থ্রেশোল্ড সহ CMMotionManager ব্যবহার করুন; Android এ, 15 m/s² এর থ্রেশোল্ড সহ Sensor.TYPE_LINEAR_ACCELERATION ব্যবহার করুন।
হ্যাঁ, একটি সরল ক্যালিব্রেশন এর জন্য, ডিভাইসটি একটি সমতল পৃষ্ঠে রাখুন, 2–3 সেকেন্ড ধরে প্রতিটি অক্ষের গড় রিডিং রিকর্ড করুন এবং এই মানগুলি পরবর্তী সকল মাপ থেকে বিয়োগ করুন। এটি শূন্য পক্ষপাত ক্ষতিপূর্তি করে কিন্তু মাপকে ত্রুটি নয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন