#!/usr/bin/env python # coding: utf-8 # # ¡Atrapa ese asteroide con poliastro! # # ![NEOs](neos.png) # # ### Antonio Hidalgo & Juan Luis Cano # # ### 2017-07-23 PyConES 2017 @ Cáceres # 1. Presentación (1 minutos) # 2. Mecánica orbital (3 minutos) # 3. poliastro (3 minutos) # 4. Cuerpos cercanos (4 minutos) # 5. Demo NEOS (7 minutos) # 6. SOCIS y conclusiones (2 minutos) # ## Presentación # # ### Juan Luis Cano (core, project author) + Antonio Hidalgo (new contributor!) # # ![Dev](dev.jpg) # ## ¿Qué es la Mecánica Orbital? # # ### Física → Mecánica → Mecánica Celeste → Mecánica Orbital # # > Una rama de la Mecánica (a su vez una rama de la Física) que estudia problemas prácticos acerca del movimiento de cohetes y otros vehículos en el espacio # ### Pero ¿por qué los cuerpos orbitan? # # Eso da para una charla entera :) Como resumen, visualicemos este experimento mental ideado por Newton: # # Newton # In[1]: from IPython.display import YouTubeVideo YouTubeVideo("iEQuE5N3rwQ", width=800, height=600) # ## poliastro # # poliastro # # * **Python puro**, acelerado con **numba** (~mismo orden de magnitud que Fortran) # * **Licencia MIT** (permisiva) # * Manejo de unidades físicas y escalas temporales gracias a Astropy # * Conversión entre varias representaciones orbitales # * Propagación analítica y numérica # * Documentación molona 🚀 http://docs.poliastro.space/ # * ¡Versión 0.7.0 liberada hace una semana! http://blog.poliastro.space/2017/09/15/2017-09-15-poliastro-070-released-ready-pycones/ # #
# In[2]: get_ipython().run_line_magic('matplotlib', 'inline') from astropy import units as u from astropy.time import Time from poliastro.bodies import Earth from poliastro.twobody import Orbit from poliastro.plotting import plot, OrbitPlotter # ## _Interlude: Time zones? Hold my beer_ # # ![Escalas temporales](time_scales.png) # In[3]: r = [-6045, -3490, 2500] * u.km v = [-3.457, 6.618, 2.533] * u.km / u.s ss = Orbit.from_vectors(Earth, r, v, Time.now()) ss # In[4]: plot(ss); # ## Cuerpos cercanos # # También conocidos como NEOs, del inglés Near Earth Objetcs. # > Son cometas y asteroides a los que las fuerzas gravitatorias del Sistema Solar han atraído a las cercanías de la Tierra. # # Existen más de 16000. # ### Tipos de NEOs # ![tipos de neos](neo_orbit_types.jpg) # ### ¿Por qué NEOs? # * Aplicaciones en investigación científica. # # ![Mining the Sky](mining_the_sky.jpg) # * Riesgo de impacto contra la Tierra. # ![impactos sobre la Tierra](bolide_events.jpg) # ## poliastro y su paquete NEOS # # Como parte del proyecto SOCIS, se ha añadido en la versión 0.7 de poliastro un paquete NEOS. Está dividido en dos módulos: # In[5]: from poliastro.neos import neows, dastcom5 # ## Módulo NEOWS # # El módulo se basa en [este Servicio Web de la NASA](https://api.nasa.gov/api.html#NeoWS). # # ![Interfaz web NEOWS](interfaz_neows.png) # In[6]: eros = neows.orbit_from_name('Eros') ganymed = neows.orbit_from_name('1036') # Ganymed IAU number amor = neows.orbit_from_name('2001221') # Amor SPK-ID frame = OrbitPlotter() frame.plot(ganymed, label='Ganymed') frame.plot(eros, label='Eros') frame.plot(amor, label='Amor') # ## ¿Cómo funciona? # ![SBDB](sbdb.png) # ## Módulo DASTCOM5 # # Trabaja con la base de datos DASTCOM5, mantenida por la NASA y el JPL. Contiene datos sobre cometas y asteroides. # La base de datos viene en un zip de unos ~230 MB que se puede descargar [a mano](ftp://ssd.jpl.nasa.gov/pub/ssd/dastcom5.zip) y descomprimir en `~/.poliastro`, o, más fácil, se puede usar una función de poliastro: # ```Python # dastcom5.download_dastcom5() # ``` # In[8]: atira = dastcom5.orbit_from_name('atira')[0] # NEO wikipedia = dastcom5.orbit_from_name('wikipedia')[0] # Asteroid, but not NEO. tomhanks = dastcom5.orbit_from_name('tomhanks')[0] jamesbond = dastcom5.orbit_from_name('9007')[0] frame = OrbitPlotter() frame.plot(atira, label='Atira (NEO)') frame.plot(wikipedia, label='Wikipedia (asteroid)') frame.plot(tomhanks, label='Tomhanks') frame.plot(jamesbond, label='James Bond (9007)') # In[9]: halleys = dastcom5.orbit_from_name('1P') frame = OrbitPlotter() frame.plot(halleys[0], label='Halley') frame.plot(halleys[5], label='Halley') frame.plot(halleys[10], label='Halley') frame.plot(halleys[20], label='Halley') frame.plot(halleys[-1], label='Halley') # ## ¿Cómo funciona? # ![dastcom5 index](dastcom5_index.png) # ![DASTCOM5 structure](dastcom5_structure.png) # ![Asteroid and comet structure](ast_com_structure.png) # In[10]: ast_db = dastcom5.asteroid_db() comet_db = dastcom5.comet_db() ast_db.dtype.names[:20] # They are more than 100, but that would be too much lines in this notebook :P # In[11]: aphelion_condition = 2 * ast_db['A'] - ast_db['QR'] < 0.983 axis_condition = ast_db['A'] < 1.3 atiras = ast_db[aphelion_condition & axis_condition] earth = Orbit.from_body_ephem(Earth) frame = OrbitPlotter() frame.plot(earth, label='Earth') for i in range(len(atiras)): record = atiras['NO'][i] label = atiras['ASTNAM'][i].decode().strip() # DASTCOM5 strings are binary ss = dastcom5.orbit_from_record(record) frame.plot(ss, label=label) # In[12]: db = dastcom5.entire_db() db[db.NAME == 'Churyumov-Gerasimenko'] # ## SOCIS y conclusiones # # * Sin una persona a tiempo completo, este proyecto no habría llegado hasta aquí # * Sin dinero, no puede haber personas a tiempo completo :) # * Este programa no se conoce mucho en España, ¡ayudadnos a difundir! # # _Per Python ad astra!_ # # * Diapositivas: https://github.com/poliastro/pycones2017-talk # * Chat: https://riot.im/app/#/room/#poliastro:matrix.org # # ## Muchas gracias :) # # ![Rocket](rocket.jpg)