13.3.1.6. API 레퍼런스

openmv 패키지의 공개 인터페이스는 카메라와 통신하기 위한 Camera 클래스와 프로토콜 오류를 위한 OMVException 계층입니다. 둘 다 이 페이지에 문서화되어 있습니다.

13.3.1.6.1. Camera 클래스

class openmv.Camera(port: str, *, baudrate: int = 921600, crc: bool = True, seq: bool = True, ack: bool = True, events: bool = True, timeout: float = 1.0, max_retry: int = 3, max_payload: int = 4096, drop_rate: float = 0.0)

USB 시리얼을 통해 연결된 OpenMV 카메라를 위한 호스트 측 프록시입니다.

매개변수:
  • port – 시리얼 장치 경로입니다. Linux에서는 USB CDC의 경우 /dev/ttyACMx, USB-to-UART 브리지의 경우 /dev/ttyUSBx 입니다. macOS에서는 /dev/tty.usbmodem... 또는 /dev/cu.usbmodem... 입니다. Windows에서는 COMx 입니다.

  • baudrate – 시리얼 보드 레이트입니다. USB에서는 921600 이 카메라를 MicroPython REPL에서 OpenMV 프로토콜로 전환하는 매직 값입니다. USB 링크에서 다른 값을 사용하면 카메라가 REPL 모드에 머무르므로 기본값을 사용해야 합니다. UART 링크에서는 이 값이 실제 회선 보드 레이트이며 양쪽 모두에서 자유롭게 설정할 수 있습니다.

  • crc – 모든 패킷에 대해 CRC 검증을 활성화합니다.

  • seq – 패킷별 시퀀스 번호를 활성화합니다.

  • ack – 패킷 확인 응답을 요구합니다.

  • events – 카메라로부터의 이벤트 알림을 활성화합니다.

  • timeout – 작업별 타임아웃(초)입니다.

  • max_retry – 패킷 실패 시 예외를 발생시키기 전 재시도 횟수입니다.

  • max_payload – 협상되는 최대 페이로드 크기(바이트)입니다. 카메라가 더 낮은 값으로 협상할 수 있습니다.

  • drop_rate – 패킷을 드롭할 테스트 전용 확률로, [0.0, 1.0] 범위입니다. 운영 환경에서는 0.0 으로 두십시오.

이 클래스는 컨텍스트 매니저 프로토콜을 지원합니다. with Camera(port) as cam: 는 진입 시 connect(), 종료 시 disconnect() 를 호출합니다.

13.3.1.6.2. 연결

Camera.connect() None

시리얼 포트를 열고 프로토콜 핸드셰이크를 수행합니다. 캐시된 상태(채널 목록, 시스템 정보, 버전 정보)가 부수 효과로 채워집니다. 컨텍스트 매니저에 의해 자동으로 호출됩니다.

Camera.disconnect() None

시리얼 포트를 닫고 트랜스포트를 해제합니다. 컨텍스트 매니저가 종료될 때 자동으로 호출됩니다.

Camera.is_connected() bool
반환:

시리얼 포트가 열려 있으면 True 입니다.

Camera.reset() None

카메라를 리셋합니다. 카메라가 재부팅되므로 연결이 끊깁니다.

Camera.boot() None

카메라를 부트로더로 진입시킵니다. 카메라가 재부팅되므로 연결이 끊깁니다.

Camera.update_capabilities() None

카메라와 프로토콜 기능(CRC, 시퀀스 검사, ACK, 이벤트, 최대 페이로드)을 다시 협상합니다. 카메라는 처리할 수 있는 최대 페이로드를 보고하며, 호스트의 요청은 그 값으로 잘리고 합의된 설정이 다시 전달됩니다. connect() 에 의해 자동으로 호출됩니다. 기존 연결에서 생성자 플래그를 다시 협상해야 하는 경우가 아니면 사용자 코드에서 호출할 이유는 없습니다.

Camera.poll_events() None

명령을 보내지 않고 카메라로부터 대기 중인 이벤트를 소비하기 위해 트랜스포트의 수신 경로를 한 번 실행합니다. 다른 I/O 없이 몇 분간 실행되는 장기 실행 프로그램에서 채널 등록 이벤트를 신속하게 처리하고자 할 때 유용합니다.

13.3.1.6.3. 스크립트 실행

Camera.exec(script: str) None

script (Python 소스 문자열)를 카메라의 stdin 버퍼에 업로드하고 실행을 시작합니다.

