Sur les agissements non délictueux
d'un simulateur de billard
se comportant de bonne manière

 

Avertissement

A travers ce petit document, vous verrez comment j'ai implementé ce qui me semble être le point le plus délicat de la modélisation du billard. Le traitement des chocs sur les bandes.

Je ne reviendrai pas sur les multiples essais qui ont conduit à cette façon de faire, et c'est dommage. Car a mon avis il y a plus a apprendre des tentatives et des erreurs, que d'une solution toute faite. Mais ce serait long, car il y a eu pas mal de tentatives, et c'est très difficile de raconter sans réécrire l'histoire.

Ceci dit, la solution que je présente par la suite est une des solutions possibles. Les équations de la physique concernant les frottements sont bien établies, et ce depuis longtemps. Et cela n'empêche pas que les codes de calcul pour, par exemple des simulations de mécanismes industriels, sont très nombreux, très différents, et très complexes.

Je vais tenter par la suite de montrer une solution. Plus exactement une des modélisations possibles. L'avantage de cette solution tient dans sa simplicité. Et, je l'espère, dans son élégance. En plus, la façon de faire peut être facilement généralisée à d'autres problèmes.

Mais, patience...
 
 

Modélisation

En fait, une part très importante du travail des personnes qui ont à leur disposition de la physique, des moyens de calcul et un problème à résoudre, est la modélisation.

Dans notre cas, modéliser le choc sur une bande, c'est d'abord, choisir la géométrie des objets. Pour la bille, pas de problèmes, on la prendra ronde. Pour la bande, plusieurs choix s'offrent à nous.
 
 

C'est vrai, quelque chose qui ressemble à la figure de droite est, a première vue "intellectuellement" plus satisfaisant.

Mais, si vous partagez (déjà) mon point de vue, vous allez espérer que la solution de gauche suffit pour reproduire le phénomène étudié. Premièrement, parce que cela sera plus simple à programmer, et surtout, parce que cela permet de comprendre plus facilement ce qui se passe.

Une des raisons pour lesquelles les bandes ont une forme " plus complexe " dans la réalité est sans doute qu'elles doivent éviter autant que faire se peut que les billes ne sortent du billard. Une autre est certainement liée à la fabrication même des bandes.

En tout cas, si c'est cela la raison principale, alors on dispose d'un superbe moyen pour restituer ce phénomène. Maintenir une vitesse verticale nulle. L'étape suivante, que j'ai franchi allègrement, et de ne pas considérer du tout la composante en Z. La solution la plus simple. Non pas celle qui assure les calculs les plus simples, mais celle qui contraint le plus, ou qui restreint le plus le problème. Et souvent, plus les contraintes sont fortes, plus la résolution est facile.

Au passage, on ne se rend compte de ce fait: les solutions les plus simples sont souvent les meilleures, qu'en essayant. Donc: partir du plus simple vers le plus complexe est une démarche raisonnable. La démarche inverse me semble malsaine, tout au moins quand on fait de telles choses pour ses loisirs...

A chaque étape, ou changement de modèle, il est prudent de vérifier que c'est mieux qu'avant. Il arrive quasiment toujours un moment où c'est pire que dans la version précédente. La, il faut appliquer la stratégie du serrage optimal. "serrer jusqu'à ce que ca pète, et desserrer d'un quart de tour.".

Pour notre problème de bandes, c'est la solution de gauche que j'ai adopte. Et je revendique ce choix doublement, car j'ai essaye de relever le point I, et la différence de comportement n'est pas sensible. Même en exagérant.

C'est d'ailleurs la une autre règle de base de la simulation. Pour vérifier l'importance des paramètres ou des choix dans les modèles, il est important de se donner la possibilité de faire varier ses paramètres. Quitte à les exagérer.

Par exemple, il faut essayer des bandes très très absorbantes, qui ne rebondissent pas, qui frottent beaucoup, qui ne frottent pas du tout...

Premièrement, c'est plaisant, ensuite, cela permet parfois de se rendre compte que l'on a passé un temps fou à programmer quelque chose qui ne sert à rien. Ca arrive. Une façon de faire que cela n'arrive jamais, c'est de ne pas faire ce genre de tests? La encore, à déconseiller si on fait de telles choses pour occuper ses loisirs.
 
 
 
 

Calcul de la force de frottement.

 

 
 
 
 

