অধ্যায়Phase 6 · মডার্ন AI ভিশন
6.6 15 মিনিট পড়া

SLAM Introduction

Simultaneous localization & mapping।

🎬 গল্প দিয়ে শুরু
Robot vacuum আপনার ঘরের map কীভাবে বানায় — অথচ GPS নেই? Tesla, drone, AR headset — সবাই করে SLAM (Simultaneous Localization And Mapping)। নিজে কোথায় আছে সেটাও জানে, পরিবেশের map-ও বানায় — একই সাথে।

সমস্যাটা কী?

  • Localization জানতে map লাগে।
  • Map বানাতে নিজের position জানতে হয়।
  • দুটোই অজানা — চিকেন-এন্ড-এগ। SLAM দুটো একসাথে solve করে।

SLAM-এর pipeline (Visual SLAM)

text
Frame → Feature extract (ORB/SIFT)
      → Match with previous frame
      → Estimate motion (Essential matrix, PnP)
      → Triangulate new 3D points
      → Bundle Adjustment (BA) — refine pose + points
      → Loop closure detection — পুরনো জায়গা চেনা, drift ঠিক করা

মূল component

  • Frontend — feature tracking, frame-to-frame motion।
  • Backend — pose graph optimization (g2o, Ceres)।
  • Loop Closure — Bag-of-Words (DBoW) দিয়ে revisit detection।
  • Map representation — sparse point cloud, dense mesh, বা occupancy grid।

Sensor অনুযায়ী SLAM

  • Monocular — সস্তা, কিন্তু scale ambiguous।
  • Stereo / RGB-D — সঠিক scale পায়।
  • LiDAR SLAM — outdoor, autonomous car (LOAM, Cartographer)।
  • Visual-Inertial (VIO) — IMU যোগ করে robust (ARKit, ARCore)।

জনপ্রিয় open-source system

  • ORB-SLAM3 — feature-based, mono/stereo/RGB-D/inertial।
  • RTAB-Map — RGB-D ও LiDAR, ROS-এ ready।
  • Kimera — semantic mesh + VIO।
  • DROID-SLAM — deep learning হাইব্রিড।

মিনি demo — ORB দিয়ে frame-to-frame motion

python
visual_odometry.py (simplified)
import cv2, numpy as np
orb = cv2.ORB_create(2000)
bf  = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

prev = None
cap  = cv2.VideoCapture("drive.mp4")
while True:
    ok, f = cap.read()
    if not ok: break
    g = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY)
    kp, des = orb.detectAndCompute(g, None)
    if prev is not None:
        m = sorted(bf.match(prev["des"], des), key=lambda x: x.distance)[:200]
        p1 = np.float32([prev["kp"][x.queryIdx].pt for x in m])
        p2 = np.float32([kp[x.trainIdx].pt for x in m])
        E, _ = cv2.findEssentialMat(p1, p2, focal=700, pp=(640, 360))
        _, R, t, _ = cv2.recoverPose(E, p1, p2)
        print("motion:", t.flatten())
    prev = {"kp": kp, "des": des}
এটি SLAM নয়, VO
এই snippet শুধু Visual Odometry — pose track করে কিন্তু global map ও loop closure নেই। পূর্ণ SLAM-এর জন্য ORB-SLAM3 ব্যবহার করুন।

ব্যবহারিক ক্ষেত্র

  • AR/VR — virtual object world-এ stable রাখা।
  • Drone autonomous flight (GPS-denied indoor)।
  • Self-driving car localization।
  • Robot vacuum, warehouse robot।
  • Archaeology / 3D scanning।
প্র্যাকটিস টাস্ক
  1. KITTI dataset-এ ORB Visual Odometry চালিয়ে trajectory plot করুন।
  2. Phone video দিয়ে ORB-SLAM3 চালিয়ে room map বানান।
  3. RTAB-Map ROS-এ চালিয়ে RGB-D camera-তে 3D mesh তৈরি করুন।