דלג לתוכן הראשי

צינורות Python SnapScript

עם סקריפטים בפייתון, תוכלו לנצל את מלוא העוצמה של OpenCV לבניית צינורות משלכם במהירות. מפרש הפייתון מוטמע בתוך הקוד האחורי של Limelight ב-C++, כך ששגיאות וקריסות מטופלות בצורה חלקה.

צינורות SnapScript רגילים מתוכנתים ישירות בממשק האינטרנט של Limelight.

Limelight מטפל בחומרה, ממשק המצלמה, רשת, סטרימינג ועיבוד תמונה בסיסי מקדים. כל מה שאתם צריכים לעשות זה לכתוב פונקציית פייתון אחת בשם runPipeline().

  • אחת התכונות החשובות ביותר שאנו מציעים היא הכוונת בלחיצה אחת. הכוונת, הכוונת הכפולה, tx, ty, ta, ts, tvert, וכל שאר קריאות NetworkTables הסטנדרטיות של Limelight יינעלו אוטומטית על הקונטור שתחזירו מפונקציית runPipeline() בפייתון.
  • כתבו ויזואליזציות בזמן אמת משלכם, סינון סף, פילטור, ועקפו את הקוד האחורי שלנו לחלוטין אם תרצו.
    • לסקריפטים בפייתון של Limelight יש גישה לספריות OpenCV ו-numpy המלאות.
    • מעבר לגישה לתמונה, לפונקציית runPipeline() יש גם גישה לנתונים מהרובוט. קבוצות FTC יכולות להשתמש ב-updatePythonInputs() וקבוצות FRC יכולות לעדכן את מערך המספרים "llrobot" ב-NetworkTables. שלחו כל נתון מהרובוטים שלכם לסקריפטים בפייתון לויזואליזציה או יישומים מתקדמים (אפשר לשלוח נתוני IMU, נתוני מיקום, מהירות רובוט וכו' לשימוש בסקריפטים בפייתון)
    • פונקציית runPipeline גם מוציאה מערך מספרים שנגיש עם getPythonOutputs() ומתוך מערך המספרים "llpython" ב-NetworkTables. זה אומר שתוכלו לעקוף את הכוונת של Limelight ופונקציונליות אחרת לחלוטין ולשלוח נתונים מותאמים אישית משלכם בחזרה לרובוטים.
    • סקריפטים בפייתון מבודדים בתוך סביבת ה-C++ שלנו, כך שאתם לא צריכים לדאוג מקריסות. שינויים בסקריפטים מיושמים מיידית, וכל הודעות שגיאה מודפסות ישירות לממשק האינטרנט.

סקריפט פייתון מינימלי ל-Limelight


import cv2
import numpy as np

# runPipeline() נקראת בכל פריים על ידי הקוד האחורי של Limelight.
def runPipeline(image, llrobot):
# המרת תמונת הקלט למרחב צבעים HSV
img_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# המרת ה-HSV לתמונה בינארית על ידי הסרת כל פיקסל
# שלא נופל בטווח ערכי HSV Min/Max הבאים
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