חיפוש מטרות נסתרות
יישום התנהגות חיפוש יכול להיות שימושי במספר מצבים. בחלק מהמשחקים, המטרה שאליה אתה מנסה לקלוע עשויה לא להיות במיקום צפוי, כך שאינך יכול להסתמך על קוד אוטונומי מבוסס ניווט עיוור כדי להגיע "קרוב מספיק". ב-2009 למשל, המטרות היו מחוברות לרובוטים של היריבים שגם הם נסעו סביב. סיבה נוספת שבגללה תרצה ליישם חיפוש היא אם מערכת ההנעה של הרובוט שלך אינה אמינה/חוזרת על עצמה מספיק כדי להציב אותך בדיוק במיקום הרצוי. לפעמים הנעות מסוג swerve או הנעות רב-כיווניות עלולות להתקשות לנסוע למיקומים מדויקים (זו לא ביקורת על הנעות swerve או רב-כיווניות; פשוט יותר מאתגר לגרום להן לנסוע למיקומים חוזרים). חלק מהמשחקים אפילו אפשרו אינטראקציה בין רובוט לרובוט במהלך מצב אוטונומי. ב-2006 לעתים קרובות עסקנו בדו-קרבות אוטונומיים שבהם רובוטי ההגנה ניסו להוציא את רובוטי ההתקפה ממצב קליעה. במקרה כזה אינך יכול להיות בטוח בשום דבר! מקווה שזה גורם לך לחשוב על כמה דרכים שבהן יכול להיות שימושי לגרום לרובוט שלך לחפש באופן אוטומטי מטרה שהוא לא יכול לראות בהתחלה.
למרבה המזל, הוספת לוגיקת חיפוש לרובוט שלך היא קלה מאוד. כדי ליישם חיפוש, פשוט גרום לרובוט שלך לסרוק אחר מטרה וברגע שהוא מוצא אותה, התחל להריץ את קוד הכיוון. נשתמש בערך 'tv' או 'target valid' המדווח על ידי limelight כדי לדעת אם אנחנו רואים מטרה או לא.
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");
float tv = table->GetNumber("tv");
float tx = table->GetNumber("tx");
float steering_adjust = 0.0f;
if (tv == 0.0f)
{
// אנחנו לא רואים את המטרה, חפש את המטרה על ידי סיבוב במקום במהירות בטוחה.
steering_adjust = 0.3f;
}
else
{
// אנחנו כן רואים את המטרה, הרץ קוד כיוון
float heading_error = tx;
steering_adjust = Kp * tx;
}
left_command+=steering_adjust;
right_command-=steering_adjust;