매개변수:

script – 실행할 MicroPython 소스입니다.

Camera.stop() None

실행 중인 스크립트를 중단합니다. IDE의 Stop 버튼과 동일합니다.

Camera.read_stdout() str | None

실행 중인 스크립트가 마지막 호출 이후 stdout 에 기록한 바이트를 읽습니다.

반환:

디코딩된 문자열 형태의 출력이며, 대기 중인 데이터가 없으면 None 입니다.

13.3.1.6.4. 스트리밍

Camera.streaming(enable: bool, raw: bool = False, resolution: tuple[int, int] | None = None) None

프레임 스트림을 켜거나 끄고 전송 포맷을 선택합니다.

매개변수:
  • enableTrue 는 스트리밍을 활성화하고, False 는 비활성화합니다.

  • rawFalse (기본값)일 때 카메라는 각 프레임을 스트림 채널에 넣기 전에 JPEG으로 압축하고 read_frame() 이 호스트에서 압축을 해제합니다. True 일 때 카메라는 캡처된 픽셀 버퍼를 압축하지 않고 전송합니다. 이는 하드웨어 JPEG 지원이 없는 카메라에서 소프트웨어 압축이 루프에서 가장 느린 단계가 될 때 올바른 선택입니다.

  • resolution – 압축되지 않은 프레임은 JPEG으로 압축된 프레임보다 훨씬 크기 때문에, 카메라가 전송 전에 각 원본 프레임을 축소하는 대상 크기 (width, height) 입니다. raw=True 일 때 필수이며, 그렇지 않으면 무시됩니다.

Camera.read_frame() dict | None

스트림 채널에서 최신 프레임을 읽습니다.

반환:

대기 중인 프레임이 없으면 None 이고, 그렇지 않으면 다음 키를 갖는 딕셔너리입니다. width (int, 픽셀), height (int, 픽셀), format (int, 카메라가 선언한 픽셀 포맷 식별자), depth (int, JPEG / PNG 프레임의 압축된 이미지 크기(바이트). 비압축 포맷에서는 사용되지 않음), data (bytes, 길이 width * height * 3 의 RGB888), raw_size (int, 디코드 전에 카메라가 USB로 보낸 바이트).

13.3.1.6.5. 사용자 정의 채널

Camera.has_channel(name: str) bool
반환:

name 으로 등록된 채널이 카메라에 존재하면 True 입니다.

Camera.channel_size(name: str) int
반환:

지정된 채널에 현재 사용 가능한 바이트 수이며, 채널이 비어 있거나 존재하지 않으면 0 입니다.

Camera.channel_read(name: str, size: int | None = None) bytes | None

사용자 정의 채널에서 읽습니다.

매개변수:
  • name – 카메라 측 스크립트가 등록한 채널 이름입니다.

  • size – 읽을 바이트 수이며, 사용 가능한 모든 데이터를 읽으려면 None 입니다.

반환:

읽은 바이트이며, 채널이 존재하지 않으면 None 입니다.

Camera.channel_write(name: str, data: bytes) bool

data 를 사용자 정의 채널에 씁니다. 페이로드보다 큰 쓰기는 자동으로 여러 패킷으로 분할됩니다.

매개변수:
  • name – 카메라 측 스크립트가 등록한 채널 이름입니다.

  • data – 전송할 바이트형 페이로드입니다.

반환:

채널이 존재하고 쓰기가 전송되었으면 True, 그렇지 않으면 False 입니다.

Camera.read_status() dict[str, bool]

등록된 모든 채널을 폴링합니다.

반환:

채널 이름을 “읽을 데이터가 준비됨”의 불리언 값에 매핑하는 딕셔너리입니다.

Camera.update_channels() None

카메라로부터 캐시된 채널 목록을 갱신합니다. 채널 등록 이벤트가 도착한 후 이름으로 채널을 조회할 때 자동으로 실행됩니다. 새로 등록된 채널을 즉시 알고자 하는 애플리케이션은 이를 직접 호출할 수 있습니다.

Camera.get_channel(name: str | None = None, channel_id: int | None = None) int | str | None

채널을 이름으로(숫자 ID 반환) 또는 ID로(이름 반환) 조회합니다. 채널 등록 이벤트가 대기 중이면 먼저 update_channels() 를 통해 채널 캐시를 갱신합니다.

