Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Programmation > Explorer > Balistique avec matplotlib

Balistique avec matplotlib

lundi 10 décembre 2012, par Laurent Ba.

Une petite classe de balistique en python avec matplotlib.
Attention, écrite par un jongleur chez un jongleur !

Voici une petite classe que j’avais faite lorsque j’ai commencé à travailler sur des lanceurs de balles.

Le but était de me familiariser un peu avec la balistique et Matplotlib.
Si vous voulez juste un résultat rapide, cette application en ligne répondra bien mieux à vos attentes.

Le script était cassé par le passage à python3 et la refonte de ipython. Mais c’est réparé ! L’exemple est minimal et je ne le considère pas comme terminé, mais je trouve qu’il a son intérêt dans le contexte.

La balistique est un problème assez récurrent en robotique, les lycéens retrouverons un sujet étudié en cours, et Matplotlib pourrait s’avérer être une alternative séduisante à Matlab [1] :

  • libre
  • puissante grâce à python et ses modules
  • interactive avec Ipython

Le but ici n’est pas de réécrire la doc de matplotlib, de Numpy et encore moins de python... (et non il faudrait d’abord que je les lise :) ) mais je vous mets quelques liens bien choisis que vous n’auriez je suis sûr jamais trouvé tout seul :) :

Contenu de la classe

Voici le script .py à télécharger :

balistik.py
script de balistique avec matplotlib

On commence par importer les ressources python utiles :


import numpy as np
import matplotlib.pyplot as plt
import IPython
from pylab import ion

Et on complète la classe avec les formules mathématiques :

def x_max(self) :
vo, a, g , yo = self.vo , self._a, self.g, self.yo
x_max = ( vo**2. * np.sin(2.*a) ) / (2.*g) \
+ np.sqrt( ( (vo**2. * np.sin(2.*a))**2. ) / (4.*g**2.) \
+ ( 2.* yo * (vo * np.cos(a))**2.) / g )
return x_max

def y_max(self) :
vo, a, g , yo = self.vo , self._a, self.g, self.yo
y_max = ( vo**2 * np.sin(a)**2 ) / ( 2*g ) + yo
return y_max

def temps_de_vol(self) :
vo, a, g , yo = self.vo , self._a, self.g, self.yo
temps_total = ((vo * np.sin(a) ) / g ) + ( np.sqrt( (vo*np.sin(a))**2 + 2*g* yo) / g )
return temps_total

def equation(self, x) :
vo, a, g , yo = self.vo , self._a, self.g, self.yo
y = -( g / ( 2 * (vo * np.cos(a))**2) ) * x**2 + np.tan(a) * x + yo
return y

def config_axes_equation(self) :
size_x_max = self.x_max() + 5./100. * self.x_max()
size_y_max = self.y_max() + 5./100. * self.y_max()
return (size_x_max, size_y_max)

def matrix_equation(self, precision = 0.1) :
x = np.arange( 0.0, self.x_max(), precision )
y = self.equation(x)
return (x, y)

Exemple d’utilisation

 vo = vitesse initial en m/s
 a = Angle de tir en degrés
 yo = Hauteur initial de tir en m

$ python balistik.py

In [1]: ball1 = Trajectoire(vo=10, a=80, yo=2)
In [2]: ball1.affiche()
In [3]: ball1.a = 40
In [4]: ball1.vo = 15
In [5]: ball1.affiche()
In [6]: ball1.draw()

In [7]: ball2 = Trajectoire()
In [8]: ball2.draw()

[1en fait je ne connais pas du tout Matlab, mais j’ai pas l’envie ni le besoin de le connaitre

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.