{ "cells": [ { "cell_type": "markdown", "id": "cond-title", "metadata": {}, "source": [ "# Conditional Coverage — Nadir Imaging with Ground-Station Tracking\n", "\n", "Demonstrates the **conditions** feature in missiontools.\n", "\n", "The spacecraft normally images in nadir-pointing mode, but when it comes\n", "within view of a ground station it stops imaging and reorients to track\n", "the station with its body X+ face (e.g. for a downlink antenna).\n", "\n", "This is implemented using:\n", "\n", "- **`ConditionAttitudeLaw`** — routes between two attitude laws based on\n", " a `SpaceGroundAccessCondition`\n", "- **Sensor `condition`** — a `NotCondition` that disables the sensor when\n", " the ground station is in view\n", "\n", "**Scenario**\n", "- 550 km sun-synchronous orbit, LTAN 10:30\n", "- Nadir-pointed conic sensor, 15° half-angle (active only when GS is *not* visible)\n", "- Ground station: Svalbard (78.2°N, 15.6°E), el_min_deg = 5°\n", "- Area of interest: EU region\n", "- Analysis window: 10 days" ] }, { "cell_type": "code", "execution_count": 10, "id": "cond-imports", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:25.761490Z", "iopub.status.busy": "2026-05-02T20:58:25.760785Z", "iopub.status.idle": "2026-05-02T20:58:29.284911Z", "shell.execute_reply": "2026-05-02T20:58:29.282567Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from missiontools import (\n", " Spacecraft, ConicSensor, AoI, Coverage, GroundStation,\n", " FixedAttitudeLaw, TrackAttitudeLaw, ConditionAttitudeLaw,\n", " SpaceGroundAccessCondition, NotCondition,\n", ")" ] }, { "cell_type": "markdown", "id": "cond-sc-md", "metadata": {}, "source": [ "## 1. Spacecraft and Ground Station" ] }, { "cell_type": "code", "execution_count": 11, "id": "cond-sc", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:29.289331Z", "iopub.status.busy": "2026-05-02T20:58:29.288716Z", "iopub.status.idle": "2026-05-02T20:58:29.316964Z", "shell.execute_reply": "2026-05-02T20:58:29.312096Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Altitude : 550 km\n", "Inclination : 97.59°\n", "Orbital period : 95.6 min\n", "Ground station : Svalbard (78.2°N, 15.6°E)\n" ] } ], "source": [ "EPOCH = np.datetime64('2025-06-01T00:00:00', 'us')\n", "\n", "sc = Spacecraft.sunsync(\n", " altitude_km=550.0,\n", " node_solar_time='10:30',\n", " epoch=EPOCH,\n", ")\n", "\n", "gs = GroundStation(lat=78.2, lon=15.6)\n", "\n", "period_s = 2 * np.pi * np.sqrt(sc.a**3 / sc.central_body_mu)\n", "print(f\"Altitude : {(sc.a - sc.central_body_radius) / 1e3:.0f} km\")\n", "print(f\"Inclination : {np.degrees(sc.i):.2f}°\")\n", "print(f\"Orbital period : {period_s / 60:.1f} min\")\n", "print(f\"Ground station : Svalbard ({gs.lat}°N, {gs.lon}°E)\")" ] }, { "cell_type": "markdown", "id": "cond-att-md", "metadata": {}, "source": [ "## 2. Conditional Attitude Law\n", "\n", "The attitude law selects between two modes:\n", "\n", "1. **Default (nadir)**: `FixedAttitudeLaw.nadir()` — body-z points at\n", " Earth centre; used when the spacecraft is *not* in view of Svalbard.\n", "2. **GS tracking**: `TrackAttitudeLaw(gs)` — body-z points at the ground\n", " station; used when `SpaceGroundAccessCondition` is true.\n", "\n", "In a real mission, the tracking law would orient the body-X face (where\n", "the downlink antenna is mounted) toward the station. Here we use\n", "`TrackAttitudeLaw` to point body-z at the station, which demonstrates\n", "the mechanism clearly." ] }, { "cell_type": "code", "execution_count": 12, "id": "cond-att", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:29.325144Z", "iopub.status.busy": "2026-05-02T20:58:29.324664Z", "iopub.status.idle": "2026-05-02T20:58:29.345875Z", "shell.execute_reply": "2026-05-02T20:58:29.339999Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Attitude law : ConditionAttitudeLaw(default=FixedAttitudeLaw(frame='lvlh', boresight=[-1. 0. 0.]), branches=[(SpaceGroundAccessCondition(spacecraft=Spacecraft(a=6928137.0, e=0.0, i=1.7033142931462117, raan=0.8148686612074731, arg_p=0.0, ma=np.float64(0.0), epoch=datetime.datetime(2025, 6, 1, 0, 0), propagator_type='j2', central_body_mu=398600441800000.0, central_body_j2=1.75553e+25, central_body_radius=6378137.0), ground_station=GroundStation(lat=78.2, lon=15.6, alt=0.0), el_min_deg=5.0), TrackAttitudeLaw(target=GroundStation(lat=78.2, lon=15.6, alt=0.0)))])\n" ] } ], "source": [ "nadir_law = FixedAttitudeLaw.nadir()\n", "track_law = TrackAttitudeLaw(gs)\n", "\n", "gs_visible = SpaceGroundAccessCondition(sc, gs, el_min_deg=5.0)\n", "\n", "attitude_law = ConditionAttitudeLaw(\n", " default_attitude=nadir_law,\n", " condition_attitudes=[(gs_visible, track_law)],\n", ")\n", "\n", "sc.attitude_law = attitude_law\n", "\n", "print(f\"Attitude law : {attitude_law}\")" ] }, { "cell_type": "markdown", "id": "cond-sensor-md", "metadata": {}, "source": [ "## 3. Sensor with Conditional Activation\n", "\n", "The sensor is a 15° half-angle conic sensor pointing along body-z\n", "(nadir when in default mode). It carries a `NotCondition` wrapping the\n", "same ground-station visibility predicate, so it only collects imagery\n", "when the spacecraft is *not* tracking the ground station." ] }, { "cell_type": "code", "execution_count": 13, "id": "cond-sensor", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:29.350786Z", "iopub.status.busy": "2026-05-02T20:58:29.350320Z", "iopub.status.idle": "2026-05-02T20:58:29.380545Z", "shell.execute_reply": "2026-05-02T20:58:29.370253Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sensor : ConicSensor(half_angle_deg=15.000, mode='body', body_vector=[0.0, 0.0, 1.0], condition=NotCondition(SpaceGroundAccessCondition(spacecraft=Spacecraft(a=6928137.0, e=0.0, i=1.7033142931462117, raan=0.8148686612074731, arg_p=0.0, ma=np.float64(0.0), epoch=datetime.datetime(2025, 6, 1, 0, 0), propagator_type='j2', central_body_mu=398600441800000.0, central_body_j2=1.75553e+25, central_body_radius=6378137.0), ground_station=GroundStation(lat=78.2, lon=15.6, alt=0.0), el_min_deg=5.0)))\n", "Sensor condition: NotCondition(SpaceGroundAccessCondition(spacecraft=Spacecraft(a=6928137.0, e=0.0, i=1.7033142931462117, raan=0.8148686612074731, arg_p=0.0, ma=np.float64(0.0), epoch=datetime.datetime(2025, 6, 1, 0, 0), propagator_type='j2', central_body_mu=398600441800000.0, central_body_j2=1.75553e+25, central_body_radius=6378137.0), ground_station=GroundStation(lat=78.2, lon=15.6, alt=0.0), el_min_deg=5.0))\n" ] } ], "source": [ "sensor = ConicSensor(\n", " 15.0,\n", " body_vector=[0, 0, 1],\n", " condition=~gs_visible,\n", ")\n", "sc.add_sensor(sensor)\n", "\n", "print(f\"Sensor : {sensor}\")\n", "print(f\"Sensor condition: {sensor.condition}\")" ] }, { "cell_type": "markdown", "id": "cond-aoi-md", "metadata": {}, "source": [ "## 4. Area of Interest and Coverage Setup\n", "\n", "We use a bounding box which covers Europe and a 10-day analysis window." ] }, { "cell_type": "code", "execution_count": 14, "id": "cond-aoi", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:29.389569Z", "iopub.status.busy": "2026-05-02T20:58:29.389075Z", "iopub.status.idle": "2026-05-02T20:58:29.487727Z", "shell.execute_reply": "2026-05-02T20:58:29.482946Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AoI points : 7050\n", "Window : 10 days\n" ] } ], "source": [ "POINT_DENSITY = 5_000 # km² per sample point\n", "\n", "aoi = AoI.from_region(\n", " lat_min_deg = 27.0,\n", " lat_max_deg = 72.0,\n", " lon_min_deg = -32.0,\n", " lon_max_deg = 45.0,\n", " point_density = POINT_DENSITY,\n", ")\n", "\n", "T_START = EPOCH\n", "T_END = EPOCH + np.timedelta64(10 * 86_400, 's')\n", "\n", "cov = Coverage(aoi, [sensor], el_min_deg=10.0)\n", "\n", "print(f\"AoI points : {len(aoi)}\")\n", "print(f\"Window : 10 days\")" ] }, { "cell_type": "markdown", "id": "cond-cov-md", "metadata": {}, "source": [ "## 5. Coverage Results" ] }, { "cell_type": "code", "execution_count": 15, "id": "cond-cov", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:29.492412Z", "iopub.status.busy": "2026-05-02T20:58:29.492007Z", "iopub.status.idle": "2026-05-02T20:58:33.504522Z", "shell.execute_reply": "2026-05-02T20:58:33.503325Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Computing coverage fraction ...\n", " Final cumulative coverage : 58.3%\n", " Mean instantaneous : 0.0%\n", "\n", "Computing revisit times ...\n", " Global mean revisit : 24.8 h\n", " Global max revisit : 225.9 h\n" ] } ], "source": [ "print(\"Computing coverage fraction ...\")\n", "frac = cov.coverage_fraction(T_START, T_END, max_step=np.timedelta64(10, 's'))\n", "print(f\" Final cumulative coverage : {frac['final_cumulative']:.1%}\")\n", "print(f\" Mean instantaneous : {frac['mean_fraction']:.1%}\")\n", "\n", "print(\"\\nComputing revisit times ...\")\n", "rev = cov.revisit_time(T_START, T_END, max_step=np.timedelta64(10, 's'))\n", "global_mean_hrs = rev['global_mean'] / 3600.0\n", "global_max_hrs = rev['global_max'] / 3600.0\n", "print(f\" Global mean revisit : {global_mean_hrs:.1f} h\")\n", "print(f\" Global max revisit : {global_max_hrs:.1f} h\")" ] }, { "cell_type": "markdown", "id": "cond-intervals-md", "metadata": {}, "source": [ "## 6. Ground-Station Access Intervals\n", "\n", "Show when the ground station is visible, which are the intervals where\n", "imaging is suspended and the spacecraft tracks the station." ] }, { "cell_type": "code", "execution_count": 16, "id": "cond-intervals", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:33.507846Z", "iopub.status.busy": "2026-05-02T20:58:33.507468Z", "iopub.status.idle": "2026-05-02T20:58:33.572281Z", "shell.execute_reply": "2026-05-02T20:58:33.570773Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ground-station passes over 10 days: 134\n", "\n", " Pass 1: 2025-06-01T01:10:57 — 2025-06-01T01:18:14 (7.3 min)\n", " Pass 2: 2025-06-01T02:46:04 — 2025-06-01T02:55:05 (9.0 min)\n", " Pass 3: 2025-06-01T04:21:07 — 2025-06-01T04:30:56 (9.8 min)\n", " Pass 4: 2025-06-01T05:56:00 — 2025-06-01T06:05:57 (9.9 min)\n", " Pass 5: 2025-06-01T07:30:42 — 2025-06-01T07:40:28 (9.8 min)\n", " Pass 6: 2025-06-01T09:05:09 — 2025-06-01T09:14:48 (9.7 min)\n", " Pass 7: 2025-06-01T10:39:30 — 2025-06-01T10:49:15 (9.8 min)\n", " Pass 8: 2025-06-01T12:14:00 — 2025-06-01T12:23:57 (9.9 min)\n", " Pass 9: 2025-06-01T13:49:03 — 2025-06-01T13:58:51 (9.8 min)\n", " Pass 10: 2025-06-01T15:24:55 — 2025-06-01T15:33:54 (9.0 min)\n", " ... and 124 more passes\n" ] } ], "source": [ "passes = gs.access(sc, T_START, T_END, el_min_deg=5.0)\n", "\n", "print(f\"Ground-station passes over 10 days: {len(passes)}\")\n", "print()\n", "for i, (t0, t1) in enumerate(passes[:10]):\n", " dur_min = (t1 - t0) / np.timedelta64(60, 's')\n", " print(f\" Pass {i+1:>2}: {str(t0)[:19]} — {str(t1)[:19]} ({dur_min:.1f} min)\")\n", "if len(passes) > 10:\n", " print(f\" ... and {len(passes) - 10} more passes\")" ] }, { "cell_type": "markdown", "id": "cond-plot-md", "metadata": {}, "source": [ "## 7. Attitude Mode Timeline\n", "\n", "Plot the GS visibility condition over the first 3 orbits to visualise\n", "when the spacecraft switches between imaging and tracking modes." ] }, { "cell_type": "code", "execution_count": 17, "id": "cond-plot", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:33.575769Z", "iopub.status.busy": "2026-05-02T20:58:33.575387Z", "iopub.status.idle": "2026-05-02T20:58:33.711721Z", "shell.execute_reply": "2026-05-02T20:58:33.710183Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABW0AAAEiCAYAAACC1vAZAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAATslJREFUeJzt3XdclfX///HnAWTJcjDcqKg5cOfOnThyZLlzVW5NKz+5ytGwLMsc5WioGc4y81OaWmHlyomWGo5w9BFCM1QUUeD9+8Mf5+sJVFDgnORxv9243Tjv6329r9d1cd4denrxvizGGCMAAAAAAAAAgENwsncBAAAAAAAAAID/Q2gLAAAAAAAAAA6E0BYAAAAAAAAAHAihLQAAAAAAAAA4EEJbAAAAAAAAAHAghLYAAAAAAAAA4EAIbQEAAAAAAADAgRDaAgAAAAAAAIADIbQFAAAAAAAAAAdCaAsAAHCf27x5sywWizZv3pwrx2vatKmaNm2aK8fKDYsWLZLFYtGJEyfsXcod7dq1Sw0aNFD+/PllsVgUGRmpyZMny2Kx2Ls0u2ratKmqVKlyx34nTpyQxWLRokWLcr4oAACA2yC0BQAAcCDvv/++LBaL6tatm+H2Q4cOafLkyRkGiO+//36mw6alS5fq3XffvftC4XCuX7+uLl266Pz585oxY4aWLFmiUqVKZftxbvcezMiPP/6oDh06qESJEnJ3d1dQUJBat26trVu3ZnttOWHdunWaPHmyvcsAAAB5DKEtAACAAwkPD1dwcLB27typY8eOpdt+6NAhTZkyJUuhbePGjZWYmKjGjRtb2wht7z/Hjx/XyZMnNXr0aA0cOFBPPPGEChQooBdffFGJiYnZdpzbvQczcuTIETk5OWnw4MF67733NHr0aMXGxqpx48b65ptvsq2u7FCqVCklJiaqd+/e1rZ169ZpypQpdqwKAADkRYS2AAAADiI6Olrbtm3TO++8I39/f4WHh2fLuE5OTnJ3d5eTE7/63c/i4uIkSX5+fjbtLi4ucnd3v+2+qampunr1ao7U9fTTT2vNmjWaMGGCnnrqKY0ePVrbtm2Tv79/jv/DweXLl7PU32KxyN3dXc7OzjlUEQAAQObwmzsAAICDCA8PV4ECBdSuXTs9/vjj6ULbRYsWqUuXLpKkZs2ayWKxWNeqDQ4O1sGDB/XDDz9Y29PWlf3nmrZNmzbV119/rZMnT1r7BgcHW4+R0fqtt1oXd8GCBSpbtqw8PDxUp04d/fTTTxmeW1JSkiZNmqSQkBC5ubmpRIkSeuGFF5SUlHTH65K2HumBAwfUpEkTeXp6KiQkRJ999pkk6YcfflDdunXl4eGhChUq6Ntvv003xr59+9SmTRv5+PjIy8tLLVq00I4dO9L1O3jwoJo3by4PDw8VL15cr776qlJTUzOsa/369XrooYeUP39+eXt7q127djp48OAdzycn9OvXT02aNJEkdenSxebnn9GathaLRcOHD1d4eLgqV64sNzc3612vy5cvV61ateTt7S0fHx+FhoZq5syZkm7/HswKT09P+fv7Kz4+PlP9V61apVq1asnDw0OFCxfWE088of/973/proGXl5eOHz+utm3bytvbW7169bLps2fPHjVo0EAeHh4qXbq05s2bZ7P9n2va9uvXT++9954kWc/15mt5u2sFAABwL1zsXQAAAABuCA8PV+fOneXq6qoePXpo7ty52rVrlx588EFJN5Y5eOaZZzRr1iyNHz9eFStWlCRVrFhR7777rkaMGCEvLy9NmDBBkhQYGJjhcSZMmKALFy7ojz/+0IwZMyRJXl5eWa73o48+0qBBg9SgQQONGjVKv//+uzp06KCCBQuqRIkS1n6pqanq0KGDtmzZooEDB6pixYr65ZdfNGPGDB05ckRr1qy547H+/vtvPfLII+revbu6dOmiuXPnqnv37goPD9eoUaM0ePBg9ezZU2+99ZYef/xxnT59Wt7e3pJuBLEPPfSQfHx89MILLyhfvnyaP3++mjZtag18JSk2NlbNmjVTcnKyxo4dq/z582vBggXy8PBIV8+SJUvUt29fhYWFadq0abpy5Yrmzp2rRo0aad++fdYQPLcMGjRIxYoV09SpU/XMM8/owQcfvOXPP83333+vlStXavjw4SpcuLCCg4O1adMm9ejRQy1atNC0adMkSYcPH9bWrVs1cuTI274H7+TixYu6du2azp07p08++US//vqrxo8ff8f9Fi1apP79++vBBx/U66+/rj///FMzZ87U1q1btW/fPps7i5OTkxUWFqZGjRpp+vTp8vT0tG77+++/1bZtW3Xt2lU9evTQypUrNWTIELm6uurJJ5/M8NiDBg3SmTNntGnTJi1ZssRm252uFQAAwD0xAAAAsLvdu3cb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myUkJKh9+/aaNm1aum1pgbQk6zIX/v7+2Xr8rOJOWwAAAAAAANyVQoUK6eGHH9acOXOsD/vKCldXV5UtW/a2+xYvXlxNmjRReHi4wsPD9fDDDysgIOCW/S0Wixo2bKgpU6Zo3759cnV11RdffHHL/j///LPN6x07dqhcuXJydnZO17dmzZqKjY2Vi4uLQkJCbL4KFy58y3OsVKmSDh06lK49o7t5M7J161Z17NhRTzzxhKpVq6YyZcroyJEj1u3lypWTh4eHvvvuu9uOM2TIEL3xxhvq0KGDfvjhh0wd+1YqVKigXbt22bT983V28PHxUdGiRbV161ab9q1bt6pSpUqSpIoVK+rAgQPWJTmkGz/Hm9WsWVMHDx5UcHBwup/dzSH5r7/+quLFi9/y55lbCG0BAAAAAABw195//30lJyerdu3aWrFihQ4fPqyoqCh9+umn+u2336zh51dffaUnnnhCX331lY4cOaKoqChNnz5d69atU8eOHW97jF69emn58uVatWrVLZdGkG4EsFOnTtXu3bt16tQprV69WmfPnlXFihVvuc+pU6f03HPPKSoqSsuWLdPs2bM1cuTIDPu2bNlS9evXV6dOnbRx40adOHFC27Zt04QJE7R79+5bHiMsLExbtmyxaQsODtaBAwcUFRWlc+fO6fr167fcv1y5ctY7iA8fPqxBgwbpzz//tG53d3fXmDFj9MILL+iTTz7R8ePHtWPHDn300UfpxhoxYoReffVVPfLII+lqyooRI0Zo3bp1euedd3T06FHNnz9f69evt1lqIrv85z//0bRp07RixQpFRUVp7NixioyMtP6cevbsKYvFogEDBujQoUNat26dpk+fbjPGsGHDdP78efXo0UO7du3S8ePHtWHDBvXv398mPP/pp5/UqlWrbD+HrGJ5BAAAAAAAANy1smXLat++fZo6darGjRunP/74Q25ubqpUqZJGjx6toUOHSpIqVaokT09PPf/88zp9+rTc3NxUrlw5ffjhh+rdu/dtj/H4449r+PDhcnZ2VqdOnW7Zz8fHRz/++KPeffddXbx4UaVKldLbb7+tNm3a3HKfPn36KDExUXXq1JGzs7NGjhyZ4QPFpBt38a5bt04TJkxQ//79dfbsWQUFBalx48a3fJiadOPBWrVr19aFCxesa8kOGDBAmzdvVu3atZWQkKCIiAgFBwdn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uNBWkhYvXqzChQtr586dGjFihIYMGaIuXbqoQYMG2rt3r1q1aqXevXvrypUrkqTU1FQVL15cq1at0qFDhzRx4kSNHz9eK1eutI45bdo0hYeHa+HChdq6dasuXryYqeUY3n77bdWuXVv79u3T0KFDNWTIEEVFRUmSLl68qPbt2ys0NFR79+7VK6+8ojFjxuTINQEAAAAAAACQNzjk8gjVqlXTiy++KEkaN26c3njjDRUuXFgDBgyQJE2cOFFz587VgQMHVK9ePeXLl09Tpkyx7l+6dGlt375dK1euVNeuXSVJs2fP1rhx4/Too49KkubMmaN169bdsZa2bdtq6NChkqQxY8ZoxowZioiIUIUKFbR06VJZLBZ98MEHcnd3V6VKlfS///3PWmdGkpKSlJSUZH198eLFLF4dAEBmOVkscnG22LsMAEAuc7T//jtZHKcWALifuTg7ySXV2LuMDLk48VmArHHI0LZq1arW752dnVWoUCGFhoZa2wIDAyVJcXFx1rb33ntPH3/8sU6dOqXExERdu3ZN1atXlyRduHBBf/75p+rUqWMzbq1atZSamprpWiwWi4KCgqzHjYqKUtWqVeXu7m7tc/MxMvL666/bBMwAgJxTsYiPKhbxsXcZAIBcVrKQp0oW8rR3GQCAXNahWlF7lwBkG4dcHiFfvnw2ry0Wi02b5f//S3Va4Lp8+XKNHj1aTz31lDZu3KjIyEj1799f165dy5Fa7hT03s64ceN04cIF69fp06fvtUQAAAAAAAAA9xGHDG2zauvWrWrQoIGGDh2qGjVqKCQkRMePH7du9/X1VWBgoHbt2mVtS0lJ0d69e+/puBUqVNAvv/xis9zBzcfIiJubm3x8fGy+AAAAAAAAACDNfRHalitXTrt379aGDRt05MgRvfTSS+nC0xEjRuj111/Xl19+qaioKI0cOVJ///239a7du9GzZ0+lpqZq4MCBOnz4sDZs2KDp06dL0j2NCwAAAAAAACDvui9C20GDBqlz587q1q2b6tatq7/++sv68LA0Y8aMUY8ePdSnTx/Vr19fXl5eCgsLs1mPNqt8fHz03//+V5GRkapevbomTJigiRMnStI9jQsAAAAAAAAg77IYYxzzsXo5LDU1VRUrVlTXrl31yiuvZNu44eHh6t+/vy5cuCAPD4879r948aJ8fX114cIFlkoAAAAAAAAA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XWtboUKFVKFCBevdrZLk6empsmXL2tQYHBxsU1NgYKC15ozs379fW7dutbmzNiUlRVevXtWVK1fk6ekpSapfv77NfvXr11dkZKS13mrVqil//vzW7Q0bNlRqaqqioqJksVh05swZtWjR4rbX4eZrkD9/fvn4+Ny29sTERLm7u6drz47rcjf1ZMb+/fuVkJCgQoUK2bQnJiZalzt47rnn9PTTT2vJkiVq2bKlunTpYnM+kuTh4WG96xsAAODfhtAWAAAAmXLzn59LN9Y0vbktba3S1NRUSTceKta+fXtNmzYt3VhFihTJ0rE9PDys42fFnWpOa0urOSMJCQmaMmWKOnfunG5bRoHo3fDw8MhUv6zWXrhwYf3999+ZGierY9+pHicnJxljbLbfvHTFrSQkJKhIkSLavHlzum1pa+ROnjxZPXv21Ndff63169dr0qRJWr58uR599FFr3/Pnz/+rHp4GAABwM0JbAAAA5IiaNWvq888/V3BwsFxcsvfXzooVKyo5OVk///yzdd3bv/76S1FRUapUqVK2HqtmzZqKiopKt77sP+3YsUN9+vSxeV2jRg1rvYsWLdLly5etd9tu3bpVTk5OqlChgry9vRUcHKzvvvtOzZo1y7baa9SooUOHDmXbeFnh7++vS5cu2Zxz2p3HaVxdXdM9BK5mzZqKjY2Vi4uLgoODbzl++fLlVb58eT377LPq0aOHFi5caA1tr169quPHj1uvPwAAwL8NDyIDAABAjhg2bJjOnz+vHj16aNeuXTp+/Lg2bNig/v37pwvqsqpcuXLq2LGjBgwYoC1btmj//v164oknVKxYMXXs2DGbzuCGiRMn6pNPPtGUKVN08OBBHT58WMuXL9eLL75o02/VqlX6+OOPdeTIEU2aNEk7d+60PmisV69ecnd3V9++ffXrr78qIiJCI0aMUO/eva3LSkyePFlvv/22Zs2apaNHj2rv3r2aPXv2PdUeFham7du33/P1vht169aVp6enxo8fr+PHj2vp0qVatGiRTZ/g4GBFR0crMjJS586dU1JSklq2bKn69eurU6dO2rhxo06cOKFt27ZpwoQJ2r17txITEzV8+HBt3rxZJ0+e1NatW7Vr1y5VrFjROu6OHTvk5uaWbskKAACAfwtCWwAAAOSIokWLauvWrUpJSVGrVq0UGhqqUaNGyc/PT05O9/5r6MKFC1WrVi098sgjql+/vowxWrduXbo/2b9XYWFh+uqrr7Rx40Y9+OCDqlevnmbMmKFSpUrZ9JsyZYqWL1+uqlWr6pNPPtGyZcusd/16enpqw4YNOn/+vB588EE9/vjjatGihebMmWPdv2/fvnr33Xf1/vvvq3LlynrkkUd09OjRe6q9TZs2cnFx0bfffntP49yNggUL6tNPP9W6desUGhqqZcuWafLkyTZ9HnvsMbVu3VrNmjWTv7+/li1bJovFonXr1qlx48bq37+/ypcvr+7du+vkyZMKDAyUs7Oz/vrrL/Xp00fly5dX165d1aZNG02ZMsU67rJly9SrVy/resMAAAD/Nhbzz4WmAAAAAGSJxWLRF198oU6dOtm7lHTee+89rV27Vhs2bLB3Kbni3LlzqlChgnbv3q3SpUvbuxwAAIC7wpq2AAAAwH1s0KBBio+P16VLl+Tt7W3vcnLciRMn9P777xPYAgCAfzXutAUAAADukSPfaQsAAIB/H+60BQAAAO4R90EAAAAgO/EgMgAAAAAAAABwIIS2AAAAAAAAAOBACG0BAAAAAAAAwIEQ2gIAAAAAAACAAyG0BQAAAAAAAAAHQmgLAAAAAAAAAA6E0BYAAAAAAAAAHAihLQAAAAAAAAA4EEJbAAAAAAAAAHAg/w+svLwK9ufIXwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t_first3 = T_START + np.arange(\n", " 0, 3 * period_s, 10,\n", ").astype('timedelta64[s]')\n", "t_rel_min = (t_first3 - T_START) / np.timedelta64(60, 's')\n", "\n", "vis = gs_visible.at(t_first3).astype(float)\n", "\n", "fig, ax = plt.subplots(figsize=(14, 3))\n", "ax.fill_between(t_rel_min, vis, step='mid', alpha=0.4,\n", " label='GS visible (tracking mode)')\n", "ax.set_ylabel('GS visible')\n", "ax.set_xlabel('Time from epoch (minutes)')\n", "ax.set_yticks([0, 1])\n", "ax.set_yticklabels(['Imaging', 'Tracking'])\n", "ax.set_ylim(-0.1, 1.5)\n", "ax.set_title('Attitude mode — first 3 orbits')\n", "ax.legend(loc='upper right')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "cond-summary-md", "metadata": {}, "source": [ "## 8. Summary" ] }, { "cell_type": "code", "execution_count": 19, "id": "cond-summary", "metadata": { "execution": { "iopub.execute_input": "2026-05-02T20:58:33.715059Z", "iopub.status.busy": "2026-05-02T20:58:33.714649Z", "iopub.status.idle": "2026-05-02T20:58:33.726810Z", "shell.execute_reply": "2026-05-02T20:58:33.725059Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "10-day conditional coverage — European region\n", "550 km SSO LTAN 10:30 | 15° sensor | Svalbard GS (78.2°N)\n", "============================================================\n", "Cumulative coverage fraction : 58.3%\n", "Mean instantaneous coverage : 0.0%\n", "Global mean revisit time : 24.8 h\n", "Global max revisit time : 225.9 h\n", "Ground-station passes : 134\n", "Total tracking time : 1105 min (18.4 h)\n", "Tracking duty cycle : 7.67%\n", "============================================================\n" ] } ], "source": [ "print(\"=\" * 60)\n", "print(\"10-day conditional coverage — European region\")\n", "print(\"550 km SSO LTAN 10:30 | 15° sensor | Svalbard GS (78.2°N)\")\n", "print(\"=\" * 60)\n", "print(f\"Cumulative coverage fraction : {frac['final_cumulative']:.1%}\")\n", "print(f\"Mean instantaneous coverage : {frac['mean_fraction']:.1%}\")\n", "print(f\"Global mean revisit time : {global_mean_hrs:.1f} h\")\n", "print(f\"Global max revisit time : {global_max_hrs:.1f} h\")\n", "print(f\"Ground-station passes : {len(passes)}\")\n", "total_track_min = sum((t1 - t0) / np.timedelta64(60, 's') for t0, t1 in passes)\n", "print(f\"Total tracking time : {total_track_min:.0f} min ({total_track_min / 60:.1f} h)\")\n", "print(f\"Tracking duty cycle : {total_track_min / (10 * 1440):.2%}\")\n", "print(\"=\" * 60)" ] }, { "cell_type": "code", "execution_count": null, "id": "2433b755", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.12" } }, "nbformat": 4, "nbformat_minor": 5 }