Examen DESS MASI 1997
Informatique et Technologies
première session (27/3/97)
durée 3heures, documents autorisés
Un chariot doit se diriger vers un endroit où se trouve une balise
émettrice. Ce chariot comporte deux capteurs (un à droite, un
à gauche) capables de mesurer précisément leur distance
à cette balise (je les appellerai des yeux). Le chariot se
déplace grâce à deux roues motrices commandées
chacune par un moteur. Si les deux moteurs tournent (on supposera à la
même vitesse), le chariot avance en ligne droite. Pour tourner, on
supposera dans un premier temps que l'on bloque une roue et fait tourner
l'autre (bloquer la roue droite tout en alimentant le moteur de la roue gauche
fait tourner le chariot à droite)
Question 1 : on suppose disposer des trois fonctions (écrites en
C) dont voici les entêtes (prototype) :
float mesurer (int DeQuelCote);
void allumer_moteur (int DeQuelCote);
void eteindre_moteur (int DeQuelCote);
A condition d'avoir auparavant défini :
#define DROITE 1
#define GAUCHE 0
elles fonctionnent ainsi :
- allumer_moteur(DROITE); allume le moteur de droite et le laisse allumé
jusqu'à l'appel de la fonction eteindre_moteur(DROITE) (idem pour
GAUCHE).
- mesurer(DROITE) retourne la distance entre l'oeil droit et la balise (en m).
Donc l'instruction x=mesurer(DROITE) met dans x (qui doit être un
flottant) la distance mesurée (idem pour l'oeil gauche). Remarque :
même si la distance mesurée n'est pas parfaitement exacte, on
supposera qu'il y a la même erreur sur les deux capteurs, donc leur
valeur relative (l'une plus grande que l'autre) est considérée
comme fiable.
Le chariot est initialement placé à peu près en direction
de la balise. Vous devez faire un programme qui le déplace
jusqu'à la balise (on s'arrête quand on est à 20 cm de la
balise). Vous essayerez de vous déplacer le plus directement possible
(proche d'une droite). Pour éviter d'avancer en canard, on supposera que
quand les deux distances mesurées sont différentes de moins de 5
cm, on avance tout droit (vous pouvez proposer une autre solution).
1A) définissez l'algorithme (dites comment vous ferez) de la
manière qui vous convient le mieux (en français, pseudo C,
Grafcet, SADT, organigramme.....)
1B) écrivez le programme en C
Question 2 (subsidiaire) : on dispose également sur le chariot
d'un télémètre (visant droit devant) permettant de "voir"
s'il y a un obstacle devant le chariot, et de mesurer à quelle distance
il est. S'il y a un objet devant le chariot (à une distance
inférieure à celle de la balise bien évidement, mais
également inférieure à 1 m) le chariot essayera de le
contourner par la droite : il tourne vers la droite jusqu'à ne plus
avoir d'obstacle (toujours à moins d'un mètre) puis avance tout
en essayant d'aller à gauche sans rencontrer l'obstacle (au cas
où l'on arrive à moins de 20 cm de l'obstacle, on s'arrête
complètement). On supposera qu'il y a peu d'obstacles (toujours un
chemin possible) et que cette situation est rare (c'est à dire qu'on
accepte un parcours non optimal).
2) proposez un algorithme (en Pseudo C ou vrai C)
déplaçant le chariot en prenant en compte les obstacles
Question 3 : un chariot peut être considéré comme un
"ensemble" de composants et de fonctionnalités (il est composé de
deux moteurs qu'on peut allumer et éteindre, d'un
télémètre...). Pour cette question uniquement on suppose
que chaque moteur peut tourner dans les deux sens (soit pour reculer, soit pour
tourner plus efficacement)
3A) comment pourrait-on représenter un chariot à l'aide
d'objets C++ ? Définissez clairement ce qu'il doit y avoir dans les
classes (données et méthodes), écrivez proprement en C++
la déclaration de ces classes mais ne détaillez pas les
méthodes (dites juste en une phrase ce qu'elles font).
3B) est-ce utile d'utiliser des objets dans ce cas ?
Question 4 : Prolog peut permettre d'associer une fonction C à un
prédicat (si X est libre, X=mesurer(droite) met dans X la distance de
l'oeil droit à la balise, allumer_moteur(droite) est un prédicat
toujours vrai qui met le moteur de droite en marche...) On désire
gérer le déplacement du chariot avec un contournement des
obstacles un peu plus intelligent. On envisage ici la solution d'un programme
en prolog (avec utilisation de prédicats écrits en C)
4A) quels peuvent être les avantages (et inconvénients) d'une
telle gestion en Prolog ?
4B) quelles parties du problème traiteriez vous en C, et quelles en
Prolog ?
4C) donnez quelques exemples de règles que l'on pourrait
écrire (la syntaxe correspondant à un appel de fonction
écrite en C peut être approximative, je ne vous en tiendrai pas
rigueur)
4D) dites rapidement ce que vous pensez d'une solution utilisant un
système expert à règles d'inférence (moteur
d'ordre 0 écrit en C et donc permettant également l'appel de
fonctions spécifiques)
Question 5 : Oublions désormais la possibilité
d'obstacles. Le chariot est initialement placé dans une position et une
direction connue. On désire amener le chariot devant la balise dans une
direction donnée. Afin de minimiser les variations de rotation du
chariot (les rotations sont saccadées et génèrent, du fait
qu'elles restent parallèles, un glissement et une usure importante des
pneus, cf. le char d'assaut qui utilise également ce principe) on
désire utiliser une trajectoire parabolique (tangente à la
direction de départ et celle d'arrivée). Ceci minimisera les
variations de vitesse du CIR (centre instantané de rotation).
5) proposez une méthode (pas besoin de donner tous les
détails d'un algorithme).
Remarques générales : les questions peuvent être
traitées dans n'importe quel ordre (mais plutôt la 2 en dernier).
Il est impératif de prouver que vous maîtrisez plus d'un des
domaines abordés en cours.
P. TRAU, ULP-IPST, 20/3/97