P24 Robot de surveillance domestique

De Wiki d'activités IMA
Révision datée du 6 décembre 2014 à 10:37 par Sdeltomb (discussion | contributions) (Semaine 10)

Robot de surveillance domestique


Cahier des charges


Présentation générale du projet


Contexte


La robotique est au service de l'homme dans de nombreux domaines y compris dans celui de la surveillance de nos maisons.
En effet de nouveaux robots voient le jour permettant de voir, d'entendre, de parler et de vous déplacer chez vous (ou ailleurs) depuis n'importe quel point de la planète.
Il y a par exemple le robot espion Rovio de la société WoWee:

Rovio

Ou encore pour un usage plus professionnel Lucos de la société Abankos Robotic.

Lucos

Le roomba est un robot aspirateur de la société IRobot. Les Roombas contiennent une interface électronique et logicielle permettant la modification du firmware et ainsi, le contrôle, la modification du comportement et la lecture des données recueillies par les capteurs du robot. Cette fonction, appelée iRobot Roomba Open Interface par le constructeur, a été introduite afin d'encourager les programmeurs et ingénieurs en robotique à apporter leurs propres améliorations au Roomba.
Roomba

Objectif du projet

Le but du projet est la reconversion d’un vieux Roomba dont le bloc de rammasage est HS, en robot de surveillance domestique à l’aide d’un système embarqué dont les différentes fonctionnalités seront les suivantes :
=> Programmation de ronde
=> Détection des intrus (par le biais d’une caméra)
=> Pilotage à distance du robot (par le biais d’une interface web ou application android)
=> Envoi de notification en cas de détection d’une intrusion

Les avantages de la reconversion d'un roomba pour ce projet sont :
=> Réutilisation du dock de recharge
=> Utilisation des différents capteurs embarqués
=> Envoi des commandes par le port série (via la connectique MiniDIN)

Description du projet

Le projet consiste à greffer au Roomba un système embarqué qui dispose du Wifi et sera relié à une webcam. Le système devra permettre de piloter le roomba et de visualiser la vidéo de la webcam par le biais d'une page web.
Puis dans un second temps des nouvelles fonctionnalités orientées surveillance seront ajoutées. En effet, le robot sera capable, via la caméra, de suivre un itinéraire, détecter des mouvements ainsi que des visages afin d'informer l'utilisateur de ce qui se passe chez lui. Celui-ci recevra alors une notification par mail avec image de l'intrusion qui a été détectée.
Le schéma suivant illustre comment s’effectuent les échanges entre les différents périphériques :

Principe de fonctionnement


Choix techniques : matériel et logiciel

Dans le cadre du projet, les matériels et logiciels suivants vont être utilisés :


Étapes du projet

Afin de mener à bien le projet, différentes étapes ont étés posées.

=> Prise en main du roomba

L’objectif de cette partie est de créer un programme simple sur le PcDuino permettant de communiquer avec le Roomba. Principalement envoyer des ordres et récupérer les informations des capteurs.

=> Étude et réalisation de la partie alimentation du PcDuino

La batterie du Roomba délivre une tension qui varie en fonction de la charge de celle-ci (de 12V jusque 20V sur la base de recharge). Il est donc nécessaire de prévoir une régulation de cette tension afin d'obtenir l'alimentation nécessaire au bon fonctionnement du PcDuino.

=> Prise en main du kit webcam

Dans cette partie il est question de piloter les servomoteurs du kit et d'installer un logiciel permettant la récupération du flux vidéo de la webcam.

=> Réalisation de la prise en main à distance

Il s'agit ici de disposer pour fin octobre d'une première version du système permettant de prendre à distance le roomba via un site web. Il faudra être capable depuis le site de :

  • piloter le roomba
  • visualiser le flux vidéo de la webcam
  • visualiser les informations des capteurs

=> Détection d'intrus, alarme et notification

Une fois la première version du système finalisée, il faudra étudier et mettre en place un dispositif de détection d'intrusion. Avec la possibilité de déclencher une alarme sonore et d'envoyer une notification au propriétaire.

=> Programmation de rondes

Dans un dernier temps, si possible, réaliser un système de ronde permettant au Roomba d'inspecter une pièce tous les N temps.

Avancement du Projet

Semaine 1

Réalisation des tests de communication avec le roomba.

Connecteur Mini DIN



J'ai récupéré dans un premier temps la documentation du ROI (Roomba Open Interface). ROI permet de communiquer avec le roomba par le biais d'un port série dont le connecteur est un Mini DIN avec 8 pin. Il a donc fallu faire l'acquisition d'un câble de ce type afin de pouvoir relier le roomba au système embarqué.





