मुख्य कंटेंट तक स्किप करें

FTC Java और Blockly प्रोग्रामिंग गाइड

(Blockly स्क्रीनशॉट जल्द ही आ रहे हैं!)

सुनिश्चित करें कि आपने FTC प्रोग्रामिंग क्विक स्टार्ट पढ़ लिया है।

Javadoc: [Javadoc का लिंक जल्द ही आ रहा है]

पूर्ण उदाहरण रेपो: Limelight FTC उदाहरण रेपो

सफलता के लिए सुझाव

  • पहले सरल काम करें। FRC में, हमने सीखा है कि सबसे अच्छी सॉफ्टवेयर टीमें अक्सर सबसे सरल दृष्टिकोण का उपयोग करती हैं। उदाहरण के लिए, FRC टीम 2056 ने 2024 में गेम पीस को ट्रैक करने के लिए न्यूरल नेटवर्क के बजाय एक मानक 90FPS कलर पाइपलाइन का उपयोग किया।

यहां एक उदाहरण है कि आप प्रोग्रामिंग शुरू करते समय किस प्रकार का प्रश्न पूछ सकते हैं: टेलीऑप में, क्या आपको अपने रोबोट की फील्ड पर स्थिति जानने की आवश्यकता है, या आपको बस तब तक स्ट्रेफ करने की आवश्यकता है जब तक कि आपका क्रॉसहेयर एक विशिष्ट टैग पर केंद्रित नहीं हो जाता (strafeSpeed = result.getTx()*.03)?

प्रमुख अवधारणाएँ

1. प्रारंभीकरण

हमें अपने रोबोट कोड में अपने Limelight3A को सेट करने की आवश्यकता है।

import com.qualcomm.hardware.limelightvision.LLResult;
import com.qualcomm.hardware.limelightvision.LLResultTypes;
import com.qualcomm.hardware.limelightvision.LLStatus;
import com.qualcomm.hardware.limelightvision.Limelight3A;
Limelight3A limelight;

@Override
public void init() {
limelight = hardwareMap.get(Limelight3A.class, "limelight");
limelight.setPollRateHz(100); // यह सेट करता है कि हम Limelight से कितनी बार डेटा मांगते हैं (प्रति सेकंड 100 बार)
limelight.start(); // यह Limelight को देखना शुरू करने के लिए कहता है!
}

2. पाइपलाइन प्रबंधन

पाइपलाइन छोटे, तुरंत स्वैप करने योग्य प्रोग्राम की तरह होते हैं जो बदलते हैं कि Limelight दुनिया को कैसे देखता है। आप Limelight वेब इंटरफेस में 10 अलग-अलग पाइपलाइन सेट कर सकते हैं, प्रत्येक एक अलग कार्य के लिए। यहां बताया गया है कि आप उनके बीच कैसे स्विच करते हैं:

limelight.pipelineSwitch(0); // पाइपलाइन नंबर 0 पर स्विच करें

यह फायर-एंड-फॉरगेट है। Limelight मिलीसेकंड में अपनी पाइपलाइन बदल देगा, लेकिन आपका कोड जारी रखने से पहले इसका इंतजार नहीं करेगा। यदि आप वर्तमान पाइपलाइन इंडेक्स की जांच करना चाहते हैं, तो कॉल करें

result.getPipelineIndex()

LLResult ऑब्जेक्ट प्राप्त करने के बारे में जानने के लिए अगला खंड देखें।

3. परिणाम प्राप्त करना और उपयोग करना

LLResult Limelight क्या देखता है, इस बारे में जानकारी से भरा एक कंटेनर की तरह है। यहां बताया गया है कि हम उस जानकारी को कैसे प्राप्त करते और उपयोग करते हैं:

LLResult result = limelight.getLatestResult();
if (result != null && result.isValid()) {
double tx = result.getTx(); // लक्ष्य कितना बाएं या दाएं है (डिग्री)
double ty = result.getTy(); // लक्ष्य कितना ऊपर या नीचे है (डिग्री)
double ta = result.getTa(); // लक्ष्य कितना बड़ा दिखता है (छवि का 0%-100%)

telemetry.addData("लक्ष्य X", tx);
telemetry.addData("लक्ष्य Y", ty);
telemetry.addData("लक्ष्य क्षेत्र", ta);
} else {
telemetry.addData("Limelight", "कोई लक्ष्य नहीं");
}

4. Python SnapScripts से बात करना

आप वेब इंटरफेस में अपनी खुद की Python SnapScript पाइपलाइन लिख सकते हैं। अपना कोड लिखने में मदद के लिए हमारे LLM-आधारित SnapScript जनरेटर का उपयोग करें।

यहां बताया गया है कि आप रोबोट कोड से Python को संख्याएं कैसे भेजते हैं और संख्याएं वापस कैसे प्राप्त करते हैं:

// Python को संख्याएं भेजना
double[] inputs = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
limelight.updatePythonInputs(inputs);

// Python से संख्याएं प्राप्त करना
double[] pythonOutputs = result.getPythonOutput();
if (pythonOutputs != null && pythonOutputs.length > 0) {
double firstOutput = pythonOutputs[0];
telemetry.addData("Python आउटपुट:", firstOutput);
}

