12.10. 마무리¶
USB 케이블에 꽂힌 카메라가 호스트 프로그램으로 프레임을 스트리밍하고, 호스트로부터 설정 업데이트를 받아들이며, 동기화를 잃지 않고 뽑았다 다시 꽂아도 견디는 것 – 재전송은 숨겨지고, 여러 논리 스트림이 하나의 포트를 공유하며, 애플리케이션에는 프레이밍 코드가 전혀 없이 – 이 모든 것이 카메라 측 약 40줄의 코드와 호스트 측의 비슷한 양에서 나옵니다. 프로토콜 라이브러리는 바이트 파이프를 프로그래밍 가능한 채널 표면으로 바꾸고 애플리케이션 아래의 모든 것을 보이지 않게 유지합니다.
12.10.1. 이 장에서 구축한 것¶
스택의 4계층 멘탈 모델: 전송(transport), 프레이밍(framing), 신뢰성(reliability), 채널(channels). 각 계층은 하나의 문제를 해결하고 그 위의 모든 것을 무시합니다.
전송선상 패킷 형식 – CRC가 포함된 10바이트 헤더, 가변 페이로드, 후행 CRC. 한 바이트씩 따라가며 살펴볼 수 있을 만큼 작습니다.
전송 계층이 연결될 때 카메라와 호스트가 수행하는 핸드셰이크: PROTO_SYNC, 기능 교환, 채널 탐색.
그 위의 신뢰성 메커니즘: 시퀀스 번호, ACK, NAK, 지수 백오프를 사용한 재전송, 그리고 열 가지 상태 코드.
채널 모델: 하나의 전송선에 최대 32개의 명명된 논리 스트림, 내장된
stdin/stdout/stream/profile및 Python 클래스로 등록되는 애플리케이션 채널.백엔드 인터페이스 –
size,read,write,poll,lock/unlock,shape,ioctl,flush,is_active– 그리고 프로토콜 라이브러리가 백엔드에 존재하는 메서드를 사용하여 채널이 무엇을 지원하는지 결정하는 방법.호스트 측: openmv-python SDK의
Camera클래스, USB-CDC를 프로토콜 모드로 전환하는921600보드 레이트의 마법 같은 속도, 그리고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 + 열화상 정렬 GUI),ccm-tuning(색상 보정 행렬 튜너),genx320-event-streaming및genx320-overlay-calibration(이벤트 카메라 도구)이 포함되어 있습니다. 각 도구는 이 장에서 다룬 패턴을 처음부터 끝까지 사용합니다.
12.10.3. 다음으로 나아갈 방향¶
카메라 프로젝트가 여기서 나아가는 몇 가지 방향:
호스트 GUI 구축. 비디오 위젯에 프레임을 공급하는 프레임 채널, 슬라이더와 버튼에 데이터를 공급하는 한두 개의 설정 채널. GUI 계층 자체에는 DearPyGui 가 자연스러운 선택입니다 – 순수 Python, pip 설치 가능, 실시간 미리보기에 충분히 빠르며, 모든 기존 OpenMV 호스트 도구가 가장 먼저 찾는 것입니다.
다중 채널 텔레메트리 대시보드. 동일한 카메라에 여러 애플리케이션 채널(센서 판독값, 카운터, 상태 이벤트)이 각자의 콜백에서 갱신되고, 호스트 GUI가 타이머로 이를 읽어 각각을 별도로 렌더링합니다. 채널 계층의 독립적인 흐름 제어 덕분에 느린 한 읽기가 다른 것들을 멈추게 하지 않습니다.
UART를 통한 원격 튜닝. 동일한 채널 콜백을 사용합니다. 애플리케이션이
protocol.init을 호출하여 USB에서 UART 전송으로 전환합니다. 카메라는 헤드리스로 계속 실행되고 Raspberry Pi나 노트북의 Python 스크립트가 현장 튜닝을 위해 시리얼 라인으로 카메라와 통신합니다.
전송선 형식, 신뢰성 계층, 채널 추상화는 바뀌지 않습니다. 배포 환경에 맞는 전송을 선택하고 호스트가 보거나 설정해야 하는 각 항목에 대한 채널을 추가하는 것이 여기서부터의 엔지니어링 작업 전부입니다.