Görevler: robotun iç sesini oku
Bu modül boyunca robotuna yeni bir kablo ya da yeni bir motor eklemedin. Eklediğin şey görünmez: robotun sana ne hissettiğini söyleyen bir ses. Koduna telemetri satırları koydun, joystick değerlerini ekrana bastın, kendi değişkenini oluşturup onu da gösterdin. Şimdiye kadar robotuna hep dışarıdan baktın; bugün ilk kez robotun sana içeriden ne olup bittiğini anlatacak. Bu ders bir sınav değil, bir usta günü. Yeni bir satır yazmana gerek yok; olanı okumayı öğreneceksin. Üç görev var: en okunur ekranı tasarlamak, telemetriyle bir hatayı yakalamak ve sadece ekrana bakarak robotu sürmek. Her birinde puan var ve sonunda kendini değerlendireceksin.
Kanca: pilot yere bakmadan nasıl uçar? (10 dk)
Videoyu izledikten sonra bir dakika düşün: iki sürücünün robotu aynıydı, kodları neredeyse aynıydı. Fark neredeydi? Fark ekrandaydı. Birinci sürücünün ekranı ona bir şey söylemiyordu; sayılar vardı ama okunmuyordu. İkincinin ekranı bir cümle gibi konuşuyordu.
Sınıfça kısa bir tartışma: bir uçak pilotu, dışarısı sisliyken ya da gece hiçbir şey görünmezken uçağı nasıl düz tutar? Camdan dışarı bakarak değil, önündeki göstergelere bakarak. Göstergeler ona uçağın hızını, eğimini, yönünü söyler; o da gözüyle değil, sayılarla uçar. Buna gösterge uçuşu denir. Bugün senin robotun da bir gösterge paneli kazanacak. İyi bir panel, robota bakamadığın anda bile ne yaptığını bilmeni sağlar. Kötü bir panel, dolu olduğu hâlde işe yaramaz. Bugün puanı en çok yazan değil, ekranı en çok konuşturan kazanacak.
Puan sistemini şimdi kur. Kâğıdının üstüne şu tabloyu çiz, her görevden sonra kendi puanını yaz:
| Ne oldu | Puan etkisi |
|---|---|
| Ekranın bir bakışta okunuyor: etiketli, sade, kaymayan satırlar | Tam 10 puan |
| Ekran dolu ama karışık, hangi sayı ne belli değil | 4 puan iner |
| clearTelemetry unutulmuş, satırlar üst üste birikiyor | 3 puan iner |
| Telemetriye bakarak bir hatayı tek başına buldun | 3 bonus puan |
| Robotu göremeden, sadece ekrana bakarak düz sürdün | 3 bonus puan |
Ana etkinlik: kokpit yarışması (20 dk)
Şimdi kendi gösterge panelini tasarla. Bu bir kod yarışması değil, bir okunurluk yarışması. Herkesin koduna zaten şu telemetri bloğu var; senin işin onu daha okunur hâle getirmek.
void teleopLoop() {
auto js = probot::io::joystick_api::makeDefault();
float ileri = js.getLeftY();
float donus = js.getRightX();
surMotor(SOL_RPWM, SOL_LPWM, ileri + donus);
surMotor(SAG_RPWM, SAG_LPWM, ileri - donus);
probot::clearTelemetry(); // once eski yaziyi sil
probot::printf("ileri: %.2f\n", ileri); // sonra taze degeri yaz
probot::printf("donus: %.2f\n", donus);
delay(20);
}
Adım 1: Sadeleştir ve etiketle. Ekrana kaç satır koyacağına sen karar ver. Az satır çoğu zaman daha iyidir. Her satırın başına ne olduğunu söyleyen kısa bir etiket koy: ileri:, donus:, hiz:. Etiketsiz bir sayı hiçbir şey söylemez; etiketli sayı bir cümle kurar.
Adım 2: Kendi değişkenini göster. Şimdiye kadar ekrana joystick'in hazır değerlerini bastın. Bir de kendi oluşturduğun bir değeri göster. Örneğin bir hız çarpanı ekle: robotu bazen tam güç, bazen yarı güçte sürmek istersin. Bir buton bu çarpanı değiştirsin, sen de değeri ekranda gör.
float carpan = 1.0f;
if (js.getA()) carpan = 0.5f; // A basiliyken yavas mod
else carpan = 1.0f; // birakinca tam guc
surMotor(SOL_RPWM, SOL_LPWM, (ileri + donus) * carpan);
surMotor(SAG_RPWM, SAG_LPWM, (ileri - donus) * carpan);
probot::clearTelemetry();
probot::printf("ileri: %.2f\n", ileri);
probot::printf("hiz x: %.2f\n", carpan); // kendi degiskenin ekranda
Adım 3: Deadzone'u yakala. Çubuğu tamamen bırak ve ekrana bak. Sayı ne gösteriyor? Elini çektiğin hâlde ileri satırı tam 0.00 yazıyor olmalı. Oysa çubuk hiçbir zaman fiziksel olarak tam ortada durmaz, hep birazcık kaçar. Kütüphane bu küçük kaçığı senin için siliyor: belli bir eşiğin altındaki değerleri sıfır sayıyor. Buna deadzone, yani ölü bölge denir. Şimdi çubuğu çok yavaşça it; sayının bir yerde 0.00'dan birden bir değere atladığını göreceksin. İşte o an eşiği geçtin.
Adım 4: Ekranını bir arkadaşına göster. Ona iki saniye baktır, sonra kapat ve sor: robot şu an ne yapıyordu? Bir bakışta cevaplayabildiyse ekranın okunur demektir. Duraksadıysa, bir satır fazla ya da bir etiket eksik var.
Kavram köprüsü: telemetri robotun iç sesidir (7 dk)
Durup nefeslen. Ekranını kurdun, şimdi ne yaptığının adını koyalım.
Telemetri, robotun kendi içinden sana gönderdiği habertir. Motorlar, joystick, senin değişkenlerin; hepsinin o anki değeri robotun içinde bir sayı olarak duruyor. Sen bu sayıları ekrana bastığın anda robotun sessiz düşüncesini duyulur hâle getiriyorsun. Robota bakınca sadece dışını görürsün: tekerlek dönüyor mu, duruyor mu. Telemetriyle içini duyarsın: hangi hızda, hangi yöne, hangi modda.
İki teknik kuralın adını koyalım. Birincisi önce sil, sonra yaz. Her loop turunda clearTelemetry() ile ekranı temizleyip sonra taze değeri basıyorsun. Bunu unutursan eski satırlar silinmez, yenileri altına eklenir ve ekran saniyede onlarca satırla dolup okunmaz olur. Videodaki birinci sürücünün karmaşası çoğu zaman budur. İkincisi biçim. %.2f bir ondalık sayıyı iki basamakla gösterir, örneğin 0.75. %d ise tam sayıları gösterir, ondalık olmayanları. Doğru biçim, sayıyı okunur yapar; 0.7499998 kimseye bir şey söylemez, 0.75 bir bakışta anlaşılır.
Bir de kavramsal fark var. İlk derslerde ekrana joystick'in hazır değerlerini bastın; onları sen üretmedin, kütüphane verdi. Bu derste kendi değişkenini oluşturdun: hız çarpanı senin fikrindi, adını sen koydun, değerini sen değiştirdin ve ekrana sen koydun. Bir değişken, içine bir sayı koyabildiğin ve sonra o sayıyı okuyup değiştirebildiğin adlandırılmış bir kutudur. Bugün ilk kez robotun içine kendi kutunu yerleştirdin ve onu duyulur yaptın. Bu, sonraki modülde robotun sensiz karar vermesinin de temeli olacak.
Uygulama: hata avı turnuvası ve kör sürüş (15 dk)
Görev 2: Hata avı turnuvası
Şimdi telemetri gerçek işini görecek: bir hatayı yakalamak. Öğretmenin ya da bir arkadaşın robotun koduna küçük bir hata koyar, sen sadece ekrana bakarak hatayı bulursun. Robotu sürmeden önce tahmin et, sonra sür ve telemetriyle doğrula.
Sık karşılaşılan üç hata ve ekranda nasıl ele verirler:
| Hata | Ekranda ne görürsün |
|---|---|
| Yanlış eksen bağlanmış (ileri için LeftY yerine LeftX okunmuş) | Çubuğu ileri itersin ama ileri satırı 0.00 kalır, yana itince değişir |
| Ters işaret (ileri itince değer eksi çıkar) | Çubuğu ileri itersin, sayı -0.80 gibi eksi olur |
| Unutulan çarpan (hız çarpanı hesaba katılmamış) | hiz x satırı 0.50 yazar ama robot yine tam güçte gider |
Turnuva şöyle işler: her tur bir hata konur, süre başlar, ilk doğru teşhisi yapan puanı alır. Hatayı robotu izleyerek de bulabilirsin ama telemetriyle bulmak hem daha hızlı hem daha kesindir; çünkü ekran sana tam sayıyı söyler, gözün ise sadece "bir tuhaflık var" der. Teşhisini yaparken kuru "bozuk" deme; "ileri satırı sıfır kalıyor, demek yanlış eksen okunmuş" gibi ekrandaki kanıtı göster. Bir tur bekleyenler hakem olur ve süreyi tutar.
Görev 3: Kör sürüş
Bu görev pilotun gösterge uçuşudur. Robotunu bir perdenin arkasına al ya da gözünü robottan ayırıp yalnızca telefonun ekranına bak. Yere bantla düz bir çizgi koy ve robotu o çizgi boyunca sür; ama robota bakmadan, sadece donus satırındaki sayıya bakarak.
Düz gitmenin sırrı şu: robot ancak donus değeri tam 0.00 ise dümdüz gider. Sağa kaçıyorsa sayı artıdadır, sola kaçıyorsa eksidedir. Sen sağ çubuğu öyle nazik tut ki donus satırı 0.00'da kalsın. Bir arkadaşın robota bakıp çizgiden ne kadar saptığını söylesin, sen sadece sayıya güven. İlk denemede zor gelir, çünkü göze değil sayıya güvenmeye alışık değilsin. Ama birkaç denemede fark edeceksin: ekran sana gerçeği robottan önce söylüyor. Çubuk azıcık kaçtığında sayı hemen değişir, robot daha kaçmaya başlamadan sen düzeltebilirsin.
Bunu başardığında çok önemli bir şey yapmış olursun: robota bakmadan ona güvenmek. Sonraki modülde robot sensiz, kendi başına hareket edecek; o zaman ona bakmak değil, ne yaptığını okumak senin tek gözün olacak.
Pekiştirme ve öz-değerlendirme (7 dk)
Görevler bitti, şimdi kendine karşı dürüst ol. Kimse not vermiyor, gelişimi sen ölçüyorsun. Her satır için sana en uygun sütunu işaretle.
| Soru | Başlangıç | Gelişiyor | Ustalaştım |
|---|---|---|---|
| Ekranımı bir bakışta okunur yapabiliyorum | Sayılar karışık | Çoğu satır etiketli | Sade, etiketli, kaymayan panel |
| clearTelemetry'nin neden gerektiğini anlatabiliyorum | Emin değilim | Biliyorum | Unutulunca ne olacağını da biliyorum |
| Kendi değişkenimi oluşturup ekrana koyabiliyorum | Sadece hazır değerler | Bir değişken ekledim | Değişkeni buton ile değiştirip izliyorum |
| Telemetriyle bir hatayı teşhis edebiliyorum | Robotu izlerim | Bazen ekrandan bulurum | Ekrandaki sayıyla kanıtlarım |
| Robota bakmadan, ekranla düz sürebiliyorum | Göze güvenirim | Ara sıra sayıya bakarım | Sadece ekranla düz sürerim |
Günlük hayat bağı: Bugün öğrendiğin şey sadece robotla ilgili değil. Bir arabanın hız göstergesi sürücüye lastiğe bakmadan ne kadar hızlı gittiğini söyler. Telefonun şarj yüzdesi, pilini açıp bakmadan ne kadar kaldığını söyler. Doktorun ateş ölçeri, vücudun içini görmeden içeride ne olduğunu bir sayıyla anlatır. Hepsi telemetridir: göremediğin bir şeyin içini, bir sayıyla duyulur yapmak. Bir sistemin doğru sayısını doğru anda okumak, sadece robotların değil, senin de becerin.
Modül kontrol listesi
Bu modülü bitirdin sayılır. Şu satırların hepsine gönül rahatlığıyla evet diyebiliyorsan otonom modülüne hazırsın:
- Koduna telemetri satırları ekledin:
probot::printfile bir etiketi ve bir değeri Driver Station ekranına bastın. - Her loop turunda önce
clearTelemetry()çağırıp sonra yazdığını, yoksa satırların birikeceğini biliyorsun. %.2fbiçiminin iki basamaklı ondalık,%dbiçiminin tam sayı gösterdiğini koda bakmadan söyleyebiliyorsun.- Kendi değişkenini oluşturdun, bir butonla değerini değiştirdin ve o değeri ekranda izledin.
- Deadzone'u kendi gözünle gördün: çubuk bırakıkken değerin tam
0.00göründüğünü ve neden olduğunu anlatabiliyorsun. - Telemetriyle en az bir hatayı teşhis ettin ve kanıtını ekrandaki sayıyla gösterdin.
- Robota bakmadan, sadece ekrana bakarak robotu düz sürmeyi denedin.
Erken bitirene ek görev
Görevleri erken bitirdiysen boş durma, iki meydan okuma seni bekliyor:
- Mod adı ekranı: Hız çarpanını bir sayı yerine bir isimle göster. Çarpan tam güçteyken ekrana
mod: HIZLI, yarı güçteykenmod: YAVASyazdır. Bir if ile hangi metni basacağına karar ver. Böylece ekranın sayıyı değil, doğrudan durumu söyler; okuması daha da hızlanır. - Kör hedefe park: Yere bir hedef nokta bantla ve robotu perde arkasından, sadece bir arkadaşının söylediği sapma ve senin ekrandaki sayılarınla o noktaya park et. Gözün kapalı, kulağın ve ekranın açık. Robot sensiz karar verdiğinde onu böyle yöneteceksin; bir sonraki modülde tam da bunu yapacak.