IMA4 2018/2019 P40 : Différence entre versions
(→Semaine 7) |
(→Semaine 8) |
||
Ligne 454 : | Ligne 454 : | ||
==Semaine 8== | ==Semaine 8== | ||
+ | //TODO Ajout travail Robotino | ||
Nous avons réalisé la première partie avec le script shell. Après avoir exécuté le fichier script shell, il exécutera la commande mifare-classic-read-ndef pour lire le contenu de tag nfc et le sauvgardera dans readdata.txt. Puis le programme cpp ouvrira ce fichier, obtiendra les données et modifiera le fichier yaml. Mais cette méthode n’est pas bonne, nous allons continuer à améliorer la programme de lecture. | Nous avons réalisé la première partie avec le script shell. Après avoir exécuté le fichier script shell, il exécutera la commande mifare-classic-read-ndef pour lire le contenu de tag nfc et le sauvgardera dans readdata.txt. Puis le programme cpp ouvrira ce fichier, obtiendra les données et modifiera le fichier yaml. Mais cette méthode n’est pas bonne, nous allons continuer à améliorer la programme de lecture. | ||
Version du 4 avril 2019 à 00:33
Sommaire
Présentation générale : RFID/NFC
Étudiants : Xinwei Hu et Jean de Dieu NDUWAMUNGU
Encadrants : Thomas DANEL et Vincent COELEN
Description
Le Robotino est un système robotique opérationnel de grande qualité à entraînement omnidirectionnel. Il peut se déplacer dans plusieurs directions. Il est muni d’une webcam et de plusieurs capteurs afin d’assurer son déplacement et différentes opérations qu’on adviendrait à effectuer. Il peut être utilisé directement sans PC.
Pour effectuer sa commande le Robotino dispose d’un ordinateur de bord sur lequel se trouve une carte Compact Flash qui contient plusieurs applications de démonstration ainsi qu’un système d’exploitation. Les démonstrations peuvent être directement lancées à l’aide du clavier de commande du Robotino.
Traditionnellement sa programmation est faite soit depuis un PC à l’aide du logiciel Robotino View via un réseau local sans fil ou en le branchant directement par une connexion filaire.
Dans ce projet nous allons développer une méthode nous permettant de le configurer automatiquement sans devoir passer par un réseau quelconque à l’aide de puces RFID/NFC et aussi en exploitant la technologie NFC disponible sur nos téléphones Android.
Objectifs
- Aspect RoboCup
Le but de ce projet est d'avoir des puces RFID/NFC intégrés au niveau des têtes des Robotino ou sur la coque et de pouvoir avoir plusieurs applications possibles. Une des application possibles serait d’avoir des cartes qu’on pourrait aimanter afin de choisir la configuration du robot pour différents aspects. Dans la coupe de robotique, RoboCup, les robots sont de deux couleurs différentes : cyan ou magenta. Au début de la compétition cette configuration est faite manuellement. Le travail que nous allons faire sera de le réaliser automatiquement cette tâche à l’aide de puces RFID/ NFC en leurs affectant un numéro, une couleur. Automatiser la tâche nous permettra de gagner donc du temps et d’éviter les erreurs liées à la configuration des Robotino surtout quand on dispose plusieurs de ces derniers.
- Aspect AIP
L'école Polytech Lille reçoit le long de l'année des visites sur le campus lors des journées portes ouvertes ou des événements comme la CREP. Sur les différents robots se trouvent des vidéos de démonstration. L'objectif côté AIP sera de développer une technique permettant de lancer automatiquement une démonstration à l'aide d'un tag préprogrammé qu'on viendrai déposer sur le robot.
- Application Smartphone
La technologie NFC s'est étendue sur plusieurs modèles de smartphone. Un autre objectif de ce projet sera d'exploiter cette possibilité en effectuant une configuration automatique des Robotino lorsqu'on approche un smartphone sur ces derniers. Dans notre cas il s'agira dans un premier temps de connecter automatiquement le robot sur le même réseau wifi que le smartphone que l'on approche du Robotino et dans un second temps de piloter le robot ou de visualiser les images vidéos à l'aide du joystick virtuel sur une application Android que nous allons développer.
Analyse du projet
Positionnement par rapport à l'existant
Dans ce projet nous allons travailler sur des Robotino qu'on retrouve à Polytech. Notre solution sera nouvelle dans la mesure où elle va permettre un gain considérable en temps et en nombre de tâches à effectuer lors de la configuration des robots, en automatisant les tâches. Les Robotino disposent des supports NFC le but est d'exploiter cette possibilité en apportant une solution nouvelle.
Analyse du premier concurrent
Wakdev est une société de développement informatique spécialisée dans la conception et la réalisation de solutions Web & Mobile. Il a développé l'application qui s'appelle NFC Tools pour configurer des tags NFC sur la plateforme Android, IOS, PC/MAC. NFC Tools est une application qui permet de lire, écrire ou programmer des tâches sur les tags NFC et autres puces RFID compatibles. NFC Tools peut enregistrer sur les tags NFC des informations standard qui seront compatibles avec l'ensemble des appareils NFC. Il propose aussi de programmer des tâches sur les tags NFC afin d'automatiser des actions qui étaient autrefois répétitives.
Website de cette société : [1]
Analyse du second concurrent
Robotino View est le logiciel d'édition officiel de Robotino avec des fonctionnalités extrêmement puissantes. Il peut réaliser la programmation et la simulation de Robotino.
Scénario d'usage du produit ou du concept envisagé
4 Juillet 2019, RoboCup 2019
L'équipe de recherche de Polytech'Lille participe à la RoboCup 2019. Elle veut améliorer ses performances en instaurant une technique de configuration automatique des Robotino sans avoir à le faire manuellement pour chaque robot en lui assignant à l'aide d'un tag NFC un numéro ainsi qu'une configuration adéquate. Des Tags Cyan et Magenta pour chaque ont été fabriqués. On a juste à coller le tag sur la tête du Robotino pour le configurer en Cyan ou Magenta.
2 Mai 2019, Journée CREP Polytech Lille
Jean et Xinwei, étudiant en IMA4 et passionné par la robotique, sont chargés de la présentation des Robotino aux élèves venus découvrir ce qui peut être leurs domaines d'études dans quelques années. Afin de rendre interactif la présentation des Robotino Jean et Xinwei ont décidé de développer une application sur leurs téléphones Android qui agit en tant que joystick permettant ainsi une commande à distance du Robotino, ou une vue de ce que la caméra sur le robot filme. Ils pourront saisir une photo qu'ils vont partager avec les élèves visiteurs.
Réponse à la question difficile
- Existe-t-il un lecteur intégré NFC au robotino ? Si oui quelle est la difficulté du projet ? Si non, quel lecteur prendre (quelle norme) et comment s'intégre-t-il dans la chaîne de développement ?
Les robotinos ne disposent pas de lecteur intégré NFC. Dans le cadre du projet commun à la coupe Robocup nos encadrants ont effectué une commande de lecteur NFC. Une fois arrivés nôtre tâche sera de les connecter au Robotino et de nous assurer du bon fonctionnement des lecteurs. Dans le Robotino il existe une interface RE232 et celui de LAN sans fil. Nous pouvons utiliser l'une des interfaces pour communiquer.La difficulté du projet réside dans le fait que l'on va devoir apprendre à développer sur un Robotino en utilisant ROS qui est un serveur de paramètre. Nous avons la possibilité de le faire en C++ et en Python. Le robotino dispose en effet d'un fichier de configuration dans lequel se trouve sa configuration complète : nom du robot, couleur, réglages des moteurs, etc. Nous allons donc devoir lire ce fichier et trouver par nous mêmes comment envoyer l'information nécessaire à l'antenne qui sera connecté sur le Robotino. Cette antenne est notre lecteur RFID et sera connecté en série avec le Robotino. De plus une application Android devra être développée dans le langage Java. Nous allons donc apprendre également comment concevoir des applications Android et comment faire marcher la communication téléphone<->Robotino.
- Comment réaliser la configuration du smartphone pour la prise de contrôle du Robotino ?
Le téléphone Android ouvre la connexion de données 3G/4G et accède à internet, il communique ensuite avec le robot par l'adresse IP en utilisant une structure client/serveur. Le serveur est toujours en cours d'exécution et attend un accès client. Une fois le programme client ouvert, on saisis ladresse IP du serveur et on se connecte sur ce dernier. On peut par conséquent obtenir la vidéo en temps réel et l'afficher sur l'écran du smartphone ou envoyer les commandes/données pour contrôler les mouvements du robots à l'aide des boutons virtuels.
Préparation du projet
Cahier des charges
- S'assurer du bon fonctionnement du kit RFID sur le Robotino. Programmer ce dernier afin qu'il puisse prendre en compte les différents applications dont nous pourrons avoir besoin
- Coller des tags RFID/NFC extérieurs pour mettre le robot dans une configuration souhaitée
- Côté téléphone : Réaliser la prise de contrôle du Robotino avec le téléphone à l'aide d'une application Android
- Reconfigurer le robot avec le téléphone
Choix techniques : matériel et logiciel
- Robotino 3
- Transpondeur RFID/NFC Grove, référence mouser : 713-113020006
- Assortiment de tag RFID/NFC, référence mouser : 485-365
- Tag RFID/NFC Sticker, référence mouser : 485-362
- Un téléphone/tablette sous Android 0S
Liste des tâches à effectuer
Calendrier prévisionnel
Avant le 13/02/19 - Premier Test d'un programme linux prenant en charge la présence d'un Tag
Avant le 20/02/19 - Finalisation de l'Interface logicielle et intégration des test RFID/NFC. Début du travail sur le Robotino
Répartition du volume de travail (***h):
- Recherche sur les technologies à utiliser
- Formation Java, Android Studio et langage Go
- Réalisation de l'interface logicielle (Application)
- Intégration des différentes parties
- Test et débuggage
- Test du projet lors de la Robocup
Réalisation du Projet
Feuille d'heures
Tâche | Prélude | Heures S1 | Heures S2 | Heures S3 | Heures S4 | Heures S5 | Heures S6 | Heures S7 | Heures S8 | Heures S9 | Heures S10 | Heures S11 | Heures S12 | Total | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Rédaction du cahier de charge | 4 | ||||||||||||||
Prise en main d'Android Studio | 2 | ||||||||||||||
Lecture et ecriture des tags sur un téléphone Android | |||||||||||||||
Lecture des tags sur un ordinateur Linux | |||||||||||||||
Automatisation du programme | |||||||||||||||
Travail sur l'interface pour le rendu | |||||||||||||||
Redaction du rapport | |||||||||||||||
Redaction du rapport | |||||||||||||||
Intégration de la synchronisation Wifi Téléphone/Ordinateur par NFC | |||||||||||||||
Wiki |
Prologue
Nous avons effectué une première rencontre avec nos encadrants qui nous a permis d'en savoir plus sur notre sujet :
Nous allons réaliser une application qui aura plusieurs fonctions. L'application devra nous permettre de pouvoir lire le contenu d'une carte RFID sur laquelle on aura préalablement écrit certaines commandes. Ainsi elle pourrait lancer une fonction souhaitée dès la détection d'une puce NFC/RFID en lançant une commande qui déclencherait notre application ou demanderait à l'utilisateur d'installer l'application. Elle devra également nous permettre de contrôler un Robotino grâce à un joystick sur l'application, le téléphone étant en communication par wifi.
Voici ci-dessous le logo de notre application
Les cartes NFC que nous utilisons sont des cartes Mifare Classic 1K. Ils disposent d'une capacité de 1024 bytes.( Notes ajouter la photo de leurs memory card)
Les 1024 bytes sont organisés en blocs et en secteurs. Au total 16 secteurs et chacun formé de 4 blocs. Chaque bloc a 16 bytes.
Sur les 4 blocs on ne peut stocker les données que sur 3. Le dernier correspond au sector trailer où figurent les droits d'accès des données ainsi que la manière dont les données sont lues.
Semaine 1
Un compte Git a été créé afin de pouvoir gérer nos codes sources en suivant leurs évolutions et en travaillant séparément nous partageant ainsi les tâches. Dépôt Git nfcrobotino. Deux branches ont été créées une où l'on va ajouter les programmes de notre application et une autre les codes que l'ont va installer sur le Robotino.
Nous avons ensuite effectué une recherche sur la manière la plus efficace de réaliser notre application Android. Le logiciel avec lequel nous allons travailler est Android Studio. Il s'agit de l'environnement de développement officiel de Google. Nous l'avons choisi pour sa simplicité et son efficacité et la possibilité de relier directement nos comptes Git au logiciel. Nous avons la possibilité d'écrire notre programme en Kotlin ou en Java mais notre choix s'est tourné vers ce dernier.
Nous avons mis en place les différents stratégies afin de réaliser ce projet et avons décidé de travailler dans un premier sur la réalisation de la configuration automatique du Robotino par les tags NFC.
Semaine 2
Travail sur la structure de l'application que l'on prévoit de coder.
Notre application aura un menu d'accueil qui nous permettra d'accéder à différentes fonctionnalités.
Nous avons également effectué une recherche bibliographique sur le NFC des téléphones mobiles en particulier les téléphones Android afin de comprendre le protocole utilisé : les messages échangés seront sous format NDEF : NFC Data Exchange Format. Il s'agit d'un format standard d'échange de données entre deux périphériques NFC ou un périphérique NFC et un tag. Les données enregistrées sont sous forme NDEF Messages ou sous formes de NDEF Records. Il est utilisé pour effectuer l'échange d'URL, de texte ainsi que plusieurs autres possibilité.
Nous nous sommes renseigné sur la manière dont un Tag peut déclencher l'ouverture d'une application ou d'un site web automatiquement dès qu'elle est détectée par un téléphone et comment écrire sur une carte RFID/NFC et la configurer.
Les téléphones Android ont simultanément trois modes de fonctionnement concernant la technologie NFC :
- Le mode d'écriture/lecture qui permet d'écrire ainsi que de lire les Tags qui sont approchés au téléphone
- Le mode P2P(Peer to Peer) permettant d'échanger avec les autres périphériques NFC (par exemple un autre téléphone)
- Le mode d'émulation qui donne la possibilité au téléphone de se comporter lui-même comme un Tag
Afin de réaliser la communication Robotino<->Téléphone nous aurons besoin de :
- Installer la librairie libnfc sur le Robotino
- se rendre dans le fichier de configuration de la librairie et l'adapter suivant le port où notre antenne RFID est reliée
- installer la librairie libfreefare qui va nous permettre de lire et écrire les différents Tags
Semaine 3
Prise en main du Robotino.
Le Robotino dispose d'un fichier de configuration robotConfig.yaml dans le quel se trouvent les informations suivantes :
teamName: PYRO teamColor: magenta robotNumber: 1 robotName: R1
cryptoKey: randomkey
Ces attributs correspondent respectivement aux nom de l'équipe, la couleur du Robot, le numéro , le nom ainsi que la clé de sécurité. Ce qui nous intéresse ici c'est de pouvoir écrire sur un Tag l'information de configuration du robot et venir connecter le tag sur le robot afin de modifier automatiquement ces différents champs. Le Robotino 3 sur lequel nous travaillons dispose d'un système d'exploitation Ubuntu. Nous pouvons donc commencer à effectuer des test avec un programme Linux qui pourra modifier un fichier une fois que l'antenne connectée préalablement en usb sur un ordinateur détectera un tag.
La librairie libfreefare dispose d'un programme nous permettant de lire et écrire un Tag. Il s'agit des fonctions :
mifare-classic-read-ndef -y -o nomFichier.txt mifare-classic-write-ndef -y -i nomFichier.txt
La première nous permet de lire ce qui se trouve sur un Tag et recopie les données lues dans un fichier txt. La seconde nous permet d'écrire les données provenant d'un fichier txt. Cependant par rapport à notre application il ne serait pas intéressant d'utiliser un programme qui crée un autre fichier. Pour cela il nous faudrait avoir accès à un écran et lancer le programme de lecture ou d'écriture. Nous avons donc décidé de transformer et d'optimiser le programme de lecture et d'écriture et les incorporer dans une seule fonction en langage C++ de manière à pouvoir les lancer une fois pour toute.
Nous avons effectué un premier programme.c de lecture des tags. Nous avons remarqué que les données écrites sur les tags disposent d'un entête de fichier binaire suivi de la langue dans laquelle le contenu se trouve. Nous avons décidé d'ignorer cet entête par la fonction suivante :
char data[5][30]; int i=0,j=0,k=0; k=7; // Pour éliminer le contenu inutile au début while(k<tlv_data_len){ if(tlv_data[k]=='\n') { i++; j=0; k++;} else { data[i][j]=tlv_data[k]; j++; k++; }
tlv_data correspond aux données lues (voir code complet dans les documents annexes).
De la même manière nous avons écris un code nous permettant d'écrire sur les Tags.
Semaine 4
Dans notre application Android nous souhaitons développer les fonctionnalités suivantes :
- Pouvoir lire et écrire les Tags NFC.
- Pouvoir commander le robotino
- Pouvoir acquérir un flux vidéo provenant du robotino
Nous voulons faciliter au maximum l'expérience utilisateur de celui qui utilise notre application. Nous avons pensé à intégrer une possibilité de lancer l'application dès qu'un Tag sera approché du téléphone. Afin de réaliser cela nous sommes parti de ce schéma de principe :
Lorsque un Tag NFC est approché du téléphone, le téléphone donne priorité à la recherche d'une application prête à prendre son contrôle et la lance si les données sont au bon format c'est à dire les données NDEF. Pour cela nous avons besoin de le déclarer dans notre application. Si les données ne sont pas sous format standard NDEF c'est à nous de programmer un protocole nous permettant de lire ces données. Cependant dans notre projet nous utiliserons que les données NDEF. C'est grâce à ce mécanisme que nous pourrons donner la priorité à notre application afin qu'elle s'ouvre dès qu'un Tag sera approché.
Dans le fichier AndroidManifest.xml nous avons ajouté les lignes suivantes afin de réaliser ce qui est décrit ci-dessus :
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />
<intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/tech_filter" />
<tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.MifareClassic</tech>
Un message qui nous prévient que le téléphone utilisé dispose de la NFC activiée ou pas a été ajouté :
if(nfcAdapter!=null && nfcAdapter.isEnabled()){ Toast.makeText(this, "Votre appareil dispose de la tech NFC !", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this, "NFC pas disponible :( ", Toast.LENGTH_LONG).show(); }
Nous avons travaillé sur notre interface d'accueil comme le montre la figure ci-après
//TODO
Nous avons trois différentes activités que nous voulons programmer : une activité pour lire et écrire des tags, une autre pour prendre le contrôle du robot et une autre pour avoir le flux vidéo du robot.
Cette semaine nous nous sommes concentré sur la première activité celle de pouvoir lire et écrire des tags sur notre téléphone.
Semaine 5
Cette semaine nous nous intéressons à la deuxième activité qui nous permet de prendre en contrôle le Robotino.
L'intérêt du RFID/NFC est non seulement de pouvoir configurer le Robotino en plaçant un Tag sur l'antenne relié au robot mais aussi de pouvoir prendre le contrôle du robot. Une Web Interface est déjà disponible sur le Robotino nous permettant de le contrôler via un smartphone à travers un navigateur. Utilisant une application que nous développons nous-même nous ne pouvons pas utiliser un navigateur. Nous allons donc établir la connexion Smartphone <=> Robotino en utilisant le protocole les sockets. Nous allons introduire un client et un serveur. Le client va correspondre au Smartphone et le serveur le Robotino. Les deux seront lié sur le même port que nous allons choisir.
L'utilité de la NFC sera de pouvoir transférer l'adresse IP du Robotino ainsi que le port d'écoute se trouvant dans le logiciel où le serveur sera exécuté.
Voici le principe de fonctionnement : Un utilisateur approche son téléphone de l'antenne RFID/NFC branché sur le robot; celui-ci transfert l'adresse IP et le port du robot.
Nous avons testé dans un premier temps le client sur le téléphone.
Les 4 boutons vont envoyer des paquets TCP formant les chaînes de caractères Avancer, Reculer, Droite ou Gauche. Afin d'obtenir un client TCP qui marche nous avons importé la classe ServerSocket nous permettant d'écouter et d'accepter les différents connexions de clients. Ces données seront reçues par le serveur qui va les utiliser. Pour qu'elle l'échange des données ait lieu plusieurs étapes sont à franchir :
//Ajouter description des TCP/IP... TODO
Semaine 6
//TODO ajouter travail sur le serveur
L'application que nous développons est capable d'écrire et lire les différents tags. Nous sommes également capable d'identifier sur un ordinateur Linux le type de tag RFID qui lui est relié.
Semaine 7
//Ajout travail sur le Robotino
Nous pouvons lire et écrire sur les différents tags côté ordinateur grâce aux fonctions suivantes :
- mifare-classic-read-ndef -y -o fichier.txt
- mifare-classic-write-ndef -y -i fichier.txt
Semaine 8
//TODO Ajout travail Robotino
Nous avons réalisé la première partie avec le script shell. Après avoir exécuté le fichier script shell, il exécutera la commande mifare-classic-read-ndef pour lire le contenu de tag nfc et le sauvgardera dans readdata.txt. Puis le programme cpp ouvrira ce fichier, obtiendra les données et modifiera le fichier yaml. Mais cette méthode n’est pas bonne, nous allons continuer à améliorer la programme de lecture.
#! /bin/sh mifare-classic-read-ndef -y -o readdata.txt g++ -o test config_robot.cpp -lyaml-cpp ./test
Semaine 9
Nous analysons le programme original de la commande:mifare-classic-read-ndef -y -o fichier.txt. Nous comprenons toutes les fonctions appelées et essayons de les appliquer à nos propres programmes.
Afin de lire le contenu de tag nfc, nous recherchons d’abord l’interface USB correspondante et le tag, puis on dois obtenir le MAD(Accès au secteur) et le TLV bloc qui contient les informations. Après avoir obtenu la longueur d'un bloc, nous analysons tous les blocs un par un jusqu'à avoir les données. Nous plaçons un pointeur avant ces informations et les écrivons dans le fichier .txt.
nfc_device *device = NULL; MifareTag *tags = NULL; Mad mad; nfc_context *context;
nfc_init(&context); device = nfc_open(context, devices); tags = freefare_get_tags(device); char *tag_uid = freefare_get_tag_uid(tags[i]); mifare_classic_connect(tags[i]) // avoir le MAD if ((mad = mad_read(tags[i]))) { uint8_t tlv_type; // NULL ou avoir des informations uint16_t tlv_data_len; // la longueur d'un TLV bloc uint8_t *tlv_data; // Pointez sur les données uint8_t *pbuffer = buffer; tlv_data = tlv_decode(pbuffer, &tlv_type, &tlv_data_len); // mettre un pointeur switch (tlv_type) { // chercher les messages dans tlv bloc ... } fwrite(tlv_data, 1, tlv_data_len, ndef_stream) }
Semaine 10
Nous avons optimisé la manière d'obtenir les données. Nous avons plutôt assigné les données obtenues du pointeur à la chaîne et écrit directement dans le fichier yaml.
char data[5][30]; int i=0,j=0,k=0; k=7; // Pour éliminer le contenu inutile au début while(k<tlv_data_len){ if(tlv_data[k]=='\n') { i++; j=0; k++;} else { data[i][j]=tlv_data[k]; j++; k++; }