def test_plot_trajectory_without_attractor_raises_error(): frame = OrbitPlotter3D() with pytest.raises(ValueError) as excinfo: frame.plot_trajectory({}) assert ("An attractor must be set up first, please use " "set_attractor(Major_Body)." in excinfo.exconly())
def test_show_calls_prepare_plot(mock_prepare_plot, mock_iplot): m = OrbitPlotter3D() earth = Orbit.from_body_ephem(Earth) m.plot(orbit=earth, label="Object") m.show() assert mock_iplot.call_count == 1 mock_prepare_plot.assert_called_once_with()
def test_plot_sets_attractor(): frame = OrbitPlotter3D() assert frame._attractor is None assert frame._attractor_data == {} frame.plot(iss) assert frame._attractor == iss.attractor assert frame._attractor_data["name"] == iss.attractor.name
def test_set_view(): frame = OrbitPlotter3D() frame.set_view(0 * u.deg, 0 * u.deg, 1000 * u.m) eye = frame.figure["layout"]["scene"]["camera"]["eye"] assert eye["x"] == 1 assert eye["y"] == 0 assert eye["z"] == 0
def plot(self, sats_to_plot=None): if not sats_to_plot: sats_to_plot = self.planes s = np.arange(0, len(self), len(self) // sats_to_plot) op = OrbitPlotter3D() for sat in self.satellites[s]: f = op.plot(sat) return f
def test_savefig_calls_prepare_plot(mock_prepare_plot, mock_export): m = OrbitPlotter3D() earth = Orbit.from_body_ephem(Earth) m.plot(orbit=earth, label="Object") with tempfile.NamedTemporaryFile() as fp: m.savefig(filename=fp.name + ".jpeg") assert mock_export.call_count == 1 mock_prepare_plot.assert_called_once_with()
def test_get_3d_figure_has_expected_properties(): frame = OrbitPlotter3D() figure = frame.show() assert figure.data == () assert figure.layout.autosize is True assert "xaxis" in figure.layout.scene assert "yaxis" in figure.layout.scene assert "zaxis" in figure.layout.scene assert "aspectmode" in figure.layout.scene
def test_plot_3d_trajectory_plots_a_trajectory(): frame = OrbitPlotter3D() assert len(frame.trajectories) == 0 trajectory = churi.sample() frame.set_attractor(Sun) frame.plot_trajectory(trajectory) assert len(frame.trajectories) == 1 assert frame._attractor == Sun
def test_plot_trajectory_plots_a_trajectory(): frame = OrbitPlotter3D() assert len(frame._data) == 0 earth = Orbit.from_body_ephem(Earth) trajectory = earth.sample() frame.set_attractor(Sun) frame.plot_trajectory(trajectory) assert len(frame._data) == 1 assert frame._attractor == Sun
def test_get_figure_has_expected_properties(): frame = OrbitPlotter3D() figure = frame.figure assert figure["data"] == [{}] assert figure["layout"]["autosize"] is True assert "xaxis" in figure["layout"]["scene"] assert "yaxis" in figure["layout"]["scene"] assert "zaxis" in figure["layout"]["scene"] assert "aspectmode" in figure["layout"]["scene"]
def test_show_calls_prepare_plot(): patcher = mock.patch.object(OrbitPlotter3D, '_prepare_plot') patched = patcher.start() m = OrbitPlotter3D() earth = Orbit.from_body_ephem(Earth) m.plot(orbit=earth, label="Object") m.show() assert patched.call_count == 1 patched.assert_called_with()
def test_savefig_calls_prepare_plot(): patcher = mock.patch.object(OrbitPlotter3D, '_prepare_plot') patched = patcher.start() m = OrbitPlotter3D() earth = Orbit.from_body_ephem(Earth) m.plot(orbit=earth, label="Object") with tempfile.NamedTemporaryFile() as fp: m.savefig(filename=fp.name + ".jpeg") assert patched.call_count == 1 patched.assert_called_with()
def test_set_different_attractor_raises_error(): body1 = mock.MagicMock() body1.name = "1" body2 = mock.MagicMock() body2.name = "2" frame = OrbitPlotter3D() frame.set_attractor(body1) with pytest.raises(NotImplementedError) as excinfo: frame.set_attractor(body2) assert "Attractor has already been set to 1." in excinfo.exconly()
#Plot from plotly.offline import init_notebook_mode init_notebook_mode(connected=True) from poliastro.plotting import OrbitPlotter3D from poliastro.bodies import Earth, Mars #Visual setting of the graph color_earth0 = '#3d4cd5' color_earthf = '#525fd5' color_mars0 = '#ec3941' color_marsf = '#ec1f28' color_sun = '#ffcc00' color_orbit = '#888888' color_trans = '#444444' frame = OrbitPlotter3D() frame.set_attractor(Sun) frame.plot_trajectory(rr_earth, label=Earth) frame.plot_trajectory(rr_mars, label=Mars, color=color_marsf) frame.plot_trajectory(ss0_trans.sample(times_vector), label="MSL trajectory", color=color_trans) frame.set_view(30 * u.deg, 260 * u.deg, distance=3 * u.km) frame.show(title="MSL Mission: from Earth to Mars")
def test_plot_appends_data(): frame = OrbitPlotter3D() assert len(frame._data) == 0 frame.plot(iss) assert len(frame._data) == 1 + 1
def plot_object(objectplo): obj = Orbit.from_body_ephem(objectplo) a = OrbitPlotter3D() a.plot(orbit=obj, label=str(objectplo)) return a.figure
# Solve for the transfer maneuver man_lambert = Maneuver.lambert(ss_earth, ss_mars) # Get the transfer and final orbits ss_trans, ss_target = ss_earth.apply_maneuver(man_lambert, intermediate=True) # Let's plot this transfer orbit in 3D! # In[8]: from poliastro.plotting import OrbitPlotter3D # In[9]: plotter = OrbitPlotter3D() plotter.set_attractor(Sun) plotter.plot_ephem(earth, date_launch, label="Earth at launch position") plotter.plot_ephem(mars, date_arrival, label="Mars at arrival position") plotter.plot_trajectory(ss_trans.sample(max_anomaly=180 * u.deg), color="black", label="Transfer orbit") plotter.set_view(30 * u.deg, 260 * u.deg, distance=3 * u.km) # Not bad! Let's celebrate with some music! # In[10]: from IPython.display import YouTubeVideo YouTubeVideo('zSgiXGELjbc')
def __init__(self, position, velocity): self.r_start = position*u.km self.v_start = velocity*u.km/u.s self.orbit = Orbit.from_vectors(Earth, self.r_start, self.v_start) def maneuver(self, dv): man = Maneuver.impulse(dv*u.km/u.s) self.orbit = self.orbit.apply_maneuver(man) """This section is just testing out the orbit plotter and the maneuver functions""" test1 = Spacecraft((-6045, -3490, 2500),(2, 0.5, 8)) test2 = Spacecraft((8000, 0, 0), (0, 8, 0)) op = OrbitPlotter3D() op.plot(test1.orbit) op.plot(test2.orbit) #test1.maneuver((0,0,1)) test1.orbit = test1.orbit.propagate(30*u.min) test2.orbit = test2.orbit.propagate(30*u.min) op = OrbitPlotter3D() op.plot(test1.orbit) op.plot(test2.orbit) test2.orbit.inc """This section is the first, most simple simulation. The goal is for a single spacecraft to change its orbit to a circular, polar orbit through a series of impulse maneuvers. The series of impulse maneuvers are 30 impulses that are each 20 minutes apart. A maneuver can be along the x, y or z axis and is fixed at 500 mps impulses for the purpose of this first experiment."""
# In[3]: roadster = Ephem.from_horizons( "SpaceX Roadster", epochs=time_range(EPOCH, end=EPOCH + 360 * u.day), attractor=Sun, plane=Planes.EARTH_ECLIPTIC, id_type="majorbody", ) roadster # In[4]: from poliastro.plotting.misc import plot_solar_system # In[5]: frame = plot_solar_system(outer=False, epoch=EPOCH) frame.plot_ephem(roadster, EPOCH, label="SpaceX Roadster", color="black") # In[6]: frame = OrbitPlotter3D(plane=Planes.EARTH_ECLIPTIC) frame.plot_body_orbit(Earth, EPOCH) frame.plot_body_orbit(Mars, EPOCH) frame.plot_ephem(roadster, EPOCH, label="SpaceX Roadster", color="black") frame.set_view(45 * u.deg, -120 * u.deg, 4 * u.km)
def test_dark_theme(): frame = OrbitPlotter3D(dark=True) assert frame._layout.template.layout.plot_bgcolor == "rgb(17,17,17)"