매개변수:
  • name – ID로 해석할 채널 이름입니다.

  • channel_id – 이름으로 해석할 채널 ID입니다.

반환:

대응하는 ID 또는 이름이며, 채널이 존재하지 않으면 None 입니다. name 또는 channel_id 중 하나는 반드시 제공해야 합니다.

13.3.1.6.6. 장치 인트로스펙션

Camera.version() dict

카메라의 프로토콜, 부트로더, 펌웨어 버전 트리플을 반환합니다. connect() 이후 캐시됩니다. 각 트리플은 int(major, minor, patch) 튜플입니다:

  • protocol_version – 카메라가 구현하는 OpenMV 와이어 프로토콜의 버전입니다.

  • bootloader_version – 플래시에 상주하는 부트로더 이미지입니다.

  • firmware_version – 현재 실행 중인 MicroPython 펌웨어입니다.

Camera.system_info() dict

카메라의 하드웨어 기능 및 메모리 정보를 반환합니다. connect() 이후 캐시됩니다. 반환된 딕셔너리의 키는 네 그룹으로 나뉩니다.

식별 정보

  • cpu_id – 32비트 CPU 식별자입니다.

  • device_id – 32비트 워드 3개로 이루어진 튜플로, 실리콘에 새겨진 고유 장치 시리얼입니다.

  • chip_id – 32비트 워드 3개로 이루어진 튜플로, 카메라에 연결된 이미지 센서마다 하나씩의 항목입니다.

  • usb_vid – USB 벤더 ID입니다.

  • usb_pid – USB 제품 ID입니다.

메모리 크기 (모두 킬로바이트 단위)

  • flash_size_kb – 내부 플래시 총량입니다.

  • ram_size_kb – 총 RAM입니다.

  • framebuffer_size_kb – 이미지 캡처를 위해 예약된 RAM입니다.

  • stream_buffer_size_kb – 프레임을 호스트로 보내는 스트림 채널을 위해 예약된 RAM입니다.

기능 플래그 (기능당 불리언 하나, 모두 <feature>_present 형식의 이름)

  • gpu_present – 그래픽 처리 장치입니다.

  • npu_present – 신경망 처리 장치입니다.

  • isp_present – 이미지 신호 프로세서입니다.

  • venc_present – 비디오 인코더입니다.

  • jpeg_present – JPEG 하드웨어 인코더입니다.

  • dram_present – 외부 DRAM입니다.

  • crc_present – CRC 가속기입니다.

  • pmu_present – 성능 모니터링 장치입니다.

  • wifi_present – Wi-Fi 무선 모듈입니다.

  • bt_present – Bluetooth 무선 모듈입니다.

  • sd_present – SD 카드 슬롯입니다.

  • eth_present – 이더넷 PHY입니다.

  • multicore_present – 다중 CPU 코어입니다.

기타

  • usb_highspeed – 불리언으로, USB가 고속 모드(USB 2.0 HS, 480 Mbps)로 열거되면 True 입니다.

  • pmu_eventcnt – 사용 가능한 PMU 이벤트 카운터의 수이며, PMU가 없으면 0 입니다.

Camera.print_system_info() None

포맷된 시스템 정보 블록을 INFO 레벨로 logging 에 기록합니다. CLI는 연결 시 이를 사용합니다.

13.3.1.6.7. 진단

Camera.host_stats() dict
반환:

호스트 측에서 추적되는 트랜스포트 계층 카운터입니다: sent, received, checksum, sequence.

Camera.device_stats() dict
반환:

카메라 측에서 추적되는 트랜스포트 계층 카운터입니다: sent, received, checksum, sequence, retransmit, transport, sent_events, max_ack_queue_depth.

13.3.1.6.8. 프로파일러

프로파일러는 계측된 펌웨어 모듈(현재 image, ml, ulab)에 대해 함수별 호출 횟수와 최소 / 최대 / 총 실행 시간을 보고합니다. 함수 진입과 종료는 컴파일 시점에 가로채집니다. 런타임은 각 시점에 단조 증가 마이크로초 카운터를 샘플링하고, 함수별로 결과를 누적하며, profile 채널을 통해 호스트에 테이블을 노출합니다.

