Buscando Objetivos No Visibles
Implementar un comportamiento de búsqueda puede ser útil en varias situaciones. En algunos juegos, el objetivo en el que intentas anotar puede no estar en una ubicación predecible, por lo que no puedes depender de código autónomo de navegación estimada para llegar "lo suficientemente cerca". En 2009, por ejemplo, los objetivos estaban unidos a los robots oponentes que también se movían. Otra razón por la que podrías querer implementar búsqueda es si el tren de transmisión de tu robot no es lo suficientemente confiable/repetible para colocarte exactamente en la ubicación que deseas. A veces los trenes de transmisión swerve u omnidireccionales pueden tener problemas para conducir a ubicaciones precisas (esto no es una crítica a los trenes de transmisión swerve u omnidireccionales; simplemente es más desafiante lograr que conduzcan a ubicaciones repetibles). Algunos juegos incluso han permitido interacción robot-robot durante el modo autónomo. En 2006 frecuentemente participábamos en duelos autónomos donde los robots de defensa intentaban sacar a los robots de ofensiva de su posición de anotación. ¡En este caso no puedes estar seguro de nada! Esperamos que esto te haga pensar en algunas formas en las que tener tu robot buscando automáticamente un objetivo que inicialmente no puede ver podría ser útil.
Afortunadamente, agregar lógica de búsqueda a tu robot es muy fácil. Para implementar búsqueda, simplemente haces que tu robot escanee en busca de un objetivo y una vez que lo encuentra, comienza a ejecutar el código de apuntado. Usaremos el valor 'tv' o 'target valid' reportado por limelight para saber si vemos un objetivo o no.
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)
{
// No vemos el objetivo, buscar el objetivo girando en el lugar a una velocidad segura.
steering_adjust = 0.3f;
}
else
{
// Sí vemos el objetivo, ejecutar código de apuntado
float heading_error = tx;
steering_adjust = Kp * tx;
}
left_command+=steering_adjust;
right_command-=steering_adjust;
