Estimación de Distancia
Usando una Cámara de Ángulo Fijo
Si su cámara de seguimiento de visión está montada en su robot de tal manera que el ángulo entre el plano del suelo y su línea de visión no cambia, entonces puede usar esta técnica para calcular con gran precisión la distancia a un objetivo. Luego puede usar este valor de distancia para conducir su robot hacia adelante y hacia atrás para obtener el rango perfecto o ajustar la potencia de un mecanismo de lanzamiento.
Vea el diagrama a continuación. En este contexto, todas las variables son conocidas: la altura del objetivo (h2) es conocida porque es una propiedad del campo. La altura de su cámara sobre el suelo (h1) es conocida y su ángulo de montaje es conocido (a1). El Limelight (o su sistema de visión) puede decirle el ángulo y al objetivo (a2).
Podemos resolver d usando la siguiente ecuación:
tan(a1+a2) = (h2-h1) / d
"d = (h2-h1) / tan(a1+a2)"
La función "tan" generalmente espera una entrada medida en radianes. Para convertir una medición de ángulo de grados a radianes, multiplique por (3.14159/180.0). Vea el ejemplo de código completo a continuación.
- Java
- C++
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
NetworkTableEntry ty = table.getEntry("ty");
double targetOffsetAngle_Vertical = ty.getDouble(0.0);
// ¿Cuántos grados hacia atrás está rotado su limelight desde la vertical perfecta?
double limelightMountAngleDegrees = 25.0;
// distancia desde el centro de la lente del Limelight al suelo
double limelightLensHeightInches = 20.0;
// distancia desde el objetivo al suelo
double goalHeightInches = 60.0;
double angleToGoalDegrees = limelightMountAngleDegrees + targetOffsetAngle_Vertical;
double angleToGoalRadians = angleToGoalDegrees * (3.14159 / 180.0);
//calcular distancia
double distanceFromLimelightToGoalInches = (goalHeightInches - limelightLensHeightInches) / Math.tan(angleToGoalRadians);
std::shared_ptr<NetworkTable> table = nt::NetworkTableInstance::GetDefault().GetTable("limelight");
double targetOffsetAngle_Vertical = table->GetNumber("ty",0.0);
// ¿Cuántos grados hacia atrás está rotado su limelight desde la vertical perfecta?
double limelightMountAngleDegrees = 25.0;
// distancia desde el centro de la lente del Limelight al suelo
double limelightLensHeightInches = 20.0;
// distancia desde el objetivo al suelo
double goalHeightInches = 60.0;
double angleToGoalDegrees = limelightMountAngleDegrees + targetOffsetAngle_Vertical;
double angleToGoalRadians = angleToGoalDegrees * (3.14159 / 180.0);
//calcular distancia
double distanceFromLimelightToGoalInches = (goalHeightInches - limelightLensHeightInches)/tan(angleToGoalRadians);
Al usar esta técnica, es importante elegir cuidadosamente el ángulo de montaje de su cámara. Desea poder ver el objetivo tanto cuando está demasiado cerca como demasiado lejos. Tampoco quiere que este ángulo cambie, así que móntelo de forma segura y evite usar ranuras en su geometría de montaje.
Si tiene problemas para determinar cuál es el ángulo a1, también puede usar la ecuación anterior para resolver a1. Simplemente coloque su robot a una distancia conocida (midiendo desde la lente de su cámara) y resuelva la misma ecuación para a1.
En el caso de que su objetivo esté casi a la misma altura que su cámara, esta técnica no es útil.
Usando el Área para Estimar la Distancia
Otra forma simple de estimar la distancia es usar el área del contorno que está rastreando. Este es un método muy simple de implementar, pero no le da resultados extremadamente precisos. Todo lo que hace es apuntar su cámara de visión al objetivo desde una distancia conocida y tomar nota del área del blob. Asegúrese de estar usando una representación precisa del objetivo de visión del campo real y asegúrese de apuntar a él desde su ubicación de disparo deseada. Luego puede hacer esto desde algunas distancias diferentes y hacer una tabla con estos valores. En 2016 usamos este método para ajustar la puntería de nuestra torreta de 2 ejes basándonos en qué tan lejos estábamos de la meta.