프로파일러는 makePROFILE_ENABLE=1 이 전달될 때만 펌웨어에 빌드됩니다. 기본 펌웨어 이미지에는 포함되지 않습니다. 빌드가 추적 모듈에 추가하는 -finstrument-functions 플래그는 무시할 수 없는 런타임 오버헤드를 가지므로, 프로파일링 빌드는 이를 필요로 하는 특정 디버깅 세션을 위해 소스에서 생성됩니다. 펌웨어가 이 플래그로 빌드되지 않은 경우 profile 채널은 등록되지 않으며, 이 페이지의 모든 프로파일러 메서드는 아무 작업도 하지 않고 조용히 반환됩니다.

Arm Performance Monitoring Unit (PMU)은 Cortex-M55의 하드웨어 카운터 블록으로, 사이클 수, 캐시 적중 및 실패, 분기 동작, 그 밖의 아키텍처에 정의된 이벤트를 측정 대상 코드의 속도를 저하시키지 않고 추적하는 구성 가능한 소수의 카운터 집합입니다. PMU를 갖춘 cam에서 – AE3와 N6, 즉 M55를 기반으로 만들어진 OpenMV 제품군의 두 cam – 프로파일러는 타이밍 데이터와 함께 이러한 카운터를 샘플링하며 이벤트 합계는 각 함수별 레코드에 표시됩니다. PMU가 없는 cam도 타이밍 레코드는 생성하지만, 이벤트 필드는 0으로 반환되고 profiler_event()는 아무 동작도 하지 않습니다.

Camera.profiler_mode(exclusive: bool = False) None

포함적 타이밍과 배타적 타이밍을 전환합니다. 포함적 타이밍은 피호출자의 시간을 호출자에게 부과하고, 배타적 타이밍은 그렇지 않습니다.

매개변수:

exclusiveTrue 는 배타적 타이밍을, False 는 포함적 타이밍을 선택합니다.

Camera.profiler_reset(config: list | None = None) None

모든 프로파일 카운터를 지웁니다. config=None 이면 기본 PMU 이벤트 할당도 복원합니다.

매개변수:

config – 향후의 카운터별 구성 재정의를 위해 예약되었습니다. 기본값을 유지하려면 None 을 전달하십시오.

Camera.profiler_event(counter_num: int, event_id: int) None

PMU 카운터 슬롯 중 하나를 특정 하드웨어 이벤트에 바인딩합니다.

매개변수:
  • counter_num – 카운터 인덱스입니다.

  • event_id – 아키텍처 정의 이벤트 식별자입니다.

Camera.read_profile() list[dict] | None

마지막 리셋 이후 수집된 함수별 프로파일 레코드를 반환합니다. 각 레코드는 address, caller, call_count, min_ticks, max_ticks, total_ticks, total_cycles 와 카메라의 pmu_eventcnt 크기에 맞춘 events 튜플을 갖는 딕셔너리입니다.

반환:

레코드 딕셔너리의 리스트이며, 프로파일 채널을 사용할 수 없거나 수집된 데이터가 없으면 None 입니다.

13.3.1.6.9. 서브클래싱 및 채널 내부 구조

위에 문서화된 메서드는 패키지의 모든 일반적인 사용을 다룹니다. 일부 패턴(호스트가 반응하고자 하는 카메라 측 이벤트 처리, 다단계 교환을 위한 채널 잠금, 바이트 스트림 대신 형태가 정해진 데이터를 전달하는 채널과의 통신, 또는 채널별 제어 명령 구동)에는 Camera 가 밑줄로 접두사를 붙여 유지하는 메서드가 필요합니다. 이러한 이름은 관례상 비공개이며(Python은 이름을 맹글링하지 않음), 이를 필요로 하는 애플리케이션은 Camera 를 서브클래싱하거나 메서드를 직접 호출하도록 기대됩니다.

이벤트에 반응하기 위한 서브클래싱. 카메라가 발생시키는 모든 이벤트는 Camera._handle_event() 를 통해 도착합니다. Camera 를 서브클래싱하고 이 메서드를 재정의하는 것이 애플리케이션이 카메라 측 스크립트가 발생시키는 이벤트에 반응하는 방법입니다. 이벤트 페이지에서 전체 패턴을 설명합니다.

Camera._handle_event(channel_id: int, event: int) None

카메라로부터 이벤트 하나를 디스패치합니다. 이벤트 패킷이 도착할 때마다 트랜스포트 계층에 의해 호출됩니다. 애플리케이션별 처리를 추가하려면 서브클래스에서 재정의하고, 기본 동작(CHANNEL_REGISTERED 시 채널 목록 갱신, stream 채널의 프레임 준비 추적, stdin 채널 시작 / 중지 로깅)을 유지하려면 super()._handle_event(...) 를 호출하십시오.

