Documentation du Module SOLSTICE¶
Links: An up to date version of this documentation is available on https://hpp.education/Lessons/MecaSpace/Solstice/
The gitlab repo is https://gitlab.com/SimonMarie/orbiter
A demo jupyter notebook can be found here https://hpp.education/Lessons/MecaSpace/Solstice/Solstice-Demo.ipynb
Présentation générale¶
Le module SOLSTICE basé sur le language Python, permet l’intégration numérique de la trajectoire d’un astronef dans le champs gravitationel de 2 corps: Un corps principal (fixe), et un corps secondaire (en mouvement de rotation uniforme autour du corps principal).
La class Capsule est une modélisation simple permettant de spécifier directement le delta_v d’une manoeuvre.
La class Stage modélise un étage et son moteur grace à son ISP et son débit.
La class Launcher permet de modéliser un lanceur à partir de plusieurs éléments Stage.
Ces trois class sont équivalentes en terme d’intégration numérique mais ne présentent pas le même niveau de
modélisation. Elles sont basées sur
l’intégration des lois de Newton dans le repère du corps principal (CP) en coordonnées
polaire .

Le système représenté est basé sur l’influence gravitationelle d’un corps
principal et d’un corps secondaire (généralement le satellite le plus massif).
Le corps secondaire est placé initialement en et se déplace sur son orbite
circulaire dans le sens anti-horaire. Le corps principal peut être changé en utilisant
la fonction planet(nom) ou body=nom dans l’initialisation. Le corps secondaire
peut être modifié en utilisant la fonction setmoon(nom).
Les équations du mouvement intégrées dans la méthode integtraj() sont les suivantes:
Notations:
: Force gravitationel du corps principale (N).
: Force gravitationel du corps secondaire (N).
: Poussée (N)
: Trainée (N).
: Portance (N).
: Angle entre le vecteur vitesse (/CP) et le vecteur
.
Angle de manoeuvre.
Différentiel de vitesse de la manoeuvre.
Le corps princpal possède généralement une atmosphère simple de type:
Lors de la rentrée atmosphérique, le repère lanceur est le suivant:

