Démarrage rapide de la programmation FRC
Limelight prend en charge les protocoles REST/HTTP, Websocket, Modbus et NetworkTables pour les données de ciblage, les données d'état et la configuration en direct. Les formats de sortie JSON et bruts sont disponibles. Consultez la section APIs de la documentation pour plus d'informations.
Pour les équipes FRC, le protocole recommandé est NetworkTables. Limelight publie toutes les données de ciblage, y compris un dump JSON complet, sur NetworkTables à 100hz. Les équipes peuvent également définir des contrôles tels que le ledMode, la fenêtre de recadrage, et plus encore via NetworkTables. Les équipes FRC peuvent utiliser les bibliothèques Limelight Lib Java et C++ pour commencer à utiliser Limelight en quelques secondes. Limelight Lib est le moyen le plus simple de commencer.
LimelightLib :
- Java
- C++
- Python
double tx = LimelightHelpers.getTX("");
#include "LimelightHelpers.h"
double tx = LimelightHelpers::getTX("");
double ty = LimelightHelpers::getTY("");
wip
Si vous voulez sauter LimelightLib et passer directement à la programmation avec 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");
//lire les valeurs périodiquement
double x = tx.getDouble(0.0);
double y = ty.getDouble(0.0);
double area = ta.getDouble(0.0);
//publier sur le smart dashboard périodiquement
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() est appelé à chaque image par le backend de Limelight.
def runPipeline(image, llrobot):
# convertir l'image d'entrée dans l'espace de couleur HSV
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# convertir le hsv en une image binaire en supprimant tous les pixels
# qui ne sont pas dans les valeurs Min/Max HSV suivantes
img_threshold = cv2.inRange(img_hsv, (60, 70, 70), (85, 255, 255))
# trouver les contours dans la nouvelle image binaire
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largestContour = np.array([[]])
# initialiser un tableau vide de valeurs à renvoyer au robot
llpython = [0,0,0,0,0,0,0,0]
# si des contours ont été détectés, les dessiner
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# enregistrer le plus grand contour
largestContour = max(contours, key=cv2.contourArea)
# obtenir le rectangle englobant non pivoté qui entoure le contour
x,y,w,h = cv2.boundingRect(largestContour)
# dessiner le rectangle englobant non pivoté
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)
# enregistrer des données personnalisées à renvoyer au robot
llpython = [1,x,y,w,h,9,8,7]
#renvoyer le plus grand contour pour le réticule LL, l'image modifiée et les données personnalisées du robot
return largestContour, image, llpython