रोबोट लोकलाइजेशन MegaTag के साथ
यदि आपके Limelight का रोबोट-स्पेस पोज़ वेब यूआई में कॉन्फ़िगर किया गया है, और फ़ील्ड मैप वेब यूआई के माध्यम से अपलोड किया गया है, तो रोबोट का फ़ील्ड स्पेस में स्थान getBotpose() और "botpose" नेटवर्कटेबल्स ऐरे (x,y,z मीटर में, रोल, पिच, यॉ डिग्री में) के माध्यम से उपलब्ध होगा।
हमारा रोबोट लोकलाइजेशन एल्गोरिथ्म MegaTag कहलाता है। यदि एक से अधिक टैग दृश्य में हैं, तो यह व्यक्तिगत टैग अस्पष्टताओं और छवि में शोर के प्रति लचीला है। यदि सभी कीपॉइंट्स कोप्लानर हैं, तो अभी भी अस्पष्टता फ्लिपिंग का कुछ जोखिम है।
- हरा सिलेंडर: प्रति-टैग बॉट पोज़
- नीला सिलेंडर: पुराना बॉटपोज़
- सफेद सिलेंडर: MegaTag बॉटपोज़
यहाँ स्पष्ट पोज़ अस्पष्टता पर ध्यान दें:
देखें कि कैसे नया बॉटपोज़ (सफेद सिलेंडर) पुराने बॉटपोज़ (नीले सिलेंडर) की तुलना में बेहद स्थिर है। आप tx और ty मूल्यों को भी देख सकते हैं।
यह केवल प्लानर टैग तक सीमित नहीं है। यह पूर्ण 3D में और किसी भी ओरिएंटेशन में किसी भी संख्या के टैग के लिए स्केल करता है। फ्लोर टैग और सीलिंग टैग पूरी तरह से काम करते हैं।
यहाँ एक आरेख है जो एक सरल प्लानर केस के साथ इसके काम करने के एक पहलू को दर्शाता है। वास्तविक परिणाम दर्शाए गए से बेहतर हैं, क्योंकि चित्रित MegaTag में एक बिंदु के बजाय तीन बिंदुओं पर महत्वपूर्ण त्रुटि लागू की गई है। जैसे-जैसे 3D संयुक्त MegaTag आकार और कीपॉइंट संख्या में बढ़ता है, इसकी स्थिरता बढ़ती जाती है।
WPILib का पोज़ एस्टीमेटर उपयोग करना
2024 में, अधिकांश WPILib इकोसिस्टम एक सिंगल-ओरिजिन कोऑर्डिनेट सिस्टम में परिवर्तित हो गया। 2023 में, आपका कोऑर्डिनेट सिस्टम ओरिजिन आपके एलायंस कलर के आधार पर बदलता था।
2024 और उसके बाद के लिए, आपके को ऑर्डिनेट सिस्टम का ओरिजिन हमेशा "नीला" ओरिजिन होना चाहिए। FRC टीमों को पोज़-संबंधित कार्यक्षमता के लिए हमेशा botpose_wpiblue का उपयोग करना चाहिए
LimelightHelpers.PoseEstimate mt1 = LimelightHelpers.getBotPoseEstimate_wpiBlue("limelight");
if(mt1.tagCount == 1 && mt1.rawFiducials.length == 1)
{
if(mt1.rawFiducials[0].ambiguity > .7)
{
doRejectUpdate = true;
}
if(mt1.rawFiducials[0].distToCamera > 3)
{
doRejectUpdate = true;
}
}
if(mt1.tagCount == 0)
{
doRejectUpdate = true;
}
if(!doRejectUpdate)
{
m_poseEstimator.setVisionMeasurementStdDevs(VecBuilder.fill(.5,.5,9999999));
m_poseEstimator.addVisionMeasurement(
mt1.pose,
mt1.timestampSeconds);
}