12.10. Tổng kết

Một cam được cắm vào cáp USB để truyền phát khung hình đến chương trình host, chấp nhận cập nhật cấu hình từ host, và tồn tại qua việc rút/cắm lại mà không mất đồng bộ -- với các lần truyền lại ẩn, nhiều luồng logic chia sẻ một cổng, và không có mã đóng gói trong ứng dụng -- xuất phát từ khoảng bốn mươi dòng code phía cam và một lượng tương tự phía host. Thư viện giao thức biến một ống byte thành bề mặt kênh có thể lập trình và giữ mọi thứ bên dưới ứng dụng ẩn đi.

12.10.1. Những gì chương đã xây dựng

  • Mô hình tư duy bốn lớp của ngăn xếp: transport, đóng gói, độ tin cậy, kênh. Mỗi lớp giải quyết một vấn đề và bỏ qua mọi thứ bên trên.

  • Định dạng gói tin trên đường truyền -- header 10 byte có CRC, tải trọng biến đổi, CRC cuối. Đủ nhỏ để đi qua từng byte.

  • Quá trình bắt tay mà cam và host thực hiện khi transport kết nối: PROTO_SYNC, trao đổi khả năng, khám phá kênh.

  • Cơ chế độ tin cậy bên trên: số thứ tự, ACK, NAK, truyền lại với backoff theo cấp số nhân, mười mã trạng thái.

  • Mô hình kênh: tối đa 32 luồng logic có tên trên một đường truyền, với các kênh stdin / stdout / stream / profile tích hợp sẵn và các kênh ứng dụng được đăng ký bởi lớp Python.

  • Giao diện backend -- size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active -- và cách thư viện giao thức sử dụng các phương thức có trên backend để quyết định kênh hỗ trợ gì.

  • Phía host: lớp Camera của SDK openmv-python, tốc độ magic 921600-baud chuyển USB-CDC sang chế độ giao thức, và mẫu vòng channel_size / channel_read / channel_write.

  • Mẫu truyền phát khung hình -- chụp một bộ đệm, readp với chốt, send_event cho thông báo khung hình mới -- và mẫu cấu hình hai chiều (kênh ghi từ host, vòng JSON) cùng nhau tạo thành nền tảng cho mọi công cụ cam tương tác.

12.10.2. Lộ trình tham khảo

Các trang tham chiếu thư viện là điểm tra cứu khi một trong những tính năng này xuất hiện trong code thực:

  • protocol --- Các kênh giao thức OpenMV -- mô-đun protocol, protocol.init(), protocol.register(), ProtocolChannel, các hằng số cờ kênh, và bảng tải trọng tối đa theo cam.

  • SDK host -- pip install openmv, openmv.camera.Camera. Các phương thức được đề cập trong chương này: update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec(), và stop().

  • Kho lưu trữ openmv-projects -- các công cụ thực được xây dựng trên thư viện giao thức. Thư mục tools/ bao gồm thermal-overlay-calibration (GUI căn chỉnh RGB + nhiệt), ccm-tuning (công cụ điều chỉnh ma trận hiệu chỉnh màu sắc), genx320-event-streaminggenx320-overlay-calibration (công cụ cho camera sự kiện). Mỗi cái sử dụng các mẫu từ chương này từ đầu đến cuối.

12.10.3. Hướng phát triển tiếp theo

Một số hướng mà các dự án cam phát triển từ đây:

  • Xây dựng GUI host. Một kênh khung hình cung cấp cho widget video, một hoặc hai kênh cấu hình cung cấp cho các thanh trượt và nút. Đối với lớp GUI, DearPyGui là lựa chọn tự nhiên -- thuần Python, cài qua pip, đủ nhanh để xem trực tiếp, và là những gì mọi công cụ host OpenMV hiện có đều dùng đầu tiên.

  • Bảng điều khiển telemetry đa kênh. Nhiều kênh ứng dụng trên cùng một cam (đọc cảm biến, bộ đếm, sự kiện trạng thái) mỗi cái được làm mới trong callback riêng, và GUI host đọc chúng trên bộ định thời và hiển thị từng cái riêng biệt. Kiểm soát luồng độc lập của lớp kênh có nghĩa là một lần đọc chậm không làm dừng các kênh khác.

  • Điều chỉnh từ xa qua UART. Cùng các callback kênh; ứng dụng gọi protocol.init để chuyển từ USB sang transport UART. Cam tiếp tục chạy headless và một tập lệnh Python trên Raspberry Pi hoặc laptop giao tiếp với nó qua đường serial để điều chỉnh hiện trường.

Định dạng dây, lớp độ tin cậy, và sự trừu tượng kênh không thay đổi. Chọn transport phù hợp với triển khai và thêm một kênh cho mỗi thứ host cần xem hoặc đặt là toàn bộ công việc kỹ thuật từ đây trở đi.