সেন্সর ফিউশন — একটি প্র্যাকটিক্যাল পরিচিতি
এই পাঠে যা শিখবেন
- সেন্সর ফিউশন কী এবং কেন এটি একক সেন্সরের চেয়ে ভালো ফলাফল দিতে পারে
- ইনভার্স-ভ্যারিয়েন্স ওয়েটেড এভারেজের গাণিতিক ভিত্তি
- একটি জেনুইন, বহু-ট্রায়াল সিমুলেশনে ফিউশনের সুবিধা কীভাবে পরিমাপ করা যায়
- এই বিষয়ের সীমা — কেন এটি "পূর্ণাঙ্গ Kalman filter" নয়, এবং সেই গভীরতর বিষয় কোথায় শুরু হয়
১ · সেন্সর ফিউশন কী
বাস্তব এমবেডেড/IoT সিস্টেমে প্রায়ই একাধিক সেন্সর একই রাশি (বা সম্পর্কিত রাশি) পরিমাপ করে — যেমন একটি IMU-তে অ্যাক্সিলেরোমিটার ও জাইরোস্কোপ দুটোই ওরিয়েন্টেশন সম্পর্কে তথ্য দেয়, বা দুটো ভিন্ন দূরত্ব সেন্সর একই বস্তুর দূরত্ব মাপে। প্রতিটি সেন্সরের নিজস্ব নয়েজ বৈশিষ্ট্য থাকে — একটি হয়তো বেশি নির্ভুল কিন্তু ধীর, আরেকটি কম নির্ভুল কিন্তু দ্রুত। সেন্সর ফিউশনSensor Fusionএকাধিক সেন্সরের রিডিং পরিসংখ্যানগতভাবে যৌক্তিক উপায়ে মিলিয়ে একটি একক, পৃথক যেকোনো সেন্সরের চেয়ে বেশি নির্ভুল অনুমান তৈরি করার প্রক্রিয়া। হলো এই একাধিক রিডিংকে একটি স্মার্ট উপায়ে মিলিয়ে একটি একক, বেশি নির্ভরযোগ্য অনুমান তৈরি করার প্রক্রিয়া।
বাস্তব সেন্সর ফিউশন সিস্টেম (যেমন Kalman filter, Extended Kalman Filter, Complementary Filter) সময়ের সাথে পরিবর্তনশীল অবস্থা (state) ট্র্যাক করে, প্রেডিকশন ও আপডেট ধাপ আলাদাভাবে সামলায়, এবং একটি গভীর, স্বতন্ত্র বিষয় — এই পাঠ সেই পূর্ণাঙ্গ গণিত কভার করে না। এখানে আমরা শুধু ফিউশনের সবচেয়ে মৌলিক বিল্ডিং-ব্লক — একই মুহূর্তের একাধিক স্বাধীন রিডিং-কে কীভাবে পরিসংখ্যানগতভাবে যৌক্তিক উপায়ে মেলানো যায় — তার একটি বাস্তব, চলমান উদাহরণ দেখছি।
২ · ইনভার্স-ভ্যারিয়েন্স ওয়েটেড এভারেজ
যদি দুটো স্বাধীন সেন্সর একই প্রকৃত মান মাপে, প্রতিটির নিজস্ব নয়েজ ভ্যারিয়েন্স ($\sigma_A^2$ ও $\sigma_B^2$) সহ, তাহলে পরিসংখ্যানগতভাবে সবচেয়ে নির্ভুল ফিউজড অনুমান পাওয়া যায় প্রতিটি সেন্সরকে তার ভ্যারিয়েন্সের ব্যস্তানুপাতে (inversely) ওয়েট দিয়ে — অর্থাৎ যে সেন্সর কম নয়েজি (কম ভ্যারিয়েন্স), সে বেশি ওয়েট পায়:
$$ w_A = \frac{1/\sigma_A^2}{1/\sigma_A^2 + 1/\sigma_B^2}, \qquad w_B = \frac{1/\sigma_B^2}{1/\sigma_A^2 + 1/\sigma_B^2} $$ $$ \hat{x}_{\text{fused}} = w_A \cdot x_A + w_B \cdot x_B $$লক্ষ্য করুন $w_A + w_B = 1$ সবসময় সত্য (ওয়েটগুলো নরমালাইজড)। এই সূত্রটি একটি পরিচিত পরিসংখ্যান ফলাফলের সরল রূপ — দুটো স্বাধীন অনুমানের সবচেয়ে কম-ভ্যারিয়েন্স লিনিয়ার কম্বিনেশন (best linear unbiased estimator) ঠিক এই ইনভার্স-ভ্যারিয়েন্স ওয়েটিং-এই পাওয়া যায়।
৩ · Python সিমুলেশন — ফিউশন সত্যিই দুটো সেন্সরকে হারায় কিনা
নিচের কোড সেলে দুটো সিমুলেটেড সেন্সর — সেন্সর A (বেশি নয়েজি, $\sigma_A = 3.0$) ও সেন্সর B (কম নয়েজি, $\sigma_B = 1.0$) — একই প্রকৃত মান (৫০.০ সেমি দূরত্ব ধরা হয়েছে) বহুবার (৩০০ ট্রায়াল) মাপছে, প্রতিটি সেন্সরের জন্য আলাদা ফিক্সড সিড ব্যবহার করে। প্রতিটি ট্রায়ালে ইনভার্স-ভ্যারিয়েন্স ওয়েটেড এভারেজ দিয়ে দুটো রিডিং ফিউজ করা হয়, এবং শেষে তিনটি গড় পরম ত্রুটি (MAE) — সেন্সর A একা, সেন্সর B একা, ও ফিউজড — তুলনা করা হয়েছে।
import random
TRUE_VALUE = 50.0 # প্রকৃত দূরত্ব (cm) -- দুটো ভিন্ন সেন্সর একই বস্তু মাপছে
SENSOR_A_STD = 3.0 # সেন্সর A -- কম নির্ভুল (বেশি নয়েজ)
SENSOR_B_STD = 1.0 # সেন্সর B -- বেশি নির্ভুল (কম নয়েজ)
rng_a = random.Random(11) # প্রতিটি সেন্সরের জন্য আলাদা ফিক্সড সিড
rng_b = random.Random(22)
N_TRIALS = 300
var_a = SENSOR_A_STD ** 2
var_b = SENSOR_B_STD ** 2
# ইনভার্স-ভ্যারিয়েন্স ওয়েট (নরমালাইজড, w_a + w_b = 1)
w_a = (1 / var_a) / (1 / var_a + 1 / var_b)
w_b = (1 / var_b) / (1 / var_a + 1 / var_b)
print(f"সেন্সর A-এর ওয়েট (w_a) = {w_a:.3f}")
print(f"সেন্সর B-এর ওয়েট (w_b) = {w_b:.3f} (মোট = {w_a + w_b:.3f})")
sum_err_a = 0.0
sum_err_b = 0.0
sum_err_fused = 0.0
for trial in range(N_TRIALS):
reading_a = rng_a.gauss(TRUE_VALUE, SENSOR_A_STD)
reading_b = rng_b.gauss(TRUE_VALUE, SENSOR_B_STD)
fused = w_a * reading_a + w_b * reading_b
sum_err_a += abs(reading_a - TRUE_VALUE)
sum_err_b += abs(reading_b - TRUE_VALUE)
sum_err_fused += abs(fused - TRUE_VALUE)
if trial < 5: # প্রথম কয়েকটি ট্রায়াল দেখানো হলো
print(f"ট্রায়াল {trial + 1}: সেন্সর A = {reading_a:.2f}\tসেন্সর B = {reading_b:.2f}"
f"\tফিউজড = {fused:.2f}")
mae_a = sum_err_a / N_TRIALS
mae_b = sum_err_b / N_TRIALS
mae_fused = sum_err_fused / N_TRIALS
print(f"\n{N_TRIALS} ট্রায়ালের উপর গড় পরম ত্রুটি (MAE):")
print(f" সেন্সর A একা:\t{mae_a:.4f} cm")
print(f" সেন্সর B একা:\t{mae_b:.4f} cm")
print(f" ফিউজড অনুমান:\t{mae_fused:.4f} cm")
assert mae_fused < mae_a and mae_fused < mae_b, "ফিউশন উভয় সেন্সরকে হারাতে ব্যর্থ হয়েছে!"
print("\nফিউজড অনুমানের ত্রুটি সেন্সর A ও সেন্সর B উভয়ের চেয়ে সত্যিই কম -- ফিউশন কাজ করছে।")
একাধিক স্বাধীন সেন্সর রিডিং-কে তাদের নিজস্ব নির্ভুলতা (ভ্যারিয়েন্সের ব্যস্তানুপাতে) অনুযায়ী ওয়েট দিয়ে মেলালে ফিউজড অনুমান পরিসংখ্যানগতভাবে যেকোনো একক সেন্সরের চেয়ে বেশি নির্ভুল হয় — এটি এই কোর্সে গণনা করে সরাসরি যাচাই করা হয়েছে, শুধু দাবি করা হয়নি। এটি সেন্সর ফিউশনের সবচেয়ে মৌলিক বিল্ডিং-ব্লক; সম্পূর্ণ Kalman filter-এর মতো টেকনিক এই একই ধারণাকে সময়ের সাথে পরিবর্তনশীল অবস্থার (state) উপর প্রয়োগ করে, যা একটি গভীরতর, আলাদা বিষয়। M9 শেষ হলো — পরের পাঠ (L41) থেকে M10-এ IoT আর্কিটেকচার ও ওয়্যারলেস প্রোটোকল শুরু হচ্ছে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি সেন্সর A ও সেন্সর B-এর $\sigma$ একদম সমান হতো, তাহলে $w_A$ ও $w_B$-এর মান কত হতো, এবং এটি কোন পরিচিত পদ্ধতির সাথে মিলে যেত?
$\sigma_A = \sigma_B$ হলে $w_A = w_B = 0.5$ হবে — অর্থাৎ ফিউজড অনুমান হবে দুটো রিডিং-এর সাধারণ (সরল) গড়। এটাই স্বাভাবিক, কারণ দুটো সেন্সর সমান নির্ভুল হলে কোনো একটাকে বেশি গুরুত্ব দেওয়ার যৌক্তিক কারণ নেই — ইনভার্স-ভ্যারিয়েন্স ওয়েটিং তখন স্বয়ংক্রিয়ভাবে সাধারণ গড়ে পরিণত হয়।
প্র ০২
উপরের কোড সেলে rng_a ও rng_b-এর জন্য দুটো আলাদা random.Random
ইনস্ট্যান্স (ভিন্ন সিড সহ) ব্যবহার করা হয়েছে কেন, একটিমাত্র সাধারণ rng ব্যবহার না করে?
কারণ ফিউশনের গাণিতিক যৌক্তিকতা (ইনভার্স-ভ্যারিয়েন্স ওয়েটিং) মূলত ধরে নেয় দুটো সেন্সরের নয়েজ স্বাধীন (independent) — একটির ত্রুটি আরেকটির ত্রুটির সাথে সম্পর্কিত নয়। একই random-instance ব্যবহার করলে দুটো সিকোয়েন্স সম্পর্কিত (correlated) হয়ে যেতে পারত, যা বাস্তব স্বাধীন-সেন্সর পরিস্থিতির একটি ভুল প্রতিনিধিত্ব হতো।
প্র ০৩ যদি সেন্সর A হঠাৎ সম্পূর্ণ নষ্ট হয়ে যায় এবং সবসময় একটি ভুল, স্থির মান (যেমন ০) রিপোর্ট করে, তাহলে উপরের সরল ইনভার্স-ভ্যারিয়েন্স ফিউশন কী সমস্যায় পড়বে?
এই সরল মডেলে ওয়েট $w_A$/$w_B$ ফিক্সড (পূর্বে গণনাকৃত ভ্যারিয়েন্সের উপর ভিত্তি করে), তাই যদি সেন্সর A হঠাৎ সম্পূর্ণ ভুল হয়ে যায় কিন্তু তার ওয়েট এখনও ইতিবাচক থাকে, ফিউজড অনুমান ভুল দিকে টানা হবে — এটি এই পরিচিতিমূলক পদ্ধতির একটি সীমাবদ্ধতা। বাস্তব সিস্টেমে এই সমস্যা সমাধানে "আউটলায়ার রিজেকশন" বা অভিযোজিত (adaptive) ভ্যারিয়েন্স অনুমান লাগে — যা পূর্ণাঙ্গ Kalman filter-এর মতো টেকনিকের একটি অংশ, এই পাঠের সৎ-পরিসরের বাইরে।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
SENSOR_A_STD১.০ (সেন্সর B-এর সমান) করলেw_a-এর মান কত হবে বলে আপনার ধারণা?যেহেতু তখন $\sigma_A = \sigma_B$, তাই $w_a = 0.5$ হবে — উভয় সেন্সর সমান নির্ভুল হওয়ায় ফিউশন সাধারণ গড়ে পরিণত হবে।
-
পরীক্ষা করুন: উপরের কোড সেলে
N_TRIALS-এর মান ৩০০ থেকে কমিয়ে ৫ করে Run চেপে দেখুনmae_fusedএখনও উভয় সেন্সরের চেয়ে কম থাকে কিনা।অল্প সংখ্যক ট্রায়ালে (যেমন ৫টি) র্যান্ডম ভ্যারিয়েশনের কারণে ফলাফল অনিশ্চিত হতে পারে — কখনো কখনো ফিউজড MAE তখনও দুটো সেন্সরের চেয়ে কম আসতে পারে, কিন্তু নিশ্চিতভাবে নয়, কারণ ছোট নমুনায় গড় সঠিক পরিসংখ্যানগত প্রবণতা প্রতিফলিত নাও করতে পারে। এই কারণেই কোড সেলে ৩০০টি ট্রায়াল ব্যবহার করা হয়েছে — বড় সংখ্যক ট্রায়ালে ফিউশনের প্রকৃত পরিসংখ্যানগত সুবিধা নির্ভরযোগ্যভাবে দেখা যায়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ মাইক্রোপ্রসেসর আর্কিটেকচার, এমবেডেড C, GPIO, টাইমার/PWM/ADC, সিরিয়াল প্রোটোকল, RTOS, সেন্সর/অ্যাকচুয়েটর, IoT আর্কিটেকচার, ওয়্যারলেস প্রোটোকল, MQTT/CoAP ও IoT সিকিউরিটি — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
- Computer Architecture & Digital Logic কোর্স সহোদর কোর্স সাধারণ ফ্লোটিং-পয়েন্ট গণনা ও ডেটা রিপ্রেজেন্টেশনের ভিত্তি সেই কোর্সে কভার করা হয়েছে।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Design and Analysis of Algorithms ও আরও অনেক কোর্স — সব এক জায়গায়।