12.10. สรุป

กล้องที่เสียบสายเคเบิล USB ซึ่งสตรีมเฟรมไปยังโปรแกรมโฮสต์ รับการอัปเดตการตั้งค่าจากโฮสต์ และทำงานต่อเนื่องได้แม้ถอดและเสียบสายใหม่โดยไม่เสียการซิงก์ -- พร้อมการส่งซ้ำที่ซ่อนอยู่ สตรีมลอจิกหลายรายการที่ใช้พอร์ตเดียวร่วมกัน และไม่มีโค้ดกำหนดกรอบในแอปพลิเคชัน -- ทั้งหมดนี้ได้จากโค้ดด้านกล้องประมาณสี่สิบบรรทัดและจำนวนใกล้เคียงกันด้านโฮสต์ ไลบรารีโปรโตคอลเปลี่ยนท่อไบต์ให้เป็นพื้นผิวช่องสัญญาณที่โปรแกรมได้และซ่อนทุกอย่างใต้แอปพลิเคชันให้มองไม่เห็น

12.10.1. สิ่งที่บทนี้สร้างขึ้น

  • โมเดลทางความคิดสี่ชั้นของสแต็ก: การขนส่ง, การกำหนดกรอบ, ความน่าเชื่อถือ, ช่องสัญญาณ แต่ละชั้นแก้ปัญหาหนึ่งอย่างและไม่สนใจทุกอย่างที่อยู่เหนือ

  • รูปแบบแพ็กเก็ตบนสายสัญญาณ -- ส่วนหัว 10 ไบต์พร้อม CRC, เพย์โหลดแปรผัน, CRC ท้าย มีขนาดเล็กพอที่จะอ่านทีละไบต์

  • การจับมือที่กล้องและโฮสต์ดำเนินการเมื่อการขนส่งเชื่อมต่อ: PROTO_SYNC, การแลกเปลี่ยนความสามารถ, การค้นพบช่องสัญญาณ

  • กลไกความน่าเชื่อถือที่อยู่เหนือ: หมายเลขลำดับ, ACK, NAK, การส่งซ้ำด้วย exponential backoff, รหัสสถานะสิบรหัส

  • โมเดลช่องสัญญาณ: สตรีมลอจิกที่ตั้งชื่อได้สูงสุด 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 (GUI จัดตำแหน่ง RGB + ความร้อน), ccm-tuning (ตัวปรับเมทริกซ์แก้ไขสี), genx320-event-streaming และ genx320-overlay-calibration (เครื่องมือกล้องเหตุการณ์) แต่ละตัวใช้รูปแบบจากบทนี้ตั้งแต่ต้นจนจบ

12.10.3. ทิศทางต่อไป

ทิศทางที่โปรเจกต์กล้องมักไปต่อจากนี้:

  • การสร้าง GUI โฮสต์ ช่องสัญญาณเฟรมที่ป้อนวิดเจ็ตวิดีโอ ช่องสัญญาณการตั้งค่าหนึ่งหรือสองช่องที่ป้อนสไลเดอร์และปุ่ม สำหรับชั้น GUI เอง DearPyGui คือตัวเลือกที่เป็นธรรมชาติ -- pure-Python, ติดตั้งผ่าน pip ได้, เร็วพอสำหรับตัวอย่างสด และเป็นสิ่งที่เครื่องมือโฮสต์ OpenMV ทุกตัวที่มีอยู่เลือกใช้ก่อน

  • แดชบอร์ดเทเลเมทรีหลายช่องสัญญาณ ช่องสัญญาณแอปพลิเคชันหลายช่องบนกล้องตัวเดียวกัน (การอ่านจากเซนเซอร์, เคาน์เตอร์, เหตุการณ์สถานะ) แต่ละช่องรีเฟรชใน callback ของตัวเอง และ GUI โฮสต์ที่อ่านบนตัวจับเวลาและแสดงผลแต่ละช่องแยกกัน การควบคุมการไหลแบบอิสระของชั้นช่องสัญญาณหมายความว่าการอ่านช้าหนึ่งครั้งไม่หยุดช่องอื่น

  • การปรับแต่งระยะไกลผ่าน UART callback ช่องสัญญาณเดิม แอปพลิเคชันเรียก protocol.init เพื่อสลับจาก USB เป็นการขนส่ง UART กล้องทำงานต่อเนื่องแบบ headless และสคริปต์ Python บน Raspberry Pi หรือแล็ปท็อปคุยกับมันผ่านสายอนุกรมสำหรับการปรับแต่งในสนาม

รูปแบบสายสัญญาณ ชั้นความน่าเชื่อถือ และการนามธรรมช่องสัญญาณไม่เปลี่ยนแปลง การเลือกการขนส่งที่เหมาะกับการใช้งานและเพิ่มช่องสัญญาณสำหรับแต่ละสิ่งที่โฮสต์ต้องการดูหรือตั้งค่าคืองานวิศวกรรมทั้งหมดจากจุดนี้เป็นต้นไป