Cours 3 : Stratégie Radar - guigue/wikihomepage/uploads/Course/LI260_2013... · Pbs divers Radar...

Preview:

Citation preview

Pbs divers Radar Stratégies composites Simulateur de référence

Cours 3 : Stratégie Radar

Vincent GuigueUPMC - LIP6

Vincent Guigue LI260 - Course de Voiture 1/28

Pbs divers Radar Stratégies composites Simulateur de référence

Problème : matrice vs image

Proposition :◦ Notre référence : la matrice de terrain

- Ne pas modifier les directions proposées jusqu’ici- Image = simple représentation

Herbe Route Route Route

Herbe

Herbe

Herbe Route

RouteHerbe

Matrice de Terrain

I

J I

J

Direction = (0,1)

Vincent Guigue LI260 - Course de Voiture 2/28

Pbs divers Radar Stratégies composites Simulateur de référence

Solution basique

Synchronisation basique des indices :◦ Dès que je dois afficher qqch en (i,j) ⇒ je change le pixel (i,j)

1 pub l i c s t a t i c Buf f e r ed Image imageFromCi r cu i t ( C i r c u i t t r a c k ) {2 Buf f e r ed Image im =3 new Buf f e r ed Image (track.getHeight(), track.getWidth() ,4 Buf f e r ed Image .TYPE_4BYTE_ABGR) ;56 f o r ( i n t i =0; i<t r a c k . g e tHe i gh t ( ) ; i++)7 f o r ( i n t j =0; j<t r a c k . getWidth ( ) ; j++)8 im . setRGB (i, j , terra inToRGB ( t r a c k . g e tT e r r a i n ( i, j ) ) ) ;9

10 re tu rn im ;11 }

Vincent Guigue LI260 - Course de Voiture 3/28

Pbs divers Radar Stratégies composites Simulateur de référence

Affichage inversé1 Ar r a yL i s t <Commande> coms = new Ar r a yL i s t <Commande>() ;2 f o r ( i n t i =0; i <50; i++) coms . add (new Commande ( 1 , 0 ) ) ;3 // a c c e l a fond4 f o r ( i n t i =0; i <50; i++) coms . add (new Commande ( 1 , 0 . 1 ) ) ;5 // a c c e l a fond + r o t a t i o n p o s i t i v e6 f o r ( i n t i =0; i <50; i++) coms . add (new Commande ( 1 , 0 ) ) ;7 // a c c e l a fond8 f o r ( i n t i =0; i <50; i++) coms . add (new Commande (1 , −0 .1 ) ) ;9 // a c c e l a fond + r o t a t i o n n é g a t i v e

101112 p o s i t i o n : ( 581 . 0 , 719 . 019002 )13 p o s i t i o n : (581 .0 , 719 .056967996)14 p o s i t i o n : (581 .0 ,719 .113860060008)

Vincent Guigue LI260 - Course de Voiture 4/28

Pbs divers Radar Stratégies composites Simulateur de référence

Explication

◦ Coté modèle, je bouge de (0,1) ⇒ je change de colonne (versla droite dans la matrice)◦ Coté image, je change le pixel (i,j+1)◦ Dans le repère image, cela signifie :

- Abscisse x=i inchangée- Ordonnée y=j+1 ⇒ plus bas

◦ Sur les commandes passées :- Rotation vers la gauche (trigo), sur un exemple :- Un vecteur (0,1) devient (-EPS, 1-EPS) Application directe dela matrice de rotation

- Sur l’image BAS ⇒ BAS légèrement à droite

Vincent Guigue LI260 - Course de Voiture 5/28

Pbs divers Radar Stratégies composites Simulateur de référence

Corrections automatiques Eclipse

◦ Lorsque anomalie (Exception) est détectée- Fichier absent- Commande impossible- ...

◦ A vous de définir le comportement adéquat- Affichage erreur + retour null (éventuellement)

· Pas très propre...- Délégation au niveau supérieur

· Plutot une bonne idée

◦ Remplacement de la valeur manquante par une valeur pardéfaut

- Intéressant mais dangereux (bug incompréhensible souventcréé)