Par convention l’angle est orienté positivement vers l’intérieur.
Un angle
positif induira donc une composate
négative.
La Class SpaceDevice¶
- class SOLSTICE.Spacedevice(Diameter=1.0, Heigh=5.0, z0=0.0, u0=0.0, gamma0=0.0, fin=0.0, body='Terre', name='Trajectoire_default')¶
Bases :
object
Class Spacedevice
Cette Class est la plus generique, elle inclu les methodes d integration et les constantes universelles.
Pour changer de planete, il faut mettre a jour les donnees de l’instance. Exemple: cap=Capsule(….,body=”Mars”) cap.Rt => affiche le rayon du corps principal cap.Rt=3390 => Rayon de Mars
- G = 6.67408e-11¶
- Ms = 1.9884e+30¶
- P2S()¶
Converti les coordonees par rapport au corps principal (CP) en coordonnees par rapport au corps secondaire (CS) Retours: * r2 : Position / CS * theta2 : Azimute / CS
- RK2()¶
Integration d’ordre 2 avec le schéma Runge-Kutta met a jour tp,rp,z et theta
- RK4()¶
Integration d’ordre 1 avec le schéma d’euler met a jour tp,rp,z et theta
- RK4p()¶
Integration d’ordre 4 avec le schéma RK4 vect met a jour tp,rp,z et theta
- S2P(r2, theta2)¶
Converti les coordonnées par rapport au corps secondaire (CS) en coordonnees par rapport au corps principale (CP) Retours: * r : Position / CP * theta : Azimute / CP
- Sec2days(seconds)¶
Converti un interval de secondes en [jour heure mois secondes]
- __dict__ = mappingproxy({'__module__': 'SOLSTICE', '__doc__': "\n Class Spacedevice \n \n Cette Class est la plus generique, elle inclu les methodes d integration et\n les constantes universelles.\n\n Pour changer de planete, il faut mettre a jour les donnees de l'instance.\n Exemple:\n cap=Capsule(....,body='Mars')\n cap.Rt => affiche le rayon du corps principal\n cap.Rt=3390 => Rayon de Mars\n\n ", 'G': 6.67408e-11, 'Ms': 1.9884e+30, 'thetaL': 1.5707963267948966, '__init__': <function Spacedevice.__init__>, 'get_planet': <function Spacedevice.get_planet>, 'planet': <function Spacedevice.planet>, 'setmoon': <function Spacedevice.setmoon>, 'linkal': <function Spacedevice.linkal>, 'atmosphere': <function Spacedevice.atmosphere>, 'S2P': <function Spacedevice.S2P>, 'P2S': <function Spacedevice.P2S>, 'cart2pol': <function Spacedevice.cart2pol>, 'pol2cart': <function Spacedevice.pol2cart>, 'e2m': <function Spacedevice.e2m>, 'm2e': <function Spacedevice.m2e>, '__repr__': <function Spacedevice.__repr__>, 'getgravity': <function Spacedevice.getgravity>, 'rhs': <function Spacedevice.rhs>, 'rhsp': <function Spacedevice.rhsp>, 'euler': <function Spacedevice.euler>, 'RK2': <function Spacedevice.RK2>, 'RK4p': <function Spacedevice.RK4p>, 'RK4': <function Spacedevice.RK4>, 'trajint': <function Spacedevice.trajint>, 'update_udyn': <function Spacedevice.update_udyn>, 'run': <function Spacedevice.run>, 'write': <function Spacedevice.write>, 'load': <function Spacedevice.load>, 'update_wind': <function Spacedevice.update_wind>, 'rho': <function Spacedevice.rho>, 'plotraj': <function Spacedevice.plotraj>, 'anim': <function Spacedevice.anim>, 'playvid': <function Spacedevice.playvid>, 'Sec2days': <function Spacedevice.Sec2days>, 'monit': <function Spacedevice.monit>, '__dict__': <attribute '__dict__' of 'Spacedevice' objects>, '__weakref__': <attribute '__weakref__' of 'Spacedevice' objects>, '__annotations__': {}})¶
- __init__(Diameter=1.0, Heigh=5.0, z0=0.0, u0=0.0, gamma0=0.0, fin=0.0, body='Terre', name='Trajectoire_default')¶
- __module__ = 'SOLSTICE'¶
- __repr__()¶
Affichage des parametres de l’astronef
- __weakref__¶
list of weak references to the object (if defined)
- anim(kind='polar', skip=500, ref=0)¶
Anim la trajectoire et crée le fichier name+body_CP/CS .mp4
- atmosphere()¶
Trace l’evolution de la masse volumique de l’atmosphere en fonction de l’altitude.
- cart2pol(ux, uy, theta)¶
Coordonnées cart vers corrd polaires
- e2m()¶
Converti les vitesses par rapport au corps principal (CP) en vitesse par rapport au corps secondaire (CS) Retours: * u_r : Vitesse radiale / CS * u_theta : Vitesse angulaire / CS
- euler()¶
Integration d’ordre 1 avec le schéma d’euler met a jour tp,rp,z et theta
- get_planet(name='Terre')¶
Base des charactéristiques physiques et orbitales des corps celestes:
Soleil Mercure Venus Terre Lune Mars Phobos Ceres Jupiter Ganymede Saturne Titan Uranus Titania Neptune Triton Pluton Charon Eris Dysnomie
- getgravity()¶
Calcul les contributions gravitationelles du CP et cu CS et met a jour la force de gravite en fonction.
- linkal()¶
Traduction de la dernière phase de vol en conique sur le site http://antoinelegay.free.fr/mecaniquespatiale/
- load()¶
Chargement des resultats:
- m2e(ur, ut)¶
Converti les vitesses par rapport au corps secondaire (CS) en vitesse par rapport au corps principal (CP) Retours: * u_r : Vitesse radiale / CP * u_theta : Vitesse angulaire / CP
- monit(fig)¶
Represente l evolution des donnees trajectoire. Cette methode necessite un objet matplolib (fig) en input. * 11 :U(t) 12 :Z(U) * 21 :G(Z) 22 :Phi(Z) * 31 :P(t) 32 :gamma(Z)
- planet(name='Terre')¶
- Change les caractéristiques du corps principal:
self.Mt self.Rt self.rho0 self.Z0 self.Ml self.Rl self.al self.at self.TL self.earth_lim1 self.moon_inf
Corps possibles: En pratique tous les corps possible de get_planet()
- playvid(ref=0)¶
Play Video in jupyter cell if used within notebook
- plotraj(kind='rect', impref=0)¶
Represente la trajectoire a partir des resultat de l integration de la trajectoire. * kind=”rect” (default) => Dans le plan (x,z) * kind=”polar” => Dans le plan (r,theta)
- pol2cart(ur, ut, theta)¶
Coordonnées polaires vers corrd cart.
- rho()¶
Modele d atmosphere simple
- rhs(state, t)¶
Terme de droite de la conservation qdm
- rhsp(state, statep, t)¶
Terme de droite de la conservation qdm
- run(ntmax=1000000.0, dt=0.01)¶
Avance la trajectoire de ntmax iterations ou jusqu a z=0
- setmoon(name='Terre')¶
- Change les caractéristiques du corps secondaire:
self.Ml self.Rl self.al self.at self.TL self.earth_lim1 self.moon_inf
Corps possibles: En pratique tous les corps possible de get_planet()
- thetaL = 1.5707963267948966¶
- trajint()¶
Permet d integrer les equations du mouvement dans le repere du CP polaire 2D (er,etheta) Le schéma d’intégration est donné par self.integ Schemas dispo: Euler RK2 RK4 RK4 simplectique
- update_udyn()¶
Mise a jour de la vitesse relative de l’air Cela permet de prendre en compte la vitesse de rotation de la terre En considerant que l’atmosphere tourne avec.
- update_wind()¶
* Ajoute du vent et modifie l’incidence *
- write()¶
Ecriture de la trajectoire
« 0-time | 1-r | 2-theta | 3-U | 4-Gamma | 5-Pdyn | 6-phi | 7-Acc | 8-Fl | 9-Alpha | 10-ref | 11-thetaL | 12-Ft | 13-Engine | 14-r2 | 15-theta2 | 16-Moon «
La Class Capsule¶
- class SOLSTICE.Capsule(beta=0.005, u=0, z0=100000.0, gi=0.0, fin=0.0, body='Terre', name='Rentree')¶
Bases :
Spacedevice
Class Capsule - CNAM IAS
Simon Marie - nov.2018
La Class Capsule permet la creation d un objet Python modelisant une capsule de rentree. Differentes characteristiques peuvent etre saisies a l initialisation
beta : parametre balistique de la capsule (default= 5e-3)
z0 : altitude initiale (default=1e5 m)
u : vitesse initiale (default=7910 m/s)
gi : angle gamma initial (default=0)
fin : finesse de la capsule (default=0)
body : Corp principal
moon : Corp secondaire
name : nom du fichier resultats (default=Rentree)
L instanciation se fait de la facon suivante:
exemple=Capsule()
On pourra modifier les parametres par defaut impose a l initialisation en passant des arguments lors de la creation:
exemple=Capsule(u=12000,z0=400e3)
- __annotations__ = {}¶
- __init__(beta=0.005, u=0, z0=100000.0, gi=0.0, fin=0.0, body='Terre', name='Rentree')¶
- __module__ = 'SOLSTICE'¶
- __repr__()¶
caps=Capsule() Permet d afficher l instance en faisant print(caps) Peut etre desactiver avec self.display=False
- mvr(dv, omega, ref=0)¶
Effectue une manoeuvre en imposant:
dv: differentielle de vitesse
omega: angle du delta V
ref=0 : Manoeuvre par rapport au corps principal
ref=1 : Manoeuvre par rapport au corps secondaire
La Class Stage¶
- class SOLSTICE.Stage(ISP=350.0, IC=0.1, H=4, D=1, qm=10.0, mc=10.0, mcu=1.0, z0=0.0, u0=0, gamma0=-90, body='Terre', moteur='none', name='Trajectoire')¶
Bases :
Spacedevice
**Class Stage **
La Class Stage permet la creation d un objet Python modelisant un etage de Lanceur spatial disposant d’un moteur. Differentes characteristiques peuvent etre saisies a l initialisation
ISP : Impulsion specifique (default= 350.)
IC : Indice constructif ms/me (default=0.1)
z0 : altitude initiale (default=0 m)
u : vitesse initiale (default=0 m/s)
gi : angle gamma initial (default=-90)
fin : finesse de la capsule (default=0)
name : nom du fichier resultats (default=Launch.dat)
- __add__(other)¶
- __annotations__ = {}¶
- __init__(ISP=350.0, IC=0.1, H=4, D=1, qm=10.0, mc=10.0, mcu=1.0, z0=0.0, u0=0, gamma0=-90, body='Terre', moteur='none', name='Trajectoire')¶
- __module__ = 'SOLSTICE'¶
- __repr__()¶
modu=Stage() Permet d afficher l instance en faisant print(modu)
- boost(ignition=1, dt=0.01, iangle=0, ref=0)¶
Allumage des moteurs pendant une durée finie: ignition : Temps d’allumage en secondes dt : Pas de temps pour l’intérgration iangle : Angle de braquage des moteurs (°)
- check_thrust()¶
Verification poussee necessaire
- engine_start()¶
- engine_stop()¶
- get_thrust()¶
Calcul de la pousse local au point courant
- run(ntmax=1000000.0, dt=0.01)¶
Avance la trajectoire de ntmax iterations ou jusqu a z=0
- update()¶
Mise à jour des paramètres propulsifs. Si un paramètre de base est modifié, cette methode permet de mettre à jour les paramètres qui en dependent.
- update_atm()¶
- update_m()¶
Mise a jour de la masse et des parametres d Inertie.
- update_reserv()¶
Mise a jour du volume carburant disponible
- update_rot()¶
Met a jour l’incidence de l etage due au moments lacet/tangage
La Class Launcher¶
- class SOLSTICE.Launcher(stages, name='Launch_base')¶
Bases :
Stage
Class Launcher (somme de Stage) Un lanceur peut etrte obtenu en faisant:
A=Stage(ISP=420,IC=0.08) B=Stage(ISP=320,IC=0.12) Lanceur=A+B
- __annotations__ = {}¶
- __init__(stages, name='Launch_base')¶
- __module__ = 'SOLSTICE'¶
- __repr__()¶
modu=Stage() Permet d afficher l instance en faisant print(modu) Pour desactiver l affichage il faut mettre la variable self.display false
- drop(ind=0)¶
Largage de l etage inferieur si vide
- update_stages()¶
Met a jour les donnees du lanceur en fonction de la forme de la liste stages