12.10. Conclusão#

Uma câmara ligada a um cabo USB que transmite fotogramas para um programa anfitrião, aceita atualizações de configuração do anfitrião, e sobrevive a desligar/religar sem perder sincronização – com retransmissões ocultas, múltiplos fluxos lógicos partilhando uma porta, e zero código de enquadramento na aplicação – resulta de cerca de quarenta linhas de código no lado da câmara e uma quantidade semelhante no anfitrião. A biblioteca de protocolo transforma um tubo de bytes numa superfície de canais programável e mantém tudo abaixo da aplicação invisível.

12.10.1. O que o capítulo construiu#

  • Um modelo mental de quatro camadas da pilha: transporte, enquadramento, fiabilidade, canais. Cada camada resolve um problema e ignora tudo o que está acima.

  • O formato do pacote no fio – cabeçalho de 10 bytes com CRC, payload variável, CRC final. Pequeno o suficiente para percorrer byte a byte.

  • O handshake que a câmara e o anfitrião executam quando um transporte se liga: PROTO_SYNC, troca de capacidades, descoberta de canais.

  • A maquinaria de fiabilidade por cima: números de sequência, ACKs, NAKs, retransmissões com backoff exponencial, os dez códigos de estado.

  • O modelo de canais: até 32 fluxos lógicos com nome num único fio, com stdin / stdout / stream / profile integrados e canais de aplicação registados por classe Python.

  • A interface de backend – size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active – e como a biblioteca de protocolo utiliza os métodos presentes num backend para decidir o que o canal suporta.

  • O lado do anfitrião: a classe Camera do SDK openmv-python, a taxa mágica de 921600 baud que coloca o USB-CDC em modo de protocolo, e o padrão de ida e volta channel_size / channel_read / channel_write.

  • Um padrão de transmissão de fotogramas – captura em buffer único, readp com bloqueio, send_event para notificações de novo fotograma – e um padrão de configuração bidirecional (canal gravável pelo anfitrião, ida e volta JSON) que juntos formam a base de todas as ferramentas de câmara interativas.

12.10.2. Roteiro de referência#

As páginas de referência da biblioteca são os destinos de consulta quando uma destas funcionalidades surge em código real:

  • protocol — Canais do Protocolo OpenMV – o módulo protocol, protocol.init(), protocol.register(), ProtocolChannel, constantes de flags de canal, e a tabela de payload máximo por câmara.

  • O SDK do anfitrião – pip install openmv, openmv.camera.Camera. Métodos abordados neste capítulo: update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec(), e stop().

  • O repositório openmv-projects – ferramentas reais construídas sobre a biblioteca de protocolo. O diretório tools/ inclui thermal-overlay-calibration (GUI de alinhamento RGB + térmico), ccm-tuning (sintonizador de matriz de correção de cor), genx320-event-streaming e genx320-overlay-calibration (ferramentas para câmaras de eventos). Cada uma usa os padrões deste capítulo do início ao fim.

12.10.3. Para onde ir a seguir#

Algumas direções que os projetos de câmara tomam a partir daqui:

  • Construir uma GUI para o anfitrião. Um canal de fotogramas alimentando um widget de vídeo, um ou dois canais de configuração alimentando controlos deslizantes e botões. Para a camada de GUI em si, DearPyGui é a escolha natural – Python puro, instalável via pip, rápido o suficiente para pré-visualização em tempo real, e o que todas as ferramentas existentes do anfitrião OpenMV usam em primeiro lugar.

  • Painel de telemetria multicanal. Vários canais de aplicação na mesma câmara (leituras de sensores, contadores, eventos de estado) cada um atualizado no seu próprio callback, e uma GUI do anfitrião que os lê num temporizador e renderiza cada um separadamente. O controlo de fluxo independente da camada de canais significa que uma leitura lenta não bloqueia as outras.

  • Ajuste remoto por UART. Os mesmos callbacks de canal; a aplicação chama protocol.init para mudar de USB para um transporte UART. A câmara continua a funcionar sem interface e um script Python num Raspberry Pi ou portátil comunica com ela por uma linha série para ajuste em campo.

O formato do fio, a camada de fiabilidade e a abstração de canais não mudam. Escolher o transporte adequado à implementação e adicionar um canal para cada coisa que o anfitrião precisa de ver ou definir é todo o trabalho de engenharia daqui para a frente.