צינורות Python SnapScript
באמצעות סקריפטים בפייתון, תוכלו לנצל את מלוא העוצמה של OpenCV כדי לבנות במהירות צינורות משלכם. מפרש הפייתון מוטמע בתוך הבסיס C++ של Limelight, כך שטעויות וקריסות מטופלות בצורה חלקה.
צינורות 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++ שלנו, כך שאינכם צריכים לדאוג לקריסות. שינויים בסקריפטים מוחלים מיידית, וכל הודעות השגיאה מודפסות ישירות לממשק האינטרנט.
סקריפט 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