매개변수:
  • channel_id – 시스템 이벤트의 경우 0 이며, 그렇지 않으면 등록된 채널 ID입니다.

  • event – 이벤트 식별자입니다. 시스템 이벤트의 값은 EventType 열거형에서 나오고, 채널 이벤트의 값은 카메라 측 채널 백엔드가 선택한 값에서 나옵니다.

자체 프로토콜 통신 메서드를 추가하는 서브클래스는 이 페이지의 모든 제공 메서드가 갖는 동일한 재동기화 및 재시도 동작을 상속하도록 retry_if_failed() 로 데코레이션해야 합니다.

static Camera.retry_if_failed(func)

데코레이터입니다. 트랜스포트가 ResyncException 을 발생시킬 때 한 번 재시도하도록 인스턴스 메서드를 래핑합니다. _send_cmd_wait_resp() 를 (직접 또는 _channel_* 래퍼 중 하나를 통해) 호출하는 모든 메서드는 이 데코레이터를 가져야 합니다:

class MyCamera(Camera):
    @Camera.retry_if_failed
    def my_custom_command(self, payload):
        return self._send_cmd_wait_resp(Opcode.MY_CMD,
                                        0, payload)

채널 잠금은 두 관련 작업 사이에 채널 상태가 변경되지 않도록 보장합니다(예를 들어 데이터를 계속 추가하는 채널에서 _channel_size() 다음에 _channel_read() 를 수행하는 경우). read_frame()read_profile() 은 내부적으로 이를 사용하며, 다단계 접근으로 사용자 정의 채널을 구동하는 애플리케이션도 마찬가지입니다.

Camera._channel_lock(channel_id: int) bool

채널에 대한 배타적 잠금을 획득합니다. 동일 채널에 대한 다른 호스트 작업은 잠금이 해제될 때까지 블록됩니다.

매개변수:

channel_id – 숫자 채널 ID이며, 일반적으로 get_channel() 로 해석됩니다.

반환:

잠금이 허용되면 True 입니다.

Camera._channel_unlock(channel_id: int) bool

_channel_lock() 으로 이전에 획득한 잠금을 해제합니다. 항상 잠금 호출과 짝을 이룹니다. 중간의 읽기가 예외를 발생시키더라도 잠금 해제가 일어나도록 try / finally 를 사용하십시오.

매개변수:

channel_id – 숫자 채널 ID이며, 일반적으로 get_channel() 로 해석됩니다.

형태가 정해진 채널은 평면 바이트 스트림 대신 구조화된 레코드를 전달합니다. 프로파일러 채널이 제공되는 예입니다. 그 형태는 (record_count, record_size) 이며, 대기 중인 레코드 수를 알고자 하는 호스트는 바이트 크기 대신 형태를 읽습니다.

Camera._channel_shape(channel_id: int) tuple[int, ...]

채널의 형태 디스크립터를 읽습니다.

매개변수:

channel_id – 숫자 채널 ID이며, 일반적으로 get_channel() 로 해석됩니다.

반환:

채널의 레이아웃을 설명하는 부호 없는 32비트 정수의 튜플입니다. 의미는 채널별로 다릅니다.

채널별 제어 명령 – 시작, 중지, 리셋, 구성 – 은 채널별 명령 번호와 선택적 struct.pack 페이로드를 갖춘 단일 opcode(CHANNEL_IOCTL)를 통해 전달됩니다. stop(), exec(), streaming() 같은 기본 제공 메서드는 stdinstream 채널에 대한 _channel_ioctl() 호출을 감싼 얇은 래퍼입니다. 자체 ioctl 메뉴를 정의하는 cam 측 사용자 정의 채널도 동일한 방식으로 구동됩니다.

Camera._channel_ioctl(channel_id: int, cmd: int, fmt: str | None = None, *args) bytes | None

채널에 ioctl 명령을 발행합니다.

매개변수:
  • channel_id – 숫자 채널 ID이며, 일반적으로 get_channel() 로 해석됩니다.

  • cmd – 카메라 측 채널 백엔드가 정의한 명령 번호입니다.

  • fmt – 인자 튜플을 위한 선택적 struct 포맷 문자열입니다. 인자를 받지 않는 ioctl의 경우 None 을 전달하십시오.

  • argsfmt 와 일치하는 값입니다.

반환:

