Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

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.

gpiozero Robot(left=(5, 6), right=(13, 19)) ENA=GPIO12 ENB=GPIO18 IN1 0 IN2 0 ENA 0% · IN3 0 IN4 0 ENB 0% v_L 0,00 m/s · v_R 0,00 m/s · x -1,20 y 1,00 θ -23° kamera: top görünüyor · 3,34 m · x = 0,52

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.

http://raspberrypi.local:5000/
L0,00
R0,00

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ışı

  1. Açılış: fişi tak, 60 s içinde paneli aç (G6).
  2. Elle sürüş ve bağlantı kesme (G1, G2).
  3. İzle kipi: topu bul ve yaklaş (G3).
  4. Engel ve düşük pil senaryosu (G4, G5).

Başlangıç kodu

main.py iskeleti: durum makinesi + donanım soyutlaması
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

  1. 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ı
  2. 5. üniteden sonra
    Donanı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
  3. 7. üniteden sonra
    Algı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
  4. 9. üniteden sonra
    Panel ve durum makinesi

    Flask paneli, bekçi ve next_mode() geçiş fonksiyonu; her kenar için test.

    Flask ile web kontrol paneli
  5. 10. üniteden sonra
    Sistem 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
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç