Aller au contenu principal

Pipelines Python SnapScript

Avec le scripting Python, vous pouvez utiliser toute la puissance d'OpenCV pour construire rapidement vos propres pipelines. L'interpréteur Python est intégré dans le backend C++ de Limelight, donc les erreurs et les plantages sont gérés élégamment.

Les pipelines SnapScript réguliers sont programmés directement dans l'interface web Limelight.

Limelight gère le matériel, l'interfaçage de la caméra, le réseau, le streaming et le pré-traitement basique des images. Tout ce que vous avez à faire est d'écrire une fonction Python appelée runPipeline().

  • L'une des fonctionnalités les plus importantes que nous offrons est le réticule en un clic. Le réticule, le double réticule, tx, ty, ta, ts, tvert, et toutes les autres lectures NetworkTables standard de Limelight se verrouillent automatiquement sur le contour que vous retournez depuis la fonction runPipeline() Python.
  • Écrivez vos propres visualisations en temps réel, seuillages, filtrages, et contournez notre backend entièrement si désiré.
    • Le scripting Python de Limelight a accès aux bibliothèques complètes OpenCV et numpy.
    • Au-delà de l'accès à l'image, la fonction runPipeline() a également accès aux données du robot. Les équipes FTC peuvent utiliser updatePythonInputs() et les équipes FRC peuvent mettre à jour le tableau de nombres "llrobot" NetworkTables. Envoyez n'importe quelles données de vos robots à vos scripts Python pour la visualisation ou des applications avancées (On peut envoyer des données IMU, des données de pose, la vitesse du robot, etc. pour utilisation dans les scripts Python)
    • La fonction runPipeline produit également un tableau de nombres accessible avec getPythonOutputs() et depuis le tableau de nombres "llpython" NetworkTables. Cela signifie que vous pouvez contourner entièrement le réticule de Limelight et d'autres fonctionnalités et envoyer vos propres données personnalisées à vos robots.
    • Les scripts Python sont isolés dans notre environnement C++, donc vous n'avez pas à vous soucier des plantages. Les modifications des scripts sont appliquées instantanément, et tous les messages d'erreur sont affichés directement dans l'interface web.

Script Python Limelight Minimal


import cv2
import numpy as np

# runPipeline() est appelé à chaque frame par le backend de Limelight.
def runPipeline(image, llrobot):
# convertit l'image d'entrée dans l'espace couleur HSV
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# convertit 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))

# trouve les contours dans la nouvelle image binaire
contours, _ = cv2.findContours(img_threshold,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

largestContour = np.array([[]])

# initialise 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 dessine
if len(contours) > 0:
cv2.drawContours(image, contours, -1, 255, 2)
# enregistre le plus grand contour
largestContour = max(contours, key=cv2.contourArea)

# obtient le rectangle englobant non-pivoté qui entoure le contour
x,y,w,h = cv2.boundingRect(largestContour)

# dessine le rectangle englobant non-pivoté
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,255),2)

# enregistre des données personnalisées à renvoyer au robot
llpython = [1,x,y,w,h,9,8,7]

# renvoie le plus grand contour pour le réticule LL, l'image modifiée et les données robot personnalisées
return largestContour, image, llpython