Description des pins


Il a fallu ensuite déterminer le rôle de chacun des 8 petits fils de couleurs différentes se trouvant dans le cable Mini DIN. Afin de distinguer notamment les fils qui permettent la communication série par rapport aux fils qui permettent l'alimentation. Une breadboard a ensuite été utilisée afin de permettre de relier les fils permettant la communication série au PcDuino.







A l'issue de cette première semaine des commandes de mouvement ont été envoyées avec succès au Roomba, à l'aide d'un programme en C, même si la communication semble fastidieuse. En effet, la réussite d'une commande semble pour le moment aléatoire.

Semaine 2

L78S05

J'ai choisi de travailler sur plusieurs parties en parallèle afin de permettre une avancée globale du projet et d'éviter de me retrouver bloqué trop longtemps sur une même partie. Évolution des différentes parties :

  • Partie Webcam : Montage du kit Webcam. Test du logiciel mjpg-streamer afin de récupérer le flux vidéo de la webcam. Test concluant : récupération réussi du flux vidéo via une page web depuis un pc sur le même réseau wifi que le PcDuino.
  • Partie Communication série : création d'un programme en C++ permettant la réalisation des différentes commandes d'actions disponibles. La communication série semble toujours perturbé. Le roomba, par moment, ne veut pas répondre aux commandes. Premiers tests de récupération des informations des capteurs réalisés mais non concluant car aucune information n'a été reçue par le PCDuino.
  • Partie régulation : Test d'utilisation d'un régulateur de tension linéaire L78S05. Le résultat n'est pas concluant : non seulement le PcDuino n'arrive pas à se lancer mais en plus le régulateur chauffe énormément même avec un dissipateur.


Semaine 3

Régulateur à découpage LM2596
  • Partie régulation : Après étude, il semblerait qu'un régulateur à découpage est mieux adapté à la situation. En effet, en plus de proposer un meilleur rendement il chauffe beaucoup moins qu'un régulateur linéaire. Les régulateurs à découpage utilisent le rapport cyclique entre l'état passant et l'état bloqué du transistor de découpage pour réguler la tension et le courant de sortie.

Une commande d'un régulateur de tension basé sur un LM2596 a été réalisée dans le courant de la semaine dont les caractéristiques sont les suivantes.
      => Tension d'entrée du module prévue 4 à 40V (Tension d'entrée de 12 à 20V fournie par le roomba)
      => Tension de sortie 1.25V à 37V (5V sera suffisant dans notre cas)
      => Sortie en 2A normale et stable (demandé pour le PcDuino)
Le module a été reçu le weekend les premiers tests sont concluants. Le PcDuino démarre et il a fonctionné pendant plus d'une heure.

  • Partie Communication série : Les tests de récupération des informations des capteurs sont toujours problématiques seul le mode stream semble fonctionner. C'est à dire que c'est le roomba qui nous envoie périodiquement les données des capteurs. Cependant, une fois le mode activé, le roomba ne répond plus aux commandes. La connection série semble toujours instable, des problèmes de CEM sont envisagés à cause de la breadboard.


Semaine 4

