Raspberry Pi Simulink Coder target (RPIt)

Aller à : navigation, rechercher

Actualités

  • 1er septembre 2016 : RPIt est désormais sur GitHub. Consulter les dernières actualités ici.
  • 29 juin 2016 : correction d'un problème de condition initiale du bloc socket.
  • 23 juin 2016 : rajout d'un bloc socket.
  • 22 avril 2016 : compatibilité avec Matlab R2015a et R2015b.
  • 29 avril 2015: rajout d'un bloc pour le système de localisation Polaris de NDI. Compatibilité avec le RPI2.
  • 9 juillet 2014: rajout d'un bloc de mesure de taux d'occupation du CPU.
  • 27 juin 2014: correction de bugs.
    • Ajout de "setup_NXT.m", un script permettant d'automatiser le flashage du firmware du NXT et l'installation du driver RPIt.
    • Ajout d'un correctif pour le bug char16_t de la version 2012a.
    • Ajout dans "setup.m" de la configuration de l'accès USB au NXT pour les utilisateurs.
    • Réécriture majeure de "setup.m" pour plus de simplicité.
    • Quelques corrections de bugs mineurs.
  • 18 juin 2014: mise à jour majeure.
    • Compatibilité avec la version Mac OSX de Matlab/Simulink.
    • Compatibilité avec la version Linux de Matlab/Simulink.
    • Compatibilité avec des cibles différentes d'un Raspberry Pi (PC quelconque avec une distribution basée Debian, avec processeur ARM ou x86).
    • Nouveau bloc Simulink "Lego NXT". Plusieurs NXTs peuvent être contrôlés simultanément via USB.
  • 6 juin 2014: mise à jour mineure.
    • Compatibilité avec la version 2014a de Matlab/Simulink.

Présentation rapide

Principe général


RPIt est un acronyme qui signifie "Raspberry PI Simulink Coder target". C'est un projet libre qui offre la possibilité d'utiliser un système Linux basé Debian comme cible pour le mode externe de Simulink. La cible principale de ce projet est le système embarqué Raspberry Pi. Mais depuis la version 3.14, il est possible d'utiliser comme cible, n'importe quelle machine Linux tournant sur une distribution basée sur Debian (Debian, Ubuntu, Mint, …).

Le principe de base du mode externe est de convertir automatiquement un schéma-bloc en code C destiné à être exécuté en temps-réel sur un système embarqué. Une communication TCPIP entre l'interface de Simulink et le programme distant tournant sur le système embarqué est initiée à la fin du processus de compilation. Cette communication permet de changer les paramètres des blocs à la volée et d'afficher sur des oscilloscopes Simulink les données acquises en temps réel. RPIt utilise un mécanisme classique de UNIX pour la création de routines périodiques. On est donc dans un contexte de temps-réel mou. Malgré cela, sur un Raspberry Pi, nous avons mesuré des jitters de 200 microsecondes dans le pire cas, ce qui est très faible. Sur un PC basé x86, ce jitter est encore plus faible.

Ce projet est entièrement indépendant de la solution logicielle gratuite offerte par Mathworks pour piloter le Raspberry Pi. Elle n'interfère en rien avec celle-ci. Contrairement à cette dernière, tout le code de RPIt est libre et ouvert (pas de fichiers cryptés). Par contre, il est nécessaire de détenir au moins les toolboxes Simulink coder et Embedded coder.

Caractéristiques

  • La cible est configurée de manière totalement automatique en exécutant le script "setup.m". Ce script peut être lancé autant de fois qu'on le veut et impérativement à chaque changement de version de RPIt ou changement de cible.
  • Le code généré est optimisé pour une plateforme ARM. Néanmoins, il tourne aussi très bien sur une plateforme x86 ou x86_64. Les paramètres d'optimisation du compilateur sont réglés automatiquement en fonction du type de plateforme et ils maximisent la performance.
  • Comme la compilation se fait sur la cible (un Raspberry Pi modèle B est assez puissant pour supporter cette tâche), il n'est pas nécessaire d'installer une volumineuse toolchain. De plus, de cette manière on a la garantie que les bibliothèques de logiciels sont toujours à jour.
  • La communication TCPIP entre Simulink et la cible peut être sans fil (WiFi). Une solution très pratique consiste à configurer la cible comme un point d'accès WiFi.
  • Lorsque la cible est un Raspberry Pi, et qu'il est utilisé avec un Lego EV3, le port USB de celui-ci peut servir à alimenter le Raspberry. En effet, il délivre un courant suffisant pour faire tourner le processeur à 100%, alimenter un dongle WiFi et même faire de l'acquisition d'image full HD avec la caméra. Cette solution est donc complètement autonome et sans fil. Elle peut donc servir à des applications de robotique mobile.

