Alcançando a Distância Correta
Robôs de FRC frequentemente precisam ser posicionados a uma distância específica de um alvo de pontuação para que seu mecanismo de pontuação funcione bem. Você pode usar um simples loop de controle proporcional junto com a mira calibrada do limelight para fazer seu robô dirigir até uma distância específica do alvo de forma muito fácil.
Para este exemplo, você deve garantir que seu robô esteja mirado no alvo. Mais tarde, combinaremos mira e ajuste de distância em uma única função, mas para este exemplo estamos focando apenas no código que leva o robô até 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 algum ajuste na configuração KpDistance, seu robô deve dirigir até a distância desejada de forma muito rápida e precisa. Comparado à mira, dirigir até a distância correta geralmente é mais fácil porque a maioria dos robôs se move para frente e para trás muito mais facilmente do que gira no lugar.
A seguir, descreveremos um truque simples para tornar o ajuste de distância ainda mais fácil. Em vez de realmente calcular a distância, 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 reportará 0.0 quando seu robô estiver na distância correta. Usando este truque, você nunca precisa realmente calcular a distância real e seu código pode ficar 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 arremesso, 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. Note como ele recua automaticamente para a distância correta quando o piloto para de dirigir e pressiona o botão de "mira":
