Saltar al contenido principal

Posicionamiento en Rango

Los robots de FRC a menudo necesitan posicionarse a una distancia específica de un objetivo de puntuación para que su mecanismo de puntuación funcione bien. Puedes usar un simple bucle de control proporcional junto con la mira calibrada de Limelight para hacer que tu robot se desplace fácilmente a una distancia específica del objetivo.

Para este ejemplo, debes asegurarte de que tu robot esté apuntando al objetivo. Más adelante combinaremos el apuntado y el ajuste de distancia en una sola función, pero en este ejemplo nos centraremos únicamente en el código que lleva al robot a la distancia correcta.

Similar al ejemplo de apuntado, aquí mostramos una función que se puede ejecutar en el bucle de actualización de tu robot.

float KpDistancia = -0.1f;  // Constante de control proporcional para la distancia
float distancia_actual = Estimar_Distancia(); // ver el 'Caso de Estudio: Estimación de Distancia'

if (joystick->GetRawButton(9))
{
float error_distancia = distancia_deseada - distancia_actual;
ajuste_conduccion = KpDistancia * error_distancia;

comando_izquierdo += ajuste_conduccion;
comando_derecho += ajuste_conduccion;
}

Con algo de ajuste en la configuración de KpDistancia, tu robot debería conducir rápida y precisamente a la distancia deseada. En comparación con el apuntado, conducir a la distancia correcta suele ser más fácil porque la mayoría de los robots avanzan y retroceden mucho más fácilmente de lo que giran en el lugar.

A continuación, describiremos un truco simple para hacer que conducir a la distancia correcta sea aún más fácil. En lugar de calcular realmente la distancia, puedes usar la mira de Limelight. Simplemente posiciona tu robot a la distancia ideal del objetivo y calibra la posición y de la mira. Ahora tu ángulo y se reportará como 0.0 cuando tu robot esté a la distancia correcta. Usando este truco, nunca tienes que calcular realmente la distancia real y tu código puede verse algo así:

float KpDistancia = -0.1f;

std::shared_ptr<NetworkTable> tabla = NetworkTable::GetTable("limelight");
float error_distancia = tabla->GetNumber("ty");

if (joystick->GetRawButton(9))
{
ajuste_conduccion = KpDistancia * error_distancia;

comando_izquierdo += ajuste_conduccion;
comando_derecho += ajuste_conduccion;
}

Si necesitas cambiar la distancia de disparo, simplemente mueve tu robot a la nueva distancia y recalibra la mira de Limelight.

Imagen

Aquí hay un ejemplo de un robot usando la idea anterior. Observa cómo retrocede automáticamente al rango correcto cuando el conductor deja de conducir y presiona el botón de "apuntar":

Imagen