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 : 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).
trajectoire

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