{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Agile Earth-Observing Satellite Environment\n", "\n", "This example demonstrates the environment configuration for a power-free and power-constrained agile Earth-observing satellite. These environments reflect the configuration and values from an upcoming journal paper." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from Basilisk.architecture import bskLogging\n", "from Basilisk.utilities import orbitalMotion\n", "\n", "from bsk_rl import SatelliteTasking, act, data, obs, sats, scene\n", "from bsk_rl.sim import fsw\n", "from bsk_rl.utils.orbital import random_orbit, rv2HN\n", "\n", "bskLogging.setDefaultLogLevel(bskLogging.BSK_WARNING)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Power-Free Environment\n", "\n", "First, a function for generating satellite types is introduced. This function can generate one of three different observation types, and can choose to include the time through episode in the observation." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def satellite_generator(observation, n_ahead=32, include_time=False):\n", " \"\"\"_summary_\n", "\n", " Args:\n", " observation: Pick from \"S1\", \"S2\", \"S3\"\n", " n_ahead: Number of requests to include in the observation and action spaces\n", " include_time: Whether to include time through episode in the observation\n", " \"\"\"\n", "\n", " assert observation in [\"S1\", \"S2\", \"S3\"]\n", "\n", " class CustomSatellite(sats.ImagingSatellite):\n", " action_spec = [act.Image(n_ahead_image=n_ahead)]\n", " if observation == \"S1\":\n", " observation_spec = [\n", " obs.SatProperties(\n", " dict(prop=\"omega_BP_P\", norm=0.03),\n", " dict(prop=\"c_hat_P\"),\n", " dict(prop=\"r_BN_P\", norm=orbitalMotion.REQ_EARTH * 1e3),\n", " dict(prop=\"v_BN_P\", norm=7616.5),\n", " ),\n", " obs.OpportunityProperties(\n", " dict(prop=\"priority\"),\n", " dict(prop=\"r_LP_P\", norm=orbitalMotion.REQ_EARTH * 1e3),\n", " type=\"target\",\n", " n_ahead_observe=n_ahead,\n", " ),\n", " ]\n", " elif observation == \"S2\":\n", " observation_spec = [\n", " obs.SatProperties(\n", " dict(prop=\"omega_BH_H\", norm=0.03),\n", " dict(prop=\"c_hat_H\"),\n", " dict(prop=\"r_BN_P\", norm=orbitalMotion.REQ_EARTH * 1e3),\n", " dict(prop=\"v_BN_P\", norm=7616.5),\n", " ),\n", " obs.OpportunityProperties(\n", " dict(prop=\"priority\"),\n", " dict(prop=\"r_LB_H\", norm=orbitalMotion.REQ_EARTH * 1e3),\n", " type=\"target\",\n", " n_ahead_observe=n_ahead,\n", " ),\n", " ]\n", " elif observation == \"S3\":\n", " observation_spec = [\n", " obs.SatProperties(\n", " dict(prop=\"omega_BH_H\", norm=0.03),\n", " dict(prop=\"c_hat_H\"),\n", " dict(prop=\"r_BN_P\", norm=orbitalMotion.REQ_EARTH * 1e3),\n", " dict(prop=\"v_BN_P\", norm=7616.5),\n", " ),\n", " obs.OpportunityProperties(\n", " dict(prop=\"priority\"),\n", " dict(prop=\"r_LB_H\", norm=800 * 1e3),\n", " dict(prop=\"target_angle\", norm=np.pi / 2),\n", " dict(prop=\"target_angle_rate\", norm=0.03),\n", " dict(prop=\"opportunity_open\", norm=300.0),\n", " dict(prop=\"opportunity_close\", norm=300.0),\n", " type=\"target\",\n", " n_ahead_observe=n_ahead,\n", " ),\n", " ]\n", "\n", " if include_time:\n", " observation_spec.append(obs.Time())\n", " fsw_type = fsw.SteeringImagerFSWModel\n", "\n", " return CustomSatellite" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, the parameters for the satellite are defined." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "SAT_ARGS = dict(\n", " imageAttErrorRequirement=0.01,\n", " imageRateErrorRequirement=0.01,\n", " batteryStorageCapacity=80.0 * 3600 * 100,\n", " storedCharge_Init=80.0 * 3600 * 100.0,\n", " dataStorageCapacity=200 * 8e6 * 100,\n", " u_max=0.4,\n", " imageTargetMinimumElevation=np.arctan(800 / 500),\n", " K1=0.25,\n", " K3=3.0,\n", " omega_max=np.radians(5),\n", " servo_Ki=5.0,\n", " servo_P=150 / 5,\n", " oe=lambda: random_orbit(alt=800),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, the environment can be initialized." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[90;3m2025-02-13 15:16:51,667 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[mResetting environment with seed=3834134456\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:51,668 \u001b[0m\u001b[mscene.targets \u001b[0m\u001b[mINFO \u001b[0m\u001b[mGenerating 3000 targets\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:51,799 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mFinding opportunity windows from 0.00 to 28500.00 seconds\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,307 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[mEnvironment reset\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,308 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,308 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 21 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,309 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-2268) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,311 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-2268) window enabled: 468.2 to 543.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,311 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 543.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,380 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,382 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,382 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,394 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,395 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,396 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 8 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,396 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-697) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,398 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-697) window enabled: 368.9 to 489.9\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,398 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 489.9\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,415 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mimaged Target(tgt-697)\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,417 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[mData reward: {'EO1': 0.4521306121638049}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,417 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,419 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mSatellite EO1 requires retasking\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,429 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[mStep reward: 0.4521306121638049\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,430 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,431 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 0 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,431 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-2678) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,433 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-2678) window enabled: 320.3 to 408.2\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,433 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<370.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 408.2\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,443 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtimed termination at 408.2 for Target(tgt-2678) window\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,445 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,446 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,448 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mSatellite EO1 requires retasking\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,458 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,459 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,459 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 11 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,460 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-860) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,462 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-860) window enabled: 520.0 to 652.4\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,462 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<408.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 652.4\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,487 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mimaged Target(tgt-860)\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,490 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[mData reward: {'EO1': 0.9127542586368591}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,490 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,492 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mSatellite EO1 requires retasking\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,502 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[mStep reward: 0.9127542586368591\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,503 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,503 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 6 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,503 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-1667) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,505 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(tgt-1667) window enabled: 527.3 to 658.3\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,506 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<521.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 658.3\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,513 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<549.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mimaged Target(tgt-1667)\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,515 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<549.50> \u001b[0m\u001b[mData reward: {'EO1': 0.8568378292895359}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,516 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<549.50> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,518 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<549.50> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mSatellite EO1 requires retasking\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,527 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<549.50> \u001b[0m\u001b[mStep reward: 0.8568378292895359\u001b[0m\n" ] } ], "source": [ "duration = 5700.0 * 5 # 5 orbits\n", "target_distribution = \"uniform\"\n", "n_targets = 3000\n", "n_ahead = 32\n", "\n", "if target_distribution == \"uniform\":\n", " targets = scene.UniformTargets(n_targets)\n", "elif target_distribution == \"cities\":\n", " targets = scene.CityTargets(n_targets)\n", "\n", "env = SatelliteTasking(\n", " satellite=satellite_generator(observation=\"S3\", n_ahead=32, include_time=False)(\n", " name=\"EO1\",\n", " sat_args=SAT_ARGS,\n", " ),\n", " scenario=targets,\n", " rewarder=data.UniqueImageReward(),\n", " sim_rate=0.5,\n", " max_step_duration=300.0,\n", " time_limit=duration,\n", " failure_penalty=0.0,\n", " terminate_on_time_limit=True,\n", " log_level=\"INFO\",\n", ")\n", "_ = env.reset()\n", "for i in range(5):\n", " env.step(env.action_space.sample())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Power-Constrained Environment\n", "\n", "The power-constrained environment is like the power-free environment, but with an additional battery management requirement. The satellite has additional observation elements to be able to account for power.\n", "\n", "First, the upcoming reward density observation is defined." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class Density(obs.Observation):\n", " def __init__(\n", " self,\n", " interval_duration=60 * 3,\n", " intervals=10,\n", " norm=3,\n", " ):\n", " self.satellite: \"sats.AccessSatellite\"\n", " super().__init__()\n", " self.interval_duration = interval_duration\n", " self.intervals = intervals\n", " self.norm = norm\n", "\n", " def get_obs(self):\n", " if self.intervals == 0:\n", " return []\n", "\n", " self.satellite.calculate_additional_windows(\n", " self.simulator.sim_time\n", " + (self.intervals + 1) * self.interval_duration\n", " - self.satellite.window_calculation_time\n", " )\n", " soonest = self.satellite.upcoming_opportunities_dict(types=\"target\")\n", " rewards = np.array([opportunity.priority for opportunity in soonest])\n", " times = np.array([opportunities[0][1] for opportunities in soonest.values()])\n", " time_bins = np.floor((times - self.simulator.sim_time) / self.interval_duration)\n", " densities = [sum(rewards[time_bins == i]) for i in range(self.intervals)]\n", " return np.array(densities) / self.norm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The satellite generator function is then defined, along with some additional observations." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def wheel_speed_3(sat):\n", " return np.array(sat.dynamics.wheel_speeds[0:3]) / 630\n", "\n", "\n", "def s_hat_H(sat):\n", " r_SN_N = (\n", " sat.simulator.world.gravFactory.spiceObject.planetStateOutMsgs[\n", " sat.simulator.world.sun_index\n", " ]\n", " .read()\n", " .PositionVector\n", " )\n", " r_BN_N = sat.dynamics.r_BN_N\n", " r_SB_N = np.array(r_SN_N) - np.array(r_BN_N)\n", " r_SB_H = rv2HN(r_BN_N, sat.dynamics.v_BN_N) @ r_SB_N\n", " return r_SB_H / np.linalg.norm(r_SB_H)\n", "\n", "\n", "def power_sat_generator(n_ahead=32, include_time=False):\n", " class PowerSat(sats.ImagingSatellite):\n", " action_spec = [act.Image(n_ahead_image=n_ahead), act.Charge()]\n", " observation_spec = [\n", " obs.SatProperties(\n", " dict(prop=\"omega_BH_H\", norm=0.03),\n", " dict(prop=\"c_hat_H\"),\n", " dict(prop=\"r_BN_P\", norm=orbitalMotion.REQ_EARTH * 1e3),\n", " dict(prop=\"v_BN_P\", norm=7616.5),\n", " dict(prop=\"battery_charge_fraction\"),\n", " dict(prop=\"wheel_speed_3\", fn=wheel_speed_3),\n", " dict(prop=\"s_hat_H\", fn=s_hat_H),\n", " ),\n", " obs.OpportunityProperties(\n", " dict(prop=\"priority\"),\n", " dict(prop=\"r_LB_H\", norm=800 * 1e3),\n", " dict(prop=\"target_angle\", norm=np.pi / 2),\n", " dict(prop=\"target_angle_rate\", norm=0.03),\n", " dict(prop=\"opportunity_open\", norm=300.0),\n", " dict(prop=\"opportunity_close\", norm=300.0),\n", " type=\"target\",\n", " n_ahead_observe=n_ahead,\n", " ),\n", " obs.Eclipse(norm=5700),\n", " Density(intervals=20, norm=5),\n", " ]\n", "\n", " if include_time:\n", " observation_spec.append(obs.Time())\n", "\n", " fsw_type = fsw.SteeringImagerFSWModel\n", "\n", " return PowerSat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Satellite parameters are also modified for the power-constrained environment." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "SAT_ARGS_POWER = {}\n", "SAT_ARGS_POWER.update(SAT_ARGS)\n", "SAT_ARGS_POWER.update(\n", " dict(\n", " batteryStorageCapacity=120.0 * 3600,\n", " storedCharge_Init=lambda: 120.0 * 3600 * np.random.uniform(0.4, 1.0),\n", " rwBasePower=20.4,\n", " instrumentPowerDraw=-10,\n", " thrusterPowerDraw=-30,\n", " nHat_B=np.array([0, 0, -1]),\n", " wheelSpeeds=lambda: np.random.uniform(-2000, 2000, 3),\n", " desatAttitude=\"nadir\",\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, the environment can be initialized." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[90;3m2025-02-13 15:16:52,550 \u001b[0m\u001b[m \u001b[0m\u001b[93mWARNING \u001b[0m\u001b[93mCreating logger for new env on PID=96160. Old environments in process may now log times incorrectly.\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,685 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[mResetting environment with seed=557511160\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,687 \u001b[0m\u001b[mscene.targets \u001b[0m\u001b[mINFO \u001b[0m\u001b[mGenerating 3000 targets\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:52,784 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mFinding opportunity windows from 0.00 to 28500.00 seconds\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,502 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[mEnvironment reset\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,502 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,503 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mtarget index 19 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,503 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-109) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,505 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-109) window enabled: 549.9 to 655.3\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,505 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[msetting timed terminal event at 655.3\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,582 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,584 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,584 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,598 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,599 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,600 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mtarget index 17 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,600 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-1237) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,602 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-1237) window enabled: 704.0 to 804.3\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,602 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[msetting timed terminal event at 804.3\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,671 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,674 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,674 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,688 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,689 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,690 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[maction_charge tasked for 1000000000.0 seconds\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,690 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[msetting timed terminal event at 1000000600.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,759 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,761 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,762 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,775 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,776 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,776 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mtarget index 13 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,777 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-2932) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,779 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-2932) window enabled: 1125.7 to 1244.8\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,779 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[msetting timed terminal event at 1244.8\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,831 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mimaged Target(tgt-2932)\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,834 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[mData reward: {'EO1-power': 0.26460427843956014}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,834 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,836 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mSatellite EO1-power requires retasking\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,848 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[mStep reward: 0.26460427843956014\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,849 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,850 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mtarget index 0 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,850 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-1163) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,852 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mTarget(tgt-1163) window enabled: 1136.3 to 1159.6\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,852 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1127.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[msetting timed terminal event at 1159.6\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,861 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1160.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mtimed termination at 1159.6 for Target(tgt-1163) window\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,863 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1160.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,863 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1160.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,865 \u001b[0m\u001b[36msats.satellite.EO1-power \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1160.00> \u001b[0m\u001b[36mEO1-power: \u001b[0m\u001b[mSatellite EO1-power requires retasking\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,877 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1160.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n" ] } ], "source": [ "duration = 5700.0 * 5 # 5 orbits\n", "target_distribution = \"uniform\"\n", "n_targets = 3000\n", "n_ahead = 32\n", "\n", "if target_distribution == \"uniform\":\n", " targets = scene.UniformTargets(n_targets)\n", "elif target_distribution == \"cities\":\n", " targets = scene.CityTargets(n_targets)\n", "\n", "env = SatelliteTasking(\n", " satellite=power_sat_generator(n_ahead=32, include_time=False)(\n", " name=\"EO1-power\",\n", " sat_args=SAT_ARGS_POWER,\n", " ),\n", " scenario=targets,\n", " rewarder=data.UniqueImageReward(),\n", " sim_rate=0.5,\n", " max_step_duration=300.0,\n", " time_limit=duration,\n", " failure_penalty=0.0,\n", " terminate_on_time_limit=True,\n", " log_level=\"INFO\",\n", ")\n", "_ = env.reset()\n", "for i in range(5):\n", " env.step(env.action_space.sample())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Enabling Vizard\n", "\n", "Vizard visualization can be enabled by setting the ``vizard_dir`` to save the Vizard binary to. Here, it is saved to ``/tmp/vizard``, but this can be modified. Scripting settings can also be passed to Vizard." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[90;3m2025-02-13 15:16:53,883 \u001b[0m\u001b[m \u001b[0m\u001b[93mWARNING \u001b[0m\u001b[93mCreating logger for new env on PID=96160. Old environments in process may now log times incorrectly.\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,884 \u001b[0m\u001b[mgym \u001b[0m\u001b[93mWARNING \u001b[0m\u001b[93mVizard settings provided but Vizard is not enabled. Ignoring settings.\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,970 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[mResetting environment with seed=1842140160\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:53,991 \u001b[0m\u001b[mscene.targets \u001b[0m\u001b[mINFO \u001b[0m\u001b[mGenerating 100 targets\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,128 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mFinding opportunity windows from 0.00 to 28500.00 seconds\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,201 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[mEnvironment reset\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,201 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,201 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 16 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,202 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Gwoza, NG) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,202 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Gwoza, NG) window enabled: 15636.1 to 15690.5\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,203 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<0.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 15690.5\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,299 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,300 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,301 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,311 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,313 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,313 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 25 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,314 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Houzhuang, CN) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,315 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Houzhuang, CN) window enabled: 4433.5 to 4463.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,315 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<300.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 4463.0\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saving Viz file to /tmp/vizard/_VizFiles/viz_1739485014_UnityViz.bin\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\u001b[90;3m2025-02-13 15:16:54,421 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,422 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,422 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,432 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,433 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,434 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 12 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,434 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Zhujiagua, CN) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,435 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Zhujiagua, CN) window enabled: 4391.7 to 4521.9\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,435 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<600.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 4521.9\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,537 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,538 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,539 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,548 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,549 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,550 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 4 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,550 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Dabhaura, IN) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,551 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Dabhaura, IN) window enabled: 3912.7 to 4026.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,551 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<900.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 4026.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,660 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,661 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,662 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,673 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,675 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[93;1m=== STARTING STEP ===\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,675 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mtarget index 23 tasked\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,676 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Chirchiq, UZ) tasked for imaging\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,676 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[mTarget(Chirchiq, UZ) window enabled: 16604.1 to 16736.1\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,677 \u001b[0m\u001b[36msats.satellite.EO1 \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1200.00> \u001b[0m\u001b[36mEO1: \u001b[0m\u001b[msetting timed terminal event at 16736.1\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,794 \u001b[0m\u001b[msim.simulator \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1500.00> \u001b[0m\u001b[mMax step duration reached\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,795 \u001b[0m\u001b[mdata.base \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1500.00> \u001b[0m\u001b[mData reward: {}\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,795 \u001b[0m\u001b[mcomm.communication \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1500.00> \u001b[0m\u001b[mOptimizing data communication between all pairs of satellites\u001b[0m\n", "\u001b[90;3m2025-02-13 15:16:54,806 \u001b[0m\u001b[mgym \u001b[0m\u001b[mINFO \u001b[0m\u001b[33m<1500.00> \u001b[0m\u001b[mStep reward: 0.0\u001b[0m\n" ] } ], "source": [ "env = SatelliteTasking(\n", " satellite=satellite_generator(observation=\"S3\", n_ahead=32, include_time=False)(\n", " name=\"EO1\",\n", " sat_args=SAT_ARGS,\n", " ),\n", " scenario=scene.CityTargets(100),\n", " rewarder=data.UniqueImageReward(),\n", " sim_rate=0.5,\n", " max_step_duration=300.0,\n", " time_limit=duration,\n", " failure_penalty=0.0,\n", " terminate_on_time_limit=True,\n", " log_level=\"INFO\",\n", " vizard_dir=\"/tmp/vizard\",\n", " vizard_settings=dict(showLocationLabels=1),\n", ")\n", "_ = env.reset()\n", "for i in range(5):\n", " env.step(env.action_space.sample())" ] } ], "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.10.11" } }, "nbformat": 4, "nbformat_minor": 2 }