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 confiar en código autónomo de navegación a estima para llegar "lo suficientemente cerca". Por ejemplo, en 2009, los objetivos estaban unidos a los robots oponentes que también se movían. Otra razón por la que podrías querer implementar la búsqueda es si el tren de manejo de tu robot no es lo suficientemente confiable/repetible para ubicarte exactamente en la posición deseada. A veces los sistemas de manejo tipo swerve u omnidireccionales pueden tener dificultades para conducir a ubicaciones precisas (esto no es una crítica a los sistemas swerve u omnidireccionales; simplemente es más desafiante lograr que se muevan a ubicaciones repetibles). Algunos juegos incluso han permitido la interacción robot-robot durante el modo autónomo. En 2006, frecuentemente participábamos en duelos autónomos donde los robots defensivos intentaban sacar de posición de anotación a los robots ofensivos. ¡En este caso no puedes estar seguro de nada! Esperamos que esto te haga pensar en algunas formas en que podría ser útil que tu robot busque automáticamente un objetivo que inicialmente no puede ver.
Afortunadamente, agregar lógica de búsqueda a tu robot es muy fácil. Para implementar la búsqueda, simplemente haces que tu robot escanee un objetivo y una vez que lo encuentra, comience a ejecutar el código de apuntado. Usaremos el valor 'tv' o 'target valid' (objetivo válido) 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, buscamos el objetivo girando en el lugar a una velocidad segura.
steering_adjust = 0.3f;
}
else
{
// Vemos el objetivo, ejecutamos código de apuntado
float heading_error = tx;
steering_adjust = Kp * tx;
}
left_command+=steering_adjust;
right_command-=steering_adjust;