1. But du jeu

Faire faire un tour de circuit à la voiture en un minimum de temps.

La voiture roule sur un circuit virtuel, simulée sur PC (et affichée sur le deuxième écran ou dans une fenêtre à part).
Elle est contrôlée par un programme écrit en langage C.

Un programme de contrôle "minimum" vous est fourni. Le travail consiste donc à modifier et/ou enrichir ce programme afin d'améliorer ses performances.

2. Principe du programme de contrôle de la voiture

Ce programme exécute en boucle infinie avec une régulation élémentaire consistant à mesurer la position de la voiture et à ajuster sa direction et pourquoi pas sa vitesse en conséquence.

La position est obtenue en mesurant (périphérique 'U'), via un télémètre laser (matérialisé par un trait rouge dans le simulateur), la distance de la voiture à un des murs bordant la route (par défaut le mur droit, mais cela peut-être changé (périphérique 'T').

La direction est ajustée en modifiant l'angle des roues avant (périphérique 'D'). La vitesse peut être ajustée en modifiant celle de la voiture (périphérique 'V').

Un certain nombre de repères sont positionnés sur le circuit. Le passage de la voiture sur ces repères génère des évènements que le programme peut intercepter afin d'ajuster le comportement de la voiture en conséquence (par exemple : ralentir à l'approche d'un virage, accélérer afin de passer un tremplin, etc..).

Trois circuits, de difficulté croissante sont proposés. Pour passer d'un circuit à l'autre appuyer sur la touche P.

3. Mode d'emploi

Le simulateur est déjà lancé (sur le deuxième écran - si ce n'est pas le cas, appeler un enseignant).

Le programme de contrôle est écrit, compilé et lancé sous l'environnement CodeBlocks, sur l'écran principal.

Dans un premier temps compilez et lancez le programme fourni par défaut :
  • cliquez sur le petit engrenage ("Build"), à droite de la 4eme rangée de la fenêtre CodeBlocks. Vérifiez (dans la fenêtre du bas) qu'il n'y a pas d'erreur de compilation
  • cliquez sur le petit triangle vert à coté ("Run"). Ceci doit ouvrir une console dans laquelle s'affichent les informations lues et écrites par le programme de contrôle. En parallèle, la voiture doit apparaître sur le circuit et commencer à rouler.

La voiture s'arrête automatiquement après un tour. Pour l'arrêter avant, tapez "q" dans la console du programme de contrôle.

Pour démarrer un nouveau tour :
  • tapez "q" dans la console pour la fermer
  • modifiez éventuellement le programme de contrôle, re-compilez le .
  • relancez le programme de contrôle (bouton "Run").

4. Fonctions utilisables dans le programme de contrôle

La voiture est contrôlée (respectivement observée) en écrivant (respectivement lisant) des données sur un certain nombre de "périphériques".
Chaque périphérique est identifié par une lettre.
La liste des périphériques, avec les données associées, est donnée en annexe 1.
La lecture d'un périphérique est assurée par la fonction remote_read(), l''écriture par la fonction remote_write().

Par exemple, pour la lire la vitesse de la voiture, on écrira :

vit = remote_read('V');

Pour forcer une valeur d'angle de roues :

remote_write('D', angle);

La fonction remote_nom() permet de donner un nom à la voiture.

La fonction Sleep(n) permet de faire une pause de n millisecondes.

Pour appeler une fonction "f" à chaque fois qu'un événement (généré par les capteurs de la voiture) se produit, il suffit d'écrire

void f(int ev){
...
}

int main(...){
...
event_callback = f;
...
}

La fonction recevra alors un entier indiquant le numéro de l'événement reçu. La liste des codes d'événement, avec leur signification est donnée en annexe 2.

La fonction printf() permet d'afficher un message dans la console.

La fonction touche_Q() renvoie 1 si la touche "q" ou "Q" a été pressée.

Les appels aux fonctions remote_init() et remote_close() n'ont normalement pas à être changés dans le programme de base.

5. Gestion des scores

Les meilleures performances (temps au tour, pour chaque circuit) sont automatiquement transmises à un serveur, avec le nom associé à la voiture (n'oubliez donc pas de renseignez celui-ci avec la fonction remote_nom()).

* Annexe 1 - code et signification des périphériques *

  • 'V' : Vitesse du moteur (0-100)
  • 'D' : Angle de braquage des roues avant en 1/10° de degré (10 -> 1∞)
  • 'T' : Azimut de la tourelle du télémètre en 1/10°
  • 'R' : Lecture de l'Azimuth de la tourelle en 1/10°
  • 'U' : Distance mesure par le télémètre en 1/100 de mètre (en cm)
  • 'X' : Position absolue X en cm
  • 'Y' : Position absolue Y en cm
  • 'Z' : Position absolue Z en cm
  • 'N' : Numéro de la voiture (en fonction de l'ordre de connection)
  • 'E' : Lecture des evènements (cf Annexe 2)
  • 'H' : Donne le temps de course actuel
  • 'S' : Temps du tour précédent
  • 'I' : Defini le nom du vehicule lettre par lettre
  • 'M' : Mode de course :
    • 8 bits de poids fort: 1 Attente, 2 course, 3 essais libres)
    • 8 bits de poids faible : numero de piste
  • 'C' : Informations sur le dernier capteur touché :
    • 8 bits de poids faible : numéro du capteur
    • 8 bits de poids fort : couleur ('R','J' ou 'V')
  • 'K' : Téléportation de la voiture sur le troncon de piste N
    • (correspondant au capteur vert numero N).
    • Attention : à n'utiliser que pour des tests car les scores sont invalidés !

* Annexe 2 - code et signification des évènements *

Chaque événement est codé sur un bit d'un registre en contenant 16.

  • Bit 0 : Point de passage Vert, remis à zéro lors de la lecture du périphérique 'C'
  • 1 : Point de passage Jaune, remis à zéro lors de la lecture du périphérique 'C'
  • 2 : Point de passage Rouge, remis à zéro lors de la lecture du périphérique 'C'
  • 3-6 : non utilisés
  • 7 : Point de passage course (vert), remis à zéro lors de la lecture du périphérique 'C'
  • 8 : La piste à changé , remis à zéro lors de la lecture du périphérique 'M'
  • 9 : Le mode de course a changé , remis à zéro lors de la lecture du périphérique 'M'
  • 10 : Début de la course , remis à zéro au changement du mode de course.
  • 11 : Le dernier point de passage est atteint la course est finie , remis à zéro au changement du mode de course.
  • 12 : La voiture est sortie de la piste.
  • 13 : Utilisation de la fonction de téléportation. Classement Invalidé. Remis à zero au changement de piste ou du mode de course.
  • 14 : Faux départ -> destruction de la voiture , remise à zéro au changement du mode de course.
  • 15 : Collision avec le sol, Remise à zéro au changement de piste.

build.JPG (1.1 KB) Jacques LAFFONT, 03/06/2012 06:20 PM

run.jpg (968 Bytes) Jacques LAFFONT, 03/06/2012 06:21 PM

out.jpg (123 KB) Jacques LAFFONT, 03/06/2012 09:15 PM

out.png (109 KB) Jacques LAFFONT, 03/06/2012 09:21 PM

cb.PNG (57.5 KB) Jacques LAFFONT, 03/06/2012 09:24 PM

voiture2.JPG (51.1 KB) Jacques LAFFONT, 03/07/2012 04:18 PM