def orbit2(): planets = [ Planet(1817514095, 1905216634, -1485460920), Planet(1817514095, 1905216634, -1722015868), Planet(1817514095, 1905216634, -455609026), Planet(1817514095, 1905216634, 272811578), Planet(1817514095, 1905216634, -393577255), Planet(1817514095, 1905216634, -1420756477), Planet(1817514095, 1905216634, -93488736), Star(1817514095, -1385166447, Star(1817514095, 1905216634)) ] t0 = epoch_from_string(str(datetime.now())) x_val = list() y_val = list() z_val = list() planet_positions = list() planet_names = list() planet_colors = list() for orbiter in planets: orbit_period = orbiter.planet.compute_period(epoch(0)) * SEC2DAY orbit_when = np.linspace(0, orbit_period, 60) x = np.zeros(60) y = np.zeros(60) z = np.zeros(60) for i, day in enumerate(orbit_when): r, _ = orbiter.planet.eph(epoch(t0.mjd2000 + day)) x[i] = r[0] / AU y[i] = r[1] / AU z[i] = r[2] / AU x_val.append(x.tolist()) y_val.append(y.tolist()) z_val.append(z.tolist()) planet_positions.append(list((x[0], y[0], z[0]))) if orbiter.id == -455609026: planet_colors.append("green") else: planet_colors.append("gray") planet_names.append(orbiter.name) return jsonify(success=True, x=x_val, y=y_val, z=z_val, p=planet_positions, c=planet_colors, n=planet_names) if has_app_context() else x_val
def convert_to_epoch(day, month, year): """ returns epoch for day month and year """ day = str(day) month = str(month) year = str(year) if len(day) < 2: day = "0" + day if len(month) < 2: month = "0" + month return pk.epoch_from_string(year + '-' + month + '-' + day + ' 23:59:54.003')
seq = [pk.planet.jpl_lp('earth'),pk.planet.jpl_lp('mars')] print (seq) # Position des planètes et orbites # In[69]: from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt fig = plt.figure() ax = fig.gca(projection='3d') e = pk.epoch_from_string('2019-07-27 17:09:54') #date du jour pk.orbit_plots.plot_planet(seq[0], e, color = 'b', legend=True, ax=ax) pk.orbit_plots.plot_planet(seq[1], e, color = 'r', legend=True, ax=ax) plt.show() # Launch windonws, time of flight and departure vinf # In[70]: #comment sont choisis ces limites ? t0 = [e,pk.epoch(10000)] #t0 = [epoch(4000),epoch(10000)] tof = [60,380] vinf = [0,4] #fonction du launcher
import matplotlib as mpl import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from pykep import epoch, epoch_from_string, planet, AU, MU_SUN, DEG2RAD from pykep.planet import jpl_lp, keplerian from pykep.orbit_plots import plot_planet mpl.rcParams['legend.fontsize'] = 10 # asteroid @ Epoch 2014-Dec-09 (JD 2,457,000.5) ast_time = epoch_from_string('2014-12-09 00:00:00.000') #epoch(6800,"mjd2000") ast_orbel = (2.77 * AU, 0.075, 9.65 * DEG2RAD, 80.33 * DEG2RAD, 72.52 * DEG2RAD, 95.99 * DEG2RAD) # a,e,i,W,w,M (SI and RAD) ast_mu = 6e10 ast_radius = 1e5 ast_name = 'asteroid' asteroid = keplerian(ast_time, ast_orbel, MU_SUN, ast_mu, ast_radius, ast_radius * 1.1, ast_name) rA, vA = asteroid.eph(ast_time) #earth pl = jpl_lp('earth') rE, vE = pl.eph(ast_time) # plot fig = plt.figure() axis = fig.gca(projection='3d') axis.scatter([0], [0], [0], color='y') #sun plot_planet(asteroid, t0=ast_time,
def transfer(): star = Star(1817514095, 1905216634) origin = Planet(1817514095, 1905216634, -455609026) target = Planet(1817514095, 1905216634, 272811578) origin_orbit_radius = origin.planet.radius + 200000 target_orbit_radius = target.planet.radius + 200000 launch_time_start = int(float(flask_request.values['launch_start'])) launch_time_end = int(float(flask_request.values['launch_end'])) launch_time_offset = 0 if launch_time_start >= 0 else -launch_time_start flight_time_start = int(float(flask_request.values['flight_start'])) flight_time_start = max(1, flight_time_start) flight_time_end = int(float(flask_request.values['flight_end'])) flight_time_end = max(1, flight_time_end) t0 = epoch_from_string(str(datetime.now())) t0_number = int(t0.mjd2000) delta_v = np.full((flight_time_end - flight_time_start, launch_time_end + launch_time_offset), None) for launch_time in range(launch_time_start, launch_time_end): for flight_time in range(flight_time_start, flight_time_end): launch_time = int(launch_time) launch_time_index = launch_time + launch_time_offset flight_time = int(flight_time) flight_time_index = flight_time - flight_time_start t1 = epoch(launch_time + t0_number) t2 = epoch(launch_time + t0_number + flight_time) dt = (t2.mjd - t1.mjd) * DAY2SEC r1, v1 = origin.planet.eph(t1) r2, v2 = target.planet.eph(t2) lambert = lambert_problem(list(r1), list(r2), dt, star.gm) delta_vs = list() for x in range(lambert.get_Nmax() + 1): vp_vec = np.array(v1) vs_vec = np.array(lambert.get_v1()[x]) vsp_vec = vs_vec - vp_vec vsp = np.linalg.norm(vsp_vec) vo = sqrt(vsp * vsp + 2 * origin.planet.mu_self / origin_orbit_radius) inj_delta_v = vo - sqrt( origin.planet.mu_self / origin_orbit_radius) vp_vec = np.array(v2) vs_vec = np.array(lambert.get_v2()[x]) vsp_vec = vs_vec - vp_vec vsp = np.linalg.norm(vsp_vec) vo = sqrt(vsp * vsp + 2 * target.planet.mu_self / target_orbit_radius) ins_delta_v = vo - sqrt( target.planet.mu_self / target_orbit_radius) delta_vs.append(inj_delta_v + ins_delta_v) delta_v[flight_time_index, launch_time_index] = min(delta_vs) return jsonify(success=True, delta_v=delta_v.tolist(), launch_start=launch_time_start, launch_end=launch_time_end, flight_start=flight_time_start, flight_end=flight_time_end, launch_offset=-launch_time_offset)
def plottransfer(): star = Star(1817514095, 1905216634) origin = Planet(1817514095, 1905216634, -455609026) target = Planet(1817514095, 1905216634, 272811578) origin_orbit_radius = origin.planet.radius + 200000 target_orbit_radius = target.planet.radius + 200000 flight_time = int(flask_request.values['flight_time']) t0 = epoch_from_string(str(datetime.now())) t0_number = int(t0.mjd2000) launch_time = int(flask_request.values['launch_time']) + t0_number t1 = epoch(int(launch_time)) t2 = epoch(int(launch_time) + int(flight_time)) fig = plt.figure(figsize=(4, 4)) orbit_ax = fig.gca(projection='3d', proj_type='ortho') orbit_ax.scatter([0], [0], [0], color='orange') orbit_ax.set_aspect('equal') x_fig = plt.figure(figsize=(4, 4)) x_ax = x_fig.gca() x_ax.scatter([0], [0], color='orange') y_fig = plt.figure(figsize=(4, 4)) y_ax = y_fig.gca() y_ax.scatter([0], [0], color='orange') z_fig = plt.figure(figsize=(4, 4)) z_ax = z_fig.gca() z_ax.scatter([0], [0], color='orange') plot_planet(origin.planet, t0=t1, color='green', legend=True, units=AU, ax=orbit_ax) plot_planet(target.planet, t0=t2, color='gray', legend=True, units=AU, ax=orbit_ax) o_x, o_y, o_z = plot_planet_2d(origin.planet, t0=t1) t_x, t_y, t_z = plot_planet_2d(target.planet, t0=t2) x_ax.plot(o_y, o_z, label=origin.planet.name, c='green') x_ax.scatter(o_y[0], o_z[0], s=40, color='green') x_ax.plot(t_y, t_z, label=target.planet.name, c='gray') x_ax.scatter(t_y[0], t_z[0], s=40, color='gray') y_ax.plot(o_x, o_z, label=origin.planet.name, c='green') y_ax.scatter(o_x[0], o_z[0], s=40, color='green') y_ax.plot(t_x, t_z, label=target.planet.name, c='gray') y_ax.scatter(t_x[0], t_z[0], s=40, color='gray') z_ax.plot(o_x, o_y, label=origin.planet.name, c='green') z_ax.scatter(o_x[0], o_y[0], s=40, color='green') z_ax.plot(t_x, t_y, label=target.planet.name, c='gray') z_ax.scatter(t_x[0], t_y[0], s=40, color='gray') max_value = max(max([abs(x) for x in orbit_ax.get_xlim()]), max([abs(x) for x in orbit_ax.get_ylim()])) max_z_value = max([abs(z) for z in orbit_ax.get_zlim()]) dt = (t2.mjd - t1.mjd) * DAY2SEC r1, v1 = origin.planet.eph(t1) r2, v2 = target.planet.eph(t2) lambert = lambert_problem(list(r1), list(r2), dt, star.gm) min_n = None min_delta_v = None for x in range(lambert.get_Nmax() + 1): vp_vec = np.array(v1) vs_vec = np.array(lambert.get_v1()[x]) vsp_vec = vs_vec - vp_vec vsp = np.linalg.norm(vsp_vec) vo = sqrt(vsp * vsp + 2 * origin.planet.mu_self / origin_orbit_radius) inj_delta_v = vo - sqrt(origin.planet.mu_self / origin_orbit_radius) vp_vec = np.array(v2) vs_vec = np.array(lambert.get_v2()[x]) vsp_vec = vs_vec - vp_vec vsp = np.linalg.norm(vsp_vec) vo = sqrt(vsp * vsp + 2 * target.planet.mu_self / target_orbit_radius) ins_delta_v = vo - sqrt(target.planet.mu_self / target_orbit_radius) if min_delta_v is None or inj_delta_v + ins_delta_v < min_delta_v: min_n = x min_delta_v = inj_delta_v + ins_delta_v plot_lambert(lambert, color='purple', sol=min_n, legend=False, units=AU, ax=orbit_ax) l_x, l_y, l_z = plot_lambert_2d(lambert, sol=min_n) x_ax.plot(l_y, l_z, c='purple') y_ax.plot(l_x, l_z, c='purple') z_ax.plot(l_x, l_y, c='purple') orbit_ax.set_xlim(-max_value * 1.2, max_value * 1.2) orbit_ax.set_ylim(-max_value * 1.2, max_value * 1.2) orbit_ax.set_zlim(-max_z_value * 1.2, max_z_value * 1.2) x_ax.set_xlim(-1.0, 1.0) x_ax.set_ylim(-0.05, 0.05) y_ax.set_xlim(-1.0, 1.0) y_ax.set_ylim(-0.05, 0.05) z_ax.set_xlim(-1.0, 1.0) z_ax.set_ylim(-1.0, 1.0) fig.savefig('orbit') x_fig.savefig('orbit-x') y_fig.savefig('orbit-y') z_fig.savefig('orbit-z') plt.close('all') return jsonify(success=True)