البحث عن الأهداف غير المرئية
يمكن أن يكون تنفيذ سلوك البحث مفيدًا في بعض المواقف. في بعض الألعاب، قد لا يكون الهدف الذي تحاول التسجيل فيه في موقع يمكن التنبؤ به، لذلك لا يمكنك الاعتماد على الكود المستقل للحساب الميت للوصول إلى "مكان قريب بما فيه الكفاية". على سبيل المثال، في عام 2009، كانت الأهداف مرتبطة بروبوتات الخصوم التي كانت تتحرك أيضًا. سبب آخر قد يجعلك ترغب في تنفيذ البحث هو إذا كانت مجموعة نقل الحركة في روبوتك غير موثوقة/قابلة للتكرار بما يكفي لوضعك في الموقع الذي تريده بالضبط. في بعض الأحيان، قد تواجه محركات السويرف أو المحركات متعددة الاتجاهات صعوبة في القيادة إلى مواقع دقيقة (هذا ليس انتقادًا لمحركات السويرف أو المحركات متعددة الاتجاهات؛ إنه فقط أكثر تحديًا للحصول عليها للقيادة إلى مواقع قابلة للتكرار). بعض الألعاب سمحت حتى بالتفاعل بين الروبوت والروبوت أثناء الوضع المستقل. في عام 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;