WebotsDönem projesi
Otonom kara aracı
Kamerayla şerit takibi, mesafe sensörüyle engelden kaçınma ve trafik işaretlerini derin öğrenmeyle tanıyan bir araç.
Senaryo
Araç Webots şehir dünyasında bir pisti şeritten çıkmadan tamamlar, önüne çıkan engelde durur ya da yavaşlar, "dur" işaretinde 3 saniye bekler. Davranış bir durum makinesiyle yönetilir: SERIT_TAKIP, ENGEL, DUR_ISARETI, KAYIP.
Kabul ölçütleri
- Pistte 3 tur boyunca şeritten çıkma yok (yanal sapma |e| < 0,5).
- Önünde 8 m içinde engel varken çarpışma yok; engel kalkınca 2 sn içinde yeniden hareket.
- Dur işaretinde durma oranı en az %90 (20 denemede), yanlış durma en çok 1.
- Durum makinesinin her geçişi birim testle doğrulanmış; CI yeşil.
Simülasyonu kurmak
- Webots R2025a kur (Windows, macOS, Linux).
- File → Open Sample World → vehicles/city.wbt dünyasını aç; BMW X5 aracını kullan.
- Aracın controller alanını <extern> yap ya da kendi Python denetleyicini seç; araca kamera ve ön mesafe sensörü (lidar ya da distance sensor) ekle.
- Python ortamına numpy, opencv-python ve torch kur.
- Denetleyiciyi modüllere ayır: perception (şerit, işaret), control (PID), behaviour (durum makinesi); her modülün birim testleri depoda.
Başlangıç kodu
# Webots vehicle denetleyicisi (BMW X5, city.wbt). Kamera görüntüsünden şerit sapması, PID ile direksiyon.
import numpy as np
from vehicle import Driver
driver = Driver()
step = int(driver.getBasicTimeStep())
cam = driver.getDevice("camera")
cam.enable(step)
W, H = cam.getWidth(), cam.getHeight()
KP, KD = 0.35, 0.08
prev = 0.0
driver.setCruisingSpeed(20) # km/h
def lane_offset(bgra):
img = np.frombuffer(bgra, np.uint8).reshape(H, W, 4)
roi = img[int(H * 0.6):, :, :3]
yellow = (roi[:, :, 2] > 150) & (roi[:, :, 1] > 120) & (roi[:, :, 0] < 90) # BGR
xs = np.nonzero(yellow)[1]
if xs.size < 30:
return None
return (xs.mean() - W / 2) / (W / 2) # -1 .. +1
while driver.step() != -1:
e = lane_offset(cam.getImage())
if e is None: # KAYIP durumu: yavaşla, son direksiyonu koru
driver.setCruisingSpeed(5)
continue
driver.setCruisingSpeed(20)
u = KP * e + KD * (e - prev) / (step / 1000)
prev = e
driver.setSteeringAngle(float(np.clip(u, -0.5, 0.5))) # radAra teslimler
- 8. haftaÖneri ve gereksinimler
İki sayfalık öneri: test edilebilir kabul ölçütleri, ilk mimari (durum makinesi ya da ROS 2 grafiği), risk listesi, haftalık plan. Depo açıldı, CI ilk testi çalıştırıyor.
Ara sınav - 9. haftaAraç sürülüyor
Webots'ta aracı koddan sür; sabit hız ve direksiyon komutları; sensör verileri kaydediliyor.
Yol planlama ve konum belirleme - 10. haftaŞerit takibi
lane_offset() + PID ile bir tur; sapma grafiği teslim.
Robotlar için bilgisayarlı görü - 11. haftaAra kontrol: işaret sınıflandırıcı
Webots'tan toplanan veriyle eğitilmiş işaret ağı (doğrulama doğruluğu, karışıklık matrisi); engel durumu çalışıyor.
Robotlarda derin öğrenme ve uçta yapay zekâ - 12. haftaMimari: ROS 2 ya da modüller
Algılama, denetim ve davranış ayrı düğümler (ROS 2) ya da ayrı modüller; arayüzleri belgelendi.
ROS 2 ve simülasyon - 13. haftaBütünleştirme ve SIL testleri
Tüm kabul ölçütleri otomatik senaryolarla (Webots --batch) ölçülüyor.
Hava robotları: uçuş denetimi, otonomi ve sürüler - 14. haftaSunum ve rapor
10 dakikalık sunum, canlı ya da kayıtlı simülasyon, kabul ölçütlerinin her biri için kanıt (grafik, kayıt, test), final raporu ve depo.
Proje sunumları