Défi technique ETSIIT | Des étudiants aux entrepreneurs
Il y a un an, nous commencions nos travaux pour le IV ETSIIT Technical Challenge (vidéo). Qui sommes nous? Eh bien, nous sommes quatre étudiants en génie électrique et informatique à l'Université de Grenade en Espagne.
Notre équipe, Prometheus, a remporté le Tech Challenge sponsorisé par RTI. Pour ce défi, des équipes de quatre ou cinq étudiants devaient créer un produit pour résoudre un défi proposé par une entreprise externe. Le thème du défi de cette année était « Système distribué vidéo multi-agents ».
Nous avons rejoint ce challenge pour une expérience pratique. Un an après le Tech Challenge, nous sommes tous encore étudiants, mais nous avons maintenant recherché une opportunité commerciale, conçu le produit compétitif Locaviewer, développé une stratégie pour le vendre sur le marché et créé un prototype fonctionnel en plus du travail de cours requis pour nos diplômes.
Locavier
La plupart des parents ayant des enfants dans une école maternelle s'inquiètent de la santé et des progrès de leurs enfants. Notre produit, Locaviewer, tente de permettre aux parents de suivre et de voir leur enfant en temps réel. Dans le cadre de notre plan marketing, nous avons créé une vidéo promotionnelle. Notre code a été publié sous licence MIT sur GitHub.
Organisation et planning de l'équipe
Le projet nous a pris environ 250 heures. Chaque semaine, nous nous sommes rencontrés pendant au moins 4 heures, à l'exception du mois dernier où nous avons passé 20 heures/semaine sur le projet. Pour être plus efficace, nous nous sommes divisés en deux équipes. Deux personnes ont travaillé sur l'algorithme de localisation Bluetooth en intérieur. Les deux autres se sont concentrés sur une application pour capturer, encoder/décoder un flux vidéo et le partager à l'aide de RTI Connext DDS.
Algorithme de localisation
La première et la plus importante étape de notre solution consistait à déterminer l'emplacement des enfants à l'intérieur de l'école maternelle. Chaque enfant devait porter un bracelet avec un périphérique Bluetooth -capteur-, qui signalait en permanence la puissance du signal reçu par un périphérique Bluetooth -dongle-, placé dans les murs de la pièce. Cette valeur d'indication d'intensité du signal reçu (RSSI) est généralement mesurée en décibels (dB). Nous avons déterminé la relation entre le RSSI et la distance.
Les valeurs RSSI ont été transmises à un mini-ordinateur (Raspberry Pi ou MK802 III) pour exécuter un algorithme de triangulation et identifier l'emplacement de l'enfant. Comme nous connaissions la position de la caméra, après avoir déterminé la position de l'enfant, nous savions quelles caméras enregistraient l'enfant et avons sélectionné la meilleure caméra.
Application d'enregistrement vidéo
Pour enregistrer, encoder, décoder et visualiser la vidéo, nous avons utilisé GStreamer pour Java. Nous avons essayé d'autres bibliothèques telles que vlcj mais elles ne supportaient pas Raspberry Pi ou ne satisfaisaient pas aux contraintes temps réel de notre système. Après quelques recherches, nous avons découvert GStreamer qui fonctionnait avec Raspberry Pi, et pouvait facilement obtenir le tampon vidéo encodé en temps réel (en utilisant AppSink et AppSource éléments). Cela nous a permis de l'encapsuler et de l'envoyer à un sujet DDS. Nous avons même travaillé là-dessus pendant plusieurs mois, implémentant même une solution de contournement temporaire avec le streaming HTTP à l'aide de vlcj jusqu'à ce que nous décidions de notre approche finale.
Nous avons utilisé l'encodeur vidéo VP8 (WebM). Étant donné que le wrapper pour Java ne fonctionne qu'avec la version 0.10 de GStreamer, nous n'avons pas pu l'optimiser et avons dû réduire les dimensions de la vidéo. Nos tests ont utilisé Raspberry Pi, mais nous prévoyons d'utiliser un appareil MK802 III dans la mise en œuvre finale car il a le même prix mais plus de puissance de traitement. La configuration d'encodage finale était :
Nous avons utilisé le code Java suivant pour créer des éléments d'encodeur VP8.
Element codec =ElementFactory.make("vp8enc", null);codec.set("threads", 5);codec.set("max-keyframe-distance", 20);codec.set("speed", 5);Element capsDst =ElementFactory.make("capsfilter", null);capsDst.setCaps(Caps.fromString("video/x-vp8 profile=(string)2"));
Côté client, nous avons utilisé la configuration suivante :
Nous avons utilisé le code Java suivant pour créer les éléments du décodeur VP8.
String caps ="video/x-vp8, width=(int)320, height=(int)240, framerate=15/1";Element capsSrc =ElementFactory.make(" capsfilter", null);capsSrc.setCaps(Caps.fromString(caps));Element queue =ElementFactory.make("queue2", null)Element codec =ElementFactory.make("vp8dec", null);Element convert =ElementFactory. make("ffmpegcolorspace", null);
Nous avons également essayé l'encodage JPEG, mais cela n'était pas possible pour une utilisation en temps réel en raison de la taille plus importante et du plus grand nombre de paquets.
Architecture DDS
L'approche publication-abonnement était la clé de notre solution. Cela nous a permis de partager des données entre de nombreux clients sans se soucier des sockets ou des connexions réseau. Nous avions juste besoin de spécifier quel type de données envoyer et recevoir. Nous avons créé une bibliothèque wrapper, DDStheus, pour faire abstraction de l'utilisation de DDS dans notre système.
Notre solution finale était composée de six programmes qui partageaient trois sujets. Nous avons utilisé différents langages de programmation :
- Python pour fonctionner à bas niveau (HCI) avec les appareils Bluetooth
- MATLAB/Octave pour faire le script de triangulation
- Java pour fonctionner avec RTI Connext DDS et les interfaces utilisateur graphiques
Nous avions besoin de connaître toutes les valeurs RSSI d'une pièce. Nous avons créé un script pour configurer les dongles Bluetooth et obtenir les informations RSSI. Ces valeurs ont été envoyées à un programme Java à l'aide d'une simple connexion socket sur la même machine. L'application Java a publié les données dans les Données du capteur sujet. Il a envoyé l'ID de l'enfant (le capteur Bluetooth MAC), l'ID et la position du dongle Bluetooth, la pièce actuelle (en tant que clé pour filtrer par pièce), la valeur RSSI et l'heure d'expiration.
Une fois que les caméras ont enregistré et encodé la vidéo, le programme Java Gava envoie la vidéo via les Données vidéo sujet. Il a envoyé l'ID de la caméra en tant que valeur clé pour filtrer le flux à l'aide de ContentFilteredTopic avec la position de la caméra, la pièce, la trame encodée et les informations sur le codec.
En outre, l'application place l'ID de la caméra, la pièce et la position de la caméra dans la valeur QoS USER_DATA de chaque éditeur vidéo. Le mini-ordinateur de triangulation pourrait alors obtenir toutes les informations de la caméra dans une pièce simplement en découvrant les éditeurs. Il pourrait également détecter les caméras nouvelles et cassées en temps réel et mettre à jour le script de localisation pour améliorer l'algorithme de sélection de caméra.
Technologie de l'Internet des objets
- Le collège communautaire ajoute de la flexibilité pour les étudiants avancés en fabrication de composites
- Un client du Liban apprend à utiliser une machine cnc
- Nos clients de Jordanie sont venus visiter notre usine
- Un client du Canada a visité notre usine
- Notre ingénieur s'est rendu à Dubaï pour fournir une assistance technique à l'étranger
- Un client du Qatar a visité notre usine en avril 2017
- Notre client du Bengale inspecte nos nouvelles machines à bois
- Des clients indiens sont venus dans notre usine pour inspecter la machine
- Des visiteurs de Corée pour une machine de routeur CNC