FRC प्रोग्रामिंग लाइमलाइट लिब के साथ (WPILib Java और C++)
- https://github.com/LimelightVision/limelightlib-wpijava
- https://github.com/LimelightVision/limelightlib-wpicpp
JavaDocs: https://limelightlib-wpijava-reference.limelightvision.io
उपयोग
यह एक सिंगल-फाइल लाइब्रेरी है। आपको केवल नवीनतम रिलीज़ (https://github.com/LimelightVision/limelightlib-wpijava/releases) से LimelightHelpers.java फ़ाइल को अपने Java प्रोजेक्ट के "robot" फ़ोल्डर में कॉपी करना होगा। आपको अपने लाइमलाइट्स के लिए कोई ऑब्जेक्ट बनाने की आवश्यकता नहीं है - लाइब्रेरी सरल और कार्यात्मक है जिससे उपय ोग में आसानी और विश्वसनीयता अधिकतम होती है।
सफलता के लिए टिप्स
- सरल शुरुआत करें! कई सफल FRC टीमें बुनियादी दृष्टिकोणों का प्रभावी ढंग से उपयोग करती हैं। उदाहरण के लिए, टीम 2056 ने 2024 में गेम पीस ट्रैकिंग के लिए न्यूरल नेटवर्क के बजाय मानक 90FPS कलर पाइपलाइन का उपयोग किया।
- सोचें कि आपको वास्तव में क्या चाहिए: क्या आपको पूरे फील्ड का लोकलाइजेशन चाहिए, या क्या सिंपल टारगेट सेंटरिंग काम करेगी (जैसे,
driveSpeed = result.getTx() * 0.03
)?
मुख्य अवधारणाएँ
1. बुनियादी उपयोग
हर मेथड एक Limelight नाम पैरामीटर स्वीकार करता है। इसे खाली या null छोड़ दें "limelight" का उपयोग करने के लिए:
// बुनियादी लक्ष्यीकरण डेटा
double tx = LimelightHelpers.getTX(""); // क्रॉसहेयर से लक्ष्य तक क्षैतिज ऑफसेट डिग्री में
double ty = LimelightHelpers.getTY(""); // क्रॉसहेयर से लक्ष्य तक ऊर्ध्वाधर ऑफसेट डिग्री में
double ta = LimelightHelpers.getTA(""); // लक्ष्य क्षेत्र (छवि का 0% से 100%)
boolean hasTarget = LimelightHelpers.getTV(""); // क्या आपके पास एक वैध लक्ष्य है?
double txnc = LimelightHelpers.getTXNC(""); // प्रमुख पिक्सेल/बिंदु से लक्ष्य तक क्षैतिज ऑफसेट डिग्री में
double tync = LimelightHelpers.getTYNC(""); // प्रमुख पिक्सेल/बिंदु से लक्ष्य तक ऊर्ध्वाधर ऑफसेट डिग्री में
2. पाइपलाइन प्रबंधन
पाइपलाइन तुरंत-स्वैप करने योग्य प्रोग्राम की तरह हैं जो बदलते हैं कि Limelight छवियों को कैसे प्रोसेस करता है। आप वेब इंटरफेस में 10 अलग-अलग पाइपलाइन सेट कर सकते हैं:
// पाइपलाइन 0 पर स्विच करें
LimelightHelpers.setPipelineIndex("", 0);
3. LED नियंत्रण
उज्ज्वल प्रकाश LED वाले Limelights के लिए, आप विभिन्न स्थितियों के लिए LED को नियंत्रित कर सकते हैं:
// वर्तमान पाइपलाइन को LED नियंत्रित करने दें
LimelightHelpers.setLEDMode_PipelineControl("");
// LED को चालू/बंद/ब्लिंक करने के लिए मजबूर करें
LimelightHelpers.setLEDMode_ForceOn("");
LimelightHelpers.setLEDMode_ForceOff("");
LimelightHelpers.setLEDMode_ForceBlink("");
4. MegaTag के साथ फील्ड लोकलाइजेशन
(अधिक विवरण के लिए MegaTag दस्तावेज़ और Swerve Pose Estimation ट्यूटोरियल दे खें।)
// आपके आवधिक फंक्शन में:
LimelightHelpers.PoseEstimate limelightMeasurement = LimelightHelpers.getBotPoseEstimate_wpiBlue("limelight");
if (limelightMeasurement.tagCount >= 2) { // केवल तभी माप पर भरोसा करें जब हम कई टैग देखते हैं
m_poseEstimator.setVisionMeasurementStdDevs(VecBuilder.fill(0.7, 0.7, 9999999));
m_poseEstimator.addVisionMeasurement(
limelightMeasurement.pose,
limelightMeasurement.timestampSeconds
);
}
5. MegaTag2 के साथ फील्ड लोकलाइजेशन
(अधिक विवरण के लिए MegaTag2 दस्तावेज़ और Swerve Pose Estimation ट्यूटोरियल देखें।)
MegaTag2 रोबोट ओरिएंटेशन डेटा को विज़न के साथ फ्यूज़ करके लोकलाइजेशन सटीकता को बढ़ाता है। जायरो डेटा प्रदान करके, आप MegaTag2 को लोकलाइजेशन समस्या को सीमित करने में मदद करते हैं और उत्कृष्ट परिणाम प्रदान करते हैं, भले ही केवल एक टैग दिखाई दे:
// सबसे पहले, Limelight को अपने रोबोट का वर्तमान ओरिएंटेशन बताएं
double robotYaw = m_gyro.getYaw();
LimelightHelpers.SetRobotOrientation("", robotYaw, 0.0, 0.0, 0.0, 0.0, 0.0);
// पोज़ एस्टिमेट प्र ाप्त करें
LimelightHelpers.PoseEstimate limelightMeasurement = LimelightHelpers.getBotPoseEstimate_wpiBlue("");
// इसे अपने पोज़ एस्टिमेटर में जोड़ें
m_poseEstimator.setVisionMeasurementStdDevs(VecBuilder.fill(.5, .5, 9999999));
m_poseEstimator.addVisionMeasurement(
limelightMeasurement.pose,
limelightMeasurement.timestampSeconds
);
6. विशेष AprilTag कार्यक्षमता
// बेहतर प्रदर्शन के लिए कस्टम क्रॉप विंडो सेट करें (प्रत्येक मान के लिए -1 से 1)
LimelightHelpers.setCropWindow("", -0.5, 0.5, -0.5, 0.5);
// रोबोट केंद्र के सापेक्ष कैमरा पोज़ बदलें (x आगे, y बाएं, z ऊपर, डिग्री)
LimelightHelpers.setCameraPose_RobotSpace("",
0.5, // आगे ऑफसेट (मीटर)
0.0, // साइड ऑफसेट (मीटर)
0.5, // ऊंचाई ऑफसेट (मीटर)
0.0, // रोल (डिग्री)
30.0, // पिच (डिग्री)
0.0 // यॉ (डिग्री)
);
// AprilTag ऑफसेट ट्रैकिंग पॉइंट सेट करें (मीटर)
LimelightHelpers.setFiducial3DOffset("",
0.0, // आगे ऑफसेट
0.0, // साइड ऑफसेट
0.5 // ऊंचाई ऑफसेट
);
// AprilTag डिटेक्शन कॉन्फ़िगर करें
LimelightHelpers.SetFiducialIDFiltersOverride("", new int[]{1, 2, 3, 4}); // केवल इन टैग आईडी को ट्रैक करें
LimelightHelpers.SetFiducialDownscalingOverride("", 2.0f); // बेहतर फ्रेमरेट और कम रेंज के लिए आधे रिज़ॉल्यूशन पर प्रोसेस करें
7. Python एकीकरण
कस्टम Python SnapScripts के साथ संवाद करें:
// Python को डेटा भेजें
double[] dataToSend = {1.0, 2.0, 3.0};
LimelightHelpers.setPythonScriptData("", dataToSend);
// Python से डेटा प्राप्त करें
double[] dataFromPython = LimelightHelpers.getPythonScriptData("");
8. NetworkTables से विस्तृत परिणाम प्राप्त करना (RawTargets)
अधिकतम प्रदर्शन के लिए, आप JSON पार्सिंग को बायपास करके सीधे NetworkTables से रॉ टारगेट डेटा एक्सेस कर सकते हैं:
// रॉ AprilTag/Fiducial डेटा प्राप्त करें
RawFiducial[] fiducials = LimelightHelpers.getRawFiducials("");
for (RawFiducial fiducial : fiducials) {
int id = fiducial.id; // टैग आईडी
double txnc = fiducial.txnc; // X ऑफसेट (क्रॉसहेयर नहीं)
double tync = fiducial.tync; // Y ऑफसेट (क्रॉसहेयर नहीं)
double ta = fiducial.ta; // लक्ष्य क्षेत्र
double distToCamera = fiducial.distToCamera; // कैमरे से दूरी
double distToRobot = fiducial.distToRobot; // रोबोट से दूरी
double ambiguity = fiducial.ambiguity; // टैग पोज़ अस्पष्टता
}
// न्यूरल डिटेक्टर परिणाम प्राप्त करें
RawDetection[] detections = LimelightHelpers.getRawDetections("");
for (RawDetection detection : detections) {
int classID = detection.classId;
double txnc = detection.txnc;
double tync = detection.tync;
double ta = detection.ta;
// आवश्यकतानुसार कॉर्नर कोऑर्डिनेट्स एक्सेस करें
double corner0X = detection.corner0_X;
double corner0Y = detection.corner0_Y;
// ... कॉर्नर 1-3 इसी तरह उपलब्ध हैं
}