📌 Hızlı Özet & Temel Çıkarım:
Deniz yüzeyinde LiDAR ve Kamera Füzyonu, kameranın sağladığı zengin renk ve anlamsal sınıflandırma (gemi, şamandıra, insan) gücü ile 3D LiDAR’ın sağladığı mutlak mesafe ve geometri bilgisini birleştirir. Su yüzeyindeki dalga kırılmalarını ve köpük parlamalarını filtreleyerek, otonom deniz aracının çevresindeki tehditleri sıfır yanılsamayla (false positive) 3 boyutlu uzayda konumlandırmasını sağlar.
1. Denizde Optik ve Lazer Algılamanın Benzersiz Zorlukları
Karayolu otonom sürüş sistemlerini doğrudan denize kopyalamaya çalıştığınızda hızla başarısız olursunuz. Bunun temel sebepleri:
- Dinamik Zemin (Su Yüzeyi): Karada asfalt sabittir ve düzlem ayırma (RANSAC plane segmentation) ile zemin noktaları kolayca silinir. Denizde ise su sürekli yükselip alçalır; dalgalar LiDAR ışınlarını kırar ve havada asılı kalan su damlacıkları (spray/clutter) yüzlerce sahte nokta üretir.
- Güneş Yansımaları (Sun Glare): Düşük açılı güneş ışığı su yüzeyinde ayna etkisi yaparak standart kameraların dinamik aralığını tüketir ve görüntü sensörünü kör eder.
- Mesafe Tahmini Zorluğu: Denizde referans nesne (yol çizgisi, bina vb.) bulunmadığından tek lensli (monocular) kameralarla derinlik tahmini yapmak son derece yanıltıcıdır.
Bu zorlukları aşmak için erken (early) veya geç (late) sensör füzyonu stratejileri uygulanır.
2. Sensör Dış Kalibrasyonu (Extrinsic Calibration)
Füzyonun başarılı olabilmesi için LiDAR koordinat ekseni ($X_L, Y_L, Z_L$) ile Kamera koordinat ekseni ($X_C, Y_C, Z_C$) arasındaki rotasyon ($R$) ve translasyon ($T$) matrisleri milimetrik hassasiyette bilinmelidir.
3D uzaydaki bir LiDAR noktasının ($P_L$) kamera piksel düzlemine ($u, v$) izdüşümü şu formülle gerçekleştirilir:
$$egin{bmatrix} u \ v \ 1 \end{bmatrix} = rac{1}{Z_C} K \cdot [R \mid T] \cdot egin{bmatrix} X_L \ Y_L \ Z_L \ 1 \end{bmatrix}$$
Burada $K$ kameranın odak uzaklığı ve optik merkezini içeren iç parametre matrisidir (Intrinsic Matrix).
Aşağıdaki Python örneği, kalibre edilmiş kamera matrisleri ile LiDAR nokta bulutunu kamera görüntüsü üzerine yansıtan ve derinlik renk haritası oluşturan çekirdek işlevi göstermektedir:
import cv2
import numpy as np
def project_lidar_to_camera(points_3d, img, K, R, T):
"""
points_3d: (N, 3) seklinde LiDAR koordinatlari
img: Kamera RGB karesi (H, W, 3)
K: Kamera ic matrisi (3, 3)
R: Rotasyon matrisi (3, 3)
T: Translasyon vektoru (3, 1)
"""
h, w, _ = img.shape
# Sadece kameranin onunde kalan pozitif Z noktalarini al
homog = np.hstack((points_3d, np.ones((points_3d.shape[0], 1))))
extrinsic = np.hstack((R, T.reshape(3, 1)))
cam_coords = (extrinsic @ homog.T).T
front_mask = cam_coords[:, 2] > 0.5
cam_coords = cam_coords[front_mask]
# Piksel duzlemine izdusum
proj = (K @ cam_coords.T).T
pixels = proj[:, :2] / proj[:, 2:3]
depths = cam_coords[:, 2]
# Ekran sinirlari icinde kalanlari filtrele
valid = (pixels[:, 0] >= 0) & (pixels[:, 0] < w) & (pixels[:, 1] >= 0) & (pixels[:, 1] < h)
return pixels[valid], depths[valid]
3. Dinamik Dalga Filtreleme ve Kümeleme (Clustering)
LiDAR verisindeki dalga parazitlerini temizlemek için iki aşamalı bir filtreleme uygulanır:
- Gövdeye Yakınlık Filtresi (Self-filter): USV’nin kendi güvertesinden yansıyan noktalar bir CAD sınır kutusu (bounding box) yardımıyla atılır.
- Yoğunluk Tabanlı Kümeleme (DBSCAN / Euclidean Cluster): Su serpintileri genellikle seyrek ve dağınık noktalardan oluşur. Katı engeller (diğer tekneler, şamandıralar, kayalıklar) ise birbirine çok yakın, yoğun nokta grupları üretir. Minimum 15-20 noktadan az olan kümeler deniz gürültüsü sayılarak yok sayılır.
Elde edilen katı nesne sınır kutuları (3D Bounding Boxes), YOLOv8 nesne tespit modelinin ürettiği 2D sınıflarla eşleştirilerek “32 metre mesafede sancak yönünde ilerleyen yelkenli” şeklinde zenginleştirilmiş telemetriye dönüştürülür.
4. İlgili Konular ve İç Bağlantılar
- Nav2 ve COLREGs ile Otonom Seyrüsefer — Tespit edilen engellerden uluslararası kurallara göre kaçınma.
- Otonom Araçlarda Sensör Füzyonu ve Extended Kalman Filtresi (EKF) — Aracın kendi konumunun hassas takibi.
- Python ile Eşzamanlı Programlama: Asyncio ve Multiprocessing — Yüksek frekanslı görüntü işleme iş parçacıklarının yönetimi.
5. Sıkça Sorulan Sorular
Denizde katı hal (Solid-State) LiDAR mı, yoksa mekanik döner LiDAR mı tercih edilmelidir?
Pusula USV gibi küçük ve orta ölçekli deniz araçlarında hareketli parçası olmayan katı hal (Solid-State) LiDAR’lar tercih edilir. Denizdeki sürekli vibrasyon, sert dalga çarpmaları ve korozyon, mekanik döner LiDAR rulmanlarını kısa sürede aşındırır. Katı hal sensörler ayrıca daha düşük güç tüketimi sunar.
Sisli ve yağmurlu havalarda LiDAR güvenilirliğini korur mu?
Yoğun sis ve sağanak yağmurda LiDAR lazer dalgaları saçılmaya uğrar ve menzili %50’ye kadar düşebilir. Bu koşullarda sistem otomatik olarak Marin Radarı (FMCW Radar) ve Termal Kamera (FLIR) ağırlıklı çalışacak şekilde sensör güven skorunu dinamik olarak dengeler.
6. Uç Cihazlarda (NVIDIA Jetson Orin) TensorRT ile Gerçek Zamanlı Çıkarım
Gemi üzerindeki gömülü bilgisayarların (örneğin Jetson Orin Nano veya AGX Orin) güç bütçesi sınırlıdır; bataryayı hızla tüketmemek için çıkarım (inference) verimliliği optimize edilmelidir.
Standart PyTorch FP32 modeli Jetson üzerinde 15 FPS üretirken, model TensorRT INT8 / FP16 formatına dönüştürüldüğünde kare hızı 60 FPS’e yükselir ve gecikme 14 milisaniyeye düşer:
# YOLOv8 modelini Jetson icin TensorRT motoruna optimize etme
yolo export model=yolov8n_marine.pt format=engine half=True device=0
INT8 kalibrasyonunda dikkat edilmesi gereken en önemli nokta, temsilci veri setine deniz dalgaları, yağmur ve güneş parlamaları içeren en az 500 adet zorlayıcı kare eklemektir. Aksi halde INT8 nicemlemesi (quantization) küçük şamandıraların algılanma hassasiyetini (mAP50) %8 oranında düşürebilir.
LiDAR nokta bulutunun GPU üzerinde işlenmesi içinse CUDA destekli VoxelGrid filtreleri kullanılır. 100.000 noktadan oluşan ham bulut, 0.1 metrelik kübik hücrelere bölünerek 8.000 anlamlı noktaya indirgenir ve algılama gecikmesi minimuma çekilir.