Alcanzando la Distancia Correcta
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 cruz calibrada del limelight para hacer que tu robot se desplace muy 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 para este ejemplo nos enfocamos únicamente en el código que lleva al robot a la distancia correcta.
Similar al ejemplo de apuntado, aquí mostramos una función que puede ejecutarse en el bucle de actualización de tu robot.
float KpDistance = -0.1f; // Constante de control proporcional para distancia
float current_distance = Estimate_Distance(); // ver 'Caso de Estudio: Estimando Distancia'
if (joystick->GetRawButton(9))
{
float distance_error = desired_distance - current_distance;
driving_adjust = KpDistance * distance_error;
left_command += distance_adjust;
right_command += distance_adjust;
}
Con algo de ajuste en la configuración de KpDistance, tu robot debería desplazarse muy rápida y precisamente a la distancia deseada. Comparado con el apuntado, llegar a la distancia correcta suele ser más fácil porque la mayoría de los robots se mueven hacia adelante y hacia atrás mucho más fácilmente de lo que giran en su lugar.
A continuación describiremos un truco simple para hacer que llegar a la distancia correcta sea aún más fácil. En lugar de calcular realmente la distancia, puedes usar la cruz del limelight. Solo posiciona tu robot a tu distancia ideal del objetivo y calibra la posición en Y de la cruz. Ahora tu ángulo Y reportará 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 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;
}
Si necesitas cambiar la distancia de tiro, solo mueve tu robot a la nueva distancia y recalibra la cruz del limelight.
![]()
Aquí hay un ejemplo de un robot usando la idea anterior. Nota cómo retrocede automáticamente a la distancia correcta cuando el conductor deja de conducir y presiona el botón de "apuntar":
