Pular para o conteúdo principal

Entrando no Alcance

Os 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 loop de controle proporcional junto com a mira calibrada do Limelight para fazer seu robô dirigir facilmente até uma distância específica do alvo.

Para este exemplo, você deve garantir que seu robô esteja mirando no alvo. Mais tarde, combinaremos a mira e o ajuste de distância em uma única função, mas neste exemplo, estamos focando apenas no código que faz o robô dirigir até a distância correta.

Semelhante 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 distancia_atual = Estimar_Distancia(); // veja o 'Estudo de Caso: Estimando Distância'

if (joystick->GetRawButton(9))
{
float erro_distancia = distancia_desejada - distancia_atual;
ajuste_direcao = KpDistance * erro_distancia;

comando_esquerdo += ajuste_direcao;
comando_direito += ajuste_direcao;
}

Com algum ajuste da configuração KpDistance, seu robô deve dirigir rápida e precisamente até a distância desejada. 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 com muito mais facilidade do que gira no lugar.

A seguir, descreveremos um truque simples para tornar ainda mais fácil dirigir até a 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 erro_distancia = table->GetNumber("ty");

if (joystick->GetRawButton(9))
{
ajuste_direcao = KpDistance * erro_distancia;

comando_esquerdo += ajuste_direcao;
comando_direito += ajuste_direcao;
}

Se você precisar mudar a distância de disparo, basta mover seu robô para a nova distância e recalibrar a mira do Limelight.

Imagem

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":

Imagem