Simülasyon + gerçek kartBitirme
Bitirme projesi: kameralı keşif robotu
Web panelinden elle sürülen ya da kamerasıyla renkli bir hedefi kendiliğinden izleyen, engelde ve düşük pilde güvenle duran, açılışta kendiliğinden başlayan iki tekerlekli bir Pi robotu.
Senaryo
Robot bir okul koridorunda yeşil bir topu arar. Operatör telefonundan paneli açar, robotu elle sürer, "izle" kipine geçince robot topu kamerayla bulup 30 cm'ye kadar yaklaşır. Ultrasonik sensör 15 cm'de engel görürse, pil 6,4 V'un altına inerse ya da panelle bağlantı koparsa robot durur. Pi açıldığında yazılım systemd ile kendiliğinden başlar.
Sistemi simülasyonda dene
3B kameralı keşif robotu
Diferansiyel sürüşlü robotu 3B sahada GPIO pinleriyle (L298N IN1–IN4, ENA/ENB) sür ya da izle kipini aç: kamera görüş konisi topu görünce yeşile döner, robot topa yaklaşır. Sahneyi sürükleyerek döndür, iki parmakla yakınlaştır. Sahne durumu testli saf mantıktan gelir; 3B yalnız görselleştirmedir.
Ya da pinleri elle sür (L298N):
Flask kontrol paneli ve bekçi (watchdog)
Tarayıcıdaki panelden Pi'deki küçük HTTP sunucusuna istek gönder. Yanıt kodlarını (200, 400, 401, 405), belirteç denetimini ve bağlantı kesilince robotu durduran bekçiyi dene.
Robot: stop · hız 0,00
Gereksinimler (test edilebilir)
- G1: Panelden gelen komut 200 ms içinde motorlara ulaşır (günlükten ölçülür).
- G2: Bağlantı 1 s koparsa robot durur (bekçi testi).
- G3: İzle kipinde top 3 m içindeyse robot 20 s içinde 30 ± 10 cm'ye yaklaşır (5 denemenin 4'ü).
- G4: Engel 15 cm'den yakınsa robot her kipte durur.
- G5: Pil eşiğin altına inince robot SAFE_STOP kipine geçer ve panelde uyarı gösterir.
- G6: Elektrik verildikten sonra 60 s içinde panel erişilebilir olur (systemd).
Mimari
- Donanım katmanı (hw.py): Drive, Encoder, Ultrasonic, Battery sınıfları; her birinin testte kullanılan sahte karşılığı.
- Algılama: picamera2 → HSV maske → ağırlık merkezi → target_x (−1..1) ya da None.
- Karar: saf next_mode(mode, inputs) durum makinesi; IDLE, TELEOP, FOLLOW, SAFE_STOP.
- Denetim: (v, ω) → tekerlek hızları → PI hız döngüsü (20 ms).
- Arayüz: Flask paneli ve /api uç noktaları; isteğe bağlı ROS 2 sürümünde aynı bloklar düğüm olur (camera, detector, follower, twist_mux, motor_driver).
- İşletim: systemd birimi, ayar dosyası (YAML), journalctl ile günlük.
Doğrulama
- Birim: next_mode'un her geçişi, odometri özellikleri, PI kapalı döngü testi (motor modeliyle), w1_slave ve HTTP doğrulama.
- Bileşen: kayıtlı 20 kare üzerinde algılayıcı, beklenen ağırlık merkezine 5 piksel içinde.
- Benzetim: bu sayfadaki simülasyonlarda (GPIO, motor, robot, Flask, ROS) senaryolar.
- Donanımda: G1–G6 için ölçüm tablosu; her deneme günlük dosyasıyla kanıtlanır.
Demo akışı
- Açılış: fişi tak, 60 s içinde paneli aç (G6).
- Elle sürüş ve bağlantı kesme (G1, G2).
- İzle kipi: topu bul ve yaklaş (G3).
- Engel ve düşük pil senaryosu (G4, G5).
Başlangıç kodu
from enum import Enum, auto
from dataclasses import dataclass
class Mode(Enum):
IDLE = auto(); TELEOP = auto(); FOLLOW = auto(); SAFE_STOP = auto()
@dataclass
class Inputs:
web_cmd: str | None # Flask panelinden son komut
web_age: float # son komuttan bu yana saniye
target_x: float | None # kamera: -1..1, yoksa None
obstacle_cm: float
battery_v: float
def next_mode(m: Mode, i: Inputs) -> Mode:
"""Saf geçiş fonksiyonu: pytest ile her kenar test edilir"""
if i.battery_v < 6.4 or i.obstacle_cm < 15:
return Mode.SAFE_STOP
if i.web_cmd == "follow":
return Mode.FOLLOW
if i.web_cmd and i.web_age < 1.0:
return Mode.TELEOP
if m is Mode.FOLLOW and i.target_x is not None:
return Mode.FOLLOW
return Mode.IDLE
class Drive: # gerçek: gpiozero Robot; test: sahte sınıf
def set(self, left: float, right: float) -> None: ...Teslimler
- 2. üniteden sonraÖneri ve kurulum betiği
Senaryo, gereksinimler (G1–G6), kart seçimi ADR'si ve depoda çalışan setup.sh.
Raspberry Pi OS ve Linux komut satırı - 5. üniteden sonraDonanım katmanı
hw.py: motor, enkoder, ultrasonik ve sıcaklık sınıfları; sahte (fake) karşılıklarıyla pytest testleri.
Sensörler ve veri yolları: 1-Wire, I²C, SPI - 7. üniteden sonraAlgılama ve hız denetimi
Renkli hedef algılayıcı (kayıtlı karelerle test) ve PI hız döngüsü; ayar dosyası.
Motorlar: L298N, enkoder ve hız denetimi - 9. üniteden sonraPanel ve durum makinesi
Flask paneli, bekçi ve next_mode() geçiş fonksiyonu; her kenar için test.
Flask ile web kontrol paneli - 10. üniteden sonraSistem ve demo
ROS 2 düğümleri ya da tek süreçli sürüm, systemd birimi, 3 dakikalık demo videosu ve rapor.
ROS 2 temelleri ve systemd ile otomatik başlatma