12.10. الخلاصة¶
كاميرا موصولة بكابل USB تبث الإطارات إلى برنامج مضيف، وتقبل تحديثات الإعدادات من المضيف، وتصمد أمام الفصل/إعادة التوصيل دون فقدان المزامنة -- مع إخفاء عمليات إعادة الإرسال، ومشاركة عدة تدفقات منطقية لمنفذ واحد، ودون أي شيفرة تأطير في التطبيق -- كل ذلك ينتج عن نحو أربعين سطراً من شيفرة جانب الكاميرا وقدر مماثل على جانب المضيف. تحوّل مكتبة البروتوكول أنبوب بايتات إلى سطح قنوات قابل للبرمجة وتُبقي كل ما هو دون التطبيق غير مرئي.
12.10.1. ما بناه هذا الفصل¶
نموذج ذهني من أربع طبقات للمكدّس: النقل، والتأطير، والموثوقية، والقنوات. كل طبقة تحل مشكلة واحدة وتتجاهل كل ما فوقها.
تنسيق الحزمة على السلك -- ترويسة من 10 بايت مع CRC، وحمولة متغيرة، وقيمة CRC لاحقة. صغير بما يكفي للمرور خلاله بايتاً بايتاً.
المصافحة التي تُجريها الكاميرا والمضيف عند اتصال النقل: PROTO_SYNC، وتبادل القدرات، واكتشاف القنوات.
آلية الموثوقية فوق ذلك: أرقام التسلسل، و ACKs، و NAKs، وعمليات إعادة الإرسال مع التراجع الأسي، ورموز الحالة العشرة.
نموذج القنوات: ما يصل إلى 32 تدفقاً منطقياً مسمى على سلك واحد، مع
stdin/stdout/stream/profileالمدمجة وقنوات التطبيق المسجَّلة بصنف Python.واجهة الواجهة الخلفية --
size، وread، وwrite، وpoll، وlock/unlock، وshape، وioctl، وflush، وis_active-- وكيف تستخدم مكتبة البروتوكول الدوال الموجودة في الواجهة الخلفية لتقرر ما تدعمه القناة.جانب المضيف: صنف
Cameraفي حزمة openmv-python للتطوير (SDK)، ومعدل921600باود السحري الذي يبدّل USB-CDC إلى وضع البروتوكول، ونمط جولة الذهاب والإيابchannel_size/channel_read/channel_write.نمط بث الإطارات -- التقاط بمخزن مؤقت واحد، و
readpمع مثبِّت، و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(واجهة رسومية لمحاذاة RGB والحرارية)، وccm-tuning(مُضبِّط مصفوفة تصحيح الألوان)، وgenx320-event-streamingوgenx320-overlay-calibration(أدوات كاميرا الأحداث). كل واحدة منها تستخدم الأنماط الواردة في هذا الفصل من البداية إلى النهاية.
12.10.3. إلى أين تأخذها لاحقاً¶
بضعة اتجاهات تنتقل إليها مشاريع الكاميرا من هنا:
بناء واجهة رسومية للمضيف. قناة إطارات تُغذّي عنصر فيديو، وقناة أو قناتان للإعدادات تغذّيان شرائط التمرير والأزرار. أما طبقة الواجهة الرسومية نفسها، فإن DearPyGui هو الخيار الطبيعي -- مكتوب بلغة Python بالكامل، وقابل للتثبيت عبر pip، وسريع بما يكفي للمعاينة الحية، وهو ما تلجأ إليه أولاً كل أداة مضيف موجودة من OpenMV.
لوحة قياس عن بُعد متعددة القنوات. عدة قنوات تطبيق على نفس الكاميرا (قراءات المستشعر، والعدّادات، وأحداث الحالة) تُحدَّث كل منها في دالة رد النداء الخاصة بها، وواجهة رسومية للمضيف تقرؤها على مؤقت وتعرض كلاً منها على حدة. يعني التحكم المستقل بالتدفق في طبقة القنوات أن قراءة بطيئة واحدة لا توقف الأخريات.
الضبط عن بُعد عبر UART. نفس دوال رد النداء للقنوات؛ يستدعي التطبيق
protocol.initللتبديل من USB إلى نقل عبر UART. تبقى الكاميرا تعمل دون رأس ويتحدث إليها برنامج نصي بلغة Python على جهاز Raspberry Pi أو حاسوب محمول عبر خط تسلسلي للضبط الميداني.
لا يتغير تنسيق السلك، ولا طبقة الموثوقية، ولا تجريد القنوات. اختيار النقل الذي يناسب النشر وإضافة قناة لكل شيء يحتاج المضيف لرؤيته أو ضبطه هو كامل المهمة الهندسية من هنا فصاعداً.