Rappel des conventions de repère.

    La bande est orientée selon l'axe Ox
    La normale à la bande est selon l'axe Oy
    L'axe Z est dirige de haut en bas, verticalement.
 

Calculons tout d'abord la vitesse Vi du point I appartenant à la bille au contact de la bande.

Ce point est un point lie a la bille. La vitesse de ce point dans le référentiel lie à la bande va nous indiquer si il y a frottement (Vi diffèrent de 0), et va nous renseigner sur le sens de la force de frottement (oppose à la direction de glissement).

Omega est ici la vitesse de rotation de la bille. Ce vecteur nous donne par sa direction, l'axe de rotation de la bille, et son intensité nous renseigne sur la vitesse de rotation de la bille.
 

soit

Dans notre cas, seules les composantes de Vi dans le plan (I,y,z) contribuent au frottement. Au moment du contact, la composante Viy est nulle. On peut donc par la suite considérer que:


 
 

Pour calculer la force de frottement, il nous faut :

    Le coefficient de frottement
    La force avec laquelle les objets s'appuient l'un sur l'autre.
 

Le coefficient de frottement va nous donner l'angle forme par la réaction de la bande sur la bille, par rapport à la normale a la bande. Par contre, le calcul de l'intensité de la force nous amène à calculer une sorte de force d'appui de la bille sur la bande.

Ainsi, le calcul du frottement sur la bande ressemble au calcul de la force de frottement d'une bille qui glisse sur le tapis. Chose qui n'est pas très compliquée.

Pourtant, lorsque la bille glisse sur le tapis, la force d'appui reste constante dans le temps. C'est son poids.

Ici, on est face à un problème, car on est dans un cas de choc, et on ignore souvent ce qui se passe pendant un choc, même si on est capable de bien prédire ce qui va se passer après, connaissant les conditions d'avant le choc.
 
 

Donc, de quelle information dispose t-on ?

        De la vitesse initiale de translation de la bille.
        De la vitesse initiale de rotation de la bille.
        De données physiques sur la bande qui sont :
            Son coefficient de frottement (bande/bille)
            Son coefficient de restitution.

