12.10. Récapitulatif

Une caméra branchée sur un câble USB qui diffuse des trames vers un programme hôte, accepte en retour les mises à jour de configuration de l’hôte et survit à un débranchement/rebranchement sans perdre la synchronisation – avec les retransmissions masquées, plusieurs flux logiques partageant un seul port et zéro code d’encadrement dans l’application – tient en environ quarante lignes de code côté caméra et une quantité similaire côté hôte. La bibliothèque de protocole transforme un canal d’octets en une surface de canaux programmable et garde tout ce qui se situe sous l’application invisible.

12.10.1. Ce que ce chapitre a construit

  • Un modèle mental à quatre couches de la pile : transport, encadrement, fiabilité, canaux. Chaque couche résout un problème et ignore tout ce qui se trouve au-dessus.

  • Le format de paquet sur le fil – un en-tête de 10 octets avec CRC, une charge utile variable, un CRC final. Assez petit pour être parcouru octet par octet.

  • La poignée de main que la caméra et l’hôte exécutent à la connexion d’un transport : PROTO_SYNC, échange de capacités, découverte des canaux.

  • La machinerie de fiabilité par-dessus : numéros de séquence, ACK, NAK, retransmissions avec recul exponentiel, les dix codes de statut.

  • Le modèle de canaux : jusqu’à 32 flux logiques nommés sur un seul fil, avec les canaux intégrés stdin / stdout / stream / profile et des canaux applicatifs enregistrés par classe Python.

  • L’interface de backend – size, read, write, poll, lock / unlock, shape, ioctl, flush, is_active – et la façon dont la bibliothèque de protocole utilise les méthodes présentes sur un backend pour décider de ce que le canal prend en charge.

  • Côté hôte : la classe Camera du SDK openmv-python, le débit magique de 921600 bauds qui bascule l’USB-CDC en mode protocole, et le modèle d’aller-retour channel_size / channel_read / channel_write.

  • Un modèle de diffusion de trames – capture à tampon unique, readp avec un verrou, send_event pour les notifications de nouvelle trame – et un modèle de configuration bidirectionnelle (canal accessible en écriture par l’hôte, aller-retour JSON) qui forment ensemble le socle de tout outil interactif de caméra.

12.10.2. Feuille de route de référence

Les pages de référence de la bibliothèque sont les destinations de consultation lorsque l’une de ces fonctionnalités se présente dans du vrai code :

  • protocol — Canaux du protocole OpenMV – le module protocol, protocol.init(), protocol.register(), ProtocolChannel, les constantes de drapeaux de canal et le tableau des charges utiles maximales par caméra.

  • Le SDK hôte – pip install openmv, openmv.camera.Camera. Méthodes abordées dans ce chapitre : update_channels(), has_channel(), channel_size(), channel_read(), channel_write(), poll_events(), read_frame(), exec(), et stop().

  • Le dépôt openmv-projects – de vrais outils construits sur la bibliothèque de protocole. Le répertoire tools/ comprend thermal-overlay-calibration (interface graphique d’alignement RGB + thermique), ccm-tuning (réglage de la matrice de correction des couleurs), genx320-event-streaming et genx320-overlay-calibration (outils pour caméra événementielle). Chacun utilise les modèles de ce chapitre de bout en bout.

12.10.3. Pour aller plus loin

Quelques directions que prennent les projets de caméra à partir d’ici :

  • Construire une interface graphique hôte. Un canal de trames alimentant un widget vidéo, un ou deux canaux de configuration alimentant des curseurs et des boutons. Pour la couche d’interface graphique elle-même, DearPyGui est le choix naturel – entièrement en Python, installable via pip, assez rapide pour un aperçu en direct, et ce vers quoi se tourne en premier tout outil hôte OpenMV existant.

  • Tableau de bord de télémétrie multicanal. Plusieurs canaux applicatifs sur la même caméra (relevés de capteurs, compteurs, événements de statut) chacun rafraîchi dans sa propre fonction de rappel, et une interface graphique hôte qui les lit sur un minuteur et affiche chacun séparément. Le contrôle de flux indépendant de la couche de canaux fait qu’une lecture lente ne bloque pas les autres.

  • Réglage à distance via UART. Les mêmes fonctions de rappel de canal ; l’application appelle protocol.init pour basculer de l’USB vers un transport UART. La caméra continue de fonctionner sans tête et un script Python sur un Raspberry Pi ou un ordinateur portable lui parle via une liaison série pour un réglage sur le terrain.

Le format sur le fil, la couche de fiabilité et l’abstraction de canaux ne changent pas. Choisir le transport qui convient au déploiement et ajouter un canal pour chaque chose que l’hôte doit voir ou définir constitue tout le travail d’ingénierie à partir d’ici.