Vincent Guigue LI260 - Course de Voiture 6/28

Pbs divers Radar Stratégies composites Simulateur de référence

Eclipse

◦ Import- Vérifier toujours (même rapidement) la solution proposée- S’il y a plusieurs possibilités d’import (plusieurs classeshomonymes) : l’ordre des propositions n’est pas intelligent

◦ Proposition de cast, proposition de création de variable- Fiable à 80/90

◦ Utiliser les générateurs de code automatique- Bonne chose : cela évite les petites fautes bêtes qui sont duresà débugger

Vincent Guigue LI260 - Course de Voiture 7/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : Fonctionnement

PrincipeLe radar permet de se diriger à la manière d’un sous-marin, enenvoyant des échos dans différentes directions.

P

Ensemble des faisceaux

Vincent Guigue LI260 - Course de Voiture 8/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : un peu plus de détails

◦ Partir de la voiture◦ Dans la direction D

◦ Avancer d’un pas EPS◦ Recommencer tant qu’il n’y

a pas d’obstacle◦ Renvoyer le nombre de pas

effectuésAppliquer une rotation sur D etrecommencer

P

Ensemble des faisceaux

8 pas jusqu'à l'herbe

Vincent Guigue LI260 - Course de Voiture 9/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : Cahier des charges

◦ Interface de définition d’un radar- Obtenir les scores de chaque brancheNB : score le plus grand = le meilleur

- Connaître la distance associée à chaque branche- Obtenir la meilleure branche- Récupérer les angles associés à chaque branche

