يحدث ذلك تقريبا لكل من يعمل في الروبوتات: تبني روبوتا جيدا لتجنب العوائق. الكود جاهز والوصلات جاهزة. تتركه في ممر فارغ. يسير بمرح ثم يفرمل فجأة رغم أن لا شيء أمامه.
تنظر بدهشة بينما يتصرف كأنه اصطدم بجدار غير مرئي. لم يُجن. رأى شبحا. الاسم التقني: ضوضاء الحساس (sensor noise).
المشكلة: نهج ساذج بلا فلتر
حساس الموجات فوق الصوتية قد يعطي أحيانا عينة خاطئة. غبار أو تيار هواء أو صدى قد يجعل مسافة حقيقية 200 سم تبدو لحظة كأنها 5 سم.
في الكود غالبا نثق بقراءة واحدة عمياء:
if (distance < 10) {
stopNow();
}
يرتعب الروبوت من الـ 5 سم الخاطئة ويتوقف. لا يوجد عائق; فقط خطأ قياس، ضوضاء.
النصيحة: صفِّ بالمتوسط
في الحياة لا نصدق قولا واحدا فورا. إن قال أحد إن الحرارة 50 درجة في الخارج لن تخلع المعطف فورا; ستتحقق مجددا. امنح الروبوت العادة نفسها. هذا يسمى الترشيح. أبسط طريقة فعالة: أخذ المتوسط.
الروبوت الذكي لا يقرر من عينة واحدة. في أجزاء من الألف من الثانية يأخذ 5–10 قراءات متتالية. مثال:
200, 200, 5, 202, 198
تلك الـ 5 سم الخاطئة تذوب بين القيم الصحيحة. يبقى المتوسط قريبا من المسافة الحقيقية. يتوقف للعوائق الحقيقية لا للأشباح.
int averageDistance() {
long sum = 0;
int n = 5;
for (int i = 0; i < n; i++) {
sum += readDistance();
delayMicroseconds(2000);
}
return (int)(sum / n);
}
void loop() {
int distance = averageDistance();
if (distance > 0 && distance < 10) {
stopNow();
} else {
goForward();
}
}
ملاحظة الورشة: اترك فجوة قصيرة جدا بين العينات. هذا الانتظار الميكروي ليس كفخ
delay(1000)الطويل الذي يجمد الحلقة كلها. ويمكنك بناء الفكرة نفسها بـmillis().
خلاصة
مبرمج الروبوت الجيد لا يصدق كل قيمة من الحساس فورا. يصفّي البيانات بالرياضيات ويتوقف فقط عند العوائق الحقيقية. لا تجعله صائد أشباح; علمه تحليل القراءات.