FRC प्रोग्रामिंग त्वरित प्रारंभ
Limelight लक्ष्यीकरण डेटा, स्थिति डेटा और लाइव कॉन्फ़िगरेशन के लिए REST/HTTP, Websocket, Modbus, और NetworkTables प्रोटोकॉल का समर्थन करता है। JSON और रॉ आउटपुट फॉर्मेट उपलब्ध हैं। अधिक जानकारी के लिए दस्तावेज़ों के APIs खंड को देखें।
FRC टीमों के लिए, अनुशंसित प्रोटोकॉल NetworkTables है। Limelight सभी लक्ष्यीकरण डेटा, पूर्ण JSON डंप सहित, NetworkTables पर 100hz पर पोस्ट करता है। टीमें NetworkTables के माध्यम से ledMode, क्रॉप विंडो और अन्य नियंत्रणों को भी सेट कर सकती हैं। FRC टीमें Limelight के साथ सेकंडों में शुरू करने के लिए Limelight Lib Java और C++ लाइब्रेरी का उपयोग कर सकती हैं। Limelight Lib शुरू करने का सबसे आसान तरीका है।
LimelightLib:
- Java
- C++
- Python
double tx = LimelightHelpers.getTX("");
#include "LimelightHelpers.h"
double tx = LimelightHelpers::getTX("");
double ty = LimelightHelpers::getTY("");
wip
यदि आप LimelightLib को छोड़कर सीधे NetworkTables के साथ प्रोग्रामिंग शुरू करना चा हते हैं:
- 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() Limelight के बैकएंड द्वारा हर फ्रेम पर कॉल किया जाता है।
def runPipeline(image, llrobot):
# इनपुट छवि को HSV रंग स्थान में परिवर्तित करें
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# hsv को एक बाइनरी छवि में परिवर्तित करें जिसमें कोई भी पिक्सेल न हो
# जो निम्नलिखित HSV न्यूनतम/अधिकतम मानों के भीतर नहीं आते
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