1 pub l i c i n t e r f a c e Radar {2 pub l i c double [ ] s c o r e s ( ) ; // s c o r e de chaque branche3 pub l i c double [ ] d i s t a n c e s I n P i x e l s ( ) ; // pour l ’ o b s e r v e r4 pub l i c i n t ge tBe s t I nd e x ( ) ; // m e i l l e u r i n d i c e5 pub l i c double [ ] t h e t a s ( ) ; // a ng l e s de chaque f a i s c e a u6 }

Vincent Guigue LI260 - Course de Voiture 10/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : conseils d’implémentation

◦ Donner au constructeur :- le faisceau d’angles- la voiture- le circuit

◦ Commencer à implémenter la méthode :public double[] scores() qui délègue la partie de calculd’un faisceau à :private double calcScore(double angle)

Vincent Guigue LI260 - Course de Voiture 11/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : algorithme de baseData: Voiture v, Circuit c, EPSILONResult: cpt (score, plus c’est grand, plus c’est intéressant)begin

P ←− v .position;D ←− v .direction;cpt ←− 0 ;while Cicuirt.getTerrain(P) != Herbe && P dans le circuit do

cpt++;P ←− P + D ∗ EPSILON

endend

P

Ensemble des faisceaux

8 pas jusqu'à l'herbe

Vincent Guigue LI260 - Course de Voiture 12/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : Piège d’implémentation

Attention aux copies de surfaces ! ! !

◦ Suivant les implémentations précédentes, on retourne parfoisdirectement la position/direction de la voiture... Gare auxmodifications !◦ Même phénomène avec le point de départ du circuit dans la

voiture

Vincent Guigue LI260 - Course de Voiture 13/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : piège géométriqueIl ne faut pas prendre EPSILON trop petit : temps de calcul...Il ne faut pas prendre EPSILON trop grand :

P

8 pas jusqu'à l'herbe

Ensemble des faisceaux

Vincent Guigue LI260 - Course de Voiture 14/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : piège géométrique

Erreur classique :1 double d = rada r . t h e t a ( ) [ 3 ] ;2 Commande c = new Commande( acc , d ) ;

Attention :la commande n’accepte pas un angle mais un pourcentage debraquage :◦ Pour tourner d’un angle alpha quelle commande fournir ?◦ Comment faire si la commande est <-1 ou >1 ?

Règle d’or : toujours BIEN comprendre ce que vous êtes en train defaire

Vincent Guigue LI260 - Course de Voiture 15/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : Stratégie

Un radar n’est pas une stratégie... Il faut (par exemple) un systèmeexpert :

◦ Si le faisceau le plus long est ... alors la commande est ...◦ Si ...◦ ...

NB : la meilleure solution n’est pas la même pour tous les circuits.

Vincent Guigue LI260 - Course de Voiture 16/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : Stratégie & architecture

ParamétrageLes paramètres doivent être fixés par le Main de manière générale...Et pour le radar en particulier !

Rôle du main :1 Définition des paramètres2 Définition Voiture, Circuit...3 Création du radar (à partir du faisceau, Voiture, Circuit)4 Création de la stratégie (à partir du radar)

Serialization◦ Si vos stratégies sont Serializable... Vos radars doivent l’être

aussi !◦ Ca commence à devenir intéressant pour garder la trace des

meilleures courses...

Vincent Guigue LI260 - Course de Voiture 17/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radar : limites

Le radar, ça marche bien, mais pas tout le temps...

Vincent Guigue LI260 - Course de Voiture 18/28

Pbs divers Radar Stratégies composites Simulateur de référence

Radars multiples ?

Question recurrente :Est il possible d’avoir plusieurs radars ?

Oui, mais le plus souvent on préfère avoir des stratégies multiples...On parle alors d’objet composite.

Commande + Commande getCommande()

Strategy <<INT>>Génère

+ Commande getCommande()- ArrayList<Strategy> liste

StrategyComposite

La StrategyCompositeest composée de Strategy

La StrategyCompositeest une Strategy

Vincent Guigue LI260 - Course de Voiture 19/28

Pbs divers Radar Stratégies composites Simulateur de référence

Dans le détail

◦ La stratégie complexe EST UNE Strategy◦ Elle contient une liste de Strategy + une méthode

add(Strategy)◦ Lorsque l’on fait appel à getCommande()

- Etape 1 : sélection de la meilleure stratégie pour le cas présent- Etape 2 : appel de getCommande() de la meilleure stratégie

◦ Exemple : gestion de la ligne d’arrivéeLa stratégie complexe contient

- StrategyRadar- StrategyFinCourse (si un point de la ligne d’arrivée est visibledepuis la voiture)

Vincent Guigue LI260 - Course de Voiture 20/28

Pbs divers Radar Stratégies composites Simulateur de référence

Comment choisir la bonne stratégie ?

Introduction d’un nouvel objet pour conserver une architectureélégante : le Selector

1 pub l i c i n t e r f a c e S e l e c t o r {2 pub l i c boolean i s S e l e c t e d ( ) ;3 }

La Strategy complexe devient simple ( !)◦ Une liste de Strategy◦ Une liste de Selector◦ On renvoie la première stratégie sélectionnée

Vincent Guigue LI260 - Course de Voiture 21/28

Pbs divers Radar Stratégies composites Simulateur de référence

Sur un exemple

◦ Stratégie 1 : aller vers l’arrivée la plus proche- (Implémentation libre)

◦ Selector 1 : Si un point de la ligne d’arrivée est visible ⇒ true- Pour chaque point d’arrivée : Tester la visibilité

◦ Stratégie 2 : stratégie radar classique◦ Selector 2 : DefaultSelector

- Toujours trueSi les stratégies précédente ont échouée, on fait ça

Autres possibilités :◦ appliquer différentes stratégies pour différentes portions de

circuit◦ détecter les virages en avance◦ ...

Vincent Guigue LI260 - Course de Voiture 22/28

Pbs divers Radar Stratégies composites Simulateur de référence

Implémentation (proposition)

1 pub l i c c l a s s S t r a t e g y S e l e c t o r implements S t r a t e g y {// C ’ e s t une s t r a t é g i e !2 p r i v a t e Ar r a yL i s t <St ra t egy > l i S t r a t e g y ; // Tout a b s t r a i t !3 p r i v a t e Ar r a yL i s t <Se l e c t o r > l i S e l e c t ;45 pub l i c S t r a t e g y S e l e c t o r ( ){6 l i S t r a t e g y = new Ar r a yL i s t <St ra t egy >() ;7 l i S e l e c t = new Ar r a yL i s t <Se l e c t o r >() ;8 }9

10 // P l u t o t s é c u r i s é : on e s t s u r qu ’ i l y a concordance11 pub l i c vo id add ( S t r a t e g y s t r , S e l e c t o r s e l e c t ){12 l i S t r a t e g y . add ( s t r ) ; l i S e l e c t . add ( s e l e c t ) ;13 }1415 pub l i c Commande getCommande ( ) {16 f o r ( i n t i =0; i<l i S t r a t e g y . s i z e ( ) ; i ++){17 i f ( l i S e l e c t . ge t ( i ) . i s S e l e c t e d ( ) )18 re tu rn l i S t r a t e g y . ge t ( i ) . getCommande ( ) ;19 }20 // normalement on ne pa s s e pas i c i . . .21 re tu rn l i S t r a t e g y . ge t ( l i S t r a t e g y . s i z e () −1) . getCommande ( ) ;22 }2324 } Vincent Guigue LI260 - Course de Voiture 23/28

Pbs divers Radar Stratégies composites Simulateur de référence

Simulateur de référence

Vous pouvez maintenant jouer des courses... Commençons àcomparer les performances !

◦ Téléchargeable sur le site, lien compétition◦ Usage : le simulateur s’utilise avec 2 argumentsjava -jar simulateur.jar li260/track/1_safe.trkli260/tcoms/1_safe.com

- le fichier circuit- le fichier de commandes- Le fichier de commandes doit être normalisé

Vincent Guigue LI260 - Course de Voiture 24/28

Pbs divers Radar Stratégies composites Simulateur de référence

Fichier de commandes normalisé

Code pour générer un fichier standard compatible :1 pub l i c s t a t i c vo id saveListeCommande ( A r r a yL i s t <Commande> l i s t e ,2 S t r i n g f i l e n ame ){3 t r y {4 DataOutputStream os =5 new DataOutputStream (new F i l eOutputSt r eam ( f i l e n ame ) ) ;6 f o r (Commande c : l i s t e ){7 os . w r i t eDoub l e ( c . getAcc ( ) ) ;8 os . w r i t eDoub l e ( c . getTurn ( ) ) ;9 }

10 os . c l o s e ( ) ;11 } catch ( IOExcept i on e ) {12 e . p r i n t S t a c kT r a c e ( ) ;13 }14 }

Vincent Guigue LI260 - Course de Voiture 25/28

Pbs divers Radar Stratégies composites Simulateur de référence

Simulateur en ligne

◦ Une fois que tout est au point, vous pouvez passer ausimulateur en ligne :◦ Login = votre prénom, Password = numéro étudiant

Vincent Guigue LI260 - Course de Voiture 26/28

Pbs divers Radar Stratégies composites Simulateur de référence

Simulateur en ligne (2)

NB : il faut avoir un score sur le circuit 1 pour débloquer l’affichagede votre ligneSeul le meilleur score est conservé pour chaque personne et chaquecircuit

Vincent Guigue LI260 - Course de Voiture 27/28

Pbs divers Radar Stratégies composites Simulateur de référence

Conduite sans dérapage

Rappel :Dans un premier temps, ne pas implémenter le dérapage, il seratoujours temps de le remettre après...

◦ Ne pas modifier Voiture◦ Simplifier VoitureImpl (avec une éventuellement une exception)◦ Rendre vos stratégies robustes...

1 // m e i l l e u r f a i s c e a u2 i n t i n d e xBe s tFa i s c e au = rada r . g e tBe s t I nd e x ( ) ;3 // commande a s s o c i é e4 Commande c = al lCom [ i n d e xBe s tFa i s c e au ] ;5 // c o r r e c t i o n de l a commande pour é v i t e r l e dé rapage6 double turnAbs = Math . min ( Math . abs ( c . getTurn ( ) ) ,7 ca r . getMaxTurnSansDerapage ( ) ) ;89 re tu rn new Commande( c . getAcc ( ) , turnAbs ∗ Math . signum ( c . getTurn ( ) ) ) ;

Vincent Guigue LI260 - Course de Voiture 28/28