Atölyede en sık yaşadığımız o saç baş yolduran anlardan birini konuşalım.
Öğrenci heyecanla gelir: Hocam kod bitti, her şey tamam, hadi deneyelim! Robotu büyük bir umutla koridorun başına koyarsınız. Koridor bomboş. Önünde ne duvar var ne engel. Ama robot hareket eder etmez birdenbire, sanki görünmez bir duvara çarpmış gibi panikle durur, geri kaçar ya da olduğu yerde anlamsızca dönmeye başlar.
Öğrencinin yüzü düşer: Ama hocam önü boştu, niye durdu? Siz tebessüm edersiniz... Çünkü robotun o an neyi yanlış yorumladığını biliyorsunuzdur.
Sensörün kafası karışınca ne olur?
Kaynak çoğu zaman o meşhur yarasa gözlü ultrasonik sensörümüzdür: HC-SR04. Ses dalgası gönderir, yankıyı bekler.
Ama gerçek hayat laboratuvar gibi değildir. Bazen ses kumaşta emilir, bazen açı terstir, yankı geri dönmez. Tam o an sensör ölçüm yapamaz. Arduino ya demek istediği şudur: Mesafeyi ölçemedim, bilmiyorum.
Bunu nasıl söyler? Yazılımcıların bilinen hata işaretiyle: koca bir 0 değeri göndererek.
Kardeş yazımızdan farkı: Robot Neden Hayalet Görür? yazısında rastgele yanlış ölçümleri (gürültüyü) ortalama ile süzüyorduk. Bu yazıda mesele başka: Sensör bilinçli olarak 0 = ölçüm başarısız diyor.
Robotun masum matematik hatası
Öğrencinin kodunda genelde şu masum satır vardır:
if (mesafe < 15) {
dur();
}
Sensör o an 0 gönderir. Robot saf saf hesaplar: 0, 15 ten küçük mü? Evet, hem de çok küçük!
Ve zavallı robot, burnunun duvara yapıştığını sanıp panik düğmesine basar. Ortada duvar yoktur. Sadece kafası karışmış, ölçüm yapamamış bir sensör vardır. Robot hayalet görmüyor; bir hata kodunu yanlış yorumluyor.
Tecrübe konuşuyor: Robota mantık öğretin
Ona şunu öğretmeliyiz: Bak, sana gelen 0, dibine kadar yaklaştın demek değildir. Sensör hata verdi demektir. Onu engel sanma, pas geç.
Eski düz mantık: Mesafe 15 ten küçükse dur.
Yeni tecrübeli mantık: Mesafe 15 ten küçükse ve mesafe 0 değilse dur.
if (mesafe > 0 && mesafe < 15) {
dur();
}
İşte bu kadar. Bu küçük dokunuşla robot o hayalet sıfırları, yani hatalı ölçümleri engel sanmaz; sadece gerçek mesafelere tepki verir.
İsterseniz bunu ortalama filtreyle birlikte de kullanın: Önce birkaç ölçüm alın, ortalamayı hesaplayın; sonra kararda yine mesafe > 0 şartını unutmayın. İkisi birbirinin rakibi değil, tamamlayıcısıdır.
Unutmayalım; robotik biraz da böyledir: Mükemmel olmayan donanımları, akıllıca yazılmış kodlarla idare etme sanatı.