Entrando no Alcance
Robôs da FRC frequentemente precisam ser posicionados a uma distância específica do alvo de pontuação para que seu mecanismo de pontuação funcione bem. Você pode usar um simples controle proporcional junto com a mira calibrada do limelight para fazer seu robô chegar facilmente a uma distância específica do alvo.
Para este exemplo, você deve garantir que seu robô esteja mirando no alvo. Posteriormente, combinaremos a mira e o ajuste de distância em uma única função, mas neste exemplo estamos focando apenas no código que move o robô para a distância correta.
Similar ao exemplo de mira, aqui mostramos uma função que pode ser executada no loop de atualização do seu robô.
float KpDistance = -0.1f; // Constante de controle proporcional para distância
float current_distance = Estimate_Distance(); // veja o 'Estudo de Caso: Estimando Distância'
if (joystick->GetRawButton(9))
{
float distance_error = desired_distance - current_distance;
driving_adjust = KpDistance * distance_error;
left_command += distance_adjust;
right_command += distance_adjust;
}
Com alguns ajustes na configuração do KpDistance, seu robô deve chegar rápida e precisamente à distância desejada. Comparado à mira, chegar à distância correta geralmente é mais fácil porque a maioria dos robôs se move para frente e para trás com mais facilidade do que gira no lugar.
A seguir, descreveremos um truque simples para tornar ainda mais fácil chegar à distância correta. Em vez de calcular a distância real, você pode usar a mira do limelight. Basta posicionar seu robô na distância ideal do alvo e calibrar a posição y da mira. Agora seu ângulo y será reportado como 0.0 quando seu robô estiver na distância correta. Usando este truque, você nunca precisa calcular a distância real e seu código pode ser algo assim:
float KpDistance = -0.1f;
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");
float distance_error = table->GetNumber("ty");
if (joystick->GetRawButton(9))
{
driving_adjust = KpDistance * distance_error;
left_command += distance_adjust;
right_command += distance_adjust;
}
Se você precisar mudar a distância de disparo, basta mover seu robô para a nova distância e recalibrar a mira do limelight.
Aqui está um exemplo de um robô usando a ideia acima. Observe como ele recua automaticamente para o alcance correto quando o piloto para de dirigir e pressiona o botão de "mirar":