4. hafta / 14
Sensörler ve sinyal filtreleme
Araçlar: Bu platform (Uno laboratuvarı: HC-SR04, Sharp IR, MPU6050), Python
Bu haftanın sonunda
- Bir görev için sensör seçmek ve sınırlarını açıklamak
- Ham okumaları fiziksel birimlere dönüştürmek
- Hareketli ortalama, EMA ve 1B Kalman filtresini uygulamak ve karşılaştırmak
Ders notları
Sensörler ya iç algılayıcı (proprioceptive) (robotun kendisini ölçer: enkoderler, IMU, pil gerilimi) ya da dış algılayıcı (exteroceptive) (dünyayı ölçer: mesafe sensörleri, kameralar, LiDAR) olarak sınıflandırılır.
Yaygın sensörler
- IR yansıma: ucuz, kısa menzilli, ortam ışığına duyarlı. Çizgi izleme için uygundur.
- Ultrasonik (HC-SR04): yankı süresini ölçer. Ses yaklaşık 343 m/s hızla yayılır ve gidip geri döner:
- IMU: bir ivmeölçer (yerçekimi artı hareketi ölçer, gürültülüdür) ve bir jiroskop (açısal hızı ölçer, pürüzsüzdür ancak integrali alındığında kayar (drift)).
- Tekerlek enkoderleri: tik sayar; mesafe 2πr · ticks / N olur.
Gürültü ve filtreler
Her ölçüm, gerçek değer artı gürültüdür. Filtreler, gürültü azaltımı ile gecikme (lag) arasında bir ödünleşim yapar.
Kalman filtresi bir kestirim ve onun belirsizliği P'yi tutar. Önce tahmin yapar (belirsizlik Q kadar artar), ardından ölçümü K = P / (P + R) kazancıyla ağırlıklandırarak günceller. Büyük bir R, "sensöre daha az güven" anlamına gelir. Bu fikre 9. haftada konumlandırma (localization) için geri döneceğiz.
Derinlemesine
Filtrelemeden önce gürültüyü tanıyın
Bir filtre seçmeden önce sensörü ölçün. Bir HC-SR04'ü bir duvarın önünde sabit tutun, 500 okuma kaydedin ve ortalamalarını ve standart sapmalarını (σ) hesaplayın. Varyans σ², Kalman filtresinin ihtiyaç duyduğu R değerinin ta kendisidir. Aynısını hareketsiz duran bir jiroskopla yapın: ortalaması sapmadır (bias) ve açılışta çıkarılır. 60 s boyunca integrali alınan 0,5 °/s'lik bir sapma şimdiden 30°'lik bir yön hatası üretir.
Çözümlü örnek: adım adım 1B Kalman filtresi
Süreç gürültüsü Q = 1 cm² ve ölçüm gürültüsü R = 9 cm² (σ = 3 cm) olan bir mesafeyi kestiriyoruz. x = 100 cm ve P = 4 cm² ile başlayalım. z = 106 cm okuması geliyor:
Bir sonraki adımda P⁻ = 4,21 ve K = 0,319 olur. Kazanç, P⁻ değeri P⁻² − Q P⁻ − Q R = 0 denkleminin köküne oturana kadar düşmeye devam eder:
Yani sabit modelli bir 1B Kalman filtresi birkaç adım sonra α ≈ 0,28 olan bir EMA'ya dönüşür. Kalman bakış açısı, tahmin yürütmek yerine ölçülen gürültüden hangi α'nın seçileceğini söyler ve tahminin henüz belirsiz olduğu başlangıçta kendini uyarlar.
Bedeli gecikmedir
N noktalı bir hareketli ortalama sinyali (N − 1) / 2 örnek geciktirir: 100 Hz'de N = 11, 50 ms gecikme verir. Δt adımında α katsayılı bir tamamlayıcı filtrenin zaman sabiti τ = αΔt / (1 − α) olur; α = 0,98 ve Δt = 10 ms ile τ ≈ 0,49 s'dir. τ'dan yavaş jiroskop kayması ivmeölçerle düzeltilir, τ'dan hızlı titreşim ise yok sayılır.
Hiçbir filtrenin gideremediği hatalar
Filtreler rastgele gürültüyü azaltır, sistematik hatayı değil. Ses hızı yaklaşık 331,3 + 0,606·T m/s'dir; 30 °C'de 349,5 m/s olur, bu yüzden 343 m/s varsayan ürün yazılımı yaklaşık %1,9 kısa okur. Geniş ultrasonik koni tam karşıdaki nesneyi değil en yakın kenarı görür ve yumuşak yüzeyler yankıyı yutar.
| Sensör | Ne verir | Dikkat edilecekler |
|---|---|---|
| HC-SR04 | 2 cm ile 4 m arası, yaklaşık 15°'lik koni | sıcaklık, yumuşak yüzeyler, sensörler arası karışma |
| TF-Luna (ToF LiDAR) | 0,2 m ile 8 m arası, dar ışın, UART veya I²C | doğrudan güneş ışığı, koyu veya cam yüzeyler |
| MPU6050, BMI270 | ham ivme ve açısal hız | jiroskop sapması, titreşim, füzyonu siz yazarsınız |
| BNO085 | yonga üzerinde birleştirilmiş yönelim (kuaterniyon) | motorların yakınındaki manyetik bozulma |
Simülasyon
Sensör gürültüsü ve filtreleme
30 Hz örneklenen gürültülü bir mesafe sensörü. Hareketli ortalamayı, üstel hareketli ortalamayı (EMA) ve tek boyutlu Kalman filtresini gerçek mesafeyle karşılaştır.
Kod
const int TRIG = 9, ECHO = 10;
const float ALPHA = 0.2;
float filtered = 0;
float readCm() {
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long us = pulseIn(ECHO, HIGH, 30000); // zaman aşımı ~5 m
return us * 0.0343 / 2.0;
}
void setup() { pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); Serial.begin(115200); }
void loop() {
float raw = readCm();
filtered = ALPHA * raw + (1 - ALPHA) * filtered;
Serial.print(raw); Serial.print(','); Serial.println(filtered); // Serial Plotter'ı açın
delay(30);
}def kalman_1d(zs, q=0.3, r=200.0):
x, p = zs[0], 100.0
out = []
for z in zs:
p += q # tahmin: belirsizlik artar
k = p / (p + r) # Kalman kazancı
x += k * (z - x) # ölçümle güncelle
p *= (1 - k)
out.append(x)
return outSık yapılan hatalar
- Açılışta jiroskop sapmasını çıkarmamak; integrali alınan açı dakikada onlarca derece kayar.
- Kalman Q ve R değerlerini sensör varyansını ölçmek yerine tahminle seçmek.
- Hızlı bir denetleyicinin önüne uzun bir hareketli ortalama koyup gecikme için denetleyiciyi suçlamak.
- İki HC-SR04'ü aynı anda tetiklemek; her biri diğerinin yankısını duyar.
- Eğimi atan(ax / az) ile hesaplamak; 90° civarında sıfıra böler ve işareti kaybeder, atan2 kullanın.
- Jiroskop hızı ile tamamlayıcı filtre arasında derece ve radyanı karıştırmak.
Yazılım mühendisliği bağlantısı
Filtre küçük, durum tutan ve deterministik bir hesaplamadır: aynı girdi dizisi her zaman aynı çıktıyı verir. Bu, onu robotun iyi test edilmesi en kolay parçalarından biri, yanlış yapılması ise en pahalı parçalarından biri yapar, çünkü aşağı akıştaki her denetleyici ona güvenir.
- Altın dosya testleri (golden-file tests): gerçek veya simüle edilmiş bir sensör kaydını bir kez CSV olarak kaydedin, CI'da filtreyi bunun üzerinde çalıştırın ve saklanan çıktıyla bir tolerans içinde karşılaştırın.
- Özellik testleri (property tests): sabit bir girdi o sabite yakınsamalıdır ve bir EMA çıktısı her zaman önceki tahmin ile yeni örnek arasında kalmalıdır.
- Birimleri adlara yazın (
dist_cm,rate_dps); birim karışıklıkları klasik ve pahalı bir hata sınıfıdır.
Dönem projesi uygulaması: Webots veya Wokwi'den en az bir sensör kaydını data/ klasörüne kaydedin ve onu filtrenizden yeniden geçiren bir regresyon testi ekleyin; böylece sonucu değiştiren sonraki bir "küçük ayar" derlemeyi başarısız kılar.
Laboratuvar görevi
Simülatörde, σ = 14 ve σ = 30 gürültü düzeylerinde her filtre için en düşük hatayı veren ayarları bulun. Basamak değişimlerine en hızlı hangi filtre tepki veriyor? Ardından Wokwi'de bir HC-SR04 bağlayın ve ham ile filtrelenmiş değerleri Serial Plotter'da karşılaştırın.
Kendini sına
Bir 1B Kalman filtresinde tahmin edilen varyans P⁻ = 3 ve ölçüm varyansı R = 9. Kazanç K nedir?
35 °C'de, ses hızını 343 m/s varsayan HC-SR04 ürün yazılımı 100 cm bildiriyor. Gerçek mesafe nedir?
Bir tamamlayıcı filtre α = 0,98 kullanıyor ve 100 Hz'de çalışıyor. Zaman sabiti nedir?
11 noktalı bir hareketli ortalama 100 Hz'lik bir sinyal üzerinde çalışıyor. Ne kadar gecikme ekler?
Ödev
Wokwi'de bir MPU6050 için tümleyen filtre (complementary filter) uygulayın ve yalnızca ivmeölçerden, yalnızca jiroskoptan ve filtreden elde edilen yunuslama (pitch) açısını çizdirin. Her eğriyi birkaç cümleyle açıklayın.