T Board V2
  • Partie Communication série : Plusieurs actions ont été réalisées pour améliorer la communication série. La breadboard a été remplacée par un câblage en direct (sauf pour l'alimentation), les petits fils ont été soudés sur des fils de plus gros diamètre de type jumper mâle (permettant une liaison facile avec les Entrées/Sorties du PcDuino). Des gaines thermorétractables ont également été utilisées pour protéger les soudures. Un ralentissement de la communication a été réalisé en temporisant l'écriture sur le port série (150ms entre chaque écriture) car le roomba n'arrive pas à gérer la réception si l'intervalle entre deux paquets est trop court. Le baudrate a également été diminué : il est passé de 115200 bauds à 19200 bauds.

Les tests suite à ces changements se sont avérés concluants en effets le roomba répond correctement à toutes les commandes. De plus, les différents modes de récupération des données capteurs sont désormais opérationnels.

Une incompatibilité des entrés/sorties a été détectée entre les DIOs du PcDuino qui sont à 3,3V et ceux du roomba qui fonctionnent en 5V. Même si cela semble marcher, un shield de type TBoard V2 d'adaptation 3V vers 5V a été commandé afin d'éviter d'endommager le PcDuino.



Semaine 5

Kit Webcam
  • Partie webcam : Implémentation dans le PcDuino d'un programme qui permet le pilotage des servomoteurs du kit webcam. Le principe utilisé est connu sous le nom de Pulse Width Modulation (PWM) ou Modulation de Largeur d'Impulsions; il consiste à moyenner un signal logique (0 et 1) de fréquence fixe mais de rapport cyclique contrôlé. Dans le cas des servomoteurs utilisés, il faut envoyer une impulsion dans un cycle de 20ms. La durée de l'impulsion permet de faire varier l'angle de rotation du servomoteur.
  • Partie communication série : Ajout dans le programme principal d'une fonction permettant de réveiller le roomba si besoin. Car au bout d'un certain temps d'inactivité le roomba passe en mode sleep. Une fois dans ce mode, le roomba ne réagit plus aux commandes envoyées, il faut alors en général appuyer sur le bouton power afin de le réveiller. Ce comportement est problématique car dans le cas d'une prise de contôle à distance, l'utilisateur ne pourra pas être présent pour appuyer sur le bouton du Roomba. Le principe utilisé est d'envoyer sur le file BRC une impulsion afin de pouvoir changer le mode courant de sleep vers passif.






Semaine 6

Interface web
  • Partie web : Utilisation de la librairie Mongoose qui permet de disposer en un seul fichier d'un serveur web léger et embarqué dans une application C/C++. Implémentation de WebSocket pour pouvoir afficher les informations des capteurs du Roomba dans une page html tout en contrôlant celui-ci par le biais d'un joystick écrit en javascript.
  • Partie pilotage de la webcam : Le pilotage des servomoteurs de la webcam est également géré via le même joystick (pas très maniable pour le moment en attente de l'utilisation d'un slider qui sera plus adapté pour la webcam). Un bouton présent sur l'interface permet de passer d'un mode pilotage du robot à un mode pilotage de la webcam. Le servomoteur, permettant de pivoter la caméra de gauche à droite, a été déconnecté pour le moment car l'utilisation des deux servomoteurs entraîne une instabilité de l'alimentation du PcDuino (ce qui provoque un arrêt de celui-ci). De plus, ce servomoteur n'est pas indispensable car l'on peut pivoter la webcam de gauche à droite par le biais du Roomba.


Semaine 7

Open Source Computer Vision
  • Partie webcam : Installation de la librairie OpenCV et formation sur celle-ci. La réalisation de petits programmes en C++ ont été réalisés afin d'apprendre à récupérer des images d'une vidéo, faire de la détection de mouvements ainsi que de la reconnaissance de visages. Ces tests permettront l'élaboration d'un programme qui permettra au roomba de suivre un mouvement ou une personne afin de prendre les meilleurs clichés possibles.








Semaine 8

Exemple de détection
  • Partie webcam : Finalisation des tests permettant la reconnaissance de visages et de mouvements. Réalisation d'un algorithme pour l'ajustement automatique de la vitesse de détection du visage en fonction de la distance. Enfin, création d'un programme qui permet de passer d'un mode de détection à l'autre (mouvement -> visage et visage -> mouvement) ainsi que d'enregistrer les images suite à une détection.
  • Partie servomoteur : Réalisation du slider permettant le pilotage du servomoteur en fonction de l'angle sélectionné.








Semaine 9

POCO
  • Partie webcam : Implémentation de la communication entre le programme de détection de la webcam et le programme de contrôle du robot. Afin de pouvoir réutiliser la même interface de commande que celle de la partie web, la communication s'effectuera également par WebSocket. Utilisation de la librairie POCO qui permet de réaliser un client WebSocket en C++.
  • Partie contrôle du Roomba : Création de nouvelles commandes permettant de piloter le roomba en mode automatique.
  • Partie serveur web : mise à disposition des nouvelles commandes par l'interface de contrôle WebSocket.










Semaine 10

Roomspy
  • Partie détection : Travail d'optimisation sur les temps de réaction. En effet, le robot arrive à suivre une personne qui se déplace grâce à la détection de visage de la caméra, mais en général il y a un décalage de 4 secondes. Plusieurs pistes ont été exploitées afin d'améliorer la vitesse de réaction. Finalement la détection de visage a été abandonnée au profit d'une détection de buste. Celle-ci à l'avantage d'être plus rapide pour un résultat similaire.
  • Partie alarme et notification : Déclenchement d'une alarme sonore et envoi d'un mail en cas de détection (utilisation de la librairie ssmtp).








Semaine 11

  • Partie mail : Utilisation de mutt conjointement à ssmtp afin de pouvoir envoyer les photos d'intrusion en même temps que le mail de notification.
  • Partie rapport : Rédaction en cours.
  • Partie vidéo : Rédaction script et préparation démo.