5. मेरा रोबोट कहाँ है? (MegaTag 1)

Limelight AprilTags का उपयोग करके यह पता लगाने में मदद कर सकता है कि आपका रोबोट फील्ड पर कहाँ है। आपके Limelight में वर्तमान गेम के लिए एक AprilTag मैप पहले से इंस्टॉल है, लेकिन आप हमारे 3D मैप बिल्डर का उपयोग करके अपने खुद के मैप डिजाइन और अपलोड कर सकते हैं।

अपने रोबोट की स्थिति प्राप्त करने का प्रयास करने से पहले, निम्नलिखित करें:

  1. वेब इंटरफेस में अपनी AprilTag पाइपलाइन के "एडवांस्ड" टैब में "फुल 3D" सक्षम करें।
  2. अपने रोबोट के फुटप्रिंट के केंद्र के सापेक्ष अपने कैमरे को स्थित करने के लिए वेब इंटरफेस का उपयोग करें।

botPose के लिए कोऑर्डिनेट सिस्टम मानक FTC कोऑर्डिनेट सिस्टम से मेल खाता है।

  • (0,0,0) फील्ड फ्लोर का केंद्र है
  • गैर-डायमंड कॉन्फ़िगरेशन के लिए, 0 डिग्री यॉ का मतलब है कि नीला गठबंधन आपके रोबोट के बाईं ओर है, और लाल गठबंधन आपके रोबोट के दाईं ओर है।
if (result != null && result.isValid()) {
Pose3D botpose = result.getBotpose();
if (botpose != null) {
double x = botpose.getX();
double y = botpose.getY();
telemetry.addData("MT1 स्थान", "(" + x + ", " + y + ")");
}
}

6. मेरा रोबोट कहाँ है? (MegaTag 2)

MegaTag 2 MegaTag 1 की तरह है, लेकिन यह बढ़ी हुई सटीकता के लिए आपके IMU डेटा को फ्यूज करता है:

// सबसे पहले, Limelight को बताएं कि आपका रोबोट किस दिशा में देख रहा है
double robotYaw = imu.getAngularOrientation().firstAngle;
limelight.updateRobotOrientation(robotYaw);
if (result != null && result.isValid()) {
Pose3D botpose_mt2 = result.getBotpose_MT2();
if (botpose_mt2 != null) {
double x = botpose_mt2.getX();
double y = botpose_mt2.getY();
telemetry.addData("MT2 स्थान:", "(" + x + ", " + y + ")");
}
}

7. इनर रिजल्ट्स टाइप्स

आपने अपनी पाइपलाइन को कैसे कॉन्फ़िगर किया है, इस पर निर्भर करते हुए, आपके पास पैरेंट LLResults ऑब्जेक्ट के भीतर विभिन्न प्रकार के विस्तृत Results Lists तक पहुंच होगी।

शायद आपको इन Results Lists का उपयोग करने की आवश्यकता नहीं होगी। हम जब भी संभव हो, बेस getTx(), getTy() का उपयोग करने की सलाह देते हैं।

7.1 कलर रिजल्ट्स

कलर रिजल्ट्स रंगीन लक्ष्यों को खोजने में मदद करते हैं:

List<ColorResult> colorTargets = result.getColorResults();
for (ColorResult colorTarget : colorTargets) {
double x = detection.getTargetXDegrees(); // यह कहाँ है (बाएं-दाएं)
double y = detection.getTargetYDegrees(); // यह कहाँ है (ऊपर-नीचे)
double area = colorTarget.getTargetArea(); // आकार (0-100)
telemetry.addData("कलर टारगेट", "छवि का " + area + "% हिस्सा लेता है");
}

7.2 फिड्यूशियल/AprilTag रिजल्ट्स

फिड्यूशियल विशेष मार्कर हैं (जैसे AprilTags) जो Limelight को यह पता लगाने में मदद करते हैं कि यह कहाँ है:

List<FiducialResult> fiducials = result.getFiducialResults();
for (FiducialResult fiducial : fiducials) {
int id = fiducial.getFiducialId(); // फिड्यूशियल की ID संख्या
double x = detection.getTargetXDegrees(); // यह कहाँ है (बाएं-दाएं)
double y = detection.getTargetYDegrees(); // यह कहाँ है (ऊपर-नीचे)
double StrafeDistance_3D = fiducial.getRobotPoseTargetSpace().getY();
telemetry.addData("फिड्यूशियल " + id, distance + " मीटर दूर है");
}

यदि आप प्रत्येक FiducialResult के भीतर 3D पोज जानकारी का उपयोग करना चाहते हैं, तो आप निम्नलिखित विधियों का उपयोग कर सकते हैं:

fiducial.getRobotPoseTargetSpace(); // AprilTag कोऑर्डिनेट सिस्टम के सापेक्ष रोबोट पोज (सबसे उपयोगी)
fiducial.getCameraPoseTargetSpace(); // AprilTag के सापेक्ष कैमरा पोज (उपयोगी)
fiducial.getRobotPoseFieldSpace(); // केवल इस टैग के आधार पर फील्