Robotik projelerde herkesin başına en az bir kez gelir: Engelden kaçan güzel bir robot yaparsınız. Kod tamam, bağlantı tamam. Robotu boş bir koridora bırakırsınız. Neşeyle ilerlerken aniden, önünde hiçbir şey yokken fren yapıp durur.
Siz şaşkın bakarken robot sanki görünmez bir duvara çarpmış gibidir. Robot delirmedi. Sadece bir hayalet gördü. Teknik adı: sensör gürültüsü (sensor noise).
Sorun: Filtresiz, fazla saf yaklaşım
Ultrasonik sensör bazen anlık hata üretir. Küçük bir toz, hava akımı veya yankı yüzünden gerçekte 200 cm olan mesafe bir an 5 cm gibi görünebilir.
Kodda genellikle tek ölçüme körü körüne güveniriz:
if (mesafe < 10) {
dur();
}
Robot hatalı 5 cm değerini aldığı anda sorgulamadan panikler ve durur. Engel gerçek değildir; ölçüm hatasıdır, gürültüdür.
Püf noktası: Ortalama ile filtreleyin
Gerçek hayatta tek söze hemen inanmayız. Birisi dışarı 50 derece dese montu hemen çıkarmazsınız; birkaç kez kontrol edersiniz. Robota da aynı yeteneği verin. Buna filtreleme denir. En basit ve etkili yol: ortalama alma.
Akıllı robot tek ölçümle karar vermez. Çok kısa sürede (milisaniyeler) arka arkaya 5-10 ölçüm alır. Örnek:
200, 200, 5, 202, 198
O tek hatalı 5 cm, diğer doğru değerlerin arasında erir. Ortalama gerçek mesafeye yaklaşır. Robot hayalet engelde durmaz; gerçek engelde durur.
int mesafeOrtalama() {
long toplam = 0;
int n = 5;
for (int i = 0; i < n; i++) {
toplam += mesafeOlc();
delayMicroseconds(2000); // cok kisa ara; loop u uyutmaz
}
return (int)(toplam / n);
}
void loop() {
int mesafe = mesafeOrtalama();
if (mesafe > 0 && mesafe < 10) {
dur();
} else {
ileriGit();
}
}
Atölye notu: Ölçümler arasında çok kısa bir ara bırakın. Buradaki mikro-bekleme tüm
loopu saniyelerce kilitleyendelay(1000)tuzağından farklıdır. İsterseniz aynı mantığımillis()ile de kurabilirsiniz.
Özet
İyi bir robot programcısı sensörden gelen her veriye hemen inanmaz. Veriyi matematikle süzgeçten geçirir ve yalnızca gerçek engellerde durur. Robotunuzu hayalet avcısı yapmayın; ona verileri analiz etmeyi öğretin.