12.10. סיכום

מצלמה המחוברת לכבל USB שמזרימה פריימים אל תוכנית מארחת, מקבלת עדכוני תצורה בחזרה מהמארח, ושורדת ניתוק/חיבור מחדש מבלי לאבד סנכרון – עם שידורים חוזרים מוסתרים, מספר זרמים לוגיים החולקים פורט אחד, ואפס קוד מסגור ביישום – יוצאת מתוך כארבעים שורות של קוד בצד המצלמה וכמות דומה בצד המארח. ספריית הפרוטוקול הופכת צינור בתים לפני ערוצים ניתנים לתכנות ושומרת על כל מה שמתחת ליישום בלתי נראה.

12.10.1. מה הפרק בנה

  • מודל מנטלי בעל ארבע שכבות של המחסנית: תעבורה, מסגור, מהימנות, ערוצים. כל שכבה פותרת בעיה אחת ומתעלמת מכל מה שמעליה.

  • תבנית החבילה על גבי החיבור – כותרת בת 10 בתים עם CRC, מטען משתנה, CRC עוקב. קטנה מספיק כדי לעבור עליה בית אחר בית.

  • לחיצת היד שהמצלמה והמארח מבצעים כאשר תעבורה מתחברת: PROTO_SYNC, חילופי יכולות, גילוי ערוצים.

  • מנגנון המהימנות שמעל: מספרי רצף, ACK-ים, NAK-ים, שידורים חוזרים עם נסיגה מעריכית (exponential backoff), עשרת קודי הסטטוס.

  • מודל הערוצים: עד 32 זרמים לוגיים בעלי שם על חוט אחד, עם stdin / stdout / stream / profile מובנים וערוצי יישום הנרשמים לפי מחלקת Python.

  • ממשק ה-backend – size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active – וכיצד ספריית הפרוטוקול משתמשת בשיטות הקיימות ב-backend כדי להחליט במה הערוץ תומך.

  • צד המארח: מחלקת Camera של ה-SDK openmv-python, קצב הקסם 921600-באוד שמחליף את USB-CDC למצב פרוטוקול, ותבנית ההלוך-ושוב channel_size / channel_read / channel_write.

  • תבנית הזרמת פריימים – לכידה בחוצץ יחיד, readp עם נועל (latch), send_event להתראות על פריים חדש – ותבנית תצורה דו-כיוונית (ערוץ ניתן לכתיבה על ידי המארח, הלוך-ושוב של JSON) שיחד מהוות את הבסיס לכל כלי מצלמה אינטראקטיבי.

12.10.2. מפת דרכים לעיון

עמודי העיון של הספרייה הם יעדי החיפוש כאשר אחת מהתכונות הללו צצה בקוד אמיתי:

  • protocol — ערוצי פרוטוקול OpenMV – מודול protocol, protocol.init(), protocol.register(), ProtocolChannel, קבועי דגלי הערוץ, וטבלת המטען המרבי לכל מצלמה.

  • ה-SDK של המארח – pip install openmv, openmv.camera.Camera. שיטות שנגענו בהן בפרק זה: update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec(), ו-stop().

  • מאגר ה-openmv-projects – כלים אמיתיים הבנויים על ספריית הפרוטוקול. ספריית ה-tools/ כוללת את thermal-overlay-calibration (GUI ליישור RGB + תרמי), ccm-tuning (כוונן מטריצת תיקון צבע), genx320-event-streaming ו-genx320-overlay-calibration (כלי מצלמת אירועים). כל אחד מהם משתמש בתבניות מפרק זה מקצה לקצה.

12.10.3. לאן להמשיך מכאן

כמה כיוונים שאליהם פרויקטי מצלמה נעים מכאן:

  • בניית GUI מארח. ערוץ פריימים המזין רכיב וידאו, ערוץ תצורה אחד או שניים המזינים מחוונים וכפתורים. עבור שכבת ה-GUI עצמה, DearPyGui היא הבחירה הטבעית – Python טהור, ניתן להתקנה דרך pip, מהיר מספיק לתצוגה מקדימה חיה, ומה שכל כלי מארח קיים של OpenMV פונה אליו ראשון.

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

  • כוונון מרחוק דרך UART. אותן פונקציות callback של הערוץ; היישום קורא ל-protocol.init כדי לעבור מ-USB לתעבורת UART. המצלמה ממשיכה לרוץ ללא ראש (headless) וסקריפט Python על Raspberry Pi או מחשב נייד מדבר אליה דרך קו טורי לצורך כוונון בשטח.

תבנית החיבור, שכבת המהימנות, והפשטת הערוצים אינן משתנות. בחירת התעבורה המתאימה לפריסה והוספת ערוץ עבור כל דבר שהמארח צריך לראות או להגדיר הן כל עבודת ההנדסה מכאן ואילך.