Buscando Alvos Não Visíveis
Implementar um comportamento de busca pode ser útil em várias situações. Em alguns jogos, o alvo que você está tentando marcar pode não estar em uma localização previsível, então você não pode confiar em código autônomo de navegação estimada para chegar "perto o suficiente". Em 2009, por exemplo, os alvos estavam fixados nos robôs adversários que também estavam se movimentando. Outro motivo pelo qual você pode querer implementar a busca é se o sistema de movimentação do seu robô não for confiável/repetível o suficiente para colocá-lo exatamente na posição desejada. Às vezes, drives swerve ou omnidirecionais podem ter dificuldade para dirigir até localizações precisas (isso não é uma crítica aos drives swerve ou omnidirecionais; é apenas mais desafiador fazê-los dirigir até posições repetíveis). Alguns jogos até permitiram interação robô-robô durante o modo autônomo. Em 2006, frequentemente nos envolvíamos em duelos autônomos onde os robôs de defesa tentavam tirar os robôs de ataque da posição de pontuação. Neste caso, você não pode ter certeza de nada! Esperamos que isso faça você pensar em algumas maneiras em que ter seu robô buscando automaticamente por um alvo que inicialmente não pode ver possa ser útil.
Felizmente, adicionar lógica de busca ao seu robô é muito fácil. Para implementar a busca, você simplesmente faz seu robô procurar por um alvo e, uma vez que o encontre, começa a executar o código de mira. Usaremos o valor 'tv' ou 'target valid' (alvo válido) reportado pelo limelight para saber se vemos um alvo ou não.
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)
{
// Não vemos o alvo, procure o alvo girando no lugar em uma velocidade segura.
steering_adjust = 0.3f;
}
else
{
// Vemos o alvo, execute o código de mira
float heading_error = tx;
steering_adjust = Kp * tx;
}
left_command+=steering_adjust;
right_command-=steering_adjust;