Relative orbit sequence#

import os

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

import mirage as mr
import mirage.synth as mrsyn

coe_chief = np.array([7000, 0.1, 10, 5, 5, 5])
coe_chase = coe_chief + np.array([0, 0.0005, 0.0005, 0.01, 0.01, 0.0])
dates = mr.date_linspace(mr.now(), mr.now() + mr.hours(1.5), 100)
rv0_chief = mr.coe_to_rv(coe_chief)
rv0_chase = mr.coe_to_rv(coe_chase)

rv_chase = mr.integrate_orbit_dynamics(rv0_chief, dates)
r_chase = rv_chase[:, :3]
rv_chief = mr.integrate_orbit_dynamics(rv0_chase, dates)
r_chief = rv_chief[:, :3]

obj_chief = mr.SpaceObject('matlib_hylas4.obj', identifier='goes 15')
sv = mr.sun(dates)
nadir = -mr.hat(r_chief)
att_chief = mr.AlignedAndConstrainedAttitude(
    v_align=nadir, v_const=sv, dates=dates, axis_order=(1, 2, 0)
)
svi = mr.hat(mr.sun(dates))
dcm_inertial_to_chief = att_chief.dcms_at_dates(dates)
q_chief = mr.dcm_to_quat(dcm_inertial_to_chief)
svb = mr.stack_mat_mult_vec(dcm_inertial_to_chief, svi)

camera_z = mr.hat(r_chief - r_chase)
ref = mr.hat(np.cross(r_chief, rv_chief[:, 3:]))
camera_y = mr.hat(np.cross(camera_z, ref))
camera_x = np.cross(camera_y, camera_z)
dcm_inertial_to_camera = np.swapaxes(
    np.swapaxes(np.stack((camera_x, camera_y, camera_z), axis=-1), 0, 2), 0, 1
)
q_camera = mr.dcm_to_quat(dcm_inertial_to_camera)

# mrv.vis_attitude_motion(obj_chief, mr.dcm_to_quat(att_chief.dcms_at_dates(dates)), fname='test.gif')

Running the synthetic image generator

