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