FRC Programlama Hızlı Başlangıç
Limelight, hedefleme verileri, durum verileri 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 bir 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 ile saniyeler içinde 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 geçmek 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);
//periyodik olarak smart dashboard'a 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)
# hsv'yi, aşağıdaki HSV Min/Max değerleri arasında olmayan
# pikselleri kaldırarak ikili bir 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üde 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]
# eğer 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 verilerini döndür
return largestContour, image, llpython