mrsyn.generate_synthetic_sequence(
    'matlib_goes17.obj',
    svb,
    camera_pos=r_chase - r_chief,
    q_camera=q_camera,
    q_chief=q_chief,
    fov_deg=37,
)
gps iii approach
Found 30 key points!
Computed visibility for point 1/100, 0.45ish minutes remaining
Computed visibility for point 2/100, 0.45ish minutes remaining
Computed visibility for point 3/100, 0.48ish minutes remaining
Computed visibility for point 4/100, 0.46ish minutes remaining
Computed visibility for point 5/100, 0.45ish minutes remaining
Computed visibility for point 6/100, 0.42ish minutes remaining
Computed visibility for point 7/100, 0.42ish minutes remaining
Computed visibility for point 8/100, 0.45ish minutes remaining
Computed visibility for point 9/100, 0.42ish minutes remaining
Computed visibility for point 10/100, 0.43ish minutes remaining
Computed visibility for point 11/100, 0.40ish minutes remaining
Computed visibility for point 12/100, 0.39ish minutes remaining
Computed visibility for point 13/100, 0.39ish minutes remaining
Computed visibility for point 14/100, 0.36ish minutes remaining
Computed visibility for point 15/100, 0.35ish minutes remaining
Computed visibility for point 16/100, 0.35ish minutes remaining
Computed visibility for point 17/100, 0.43ish minutes remaining
Computed visibility for point 18/100, 0.34ish minutes remaining
Computed visibility for point 19/100, 0.35ish minutes remaining
Computed visibility for point 20/100, 0.34ish minutes remaining
Computed visibility for point 21/100, 0.34ish minutes remaining
Computed visibility for point 22/100, 0.33ish minutes remaining
Computed visibility for point 23/100, 0.32ish minutes remaining
Computed visibility for point 24/100, 0.33ish minutes remaining
Computed visibility for point 25/100, 0.31ish minutes remaining
Computed visibility for point 26/100, 0.31ish minutes remaining
Computed visibility for point 27/100, 0.31ish minutes remaining
Computed visibility for point 28/100, 0.29ish minutes remaining
Computed visibility for point 29/100, 0.29ish minutes remaining
Computed visibility for point 30/100, 0.28ish minutes remaining
Computed visibility for point 31/100, 0.28ish minutes remaining
Computed visibility for point 32/100, 0.27ish minutes remaining
Computed visibility for point 33/100, 0.27ish minutes remaining
Computed visibility for point 34/100, 0.27ish minutes remaining
Computed visibility for point 35/100, 0.27ish minutes remaining
Computed visibility for point 36/100, 0.28ish minutes remaining
Computed visibility for point 37/100, 0.28ish minutes remaining
Computed visibility for point 38/100, 0.27ish minutes remaining
Computed visibility for point 39/100, 0.27ish minutes remaining
Computed visibility for point 40/100, 0.26ish minutes remaining
Computed visibility for point 41/100, 0.28ish minutes remaining
Computed visibility for point 42/100, 0.26ish minutes remaining
Computed visibility for point 43/100, 0.25ish minutes remaining
Computed visibility for point 44/100, 0.24ish minutes remaining
Computed visibility for point 45/100, 0.26ish minutes remaining
Computed visibility for point 46/100, 0.24ish minutes remaining
Computed visibility for point 47/100, 0.24ish minutes remaining
Computed visibility for point 48/100, 0.22ish minutes remaining
Computed visibility for point 49/100, 0.24ish minutes remaining
Computed visibility for point 50/100, 0.22ish minutes remaining
Computed visibility for point 51/100, 0.21ish minutes remaining
Computed visibility for point 52/100, 0.21ish minutes remaining
Computed visibility for point 53/100, 0.20ish minutes remaining
Computed visibility for point 54/100, 0.22ish minutes remaining
Computed visibility for point 55/100, 0.20ish minutes remaining
Computed visibility for point 56/100, 0.20ish minutes remaining
Computed visibility for point 57/100, 0.21ish minutes remaining
Computed visibility for point 58/100, 0.19ish minutes remaining
Computed visibility for point 59/100, 0.18ish minutes remaining
Computed visibility for point 60/100, 0.29ish minutes remaining
Computed visibility for point 61/100, 0.18ish minutes remaining
Computed visibility for point 62/100, 0.19ish minutes remaining
Computed visibility for point 63/100, 0.17ish minutes remaining
Computed visibility for point 64/100, 0.21ish minutes remaining
Computed visibility for point 65/100, 0.18ish minutes remaining
Computed visibility for point 66/100, 0.16ish minutes remaining
Computed visibility for point 67/100, 0.15ish minutes remaining
Computed visibility for point 68/100, 0.15ish minutes remaining
Computed visibility for point 69/100, 0.14ish minutes remaining
Computed visibility for point 70/100, 0.14ish minutes remaining
Computed visibility for point 71/100, 0.14ish minutes remaining
Computed visibility for point 72/100, 0.13ish minutes remaining
Computed visibility for point 73/100, 0.13ish minutes remaining
Computed visibility for point 74/100, 0.14ish minutes remaining
Computed visibility for point 75/100, 0.14ish minutes remaining
Computed visibility for point 76/100, 0.12ish minutes remaining
Computed visibility for point 77/100, 0.12ish minutes remaining
Computed visibility for point 78/100, 0.12ish minutes remaining
Computed visibility for point 79/100, 0.11ish minutes remaining
Computed visibility for point 80/100, 0.11ish minutes remaining
Computed visibility for point 81/100, 0.10ish minutes remaining
Computed visibility for point 82/100, 0.09ish minutes remaining
Computed visibility for point 83/100, 0.09ish minutes remaining
Computed visibility for point 84/100, 0.09ish minutes remaining
Computed visibility for point 85/100, 0.08ish minutes remaining
Computed visibility for point 86/100, 0.06ish minutes remaining
Computed visibility for point 87/100, 0.06ish minutes remaining
Computed visibility for point 88/100, 0.05ish minutes remaining
Computed visibility for point 89/100, 0.05ish minutes remaining
Computed visibility for point 90/100, 0.05ish minutes remaining
Computed visibility for point 91/100, 0.04ish minutes remaining
Computed visibility for point 92/100, 0.03ish minutes remaining
Computed visibility for point 93/100, 0.03ish minutes remaining
Computed visibility for point 94/100, 0.02ish minutes remaining
Computed visibility for point 95/100, 0.02ish minutes remaining
Computed visibility for point 96/100, 0.02ish minutes remaining
Computed visibility for point 97/100, 0.01ish minutes remaining
Computed visibility for point 98/100, 0.01ish minutes remaining
Computed visibility for point 99/100, 0.00ish minutes remaining
Computed visibility for point 100/100, 0.00ish minutes remaining

Making a matplotlib animation of the result

fig, ax = plt.subplots()
ax.set_aspect('equal')
fig.patch.set_facecolor('black')

ims = []
for imname in sorted(
    [x for x in os.listdir('out') if '.png' in x], key=lambda x: int(x[5:-4])
):
    ims.append(plt.imread(f'out/{imname}'))

im = plt.imshow(ims[0][:, :, 0], cmap='gray')


def animate(i):
    im.set_data(ims[i][:, :, 0])
    return (im,)


frames = len(dates)
anim_time = 10
fps = frames / anim_time
interval = 1000 / fps
anim = FuncAnimation(fig, animate, frames=frames, interval=interval, blit=True)
anim.save('rpo.mp4')
plt.show()

Total running time of the script: (0 minutes 40.677 seconds)

Gallery generated by Sphinx-Gallery