FRC प्रोग्रामिंग क्विक स्टार्ट
लाइमलाइट टारगेटिंग डेटा, स्टेटस डेटा और लाइव कॉन्फ़िगरेशन के लिए REST/HTTP, वेबसॉकेट, मॉडबस और नेटवर्कटेबल्स प्रोटोकॉल का समर्थन करता है। JSON और रॉ आउटपुट फॉर्मेट उपलब्ध हैं। अधिक जानकारी के लिए डॉक्स के APIs सेक्शन को देखें।
FRC टीमों के लिए, अनुशंसित प्रोटोकॉल NetworkTables है। लाइमलाइट सभी टारगेटिंग डेटा, पूर्ण JSON डंप सहित, नेटवर्कटेबल्स में 100hz पर पोस्ट करता है। टीमें नेटवर्कटेबल्स के माध्यम से ledMode, क्रॉप विंडो और अन्य नियंत्रणों को भी सेट कर सकती हैं। FRC टीमें लाइमलाइट को सेकंडों में शुरू करने के लिए लाइमलाइट लिब जावा और C++ लाइब्रेरी का उपयोग कर सकती हैं। लाइमलाइट लिब शुरू करने का सबसे आसान तरीका है।
लाइमलाइटलिब:
- Java
- C++
- Python
double tx = LimelightHelpers.getTX("");
#include "LimelightHelpers.h"
double tx = LimelightHelpers::getTX("");
double ty = LimelightHelpers::getTY("");
wip
यदि आप लाइमलाइटलिब को छोड़कर सीधे नेटवर्कटेबल्स के साथ प्रोग्रामिंग शुरू करना चाहते हैं:
- Java
- C++
- LabView
- Python
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;
NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
NetworkTableEntry tx = table.getEntry("tx");
NetworkTableEntry ty = table.getEntry("ty");
NetworkTableEntry ta = table.getEntry("ta");
//नियमित रूप से मान पढ़ें
double x = tx.getDouble(0.0);
double y = ty.getDouble(0.0);
double area = ta.getDouble(0.0);
//नियमित रूप से स्मार्ट डैशबोर्ड पर पोस्ट करें
SmartDashboard.putNumber("LimelightX", x);
SmartDashboard.putNumber("LimelightY", y);
SmartDashboard.putNumber("LimelightArea", area);
#include "frc/smartdashboard/Smartdashboard.h"
#include "networktables/NetworkTable.h"
#include "networktables/NetworkTableInstance.h"
#include "networktables/NetworkTableEntry.h"
#include "networktables/NetworkTableValue.h"
#include "wpi/span.h"
std::shared_ptr<nt::NetworkTable> table = nt::NetworkTableInstance::GetDefault().GetTable("limelight");
double targetOffsetAngle_Horizontal = table->GetNumber("tx",0.0);
double targetOffsetAngle_Vertical = table->GetNumber("ty",0.0);
double targetArea = table->GetNumber("ta",0.0);
double targetSkew = table->GetNumber("ts",0.0);
import cv2
import numpy as np
# runPipeline() लाइमलाइट के बैकएंड द्वारा हर फ्रेम पर कॉल किया जाता है
def runPipeline(image, llrobot):
# इनपुट इमेज को HSV कलर स्पेस में कनवर्ट करें
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# hsv को बाइनरी इमेज में कनवर्ट करें
# जो पिक्सेल निम्नलिखित HSV Min/Max वैल्यूज में नहीं आते हैं उन्हें हटाकर
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))
# नई बाइनरी इमेज में कंटूर्स ढूंढें
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largestContour = np.array([[]])
# रोबोट को वापस भेजने के लिए वैल्यूज की एक खाली एरे इनि शियलाइज़ करें
llpython = [0,0,0,0,0,0,0,0]
# यदि कंटूर्स का पता चला है, तो उन्हें ड्रा करें
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# सबसे बड़े कंटूर को रिकॉर्ड करें
largestContour = max(contours, key=cv2.contourArea)
# कंटूर को घेरने वाला अनरोटेटेड बाउंडिंग बॉक्स प्राप्त करें
x,y,w,h = cv2.boundingRect(largestContour)
# अनरोटेटेड बाउंडिंग बॉक्स ड् रा करें
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)
# रोबोट को वापस भेजने के लिए कुछ कस्टम डेटा रिकॉर्ड करें
llpython = [1,x,y,w,h,9,8,7]
#LL क्रॉसहेयर के लिए सबसे बड़ा कंटूर, मॉडिफाइड इमेज और कस्टम रोबोट डेटा वापस करें
return largestContour, image, llpython