(le coefficient de restitution nous informe sur le comportement de la bande au cours d'un choc. Si il est nul, alors le choc est mou. (bande en guimauve?).
S'il est égal à 1, alors il n'y a pas de perte lors du choc. (c'est presque le cas des chocs entre billes.)
 
 

Quelle sont les informations que l'on souhaite calculer ?

        La vitesse de translation après le choc
        La vitesse de rotation après le choc
 
 

Le principe fondamental de la physique (2em loi de Newton) nous permet de calculer la force nécessaire pour modifier la quantité de mouvement d'un objet. Cette loi s'écrit:

P est ici une grandeur vectorielle (F et V aussi) qui se nomme quantité de mouvement.

(A noter, cette équation vectorielle est équivalente à 3 équations scalaires. Une sur chaque axe. Ainsi, on peut écrire que Fx = m d(Vx)/dt )

En d'autres termes, on sait que si la vitesse V d'un corps varie de V0 à V1 (sa masse restant constante) pendant un instant Dt, alors tout se passe comme si le corps avait été soumis à une force F = m (V1-V0)/ D t pendant cette même période.
 
 
 

Le tour semble joué.

On connaît la composante normale de la vitesse avant et après le choc (via le coefficient de restitution).

On connaît donc la force d'appui de la bille. Enfin, presque. Car on ne connaît pas le temps pendant lequel s'applique cette force. On sait simplement que c'est très court.

Mais il reste encore un autre aspect délicat.

Pendant ce temps très court, rien ne nous garantie qu'il n'y aura pas changement de nature du phénomène.

Imaginons quelqu'un qui freine très fort en voiture et qui perd 30km/h par seconde. Sa vitesse est de 55km/h, a t=0, et on décide de faire le calcul toutes les secondes. Pendant la première seconde, sa vitesse chute de 55 a 25 km/h. Mais pendant la seconde, la vitesse ne passe pas de 25km/h vers l'avant a 5km/h vers l'arrière?

On a eu un changement de nature du phénomène dans l'intervalle de temps durant lequel on considère des grandeurs constantes.

Dans notre cas, nous devrons être à même de distinguer 2 cas. Frottement ou pas frottement. Et il se peut que le frottement cesse en cours de choc.

Par exemple, une bille lancée avec très peu d'effet contraire sur une bande, dans un premier temps va voir sa rotation diminuer. Jusqu'à s'annuler. Et enfin, prendre de l'effet dans l'autre sens.

On ne pourra jamais simuler cela si on considère la force d'appui et la vitesse du point I constantes au cours du choc.
 
 

Quand on désire "voir" et détecter des changements de nature de cette sorte, il est usuel de décomposer les phénomènes, et de "discretiser".

Ici, l'idée première qui vient est de discretiser le phénomène en temps. Soit de diviser le Delta T en quantités plus petites encore. Mais, on ne connaît même pas la valeur d'un Delta T raisonnable, et quand bien même, on ne connaît la force d'appui qu'en fonction de ce Delta T. Les seules connaissances sont: bien avant le choc, et bien après le choc. Et encore, on ne connaît que quelques valeurs après le choc.

Il faut chercher autre chose.
 
 
 
 

Discretisation

Discretiser. C'est "découper" en éléments plus petits. Couper un gros volume en volumes plus petits, couper le temps en tranches. Couper une fonction en une somme de fonctions simples (comme on fait avec la transformée de Fourier)?

Un calcul complexe devient alors parfois une suite de petits calculs simples. Ou un calcul impossible une suite de calculs complexes?
 

Ici, que peut-on discretiser, quelle est l'entité qui va nous permettre de mener à bien nos calculs.

La variation de quantité de mouvement.

On sait qu'avant le choc, la vitesse normale est Vy, et qu'après le choc, cette vitesse est (-Vy*CoeffRestitution). La quantité de mouvement selon l'axe normal a la bande varie dont de (1+CoeffRestitution)*Vy*m. La masse m de la bille est constante, on peut donc raisonner sur une discrétisation de la vitesse.
 
 

On va donc discretiser cette variation de vitesse.
 
 

Schéma numérique.

Le calcul va être conduit de la façon suivante:

        Calcul du pas de discretisation. Soit dVy
            Pour Vy variant de Vy(initial) -> Vy(final)
                Calcul de Vi
                Si il y a frottement (Vi non nulle)
                        Calcul de la force d'appui apparente
                        Calcul de la force de frottement
            Mise à jour des vitesses de la bille  (de translation et de rotation)
        Fin Pour
 

Ceci ressemble à s'y méprendre à la gestion d'une série de petits rebonds, dans lesquels la variation de vitesse Vy est fixée.
 
 

Avantages Inconvénients

Cette démarche possède quelques avantages et désavantages liée aux méthodes de résolution où on discretise quelque chose qui n'est pas très "parlant". En particulier, quel doit être le pas. Est-ce que ce pas doit être par exemple 1/100 de la variation totale, ou alors quelque chose du style le max entre 1/100 et une valeur prédéfinie.

Par contre, ce choix n intervient que peu dans l organisation des calculs. On peut donc remettre à plus tard cette question.
 
 

Equations. Bilan

 

Calcul de la force de frottement.


avec Fapp la force d'appui apparente

Vi la vitesse du point de contact I, appartenant à la bille.

f' le coefficient de frottement.

l'expression de Vi et Fapp s'expriment :
 
 

oú dVy est tel que :


 
 
 

Calcul des nouvelles vitesses


Si on note nV et nW les nouvelles valeurs de V et W après un pas de calcul,

alors :

J est ici le moment d'inertie d'une sphère homogène, soit


 
 
 

Programmation.


Voici à quoi ressemble le bout de programme qui traite du choc sur la bande du haut, avec les conventions vues précédemment, écrit en langage de description. J'espère que vous n'aurez pas de problèmes pour établir la correspondance entre ce bout de code et les formules précédentes.
 

Les constantes du programme sont, avec leurs valeurs par défaut (Ce sont des valeurs qui conviennent pas trop mal, et sur lesquelles j'ai procédé à pas mal de changements. Aujourd'hui, je n'y touche plus trop, car je pense avoir atteint une version "stabilisée". ):
 
 
 
 

RESTITUTION_BANDE = 0.98
DISCRETISATION_VITESSE = 100
RAYON_BILLE = 0.0305 (3,05 cm)
LIMITE_Vi_NULLE = 0.025
FROTT = 0.23

CalculChocBande(EntreesSorties Vx,Vy,OmegaX,OmegaY,OmegaZ)

Début

DVy = -(1+RESTITUTION_BANDE)*Vy
DVy = DVy/DISCRETISATION_VITESSE
Pour i=0 jusqu a (DISCRETISATION_VITESSE-1)
/* Calcul de la vitesse de glissement */
Vxi=Vx+RAYON_BILLE*OmegaZ
Vyi=0
Vzi=-RAYON_BILLE*OmegaX
/* et de la norme de la vitesse de glissement */
NormeVi=Sqrt(Vxi*Vxi+Vzi*Vzi)
Si i=0
/* On sauvegarde la vitesse de glissement initiale
pour détecter un éventuel changement de sens */
SVxi=Vxi
SVyi=Vyi
Sinon
Si (NormeVi < LIMITE_Vi_NULLE)
Ou
Si (SVxi*Vxi+SVzi*Vzi <=0)
/* On est dans le cas ou la vitesse de glissement
devient nulle ou alors change de sens */
NormeVi=0;
SVxi=SVyi=0;
FinSi
FinSinon
Si (Nvi>1e-8)
/* Si la norme de Vi est plus petite, alors on
risque de faire des erreurs si on livre a ces
calculs? */
DOmegaX=-2.5*FROTT*Dvy*OmegaX/NormeVi
DOmegaZ=-2.5*FROTT*(Vx/RAYON_BILLE+OmegaZ)/NormeVi
DVx=-FROTT*(Vx+RAYON_BILLE*OmegaZ)
*DVy/NormeV
Sinon
/* La norme de Vi est si faible que tout se passe
comme si il n y avait pas de glissement */
DOmegaX=DOmegaz=Dvx=0
FinSinon
/* La phase d intégration proprement dite. */
OmegaX=OmegaX+DOmegaX
OmegaZ=OmegaZ+DOmegaZ
Vx=Vx+DVx
Vy=Vy+DVy
FinPour
Fin CalculChocBande
 
 
 
 

Et pour les autres bandes ?


Maintenant, le cas général du choc sur une bande ne réclame pas beaucoup de finesse. Par exemple, pour traiter le cas du choc sur la bande droite de la boule d indice B, il suffit de quelques lignes de ce style :

Vx = VitesseY[B]
Vy = - VitesseX[B]
OmegaX= OmegaY[B]
OmegaY= -OmegaX[B]
OmegaZ= -OmegaZ[B]

CalculChocBande(Vx,Vy,OmegaX,OmegaY,OmegaZ)

VitesseY[B]=Vx
VitesseX[B]=-Vy
OmegaY[B]=OmegaX
OmegaX[B]=-OmegaY
OmegaZ[B]=-OmegaZ
 
 

C'est fini.

D'une façon générale, et si j ai un conseil à donner, faites les calculs dans le repère le plus intéressant. Ensuite, il suffit de faire un changement de repère, le calcul, puis le changement de repère après.

L'avantage. C'est simple, et cela permet de tester de nombreuses options facilement (On peut faire des essais en s affranchissant du repère exact dans lequel on travaille.). Ensuite, on détecte facilement une erreur, et quand ca marche dans quelques cas, on est sur que c'est correct.

(Par exemple, je ne suis pas sur de savoir dans quels repères j ai fait les différents calculs. Et en relisant mes sources, à l'instant, la présence d'un OmegaZ= -OmegaZ[B] m'incite à penser que j'ai du utiliser des repères un peu bizarres?
 
 
 
 

Conclusion


J'espère vous avoir convaincu tout au long de ce papier, que la modélisation est quelque chose de passionnant. Et pas forcement quelque chose d'obscur ou de difficile.

Ce n'est pas non plus une science exacte, et dix personnes sur le même problème vont sans doute donner plus de dix versions différentes.

Les étapes observation, mise en équation, programmation, comportent chacune des difficultés. Et il paraît raisonnable d'aller du plus simple au plus complexe. De l'observation d'un cas simple, vers la simulation de cas complexes.

Le "bonheur", c'est d avoir un modèle, et un simulateur qui soit capable d'aller au devant de ce que l'on a observé, qui soit capable de "prédictions".

Et le "bon bonheur", c'est de passer d'un modèle horriblement complexe qui peine à marcher, et qui marche à peine, à un modèle très très simple qui marche correctement.

Le traitement des chocs sur les bandes, avec les "errances" qui m'ont conduit à cette façon de faire, fait partie de ces bons moments passés sur un PC à réinventer un monde.
 
 
 

Copyright laurent Buchard 2001.