Prérequis

  • Systèmes d'exploitation supportés
    • Windows XP, 7, 8, 10, 32 ou 64 bits
    • Mac OSX (testé sous Lion avec Matlab 2014a et sous El Capitan avec Matlab 2016b)
    • Linux (testé avec Ubuntu 12.04 LTS 64 bits, Kubuntu 14.04 LTS 64 bits et Debian Jessie 64 bits)
  • Versions de Matlab supportées
    • 2010b, 2010b SP1, 2010b SP2
    • 2011a
    • 2012a (la dernière version avec l'ancienne interface utilisateur)
    • 2014a
    • 2015a, 2015b
    • 2016a, 2016b
  • Toolboxes nécessaires
  • Cibles supportées
    • Raspberry Pi tournant sous Raspbian, distribution Raspbian
    • N'importe quelle machine basée sur Debian (Debian, Ubuntu, Mint, …) 32 ou 64 bits, ARM ou x86

Périphériques supportés

Le jeu de blocs RPIt

Ces périphériques sont connectés à la cible par USB ou bus i2c. A chacun d'eux correspond un bloc Simulink qui vient se rajouter dans la liste des blocs disponibles lorsqu'on lance "setup.m". Tous ces blocs fonctionnent en temps discret. La fréquence maximale à laquelle ils peuvent fonctionner dépend du bloc. Elle est spécifiée dans l'aide du bloc (en cliquant sur le bouton "Help").

NB: en utilisant le firmware Lego, une seule brique EV3 peut être pilotée à la fois (la première qui apparait dans l'énumération USB) tandis que jusqu'à 4 briques NXT peuvent être pilotées simultanément. En utilisant le firmware EV3.14, plusieurs briques EV3 peuvent être pilotées simultanément. De plus, la réactivité du bloc est meilleure (1ms vs 5ms) et la précision de comptage est accrue (720 incréments par tour au lieu de 360).

Ci-dessous, un exemple de câblage du bus i2c du MinIMU-9 v2 (merci à Mark's space dot com blog qui fut aussi une très importante source d'inspiration pour la programmation du driver du MinIMU-9 v2).

Wiring of the MinIMU-9 v2 (click to expand)

Les sources C des programmes de test pour des gestionnaires de périphériques peuvent être téléchargées ici.


Examples de configurations typiques

EV3 connecté à un PC Ubuntu faisant tourner Matlab 2014a. Dans cette configuration l'hôte et la cible sont les mêmes machines.L'adresse IP de la cible est donc 127.0.0.1. (cliquer pour agrandir)
NXT connecté à un PC Ubuntu faisant tourner Matlab 2014a. Dans cette configuration l'hôte et la cible sont les mêmes machines.L'adresse IP de la cible est donc 127.0.0.1. (cliquer pour agrandir)
EV3 connecté à un Raspberry Pi. Le RPI est alimenté via le port USB de l'EV3. L'hôte est un PC sous Windows 7 faisant tourner Matlab 2012a. Le PC (l'hôte) communique avec la cible (le RPI) par WiFi. Cette configuration est entièrement sans fil. (cliquer pour agrandir)


Performances

  • La communication i2c est cadencée avec une fréquence d'horloge de 400kHz. Pour une IMU 9 axes, il faut environ 1ms pour transmettre toutes les mesures. La fréquence interne de rafraichissement des mesures dans l'IMU est programmée entre 400Hz et 800Hz selon les composants et les types de mesures.
  • La communication USB avec l'EV3 fonctionnant avec le firmware standard utilise les bytecodes de la machine virtuelle de Lego. Un aller-retour prend 5ms. Il consiste à envoyer les consignes de tension des moteurs dans un sens et à récupérer les mesures des codeurs incrémentaux et des capteurs connectés à la brique dans l’autre sens. La communication USB avec un EV3 embarquant un firmware EV3.14 utilise un protocole dédié. Le temps d'aller-retour de l'information est réduit à 1ms.
  • La communication USB avec le NXT utilise côté NXT un driver spécialement développé pour RPIt. Ce driver tourne sous le système temps-réel NXTOSEK. Le temps de communication aller-retour est inférieur à 2ms.
  • Etant donné le jitter maximum mesuré sur les différentes cibles, on peut considérer que la fréquence maximale de fonctionnement de RPIt est 1kHz.
  • 5 actionneurs Dynamixel sur un même bus RS485 à 3Mbps peuvent être gérés à une fréquence pouvant atteindre 200Hz.

Démarrage rapide

Ce guide est focalisé sur une cible de type Raspberry Pi. Mais notez bien que n'importe quelle cible de type Debian peut être utilisée pour les périphériques USB. Vous pouvez même utiliser comme cible la machine qui fait tourner Matlab. Dans ce cas, il suffit d'indiquer l'adresse localhost comme adresse IP de la cible. Les périphériques i2c ne sont accessibles que depuis un Raspberry Pi.

Prérequis

La cible doit être configurée avec une version récente de Raspbian. En règle générale, sur un Raspberry Pi, tous les packages nécessaires à RPIt sont installés dans la configuration de base. Néanmoins, sur une autre cible, il faut veiller à ce que l'environnement de développement élémentaire soit installé. Pour cela, il suffit de saisir la commande:

sudo apt-get install build-essential

Screencast

Le moyen le plus rapide de démarrer avec RPIt est surement de visionner ce screencast. Des instructions plus détaillées sont données dans la section suivante.

Lien direct: [1]

Installation

  1. Télécharger la dernière version de RPIt.
  2. Copier l'archive quelque part dans votre arborescence d'utilisateur.
  3. Lancer Matlab.
  4. Sous Matlab, changer le répertoire courant pour la racine "rpit" de l'arborescence décompressée.
  5. Sous Matlab, configurer le compilateur en lançant la commande "mex -setup". Si aucun compilateur n'est disponible (vrai sous Windows 64 bits), vous pouvez télécharger des solutions gratuites sur le site de Microsoft.
  6. Vérifier que la cible est connectée au réseau et noter son adresse IP (le processus de configuration va installer sur la cible certains packages additionnels, pour cela, une connectivité internet est nécessaire).
  7. Sous Matlab, saisir la commande "setup".
  8. La cible va être pilotée à distance par une connexion ssh sans mot de passe. Pour créer une telle connexion, il faut générer une clé privée et une clé publique associée qui va être installée sur la cible. La génération de ces clés fait appel à un logiciel graphique sous Windows (pas sous Unix). Lors de la sauvegarde des clés, veiller à ce qu'elles soient stockées dans le répertoire "rpit/tools" de l'arborescence de RPIt.
  9. Lorsque le script est terminé, toutes les transactions ultérieures avec la cible se feront sans interaction avec l'utilisateur.

Le script "setup" peut être exécuté autant de fois que nécessaire sans effet néfaste. Il faut notamment le relancer en cas de changement de cible ou de changement de version de RPIt.

Test

  1. Aller dans le répertoire "demo".
  2. Aller dans le répertoire "jitter".
  3. Sélectionner "Configuration parameters…" dans le menu "Simulation".
  4. Sélectionner l'onglet "Real-Time Workshop" (2010b) ou "Code Generation" (à partir de 2012a).
  5. Verifier que le fichier de définition de la cible est "ert_rpi.tlc" dans la liste des cibles. Si ce n'est pas le cas, sélectionner "ert_rpi.tlc". Cette sélection auto-configure tous les paramètres de Simulink pour RPIt excepté l'adresse IP de la cible.
  6. Sélectionner l'onglet "Interface".
  7. Dans "MEX-file arguments:", saisir l'adresse IP de la cible avec des quotes autour comme dans '192.168.2.1'.
  8. Cliquer sur le bouton "Apply".
  9. Vérifier que la cible peut être jointe par TCPIP depuis la machine Matlab.
  10. Sélectionner la fenêtre Simulink correspondant au système "jitter".
  11. Appuyer sur [CTRL-B].
  12. Attendre la fin de la procédure de conversion, transfert, compilation et démarrage du mode externe.
  13. A la fin de la procédure, le mode externe devrait être actif. Double-cliquer sur l'oscilloscope. Appuyer sur l'icône en forme de jumelles. Vous devriez voir apparaitre un enregistrement en temps-réel du jitter de la cible. Ceci valide l'installation.

Téléchargements

Licence

RPIt est distribué sous la GNU General Public License.

Par ailleurs, toute publication (scientifique, pédagogique, en version papier ou électronique) portant sur un projet utilisant RPIt devrait contenir un lien vers la page web http://icube-avr.unistra.fr/fr/index.php/RPIt sous la forme d'une note de bas de page ou d'un lien hypertexte.

Code externe utilisé par RPIt

  • La procédure de flashage du NXT utilise le firmware et l'utilitaire nexttool de John Hansen.
  • Le driver NXT est basé sur NXTOSEK.
  • La procédure de configuration sous Windows utilise des programmes du projet PuTTY.

Versions

RPIt est désormais hébergé par GitHub. Télécharger la dernière version sur ce site.

Version Date Lien Notes de version Auteur
4.12 29 juin 2016 RPIt-4.12.zip (22.8MB) Correction d'un problème de condition initiale dans le bloc socket. J. Gangloff
4.11 23 juin 2016 RPIt-4.11.zip (22.8MB) Bloc socket. J. Gangloff
4.8 22 avril 2016 RPIt-4.8.zip (23.5MB) Compatibilité R2015a et R2015b. J. Gangloff
4.6 29 avril 2015 RPIt-4.6.zip (22.8MB) Bloc Polaris. Compatibilité RPI2. J. Gangloff et X. Weber
3.25 13 octobre 2014 RPIt-3.25.zip (22.8MB) Packaging de l'archive dans un ZIP plus compatible. Jacques Gangloff
3.24 9 juillet 2014 RPIt-3.24.zip (22.8MB) Ajout d'un bloc de mesure du taux d'occupation du CPU. Jacques Gangloff
3.23 27 juin 2014 RPIt-3.23.zip (22.8MB) Ajout de "setup_NXT.m", un script permettant d'automatiser le flashage du firmware du NXT et l'installation du driver RPIt.
Ajout d'un correctif pour le bug char16_t de la version 2012a.
Ajout dans "setup.m" de la configuration de l'accès USB au NXT pour les utilisateurs.
Réécriture majeure de "setup.m" pour plus de simplicité.
Quelques corrections de bugs mineurs.
Jacques Gangloff
3.14 18 juin 2014 RPIt-3.14.zip (14MB) Compatibilité avec la version Mac OSX de Matlab/Simulink.
Compatibilité avec la version Linux de Matlab/Simulink.
Compatibilité avec des cibles différentes d'un Raspberry Pi (PC quelconque avec une distribution basée Debian, avec processeur ARM ou x86).
Nouveau bloc Simulink "Lego NXT".
Plusieurs NXTs peuvent être contrôlés simultanément via USB.
Jacques Gangloff
2.22 6 juin 2014 RPIt-2.22.zip (7MB) Support de R2014a.
Corrections de bugs mineurs.
Jacques Gangloff
2.21 7 avril 2014 RPIt-2.21.zip (7MB) MPU9150: correction des axes du magnétomètre.
MPU9150: correction du gain du gyro.
Setup: support de R2014b.
Jacques Gangloff
2.20 4 février 2014 RPIt-2.20.zip (7.35MB) Première version publique. Jacques Gangloff

Applications

Projets pédagogiques basés sur RPIt

Un des premiers objectifs de RPIt est l'enseignement. Ci-dessous un exemple de projet d'une cinquantaine d'heures réalisé par un binôme d'étudiants ingénieurs de Télécom Physique Strasbourg.

Lien direct: [2]

Projets scientifiques basés sur RPIt

RPIt est utilisé par Xavier Weber pour sa thèse sur la compensation active de vibrations des robots parallèles à câbles. Ci-dessous, une vidéo illustrant ces travaux présentés au congrès IROS 2014 [1] et ICRA 2015 [2].

Lien direct: [3]

Lien direct: [4]

  1. Xavier Weber, Loic Cuvillon and Jacques Gangloff, Active vibration canceling of a cable-driven parallel robot using reaction wheels, in proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS 2014), Chicago, Illinois, Sept. 14–18, 2014.
  2. Xavier Weber, Loic Cuvillon and Jacques Gangloff, Active vibration canceling of a cable-driven parallel robot in modal space, in proceedings of the IEEE International Conference on Robotics and Automation (ICRA 2015), Seattle, Washington, May 26–31, 2015.

Support

Je suis actuellement l'unique développeur associé à ce projet. Si vous trouvez un bug ou si vous avez des idées d'amélioration, n'hésitez pas à me les soumettre.

Si vous utilisez RPIt et que vous l'appréciez, vous avez la possibilité de soutenir le projet financièrement. Je m'engage à ce que l'argent soit intégralement investi dans des projets d'enseignement ou de recherche liés à RPIt. Pour faire un don, cliquez simplement sur l'icône Paypal.

Nous sommes aussi ouverts à des collaborations industrielles. Nos prestations peuvent aller du développement à la demande de blocs Simulink pour RPIt dédiés à un type particulier de hardware jusqu'au prototypage rapide complet d'une commande d'un système complexe. Cette collaboration peut se faire dans le cadre d'une simple prestation de service et peut aller jusqu'à une thèse CIFRE. Vous trouverez des informations utiles à ce sujet sur le site du service de valorisation de l'Université de Strasbourg. N'hésitez pas à me contacter par mail ou par téléphone (03 67 10 61 79) pour de plus amples informations.

Soutenir RPIt



Jacques GANGLOFF

Professeur à l'Université de Strasbourg.