Upload
vanthien
View
234
Download
0
Embed Size (px)
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