Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

matlab

Introduction Matlab - Compléments GUI 1 Création d'une interface graphique Une interface graphique permet de contrôler une application interactivement avec la souris , plutôt que par lancement des commandes au clavier. Une interface graphique comprend des menus, des boutons, des "ascenseurs", des cases à cocher, des listes de choix, des zones de texte. Exemple d'interface : Elle permet de "cliquer" directement sur des images, des graphiques ou des objets pour modifier la valeur d'une variable, déclencher des fonctions ou simplement faire apparaître des informations lors d'un survol à la souris. Matlab permet d'écrire assez simplement une interface graphique pour faire une application interactive utilisable par des utilisateurs non formés à Matlab. Les notions principales d'une interface graphique sont : - les divers objets graphiques, auxquels sont attribués des noms symboliques; ces "poignées de main" ou "handles" permettent de les repérer dans l'interface; pour envisager par exemple une modification dynamique (grisé d'un bouton provisoirement non utilisable, changement du texte d'un bouton, modification d'une liste de choix...) - les propriétés des objets (couleur, disposition, taille, variable associée) - les fonctions exécutées par les clic souris sur les éléments ou "callbacks" (décrites en ligne de commande Matlab ). Les versions actuelles de Matlab permettent de construire ces interfaces directement avec la souris grâce au GUIDE (Graphical User Interface Development Environment). Cet outil est capable de construire des applications de très haut niveau. Cependant, son approche est très délicate pour un utilisateur peu expérimenté. L'approche classique par description textuelle de l'interface, moins performante mais compréhensible, permet de se familiariser avec les principales notions. Ce polycopié permet de faire une approche progressive du GUI; les exemples sont opérationnels et sont à tester pour se familiariser. Pierre Bonnet - USTL Introduction Matlab - Compléments GUI 2 I - Elements de base de l'interface graphique Pour créer une interface, il faut disposer d'une fenêtre de base dans laquelle seront insérés les éléments graphiques (objets). A noter que tout dessin graphique ou affichage d'image (résultat de plot, mesh, imshow) peut servir de fenêtre de base.  Création d'une nouvelle fenêtre pour application: fig1 = figure Le paramètre fig1 est le handle de la fenêtre, c'est à dire le numéro de repère de la fenêtre attribué par Matlab à sa création. Il est possible d'appliquer des fonctions sur cette fenêtre (redimensionnement, ajout de menus, boutons, ...) en précisant dans les fonctions le handle auquel elle s'applique. La fenêtre active à un instant donné a pour handle implicite gcf . De façon générale, tout objet graphique se voit attribué un handle; ce handle sert de référence à cet objet dans l'application.  Propriétés d'une fenêtre graphique (ou d'un objet) get(fig1) Les principales propriétés sont : le titre, la position et la dimension dans l'écran, la couleur de fond, la présence et le type de menus, le redimensionnement... Toute propriété particulière est obtenu par : valeur_propriété = get( fig1, 'nom_propriété' ) Toute propriété (modifiable!) peut être modifiée en définissant une nouvelle valeur pour la propriété considérée (valeur numérique, chaîne, liste de valeur, tableau...) set(fig1, 'nom_propriété' , valeur_propriété ) Ex : set( fig1 , 'Name' , 'Demo GUI' , 'NumberTitle' , 'off' ); La fenêtre de base est l'écran qui a pour handle "0". Par get (0 , 'ScreenSize' ), on obtient la taille de l'écran physique de l'écran. Ces valeurs permettent de fixer la taille d'une fenêtre en rapport avec la dimension physique de l'écran et d'éviter de créer une application qui "déborde" de l'écran! La taille et la position de la fenêtre (ou d'un objet) se fixent par modification de sa propriété ou contrôle "position", comprenant les coordonnées (Xor,Yor) du coin inférieur gauche et ses dimensions (Xfen,Yfen): set( fig1 , 'position' , [ 10 , 10 , 300 , 200 ]) L'ensemble des propriétés modifiables d'un objet est donné par set(handle_objet) . La liste s'affiche avec les valeurs possibles pour les différentes propriétés; les valeurs par défaut sont signalées par des crochets { } . Exemple : set( fig1 ) Tout objet graphique créé pourra être supprimé par : delete (handle_objet) La suppression d'un objet entraîne la suppression des objets qui lui sont liés (objets fils). Pierre Bonnet - USTL Introduction Matlab - Compléments GUI 3  Insertion d'un Objet dans la fenêtre L'insertion d'un objet dans une fenêtre se fait par la fonction "uicontrol" , dont le premier paramètre est le handle de la figure de référence. Le deuxième paramètre précise le "style" ou type d'objet à insérer. Exemple le "texte fixe" est l'objet le plus simple; il permet de placer un texte dans la fenêtre. text1 = uicontrol( fig1 , 'style' , 'text' , 'position' , [100,150,170,30] ,... 'string' , 'Bonjour' , 'fontsize' , 15 ) Toutes les propriétés de cet objet peuvent être modifiées par la commande "set" . Par exemple, le texte en lui-même ('string') étant une propriété, il peut être modifié: set( text1 , 'string' , 'Au revoir' ); Autre exemple : insertion d'un bouton-radio : radio1 = uicontrol( fig1 , 'style' , 'radio' , 'String' , 'Option1' , 'Position' , [30,30,60,30] ) A la différence du "texte" , on remarque que cet objet est "cliquable" à la souris, avec modification de son aspect (cet fonction est prise en charge sans aucune programmation par l'utilisateur). II - Principe de l'interaction avec la souris La presque totalité des objets de l'interface graphique (curseur, case à cocher...) peut interagir avec la souris.  La fonctionnalité la plus courante est la modification de la valeur associée à l'objet (si elle existe): pour les objets destinés à faire une saisie (case à cocher, curseur, champ de saisie, choix de liste...), Matlab gère automatiquement la valeur associée. Cette valeur est récupérable par toute partie de l'application par la fonction "get" : valeur = get (handle_objet , 'value'); Cette fonctionnalité permet de saisir la valeur d'une variable par l'interface graphique plutôt que par le clavier.  La deuxième interaction courante est une action déclenchée par le "clic" souris sur l'objet (appuyé puis relâché): la fonction associée est décrite dans la propriété "callback" de l'objet. Cette fonction peut être une instruction de base Matlab ou une fonction définie par l'utilisateur (stockée en fichier .m) Pierre Bonnet - USTL Introduction Matlab - Compléments GUI 4 set( radio1 , 'callback' , 'get( radio1 , ' 'value' ' ) ' ); Remarquer que la fonction est décrite en chaîne de caractères avec des " ' " en début et fin, ce qui oblige à doubler les " ' " pour ceux qui sont inclus dans la chaîne principale. Cette description en chaîne permet de définir en callback une liste d'instruction, ce qui évite d'écrire une multitude de petites fonctions externes dédiées aux callbacks.  Certains objets n'ont pas de callback (cas des figures) mais possèdent d'autres actions associées à la souris. Leur emploi est identique au callback classique (description de la fonction en liste d'instructions). Les principales sont : WindowButtonUpFcn WindowButtonDownFcn WindowButtonMotionFcn Exemple : récupération des coordonnées en pixels de la souris au clic fig1 = figure ; set( fig1 , 'WindowButtonDownFcn' , 'get( fig1 , ' 'CurrentPoint ' ' ) ' ); Si on désire obtenir des coordonnées dans l'espace de mesure des axes d'un graphique, plutôt qu'en pixels de la figure, il faut faire référence aux axes ( gca ) dans la fonction de clic : plot( 20 , 20 , ' r+ ' ) % tracé d'une croix rouge au centre set( gcf , 'WindowButtonDownFcn' , 'get( gca , ' 'CurrentPoint' ' ) ' )  Certains objets possèdent une fonction callback et une fonction associée au clic souris (par exemple : ButtonDownFcn ) III - Principaux Objets Graphiques  Bouton poussoir Un bouton poussoir se crée par : bp1= uicontrol ( fig1 , 'style' , 'push' , 'position' , [10 100 60 30 ] ,... 'string' , 'Début' , 'callback' , 'plot(T,X)' ) Lorsqu'on clique sur le bouton poussoir, il provoque l'exécution de la fonction indiquée dans le 'callback'. Cette fonction peut être une instruction de base Matlab ou une liste d'instruction, ce qui évite d'écrire une multitude de petites fonctions exécutées pat les callbacks. Un bouton-poussoir s'inactive par la commande : set(bp1 , 'enable' , 'off' ) Par cette commande, on peut rendre inactif certaines commandes, par exemple lorsqu'il manque des informations pour traiter un problème. Pierre Bonnet - USTL Introduction Matlab - Compléments GUI 5  Menus Généralement, les menus de la fenêtre d'application ne sont pas les menus standard (voir vue ci-dessus mais des menus spécifiques. Un menu est un titre complété par une liste de sous-menu. Les actions (callbacks)sont généralement lancés à partir des sous-menus. L'ajout de menus spécifique se fait par : menu1 = uimenu( fig1 , 'label' , ' Statist.' ); Un sous-menu est un élément du menu principal, donc de l'entité père. Il est donc déclaré car menu du menu principal. smenu1 = uimenu( menu1 , 'label' , 'Normale' , 'callback' , 'methode_normale' ) smenu2 = uimenu( menu1 , 'label' , 'Binomiale' , 'callback' , 'methode_binomiale' ); Pour enlever les menus standards de la fenêtre, il faut fixer la propriété "Menubar" à la valeur par défaut menubar : set(fig1,'menubar',menubar);  Ascenseur ou slider L'ascenseur a pour objectif de fixer la valeur d'un paramètre entre deux bornes fixées. La valeur prise par la variable est représentée par la position du curseur . slid1=uicontrol(fig1,'style','slider','position', [100,50,150,20] , 'Min' , -1 , 'Max' , 1 , ... 'callback' , 'val_variable = get(slid1 , ''value'' )' ); Les textes (variable affectée, valeurs..) ne sont pas définis par le slider. Il faut le compléter par des éléments textes convenablement placés et paramétrés; leur valeur est à modifier par le callback du slider. Exemple d'ascenseur avec affichage de la valeur: fig1=figure; texte1=uicontrol(fig1,'Style','text','String',0,'Position', [140,70,80,20],'BackGroundcolor','w'); slid1=uicontrol(fig1,'style','slider','position', [100,50,150,20] , 'Min' , -1 , 'Max' , 1 , ... 'callback' , 'set(texte1,''String'', get(slid1 , ''value'' ))' ); Pierre Bonnet - USTL Introduction Matlab - Compléments GUI 6  Texte Editable Permet à l'utilisateur de saisir une valeur. C'est une fonction importante. Text1 = uicontrol ( fig1 , 'style' , ' edit' , 'position', [100,50,150,20] , 'Max' , 1 , 'string' , '0' ); Généralement, Il faut associer un texte fixe pour préciser le rôle de la fenêtre de saisie à l'utilisateur. Exemple : le texte est placé à gauche de la fenêtre de saisie uicontrol ( fig1 , 'style' , ' texte' , 'position', [10,50,90,20] , 'string' , 'Valeur A' );  Liste de choix La liste de choix ou pop-up menu permet de sélectionner une valeur parmi une liste. Généralement, cette valeur est un texte . La valeur retournée lors du choix (paramètre 'Value') est le numéro de ligne du choix. choix1 = uicontrol ( gcf , 'Style' , 'popup' , 'String' , 'Pierre|Paul|Jacques' , 'Position' , [10 10 100 80] ); La liste des texte est modifiable après la création de la fenêtre de choix, en modifiant la propriété 'String' .  Bouton Radio Le bouton Radio permet de fixer un paramètre binaire ( 0 ou 1 ), représentant souvent un choix ou une option dans une application. fig1 = figure ; radio1 = uicontrol( fig1 , 'style' , 'Radio' , 'Position' , [ 30 20 130 25 ] , 'String' , ' OptionA ' ); radio2 = uicontrol( fig1 , 'style' , 'Radio' , 'Position' , [ 30 45 130 25 ] , 'String' , ' OptionB ' ); uicontrol( fig1 , 'style' , 'Text' , 'Position' , [ 30 70 130 30 ] , 'String' , ... ' Choix des Options ' , 'FontWeight', 'bold' ); Pierre Bonnet - USTL Introduction Matlab - Compléments GUI 7 Remarquer que les choix ne sont pas exclusifs (chaque choix peut être sélectionner). Pour obtenir l'exclusion mutuelle, il faut agir sur les valeurs de choix par les callbacks. set( bradio1 , ' Value' , 1 ); set( radio1 , 'callback' , 'set( radio2 , ' ' Value' ' , 0 ) ' ) ; set( radio2 , 'callback' , 'set( radio1 , ' ' Value' ' , 0 ) ' ) ;  Cadre Le cadre permet de dessiner un rectangle de présentation (par exemple regroupement de diverses entités graphiques dans un rectangle). Le cadre se déclare par : cadre1 = uicontrol ( fig1 , 'style' , 'frame' , 'position' , [ posX ,posY,tailleX,tailleY])  Graphiques Les graphiques se dessinent dans une partie de la fenêtre définie par la fonction 'subplot', dont les paramètres sont différents de l'emploi classique (division de la fenêtre en sous-fenêtres de taille égale) subplot( 'Position' , [ Xpos Ypos Xtaille Ytaille]) Les paramètres se définissent en % de la fenêtre (redimensionnement automatique des zones graphiques avec le redimensionnement de la fenêtre). Il est possible d'ouvrir plusieurs zones graphiques dans une même fenêtre. Les zones ne doivent pas se chevaucher, sous peine d'effacement de la zone située sous la nouvelle zone. fig1 = figure ; z1 = subplot ( 'Position' , [ .05 .1 .4 .4 ] ) ; plot ( sin( 0: 10)) z2 = subplot ( 'Position' , [ .55 .1 .4 .4 ] ) ; plot ( exp( 0 : 10)) Pierre Bonnet - USTL
Note d’application Acquisition de données séries binaires via une interface graphique Matlab® P09AB08 : Odométrie ferroviaire par fusion de données accélérométriques et GPS Présentation Cette note d’application a pour but de présenter une manière simple et efficace de réaliser l’acquisition sur PC de données séries binaires pour permettre un traitement ultérieur. L’outil choisi est Matlab®, pour la polyvalence qu’il permet en aval de l’acquisition. Matlab® fonctionne à partir d’un langage interprété dont les bases ne sont pas l’objet de cette note. Un minimum de connaissances dans la syntaxe et la gestion des objets graphiques (figures, axes… ) est recommandé pour une bonne compréhension. L’intérêt de l’utilisation d’un GUI pour l’acquisition de données série est de pouvoir paramétrer de façon simple la connexion et de pouvoir sauvegarder facilement le résultat. Page 1 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® Présentation ..........................................................................1 1 Rappels sur la liaison série .............................................4 1.1 Format des données .......................................................................................................... 4 1.2 Interface série sur PC ........................................................................................................ 4 2 Présentation du GUI Matlab® utilisé ...........................4 2.1 Fonctionnalités..................................................................................................................... 4 2.2 Structure ............................................................................................................................... 5 3 Structure serial..............................................................7 4 Précautions d’usage .........................................................8 4.1 Allocation dynamique/Pré allocation.............................................................................. 8 4.2 Ouverture/fermeture de ports......................................................................................... 9 4.3 Vidage du buffer d’entrée ................................................................................................ 9 5 Exemple des callbacks liés aux éléments du GUI.....10 5.1 5.2 5.3 5.4 5.5 5.6 Bouton – Ouvrir port ...................................................................................................... 10 Bouton – Fermer port .................................................................................................... 11 Bouton – Lancer acquisition ......................................................................................... 11 Bouton – Stopper acquisition ....................................................................................... 12 Bouton – Mise en forme des données....................................................................... 12 Bouton – Sauver Données ............................................................................................ 12 6 Synchronisation des données reçues ..........................13 6.1 Différences avec la réception de données ASCII .................................................... 13 6.2 Réception de données complexes............................................................................... 13 Bibliographie ........................................................................14 Contacts................................................................................14 Page 2 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® Code 1 : GUI contenu dans acquisition_serie_donnees.m ....... 7 Code 2 : Callback - Ouvrir port..................................................... 10 Code 3 : Callback – Fermer port .................................................... 11 Code 4 : Callback – Lancer acquisition.......................................... 11 Code 5 : Callback – Stopper acquisition ........................................ 12 Code 6 : Callback – Sauvegarde des données................................. 12 Figure 1 : Visualisation de l'interface .............................................. 5 Figure 2 : Propriétés de l’objet serial (sous Windows®) .............. 8 Figure 3 : Perte de données par non vidage du buffer .................... 9 Tableau 1 : Format d'une trame RS232........................................... 4 Tableau 2 : Exemples de constructeurs des objets sériels ............... 7 Page 3 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® 1 Rappels sur la liaison série 1.1 Format des données Le format RS232 définit la transmission de données sous forme de trames, comprenant un paquet de données de 5 à 8 bits. Bit0 Longueur 1 Signification Start Bit1 1 D0 Bit2 1 D1 Bit3 1 D2 Bit4 1 D3 Bit5 1 D4 Bit6 Bit7 Bit8 Bit9 Bit10 0–1 0–1 0–1 0–1 1-2 D5 D6 D7 Parité Stop Tableau 1 : Format d'une trame RS232 Nous traiterons dans le cadre de cette note des données 8 bits sans vérification de parité, et avec un bit de stop. Ceci permet de transmettre la majorité des données binaires : par exemple, la réception d’une donnée 8, 16, 32 bits peut se faire respectivement par la réception d’une, de deux, ou de quatre trames 8 bits. 1.2 Interface série sur PC La liaison série sur PC, et principalement son connecteur associé (DB9) tend à disparaître des nouvelles machines. De nombreux adaptateurs série  USB permettent d’émuler des ports séries et donc de contourner le problème de connectique. Tous les systèmes d’exploitation courants sont capables de gérer ce type de périphériques, mais il faut noter que la plupart ne proposent que des drivers Windows®. 2 Présentation du GUI Matlab® utilisé 2.1 Fonctionnalités Le GUI1 utilisé ici a été créé dans un but de simplicité. Il doit permettre l’ouverture d’un port série directement sur Matlab®, et proposer la configuration de la vitesse et du port à utiliser. Note : Matlab® n’est pas en mesure de détecter directement les ports connectés à un périphérique. Il est nécessaire d’avoir identifié au préalable, via le système d’exploitation par exemple, le port série concerné. On a donc les fonctionnalités suivantes : • • • • 1 Ouverture, fermeture d’un port série Configuration des paramètres de bases de la liaison (vitesse, port) Lancement, et arrêt de l’acquisition Mise en forme des données (totalement dépendant de l’application) GUI : Graphic User Interface Page 4 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® • Sauvegarde des données produites. Figure 1 : Visualisation de l'interface 2.2 Structure Voici un aperçu d’une version simple du GUI. %------------------------------------------------------------%Creation du GUI %------------------------------------------------------------function acquisition_serie_donnees() %Ouverture de la fenetre %------------------------------------------------------------handle(1) = figure('Name','Acquisition des données',... 'Position',[500, 300, 400, 200],... 'menubar','none'); %------------------------------------------------------------%Creation de la zone d'acquisition %------------------------------------------------------------%Bouton : lancer acquisition handle(2) = uicontrol('pos',[250,160,140,30],... 'style','pushbutton',... 'callback',@cb_start_acquisition,... 'String','Lancer acquisition'); %Bouton : stopper acquisition handle(3) = uicontrol('pos',[250,120,140,30],... 'style','pushbutton',... 'callback',@cb_stop_acquisition,... 'String','Stopper acquisition'); %------------------------------------------------------------%Zone mise en forme et sauvegarde Page 5 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® %------------------------------------------------------------%Bouton : Mise en forme des données handle(4) = uicontrol('pos',[250,50,140,30],... 'style','pushbutton',... 'callback',@cb_mise_forme_donnees,... 'String','Mise en forme données'); %Bouton : Sauver donnees handle(5) = uicontrol('pos',[250,10,140,30],... 'style','pushbutton',... 'callback',@cb_sauv_donnees,... 'String','Sauver données'); %------------------------------------------------------------%Zone paramètres liaison série %------------------------------------------------------------%Bouton : Ouvrir port handle(6) = uicontrol('pos',[30,90,80,30],... 'style','pushbutton',... 'callback',@cb_ouvrir_port,... 'String','Ouvrir port'); %Bouton : Fermer port handle(7) = uicontrol('pos',[135,90,80,30],... 'style','pushbutton',... 'callback',@cb_fermer_port,... 'String','Fermer port'); %Champ de texte : Vitesse du port handle(8) = uicontrol('pos',[28,148,40,30],... 'style','text',... 'string','Vitesse du port',... 'backgroundcolor',[0.7,0.7,0.7]); %Champ parametrable de la vitesse handle(9) = uicontrol('pos',[80,150,80,30],... 'style','edit',... 'string','115200',... 'tag','champ_vitesse'); %Popupmenu choix port serie handle(10) = uicontrol('pos',[80,120,80,30],... 'style','popupmenu',... 'String',{'COM1','COM2','COM3',... 'COM4','COM5','COM6','COM7',... 'COM8','COM9','COM10'},... 'tag','selection_com'); %------------------------------------------------------------%Zone nom de l'acquisition %------------------------------------------------------------%Affichage choix du nom handle(11) = uicontrol('pos',[10,40,180,15],... 'style','text',... 'string','Nom de l''acquisition (.mat)',... 'backgroundcolor',[0.9,0.9,0.9]); %Champ contenant le nom handle(13) = uicontrol('pos',[10,20,225,20],... Page 6 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® 'style','edit',... 'string','acquisitions\acquisition.mat',... 'tag','champ_nom'); %------------------------------------------------------------data=guihandles(gcf); guidata(gcf,data); %------------------------------------------------------------%Fin : Creation du GUI %------------------------------------------------------------Code 1 : GUI contenu dans acquisition_serie_donnees.m 3 Structure serial L’objet serial permet l’accès aux différents ports série d’une machine. Plusieurs possibilités existent pour l’ouverture d’un port, suivant le système d’exploitation. Système d’exploitation Linux / Linux 64 Mac OS Solaris 64 Windows 32/64 Constructeur type serial('/dev/ttyS0'); serial('/dev/tty.KeySerial1'); serial('/dev/term/a'); serial('com1’); Tableau 2 : Exemples de constructeurs des objets sériels L’appel de la primitive serial renvoie un identifieur contenant tous les paramètres de la liaison série. Dans le cas où nous l’utilisons : • • • 8 bits pas de parité un bit de stop et vis à vis des valeurs par défaut des propriétés de l’objet serial, il faut configurer au minimum les champs Port, BaudRate, InputBuffer (choix de la tailler du buffer d’entrée) et Timeout (si la valeur par défaut de 0.01s ne convient pas à l’application) . Page 7 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® s = serial('COM1'); set(s) ByteOrder: [ {littleEndian} | bigEndian ] BytesAvailableFcn BytesAvailableFcnCount BytesAvailableFcnMode: [ {terminator} | byte ] ErrorFcn InputBufferSize Name OutputBufferSize OutputEmptyFcn RecordDetail: [ {compact} | verbose ] RecordMode: [ {overwrite} | append | index ] RecordName Tag Timeout TimerFcn TimerPeriod UserData SERIAL specific properties: BaudRate BreakInterruptFcn DataBits DataTerminalReady: [ {on} | off ] FlowControl: [ {none} | hardware | software ] Parity: [ {none} | odd | even | mark | space ] PinStatusFcn Port ReadAsyncMode: [ {continuous} | manual ] RequestToSend: [ {on} | off ] StopBits Terminator Figure 2 : Propriétés de l’objet serial (sous Windows®) 4 Précautions d’usage 4.1 Allocation dynamique/Pré allocation Ce point est critique dans la réception des données. L’acquisition série sous Matlab®, en flux continu et avec un débit élevé (au delà de quelques ko.s-1), ne peut pas se faire directement sur un vecteur de taille inconnue au départ. L’augmentation constante de la taille du vecteur force une série de réallocations qui ont pour effet de provoquer une perte de données à chaque fois. La technique la plus simple consiste à préallouer un vecteur de taille suffisante au regard du débit et de la durée d’acquisition. Page 8 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® 4.2 Ouverture/fermeture de ports La gestion des ports série est rigoureuse dans Matlab®. Il est important de toujours respecter la séquence suivante : 1. 2. 3. 4. 5. ouverture du port lancement de l’acquisition arrêt de l’acquisition mise en forme ou près traitement si nécessaire fermeture du port et en particulier, il faut impérativement éviter (sous peine de devoir relancer Matlab®) : • • • d’ouvrir deux fois le même port d’ouvrir un port qui n’est pas connecté de quitter le GUI sans avoir fermé le port 4.3 Vidage du buffer d’entrée Lors du démarrage de l’acquisition, si le flux est permanent, il faut impérativement vider le buffer d’entrée, quelle que soit sa taille. Données perdues Flux série Lecture du buffer Asynchronisme et perte de données Ouverture du port Fin de remplissage du buffer Début de la lecture du buffer Figure 3 : Perte de données par non vidage du buffer La perte de données peut être simple si les données n’ont qu’une seule signification, elle peut être plus complexe à gérer si la réception se fait sous forme de trames : la synchronisation est perdue. Page 9 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® 5 Exemple des callbacks liés aux éléments du GUI 5.1 Bouton – Ouvrir port Cette fonction a pour but de créer l’objet serial avec les paramètres choisis dans le GUI. %------------------------------------------------------------%Callback : ouvrir port function cb_ouvrir_port(obj,event) data=guidata(gcbf); global s; %selection du port en fonction du popup menu switch get(data.selection_com,'value') case 1, port = 'COM1'; case 2, port = 'COM2'; case 3, port = 'COM3'; case 4, port = 'COM4'; case 5, port = 'COM5'; case 6, port = 'COM6'; case 7, port = 'COM7'; case 8, port = 'COM8'; case 9, port = 'COM9'; case 10, port = 'COM10'; otherwise, port = 'COM1'; end; s = serial(port,'BaudRate', str2num(get(data.champ_vitesse,'string'))); set(s,'InputBuffer', 8192); fopen(s); guidata(gcbf,data); Code 2 : Callback - Ouvrir port L’objet serial s, assimilable à un fichier, est déclaré en tant que variable globale : en effet, il doit être accessible par la fonction de fermeture du port, et d’acquisition des données. Page 10 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® 5.2 Bouton – Fermer port %------------------------------------------------------------%Callback : fermer port function cb_fermer_port(obj,event) data=guidata(gcbf); global s; fclose(s); delete(s); clear s; %séquence obligatoire de fermeture de l’objet guidata(gcbf,data); Code 3 : Callback – Fermer port 5.3 Bouton – Lancer acquisition Le démarrage de l’acquisition doit se faire en respectant les règles décrites précédemment : le buffer d’entrée doit être vidé avant de démarrer, et un vecteur d’acquisition doit être préalloué. %------------------------------------------------------------%Callback : start acquisition function cb_start_acquisition(obj,event) data=guidata(gcbf); global out; global acqu_on; global s; limite_taille = 10000000; out = zeros(1,limite_taille); %préallocation index = 1; acqu_on = 1; %vidage du buffer flushinput(s); pause(0.01); %acquisition, tant que acqu_on =1 et limite de taille non atteinte while ((acqu_on)&&(index < (limite_taille-get(s,’InputBuffer’))) nb_octets = get(s,'BytesAvailable'); if nb_octets out(index:(index + nb_octets - 1)) = fread(s,nb_octets); index = index + nb_octets; end; %rend la main a Matlab pour permettre le passage de acqu_on à 0 pause(0.2); end; %suppression des elements non ecrits si arret manuel out(index:limite_taille) = ''; guidata(gcbf,data); Code 4 : Callback – Lancer acquisition Page 11 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® 5.4 Bouton – Stopper acquisition L’arrêt de l’acquisition, s’il n’est pas donné par la saturation du vecteur préalloué (out) est commandé par la valeur de acqu_on. Le passage à 0 fait sortir le callback cb_start_acquisition de sa boucle principale. %------------------------------------------------------------%Callback : stop acquisition function cb_stop_acquisition(obj,event) data=guidata(gcbf); global acqu_on; acqu_on = 0; guidata(gcbf,data); Code 5 : Callback – Stopper acquisition 5.5 Bouton – Mise en forme des données Cette fonction n’a pas d’intérêt à être présentée ici, étant donné qu’elle dépend entièrement du type de données reçues. On peut envisager simplement de convertir plusieurs octets en un nombre de dynamique plus grande, ou reconstituer des chaines de caractères… De façon générale, et en accord avec l’interface, cette fonction doit générer un vecteur ou un tableau, ou une structure donnees_formatees à partir du vecteur out. 5.6 Bouton – Sauver Données La sauvegarde des données reçues peut se faire sous différentes formes, ici on crée directement un fichier .mat ouvrable par Matlab®. On peut envisager de tester la fin de la chaine de caractères du nom (ici get(data.champ_nom,'string') ) pour rajouter si nécessaire l’extension .mat, mais on peut aussi pour simplifier obliger à saisir nom de fichier contenant la bonne extension. %------------------------------------------------------------%Callback : sauvegarde des données function cb_sauv_donnees(obj,event) data=guidata(gcbf); global out; global donnees_formatees; %enregistrer sous le nom de champ_nom le vecteur out, et données formatées save(get(data.champ_nom,'string'),'out','donnees_formatees'); guidata(gcbf,data); Code 6 : Callback – Sauvegarde des données Page 12 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® 6 Synchronisation des données reçues 6.1 Différences avec la réception de données ASCII Les caractères ASCII permettent, au prix d’une surcharge d’information (pour le transfert d’une valeur 8 bits, il faut transférer 2 octets hexadécimaux), de réserver un bon nombre de caractères comme terminateurs d’une trame série (champ Terminator de l’objet serial). La réception de données binaires ne peut pas fonctionner sur le même schéma. Les trames ne peuvent, par définition, pas être bornées par des valeurs connues, sauf dans certains cas particuliers. 6.2 Réception de données complexes Les données reçues via la liaison série mise en œuvre ne sont pas forcement une succession de valeurs 8 bits représentant une même grandeur. Dans un cas aussi simple, aucun problème de synchronisation n’est à relever. Si les données reçues sont plus complexes, i.e. représentant des grandeurs différentes et/ou de types différents, il faut choisir un motif que l’on peut prévoir a priori. Il faut garder en tête que des valeurs binaires, sauf si elles sont bornées, peuvent prendre toutes les valeurs de leur dynamique. Une simple valeur ne peut donc pas servir artificiellement de terminateur. En revanche, on peut supposer qu’une succession de plusieurs valeurs connues et dans une séquence connue peut représenter un motif assimilable à un terminateur. Il convient de s’assurer que la probabilité d’occurrence de ce motif est très faible parmi les autres données. Page 13 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS Note d’application – P09AB08 Acquisition de données séries binaires via une interface graphique Matlab® Bibliographie Briot, Jérôme. «Développement efficace des interfaces graphiques.» Devellopez.com. 17 03 2009. —. «Présentation des objets graphiques.» Developpez.com. 17 03 2009. RS232 Specifications and standard. http://www.lammertbies.nl/comm/info/RS-232_specs.html (accès le 01 24, 2010). Contacts Cette note d’application a été réalisée par Jean Doucement. Pour toute question ou précision : jean.doucement@polytech.univ-bpclermont.fr ou jean.doucement@gmail.com Page 14 sur 14 Projet odométrie ferroviaire par fusion de données accélérométriques et GPS