تقدير المسافة
استخدام كاميرا ذات زاوية ثابتة
إذا كانت كاميرا تتبع الرؤية مثبتة على روبوتك بحيث لا تتغير الزاوية بين مستوى الأرض وخط رؤيتها، فيمكنك استخدام هذه التقنية لحساب المسافة إلى الهدف بدقة عالية. يمكنك بعد ذلك استخدام قيمة المسافة هذه إما لتحريك روبوتك للأمام والخلف للوصول إلى النطاق المثالي أو لضبط قوة آلية الإطلاق.
انظر إلى الرسم البياني أدناه. في هذا السياق، جميع المتغيرات معروفة: ارتفاع الهدف (h2) معروف لأنه خاصية من خصائص الميدان. ارتفاع الكاميرا فوق الأرض (h1) معروف وزاوية تثبيتها معروفة (a1). يمكن لـ Limelight (أو نظام الرؤية الخاص بك) أن يخبرك بزاوية y إلى الهدف (a2).
يمكننا حل المعادلة للحصول على d باستخدام المعادلة التالية:
tan(a1+a2) = (h2-h1) / d
"d = (h2-h1) / tan(a1+a2)"
عادة ما تتوقع دالة "tan" إدخالاً مقاسًا بالراديان. لتحويل قياس الزاوية من الدرجات إلى الراديان، اضرب في (3.14159/180.0). انظر إلى مثال الكود الكامل أدناه.
- Java
- C++
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
NetworkTableEntry ty = table.getEntry("ty");
double targetOffsetAngle_Vertical = ty.getDouble(0.0);
// كم درجة للخلف تم تدوير Limelight الخاص بك من الوضع العمودي تمامًا؟
double limelightMountAngleDegrees = 25.0;
// المسافة من مركز عدسة Limelight إلى الأرض
double limelightLensHeightInches = 20.0;
// المسافة من الهدف إلى الأرض
double goalHeightInches = 60.0;
double angleToGoalDegrees = limelightMountAngleDegrees + targetOffsetAngle_Vertical;
double angleToGoalRadians = angleToGoalDegrees * (3.14159 / 180.0);
// حساب المسافة
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 الخاص بك من الوضع العمودي تمامًا؟
double limelightMountAngleDegrees = 25.0;
// المسافة من مركز عدسة Limelight إلى الأرض
double limelightLensHeightInches = 20.0;
// المسافة من الهدف إلى الأرض
double goalHeightInches = 60.0;
double angleToGoalDegrees = limelightMountAngleDegrees + targetOffsetAngle_Vertical;
double angleToGoalRadians = angleToGoalDegrees * (3.14159 / 180.0);
// حساب المسافة
double distanceFromLimelightToGoalInches = (goalHeightInches - limelightLensHeightInches)/tan(angleToGoalRadians);
عند استخدام هذه التقنية، من المهم اختيار زاوية تثبيت الكاميرا بعناية. تريد أن تكون قادرًا على رؤية الهدف عندما تكون قريبًا جدًا وبعيدًا جدًا. كما أنك لا تريد أن تتغير هذه الزاوية، لذا قم بتثبيتها بإحكام وتجنب استخدام الفتحات في هندسة التثبيت الخاصة بك.
إذا كنت تواجه صعوبة في معرفة ما هي الزاوية a1، يمكنك أيضًا استخدام المعادلة أعلاه لحل a1. ما عليك سوى وضع روبوتك على مسافة معروفة (قياسًا من عدسة الكاميرا) وحل نفس المعادلة لـ a1.
في الحالة التي يكون فيها هدفك على نفس ارتفاع الكاميرا تقريبًا، فإن هذه التقنية ليست مفيدة.
استخدام المساحة لتقدير المسافة
طريقة بسيطة أخرى لتقدير المسافة هي استخدام مساحة المحيط الذي تتتبعه. هذه طريقة بسيطة جدًا للتنفيذ ولكنها لا تعطيك نتائج دقيقة للغاية. كل ما عليك فعله هو توجيه كاميرا الرؤية نحو الهدف من مسافة معروفة وملاحظة مساحة الكتلة. تأكد من أنك تستخدم تمثيلًا دقيقًا لهدف الرؤية في الميدان الحقيقي وتأكد من أنك تشير إليه من موقع التصويب المطلوب. يمكنك بعد ذلك القيام بذلك من مسافات مختلفة وعمل جدول من هذه القيم. في عام 2016، استخدمنا هذه الطريقة لضبط تصويب برجنا ثنائي المحور بناءً على مدى بعدنا عن الهدف.