TD 11 : Réalisation d'un Interface Graphique Utilisateur avec Matlab
ESSI1 ? AUTOMATIQUE : (TD 8 et 9, AuToTs, Mai 1999). Création d'un Graphic
User Interface Matlab pour aider l'identification d'un second ordre. Il s'agit ...
part of the document
r la courbe et afficher simultanément les coordonnées précises du point désigné afin de mesurer le premier dépassement (d1, t1) et la valeur finale vfri de la réponse indicielle. On sinspirera de lexemple de GUI vu en cours. Le choix du pointeur peut influer sur la précision, voir le pointeur fullcrosshair par exemple, ou arrow,
On peut bien sûr prévoir deffacer le tracé, ou de superposer des tracés, dajouter des grilles, de faire des zooms,
mais prévoir surtout un moyen de terminer linterface.
Améliorations de linterface
On cherche maintenant à augmenter laide fournie par linterface dans cette tâche didentification. On pourra ajouter selon le temps disponible une ou plusieurs des fonction de la liste suivante, ou même dautres fonctions laissées à votre initiative :
Insérées dans trois zones de texte éditables, les informations d1, t1 et vfri doivent permettre à linterface didentifier le processus (bouton Identifier ) cest à dire de calculer les trois paramètres de la fonction de transfert A, m et INCORPORER Equation.2 , qui seront affichés dans trois zones de texte.
Deuxièmement, linterface doit être capable de trouver seul d1, t1 et vfri en analysant les vecteurs y et t (bouton Mesurer ). Il utilisera les zones éditables précédentes pour écrire ces résultats.
Enfin, les paramètres du modèle A, m et INCORPORER Equation.2 étant donc soit (1) calculés par linterface (2) mesurés par lutilisateur, (3) tout simplement édités dans les zones de texte prévues à cet effet, linterface tracera la réponse indicielle correspondante en superposant pour comparer avec le fichier initial (bouton Tracer).
Ajouter la possibilité de Sauver dans un fichier la réponse indicielle obtenue pour A, m et INCORPORER Equation.3 .
Conseils de Préparation :
A partir de ces éléments, en analysant le problème posé , élaborer un projet dinterface :
croquis, disposition de la fenêtre, objets utilisés, avec leurs noms, leurs propriétés, les callbacks associés
Partant de ce projet, programmer linterface à laide de lutilitaire guide , (commande : >> guide) ou GUI Layout Tool du menu File de MATLAB.
Prévoir une mise en place graduelle, installer progressivement selon un plan prédéfini les fonctionnalités de linterface. On part dun objet simple, on teste progressivement les additions : il sagit dune première utilisation, et guide est peu commenté.
Mise en uvre :
Lancer guide, passer au mode Controlled Figure si nécessaire,
Construire la disposition graphique retenue, en fixant les textes et les noms des objets (strings et tags), les Callbacks, les couleurs, les curseurs, ....
Tester dabord la sauvegarde et la récupération de létat actuel de linterface (mode Activated, Apply, save dans un répertoire donné avec un nom donné de xxx.m,
relancer depuis matlab >>xxx comme on fait pour un script, puis modifier de nouveau.
Tester la lecture dun fichier et le tracé dune réponse dans la fenêtre de tracé. On aura créé un fichier de données fich.mat (ou même plusieurs fich01, fich02,
) pour aider à lévaluation de linterface
Tester lédition dune donnée dans une zone éditable, ainsi que la lecture et lécriture par un autre objet de linterface
Laffichage des coordonnées y , t de la souris se déplaçant dans la zone de tracé, on pourra adapter lexemple de la fonction animator vue en cours, et choisir un curseur adapté (tel que crosshair ou fullcrosshair, ou ibeam).
Le calcul des paramètres de la fonction de transfert à partir de d1, t1 et vfri
Lidentification automatique des paramètre à partir du calcul préliminaire de d1, t1 et vfri à laide des vecteurs y et t. On pourra essayer directement depuis linterpréteur MATLAB
La superposition de la réponse réelle provenant du fichier de données et de la réponse de la fonction de transfert proposée
Remarques importantes sur lutilisation de guide:
Dabord, sauver un interface td8et9 (Active, puis Apply dans guide, ou Save As de la figure principale) crée deux fichiers : td8et9.m est un script décrivant en Matlab linterface, td8et9.mat contient des don-nées numériques, dimensions, positions, couleurs ... pour reconstruire linterface, ce qui se fera avec la commande > td8et9, cest à dire en lançant le script. Attention, pourquoi ne faut il pas appeler son interface data, sil existe un fichier de données data.mat ?
Ensuite, certaines commandes Matlab créent plusieurs objets dinterface. Ainsi, plot(t,y) crée dans la foulée, une figure, un axe (zone blanche de tracé) dans la figure et une ou plusieurs lignes (lines) dans laxe. Si on avait créé un axe dans linterface, plot en place donc un autre par dessus, effaçant entre autres les callbacks que lon avait écrits, tels que ButtonDownFcn. Il y a plusieurs remèdes, par exemple faire line(t,y) au lieu de plot, évite de créer un axe à nouveau. Ou bien, après le plot, ajouter linstruction set(gca, ButtonDownFcn,animator start) comme dans la solution proposée.
Enfin, faire attention à la duplication des objets dinterface, parce que guide duplique le nom (ou Tag) : vous pouvez ainsi vous retrouver avec plusieurs zones éditables nommées EditText1, et recopier le callback que vous destiniez à la première dans toutes les autres ou autres mésaventures dans ce genre. Remède, changer le contenu du champ Tag si cela peut poser problème.
Noter que lon peut sauver un interface en sauvant la figure correspondante dans le menu File , Save as en haut et à gauche de la figure elle-même.
On trouve une solution dans http://www-local.essi.fr/Automatique, dans le répertoire Demos : voir les trois fichiers : gui1.m, gui1.mat et animator.m
La fonction animator.m peut être modifiée, par exemple pour choisir le curseur par exemple ibeam au lieu du curseur arrow. On pourra ainsi copier , analyser et comprendre, tester, exécuter, améliorer, et inclure des parties dans une autre solution proposée.
Correction (ou plutôt une solution possible)
Linterface représenté ci-contre est doté des fonctionnalités suivantes : on entre le nom dun fichier dans la zone Edit1, avec ou sans lextension .mat qui est utilisée par MATLAB pour les fichiers de données (.m pour les scripts ou les fonctions). Le bouton Lire le fichier provoque alors la lecture du fichier et le tracé de la réponse indicielle qui y est enregistrée : a priori, les données du fichier sont deux vecteurs nommés y et t, respectivement la réponse et les instants de mesure. Une grille est tracée, des textes sont rajoutés sur les axes et un titre.
Afin de mesurer à laide de la souris les caractéristiques du premier dépassement d1, t1 et la valeur finale de la réponse indicielle vfri, enfoncer un bouton quelconque de la souris alors que lon se trouve sur laxe de tracé (zone blanche) provoque un changement de curseur (ibeam devient fullcrosshair) et laffichage dans la zone Text1 des coordonnées du curseur sur la courbe affichée. On utilise pour cela à nouveau la fonction Matlab déjà vue : animator.m.
Lutilisateur peut à loisir éditer dans les trois zones Edit2, Edit3 et Edit5 les valeurs ainsi mesurées.
Enfoncer le bouton Identifier déclenche alors le calcul des paramètres m, oméga0 et A du modèle à identifier, le résultat de lidentification est inscrit dans trois zones Edit5, 6 et 7.
La fonction Tracer superpose la réponse indicielle du modèle ainsi calculé et la courbe tracée à partir du fichier.
Quant à Mesurer, cest la détermination par linterface des valeurs d1, t1 et vfri à partir de lanalyse des vecteurs y et t. On note que le radio bouton est positionné si le programme détecte un dépassement et un maximum de la réponse, on note en plus que linstant tel que y(t)=0.63*vfri est également calculé par linterface, afin de participer à lidentification des processus du premier ordre.
Linterface sappelle Travaux Dirigés ESSI1 ( propriété Name) ; il contient 6 pushbuttons, dont les callbacks sont donnés plus loin, 8 zones de texte éditables (fond blanc, propriété BackGroundColor),, 8 textes (objet Text) dont le titre en haut, et les explications des zones Edit ; on y trouve également un RadioButton, et un axe, avec une courbe tracée par défaut (objet line).
Les curseurs utilisés sont fullcrosshair et ibeam. Linterface graphique est représenté ci-dessous à gauche avec les noms (propriété Tag) des objets de linterface à droite.
Les callbacks (Callback, ButtonBownFcn, WindowButtonMotionFcn,
) spécifient la réactivité de linterface. La page suivante liste les réactions de linterface qui ont été programmées ici :
Quitter : close(gcf)
Effacer les axes : cla
Lire le Fichier : h=findobj(gcf,'Tag','Edit1')
load(get(h,'string'))
plot(t,y)
set(gca,'ButtonDownFcn','animator start')
grid
xlabel('temps (seconde)')
ylabel('réponse indicielle y(t)')
title('Réponse indicielle')
Mesurer : h=findobj(gcf,'Tag','Edit1');
load(get(h,'string'));
vfri=y(length(y));
[mx,imx]=max(y);
h=findobj(gcf,'Tag','Radiobutton1');
if (mx>vfri), set(h,'Value',1);
else, set(h,'value',0);
end
d1=mx-vfri;
t1=t(imx);
h=findobj(gcf,'Tag','Edit2');
set(h,'string',num2str(d1))
h=findobj(gcf,'Tag','Edit3');
set(h,'string',num2str(t1))
h=findobj(gcf,'Tag','Edit4');
set(h,'string',num2str(vfri))
h=findobj(gcf,'Tag','Edit8');
vf=0.63*vfri;
[mn,imn]=min(abs(y-vf))
set(h,'string',num2str(t(imn)))
Tracer : h=findobj(gcf,'Tag','Edit5');
m=str2num(get(h,'string'));
h=findobj(gcf,'Tag','Edit6');
om=str2num(get(h,'string'));
h=findobj(gcf,'Tag','Edit7');
vfri=str2num(get(h,'string'));
proc=tf(vfri,[1/om^2 2*m/om 1]);
set(gca,'nextplot','add' )
step(proc)
grid
set(gca,'nextplot','replace','ButtonDownFcn','animator start')
Identifier : h=findobj(gcf,'Tag','Edit2');
d1=str2num(get(h,'string'));
h=findobj(gcf,'Tag','Edit3');
t1=str2num(get(h,'string'));
h=findobj(gcf,'Tag','Edit4');
vfri=str2num(get(h,'string'));
e=abs(log(d1/vfri)/pi);
m=e/sqrt(1+e^2);
om=pi/(t1*sqrt(1-e^2));
h=findobj(gcf,'Tag','Edit5');
set(h,'string',num2str(m));
h=findobj(gcf,'Tag','Edit6');
set(h,'string',num2str(om));
h=findobj(gcf,'Tag','Edit7');
set(h,'string',num2str(vfri));
En effet, on trouve A = vfri, INCORPORER Equation.2 avec INCORPORER Equation.2 , et INCORPORER Equation.2
RadioButton : pas de callback, on détecte dans Mesurer sil y a dépassement
Axes : ButtondownFcn : animator start
ESSI1 AUTOMATIQUE : (TD 8 et 9, AuToTs, Mai 1999)
INCORPORER PBrush
Text1
Axes1
Fig1
StaticText5
PushButton6 PushButton2 PushButton5
StaticText2 Edit2 StaticText1 Edit5
StaticText3 Edit3 StaticText6 Edit6
StaticText4 Edit5 StaticText7 Edit7
RadioButton1 StaticText6 Edit8
PushButton3 PushButton4 Edit1 Pushbutton1