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

צינורות Python SnapScript

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

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

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

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

סקריפט Python מינימלי של Limelight


import cv2
import numpy as np

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