채널이 반환한 페이로드이며, 없으면 None 입니다.

공개 채널 메서드의 ID 기반 바이트 스트림 변형은 이름-ID 조회를 생략하고 명시적인 바이트 offset 을 받습니다. 큰 버퍼의 중간에서 일부를 읽는 데 유용합니다(예를 들어 profile 채널 레코드).

Camera._channel_size(channel_id: int) int
매개변수:

channel_id – 숫자 채널 ID이며, 일반적으로 get_channel() 로 해석됩니다.

반환:

채널에서 현재 사용 가능한 바이트입니다.

Camera._channel_read(channel_id: int, offset: int, length: int) bytes

offset 에서 시작하여 length 바이트를 읽습니다. 다중 패킷 읽기는 자동으로 재조립됩니다.

매개변수:
  • channel_id – 숫자 채널 ID이며, 일반적으로 get_channel() 로 해석됩니다.

  • offset – 읽기를 시작할 바이트 오프셋입니다.

  • length – 읽을 바이트 수입니다.

Camera._channel_write(channel_id: int, data: bytes, offset: int = 0) None

지정된 offsetdata 를 씁니다. 다중 패킷 쓰기는 자동으로 여러 패킷으로 분할됩니다.

매개변수:
  • channel_id – 숫자 채널 ID이며, 일반적으로 get_channel() 로 해석됩니다.

  • data – 쓸 바이트형 페이로드입니다.

  • offset – 쓰기를 시작할 바이트 오프셋입니다.

프로토콜 프리미티브는 클래스가 노출하는 가장 낮은 수준으로, 위의 모든 것이 결국 그 위에 구축되는 원시 명령 전송, 원시 채널 목록 가져오기, 수동 재동기화 항목입니다. 클래스가 아직 래핑하지 않은 옵코드를 보내거나 서브클래스에서 사용자 정의 복구를 구현할 때 애플리케이션이 이를 사용합니다.

Camera._send_cmd_wait_resp(opcode: int, channel: int = 0, data: bytes = b'') bytes | None

프로토콜 명령을 보내고 카메라의 응답을 기다립니다. 이 섹션의 다른 모든 메서드가 구축되는 프리미티브입니다.

매개변수:
  • opcode – 명령 번호입니다. 제공되는 Opcode 열거형은 펌웨어가 함께 제공하는 코드를 나열하지만, 이 매개변수는 단지 정수일 뿐이므로 사용자 정의 펌웨어 빌드가 자체 코드를 정의하고 응답할 수 있습니다.

  • channel – 채널 ID이며, 시스템 명령의 경우 0 입니다.

  • data – 명령별 페이로드입니다.

반환:

응답 페이로드이며, 연결을 끊는 Opcode.SYS_RESETOpcode.SYS_BOOT 같은 명령의 경우 None 입니다.

Camera._channel_list() dict

update_channels() 가 채우는 캐시된 channels_by_idchannels_by_name 딕셔너리를 건드리지 않고 카메라로부터 현재 채널 목록을 가져옵니다. 카메라의 채널 상태를 직접 검사하고자 하는 서브클래스에 유용합니다.

반환:

채널 ID를 {'name': str, 'flags': int} 에 매핑하는 딕셔너리입니다.

Camera._resync() None

프로토콜 핸드셰이크를 처음부터 다시 실행합니다. 초기 연결 시 connect() 에 의해, 그리고 트랜스포트로부터 OMVException 을 잡는 모든 공개 메서드에 의해 자동으로 호출됩니다. 서브클래스에서 자체 복구 루프를 구현하는 애플리케이션은 기저 오류를 처리한 후 이를 직접 호출할 수 있습니다.

13.3.1.6.10. 예외

exception openmv.OMVException

모든 프로토콜 수준 오류의 기반 클래스입니다. 아래의 세 서브클래스가 모두 이를 상속하므로, 단일 except OMVException 으로 전체 오류 영역을 다룰 수 있습니다.

exception openmv.TimeoutException

카메라가 구성된 타임아웃 내에 응답하지 않았습니다. OMVException 의 서브클래스입니다.

exception openmv.ChecksumException

패킷의 CRC가 일치하지 않았습니다. 프로토콜이 재시도 예산을 소진한 후 발생합니다. OMVException 의 서브클래스입니다.

exception openmv.SequenceException

재시도 후에도 예상치 못한 시퀀스 번호의 패킷이 도착했습니다. OMVException 의 서브클래스입니다.