צינורות 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