Mesafe Tahmini
Sabit Açılı Kamera Kullanımı
Eğer görüş takip kameranız robotunuza, zemin düzlemi ile görüş hattı arasındaki açı değişmeyecek şekilde monte edilmişse, bir hedefe olan mesafeyi çok hassas bir şekilde hesaplamak için bu tekniği kullanabilirsiniz. Bu mesafe değerini, robotunuzu mükemmel menzile girmek 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 zeminden yüksekliği (h1) ve montaj açısı (a1) bilinmektedir. Limelight (veya görüş sisteminiz) size hedefe olan y açısını (a2) 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 bir girdi bekler. Bir açı ölçümünü dereceden radyana çevirmek 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 dikey konumdan kaç derece geriye dönük?
double limelightMountAngleDegrees = 25.0;
// Limelight lensinin merkezinden zemine olan mesafe
double limelightLensHeightInches = 20.0;
// hedeften zemine 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 dikey konumdan kaç derece geriye dönük?
double limelightMountAngleDegrees = 25.0;
// Limelight lensinin merkezinden zemine olan mesafe
double limelightLensHeightInches = 20.0;
// hedeften zemine 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çmek önemlidir. Hedefe hem çok yakınken hem de çok uzaktayken görebilmeniz gerekir. Ayrıca bu açının değişmesini istemezsiniz, bu yüzden sağlam bir şekilde monte edin ve montaj geometrinizde yuva kullanmaktan kaçının.
Eğer a1 açısını belirlemekte zorlanıyorsanız, yukarıdaki denklemi a1'i çözmek için de kullanabilirsiniz. Robotunuzu bilinen bir mesafeye yerleştirin (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.
Alan Kullanarak Mesafe Tahmini
Mesafeyi tahmin etmenin başka bir basit yolu, takip ettiğiniz konturun alanını kullanmaktır. Bu uygulaması çok basit bir yöntemdir ancak size son derece hassas sonuçlar vermez. Tek yapmanız gereken görüş kameranızı bilinen bir mesafeden hedefe doğrultmak ve lekenin alanını not etmektir. Gerçek sahadaki görüş hedefinin doğru bir temsilini kullandığınızdan ve istediğiniz atış konumundan hedefe doğrulttuğunuzdan emin olun. Bunu birkaç farklı mesafeden yapabilir ve bu değerlerden bir tablo oluşturabilirsiniz. 2016'da bu yöntemi, hedeften ne kadar uzakta olduğumuza bağlı olarak 2 eksenli kulemizin nişanını ayarlamak için kullandık.