Mesafe Tahmini
Sabit Açılı Kamera Kullanımı
Görüntü takip kameranız robotunuza, yer düzlemi ile görüş hattı arasındaki açı değişmeyecek şekilde monte edilmişse, hedefe olan mesafeyi çok doğru bir şekilde hesaplamak için bu tekniği kullanabilirsiniz. Daha sonra bu mesafe değerini, robotunuzu mükemmel menzile getirmek için ileri geri sürmek veya bir fırlatma mekanizmasının gücünü ayarlamak için kullanabilirsiniz.
Aşağıdaki diyagrama bakın. Bu bağlamda, tüm değişkenler bilinmektedir: hedefin yüksekliği (h2) sahanın bir özelliği olduğu için bilinmektedir. Kameranızın yerden yüksekliği (h1) bilinmektedir ve montaj açısı (a1) bilinmektedir. Limelight (veya görüntü sisteminiz) hedefe olan y açısını (a2) size söyleyebilir.

Aşağıdaki denklemi kullanarak d'yi çözebiliriz:
tan(a1+a2) = (h2-h1) / d
"d = (h2-h1) / tan(a1+a2)"
"tan" fonksiyonu genellikle radyan cinsinden ölçülmüş bir girdi bekler. Bir açı ölçümünü dereceden radyana dönüştürmek için (3.14159/180.0) ile çarpın. Tam kod örneğini aşağıda görebilirsiniz.
- Java
- C++
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
NetworkTableEntry ty = table.getEntry("ty");
double targetOffsetAngle_Vertical = ty.getDouble(0.0);
// limelight'ınız tam dikeyden kaç derece geriye döndürülmüş?
double limelightMountAngleDegrees = 25.0;
// Limelight lensinin merkezinden yere olan mesafe
double limelightLensHeightInches = 20.0;
// hedeften yere olan mesafe
double goalHeightInches = 60.0;
double angleToGoalDegrees = limelightMountAngleDegrees + targetOffsetAngle_Vertical;
double angleToGoalRadians = angleToGoalDegrees * (3.14159 / 180.0);
// mesafeyi hesapla
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);
// limelight'ınız tam dikeyden kaç derece geriye döndürülmüş?
double limelightMountAngleDegrees = 25.0;
// Limelight lensinin merkezinden yere olan mesafe
double limelightLensHeightInches = 20.0;
// hedeften yere olan mesafe
double goalHeightInches = 60.0;
double angleToGoalDegrees = limelightMountAngleDegrees + targetOffsetAngle_Vertical;
double angleToGoalRadians = angleToGoalDegrees * (3.14159 / 180.0);
// mesafeyi hesapla
double distanceFromLimelightToGoalInches = (goalHeightInches - limelightLensHeightInches)/tan(angleToGoalRadians);
Bu tekniği kullanırken kameranızın montaj açısını dikkatli seçmeniz önemlidir. Hem çok yakınken hem de çok uzaktayken hedefi görebilmeniz gerekir. Ayrıca bu açının değişmemesini istersiniz, bu yüzden sağlam bir şekilde monte edin ve montaj geometrinizde yuva kullanmaktan kaçının.
a1 açısının ne olduğunu bulmakta zorlanıyorsanız, a1'i çözmek için yukarıdaki denklemi de kullanabilirsiniz. Robotunuzu bilinen bir mesafeye koyun (kameranızın lensinden ölçerek) ve aynı denklemi a1 için çözün.
Hedefinizin kameranızla neredeyse aynı yükseklikte olduğu durumlarda, bu teknik kullanışlı değildir.
Mesafe Tahmininde Alan Kullanımı
Mesafeyi tahmin etmenin bir diğer basit yolu, takip ettiğiniz konturun alanını kullanmaktır. Bu, uygulaması çok basit bir yöntemdir ancak son derece doğru sonuçlar vermez. Tek yapmanız gereken görüntü kameranızı bilinen bir mesafeden hedefe doğrultmak ve blob'un alanını not etmektir. Gerçek sahanın görüntü hedefinin doğru bir temsilini kullandığınızdan ve istediğiniz atış konumundan hedefe baktığınızdan emin olun. Bunu birkaç farklı mesafeden yapabilir ve bu değerlerden bir tablo oluşturabilirsiniz. 2016'da bu yöntemi, 2 eksenli taretimizin nişanını kaleye ne kadar uzak olduğumuza göre ayarlamak için kullandık.