FRC Programlama Hızlı Başlangıç
Limelight, hedefleme verisi, durum verisi ve canlı yapılandırma için REST/HTTP, Websocket, Modbus ve NetworkTables protokollerini destekler. JSON ve ham çıktı formatları mevcuttur. Daha fazla bilgi için belgelerin API bölümüne bakın.
FRC Takımları için önerilen protokol NetworkTables'dır. Limelight tüm hedefleme verilerini, tam JSON dökümü dahil olmak üzere, NetworkTables'a 100hz hızında gönderir. Takımlar ayrıca ledMode, kırpma penceresi ve daha fazlası gibi kontrolleri NetworkTables aracılığıyla ayarlayabilir. FRC takımları, Limelight'ı saniyeler içinde kullanmaya başlamak için Limelight Lib Java ve C++ kütüphanelerini kullanabilir. Limelight Lib başlamak için en kolay yoldur.
LimelightLib:
- Java
- C++
- Python
double tx = LimelightHelpers.getTX("");
#include "LimelightHelpers.h"
double tx = LimelightHelpers::getTX("");
double ty = LimelightHelpers::getTY("");
wip
LimelightLib'i atlayıp doğrudan NetworkTables ile programlamaya başlamak istiyorsanız:
- 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");
//değerleri periyodik olarak oku
double x = tx.getDouble(0.0);
double y = ty.getDouble(0.0);
double area = ta.getDouble(0.0);
//smart dashboard'a periyodik olarak gönder
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'ın arka ucu tarafından her karede çağrılır.
def runPipeline(image, llrobot):
# giriş görüntüsünü HSV renk uzayına dönüştür
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# aşağıdaki HSV Min/Max değerleri aralığında olmayan
# pikselleri kaldırarak hsv'yi ikili görüntüye dönüştür
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))
# yeni ikili görüntüdeki konturları bul
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largestContour = np.array([[]])
# robota geri göndermek için boş bir değer dizisi başlat
llpython = [0,0,0,0,0,0,0,0]
# konturlar tespit edildiyse, onları çiz
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# en büyük konturu kaydet
largestContour = max(contours, key=cv2.contourArea)
# konturu çevreleyen döndürülmemiş sınırlayıcı kutuyu al
x,y,w,h = cv2.boundingRect(largestContour)
# döndürülmemiş sınırlayıcı kutuyu çiz
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)
# robota geri göndermek için bazı özel veriler kaydet
llpython = [1,x,y,w,h,9,8,7]
#LL artı işareti için en büyük konturu, değiştirilmiş görüntüyü ve özel robot verisini döndür
return largestContour, image, llpython