Vous devez programmer le \l;robot\u object\bottr; d'entraεnement pour suivre la caisse d'explosifs, mais sans la toucher, car elle est trΦs fragile. Chaque fois que la caisse s'arrΩte 2 secondes, vous devez Ωtre α proximitΘ immΘdiate (moins de 10 mΦtres). AprΦs 10 arrΩts, la caisse s'approche de la plate-forme d'arrivΘe, pous vous y ammener.
A chaque arrΩt, la caisse vΘrifie que vous Ωtes bien lα. Si ce n'est pas le cas, le compteur est remis α zΘro. Vous devez donc rΘussir 10 fois consΘcutives !
\b;Principe
RΘpΘter α l'infini :
o Chercher la caisse.
o Calculer la distance jusqu'α la caisse.
o Si cette distance est plus petite que 5 mΦtres, reculer.
o Sinon, calculer la direction de la caisse et s'y diriger.
La boucle infinie s'effectue avec un traditionnel \c;\l;while\u cbot\while;( true )\n;.
\s;\c;while ( true )
\s;{
\s; \n;instructions α rΘpΘter ...\c;
\s;}
\n;
La recherche de la caisse se fait dans toutes les directions, avec \c;\l;radar\u cbot\radar;\n; :
\s;\c; target = radar(TargetBot);
\n;
Normalement, la caisse est toujours trouvΘe. Vous pouvez Θventuellement ajouter un test \c;\l;if\u cbot\if;\n; pour stopper le \l;robot\u object\bottr; et quitter le programme si la caisse n'est plus lα, mais cela devrait Ωtre inutile :
\s;\c;if ( target == null )
\s;{
\s; motor(0, 0); // stoppe
\s; break; // plus rien α faire
\s;}
\n;
Le calcul de la distance jusqu'α la caisse utilise l'instruction \c;\l;distance\u cbot\dist;(p1, p2)\n;. Cette instruction retourne la distance entre deux points \c;p1\n; et \c;p2\n;. Le premier point sera ici la position du \l;robot\u object\bottr;, obtenue simplement avec \c;pos\n;. La position de la caisse est obtenue α travers la description de l'objet \c;target\n; avec l'expression \c;target.position\n;.
\s;\c;len = distance(pos, target.position);
\n;
Si la distance est infΘrieure α 5 mΦtres, il faut reculer d'une vitesse proportionnelle α la distance. Plus la distance est petite, plus il faut reculer vivement.
Distance = 5.0 mΦtres -> vitesse = 0.0
Distance = 2.5 mΦtres -> vitesse = -0.5
Distance = 0.0 mΦtres -> vitesse = -1.0
Ceci s'obtient trΦs simplement avec l'\l;expression\u cbot\expr; \c;distance/5-1\n;. Donc, avec un \c;\l;if\u cbot\if;\n; :
\s;\c;if ( len < 5 ) // trop proche ?
\s;{
\s; motor(len/5-1, len/5-1); // recule
\s;}
\n;
Si la distance dΘpasse 5 mΦtres, on avance en direction de la caisse en calculant l'angle avec \c;\l;direction\u cbot\direct;\n;.
\s;\c;else
\s;{
\s; dir = direction(target.position);
\s; if ( dir >= 0 ) // α droite ?
\s; {
\s; motor(1, 1-dir/90);
\s; }
\s; else // α gauche ?
\s; {
\s; \n;α vous de trouver ...\c;
\s; }
\s;}
\n;
Lorsque la caisse est α gauche, \c;dir\n; est positif, compris entre 0 et 180 degrΘs. L'\l;expression\u cbot\expr; \c;1-dir/90\n; donne une vitesse comprise entre 1 et -1, selon la direction.
direction = 0 -> vitesse = 1.0
direction = 45 -> vitesse = 0.5
direction = 90 -> vitesse = 0.0
direction = 135 -> vitesse = -0.5
direction = 180 -> vitesse = -1.0
\image radar2 14 10;
Lorsque la caisse est α droite, \c;dir\n; est nΘgatif, compris entre 0 et -180 degrΘs.
\b;└ vous de jouer
Pour que ce programme fonctionne, il faut encore dΘclarer toutes les \l;variables\u cbot\var; utilisΘes.
\c;target\n; est de type \c;object\n;, alors que \c;dir\n; et \c;len\n; sont de type \c;float\n;.
\key;\key help;\norm; permet de revoir ces instructions en tout temps !
\t;Voir aussi
\l;Commandes\u command; et \l;programmation\u cbot;.