পাঠ ৪০ · ৫৭-এর মধ্যে · মডিউল ৯
Home / Courses / Microprocessors, Embedded Systems & IoT / সেন্সর ফিউশন

সেন্সর ফিউশন — একটি প্র্যাকটিক্যাল পরিচিতি

Sensor fusion — a practical introduction
৯ মিনিট পড়া মধ্যম · Intermediate Python সিমুলেশনসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • সেন্সর ফিউশন কী এবং কেন এটি একক সেন্সরের চেয়ে ভালো ফলাফল দিতে পারে
  • ইনভার্স-ভ্যারিয়েন্স ওয়েটেড এভারেজের গাণিতিক ভিত্তি
  • একটি জেনুইন, বহু-ট্রায়াল সিমুলেশনে ফিউশনের সুবিধা কীভাবে পরিমাপ করা যায়
  • এই বিষয়ের সীমা — কেন এটি "পূর্ণাঙ্গ Kalman filter" নয়, এবং সেই গভীরতর বিষয় কোথায় শুরু হয়

১ · সেন্সর ফিউশন কী

বাস্তব এমবেডেড/IoT সিস্টেমে প্রায়ই একাধিক সেন্সর একই রাশি (বা সম্পর্কিত রাশি) পরিমাপ করে — যেমন একটি IMU-তে অ্যাক্সিলেরোমিটার ও জাইরোস্কোপ দুটোই ওরিয়েন্টেশন সম্পর্কে তথ্য দেয়, বা দুটো ভিন্ন দূরত্ব সেন্সর একই বস্তুর দূরত্ব মাপে। প্রতিটি সেন্সরের নিজস্ব নয়েজ বৈশিষ্ট্য থাকে — একটি হয়তো বেশি নির্ভুল কিন্তু ধীর, আরেকটি কম নির্ভুল কিন্তু দ্রুত। সেন্সর ফিউশনSensor Fusionএকাধিক সেন্সরের রিডিং পরিসংখ্যানগতভাবে যৌক্তিক উপায়ে মিলিয়ে একটি একক, পৃথক যেকোনো সেন্সরের চেয়ে বেশি নির্ভুল অনুমান তৈরি করার প্রক্রিয়া। হলো এই একাধিক রিডিংকে একটি স্মার্ট উপায়ে মিলিয়ে একটি একক, বেশি নির্ভরযোগ্য অনুমান তৈরি করার প্রক্রিয়া।

সৎ-পরিসর (honest scope) নোট

বাস্তব সেন্সর ফিউশন সিস্টেম (যেমন 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) ঠিক এই ইনভার্স-ভ্যারিয়েন্স ওয়েটিং-এই পাওয়া যায়।

সেন্সর A ($x_A$, $\sigma_A^2$ বেশি) সেন্সর B ($x_B$, $\sigma_B^2$ কম) ইনভার্স-ভ্যারিয়েন্স ওয়েটেড এভারেজ ফিউজড অনুমান (উভয়ের চেয়ে নির্ভুল)
দুটো স্বাধীন সেন্সর রিডিং তাদের নিজস্ব ভ্যারিয়েন্সের ব্যস্তানুপাতে ওয়েট দিয়ে মেলালে, ফিউজড অনুমান পরিসংখ্যানগতভাবে উভয় সেন্সরের চেয়ে নির্ভুল হয়।

৩ · Python সিমুলেশন — ফিউশন সত্যিই দুটো সেন্সরকে হারায় কিনা

নিচের কোড সেলে দুটো সিমুলেটেড সেন্সর — সেন্সর A (বেশি নয়েজি, $\sigma_A = 3.0$) ও সেন্সর B (কম নয়েজি, $\sigma_B = 1.0$) — একই প্রকৃত মান (৫০.০ সেমি দূরত্ব ধরা হয়েছে) বহুবার (৩০০ ট্রায়াল) মাপছে, প্রতিটি সেন্সরের জন্য আলাদা ফিক্সড সিড ব্যবহার করে। প্রতিটি ট্রায়ালে ইনভার্স-ভ্যারিয়েন্স ওয়েটেড এভারেজ দিয়ে দুটো রিডিং ফিউজ করা হয়, এবং শেষে তিনটি গড় পরম ত্রুটি (MAE) — সেন্সর A একা, সেন্সর B একা, ও ফিউজড — তুলনা করা হয়েছে।

Python
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 উভয়ের চেয়ে সত্যিই কম -- ফিউশন কাজ করছে।")

    
এই নির্দিষ্ট ফিক্সড-সিড রানে সেন্সর A-এর MAE প্রায় ২.৪৮ cm, সেন্সর B-এর MAE প্রায় ০.৮০ cm (স্বাভাবিকভাবেই কম, কারণ এর নয়েজ কম), কিন্তু ফিউজড অনুমানের MAE আরও কমে দাঁড়ায় প্রায় ০.৭১ cm — অর্থাৎ ফিউশন এমনকি বেশি-নির্ভুল সেন্সর B-এর চেয়েও ভালো ফলাফল দেয়। এটি কাকতালীয় নয় — ওয়েট $w_B \approx 0.9$ হওয়ায় (কারণ $\sigma_B$ অনেক ছোট) ফিউজড অনুমান মূলত সেন্সর B-এর উপর নির্ভরশীল থাকে, কিন্তু সেন্সর A-এর ছোট অবদানও পরিসংখ্যানগতভাবে অতিরিক্ত তথ্য যোগ করে সামগ্রিক ভ্যারিয়েন্স আরও কমায় — এটাই ইনভার্স-ভ্যারিয়েন্স ফিউশনের মূল শক্তি।
মূল কথা · Key takeaway

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

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে SENSOR_A_STD ১.০ (সেন্সর B-এর সমান) করলে w_a-এর মান কত হবে বলে আপনার ধারণা?

    যেহেতু তখন $\sigma_A = \sigma_B$, তাই $w_a = 0.5$ হবে — উভয় সেন্সর সমান নির্ভুল হওয়ায় ফিউশন সাধারণ গড়ে পরিণত হবে।

  2. পরীক্ষা করুন: উপরের কোড সেলে 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 ও আরও অনেক কোর্স — সব এক জায়গায়।
আগের পাঠ
স্টেপার মোটর কন্ট্রোল