diff --git a/docs/getting-started/csm-stack/csm-sandbox.ipynb b/docs/getting-started/csm-stack/csm-sandbox.ipynb new file mode 100644 index 0000000..d6f24ef --- /dev/null +++ b/docs/getting-started/csm-stack/csm-sandbox.ipynb @@ -0,0 +1,153 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CSM Sandbox\n", + "\n", + "## 1. Prerequisites\n", + "\n", + "### Install Knoten\n", + "This tutorial requires Knoten version 0.4 or higher.\n", + "\n", + "`conda install -c conda-forge knoten=0.4`\n", + "\n", + "### Install Matplotlib\n", + "This tutorial requires matplotlib.\n", + "\n", + "`conda install -c conda-forge matplotlib`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "import os # File Path Joining\n", + "import json # Read ISD as python dictionary\n", + "\n", + "from knoten import csm # Knoten CSM\n", + "\n", + "import shapely.wkt # Math and Plotting Tools\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create CSM Camera from existing ISD" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "data_dir = '../data/image_to_ground'\n", + "isd_file = os.path.join(data_dir, 'isd_file.json')\n", + "\n", + "camera = csm.create_csm(isd_file)\n", + "\n", + "with open(isd_file) as json_file:\n", + " isd_dict = json.load(json_file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ???" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Change stuff?\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Footprint" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'CSM footprint')" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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06eLXq8XrVYrPXv2lOjoaOV40TXAsh7Fd8Uyp+5evXrd9Dx79+6V/v37i7Ozszg5OUlgYKC8//77yvGia6slH9wFi4judLwmTkREpFKcTiciIlIpBnEiIiKV4ur0WsRoNCIxMREuLi7c/pGI6A4lIsjIyICPj0+pO4BKYhCvRRITE6tkf2oiIlK/8+fPo1GjRhXmYRCvRYq2iTx//rzJBipERHTnSE9Ph6+vrxITKsIgXosUTaG7uroyiBMR3eHMuazKhW1EREQqxSBORESkUgziREREKsUgTkREpFIM4kRERCrFIE5ERKRSDOJEREQqxSBORESkUgziREREKsUgTkREpFIM4kRERCrFIE5ERKRSDOJEREQqxSBORESkUgziREREKsUgTkREpFIM4kRERCrFIE5ERKRSDOJEREQqxSBORESkUgziREREKsUgTkREpFIM4kRERCrFIE5ERKRSDOJEREQqxSBORESkUgziREREKsUgTkREpFIM4kRERCrFIE5ERKRSDOJEREQqxSBORESkUgziREREKsUgTkREpFIM4kRERCrFIE5ERKRSDOJEREQqxSBORESkUgziREREKsUgTkREpFIM4kRERCrFIE5ERKRSqgniaWlpGD16NHQ6HXQ6HUaPHo2rV69WWEZEEBoaCh8fHzg4OKB3796IjY01yZOTk4Px48fDw8MDTk5OGDRoEBISEipd95UrV9CoUSNoNJqbto+IiOhWqCaIjxgxApGRkQgPD0d4eDgiIyMxevToCsvMnj0bc+fOxfz587Fv3z7o9Xr0798fGRkZSp6JEydizZo1WLlyJXbs2IFr165h4MCBKCgoqFTdY8eORWBgYNV0moiIqCKiAnFxcQJAdu/eraRFREQIADl69GiZZYxGo+j1egkLC1PSsrOzRafTyYIFC0RE5OrVq2JraysrV65U8ly4cEGsrKwkPDzc4rq//PJL6dWrl/z9998CQNLS0izqp8FgEABiMBgsKkdERHWHJbFAFSPxiIgI6HQ6dOnSRUnr2rUrdDoddu3aVWaZ06dPIzk5GUFBQUqaVqtFr169lDIHDhxAXl6eSR4fHx8EBAQoecytOy4uDjNmzMDy5cthZWXe25qTk4P09HSTBxERkblUEcSTk5Ph6elZKt3T0xPJycnllgEALy8vk3QvLy/lWHJyMuzs7ODm5lZhnpvV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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Get the footprint using the model and plot it\n", + "\n", + "boundary = csm.generate_boundary((isd_dict[\"image_lines\"], isd_dict[\"image_samples\"]))\n", + "\n", + "lons, lats, alts = csm.generate_latlon_boundary(camera, boundary)\n", + "\n", + "plt.rcParams[\"figure.figsize\"] = [5, 3]\n", + "plt.axes().set_aspect('equal','datalim')\n", + "plt.plot(lons, lats)\n", + "plt.xlabel(\"Longitude (deg)\")\n", + "plt.ylabel(\"Latitude (deg)\")\n", + "plt.title(\"CSM footprint\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb b/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb index 901a750..3b24956 100644 --- a/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb +++ b/docs/getting-started/csm-stack/image-to-ground-tutorial.ipynb @@ -32,16 +32,10 @@ "\n", "\n", "### 1. Prerequisites, Install Knoten\n", - "The `knoten` installation may take a little longer than usual due to the many dependencies (including ALE) involved." - ] - }, - { - "cell_type": "markdown", - "id": "ffeccab3-0d5d-4609-9c7f-871bdb69f17a", - "metadata": {}, - "source": [ + "The `knoten` installation may take a little longer than usual due to the many dependencies (including ALE) involved.\n", + "\n", "```\n", - "conda install -c conda-forge knoten=0.2.1\n", + "conda install -c conda-forge knoten=0.4\n", "```" ] }, @@ -65,6 +59,8 @@ "import ale\n", "import json\n", "import knoten\n", + "from knoten import csm\n", + "from csmapi import csmapi\n", "import os\n", "\n", "# Set local data directory and paths\n", @@ -114,12 +110,12 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 2, "id": "0c4dbf84-2986-495b-9e4a-da4c77059e7e", "metadata": {}, "outputs": [], "source": [ - "sensor_model = knoten.csm.create_csm(isd_file, verbose=False)" + "sensor_model = csm.create_csm(isd_file, verbose=False)" ] }, { @@ -132,24 +128,24 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 3, "id": "d8f2b155-9803-4a6b-a967-bca1ef35860f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(-572485.2147483829, -79884.88742005036, -3326939.6184008163)" + "(-572485.2147458872, -79884.88741760612, -3326939.618401299)" ] }, - "execution_count": 30, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create an image coordinate at line = 206 and sample = 206\n", - "image_coord = knoten.csmapi.ImageCoord(206, 206)\n", + "image_coord = csmapi.ImageCoord(206, 206)\n", "\n", "# Convert the image coordinates to ground coordinates with desired precision of 0.0\n", "ground_coord = sensor_model.imageToGround(image_coord, 0.0)\n", @@ -168,17 +164,17 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 4, "id": "0edc0b6d-cdbe-46a8-9fdc-4ebdc4570f1a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(205.99991086761267, 206.00000010379927)" + "(206.0000000225674, 205.9999999963493)" ] }, - "execution_count": 31, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -194,7 +190,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -208,7 +204,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.0" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/docs/getting-started/data/image_to_ground/isd_file.json b/docs/getting-started/data/image_to_ground/isd_file.json index 6dc26b5..2333f5f 100644 --- a/docs/getting-started/data/image_to_ground/isd_file.json +++ b/docs/getting-started/data/image_to_ground/isd_file.json @@ -42,20 +42,20 @@ 0.8371209459443085, -0.2996928944391797, -0.10720760458181891, - -0.44488113064480633 + -0.4448811306448063 ], [ 0.8371209163489989, -0.29969290157106665, -0.10720758464502428, - -0.4448811863335056 + -0.44488118633350565 ] ], "angular_velocities": [ [ 3.16238646979841e-05, -2.880432898124293e-05, - 5.652013165872617e-05 + 5.6520131658726165e-05 ], [ 3.162386469798407e-05, @@ -320,25 +320,25 @@ ], "positions": [ [ - -1885.2980675616832, - 913.1652236013313, + -1885.2980675616827, + 913.1652236013311, -2961.966828003069 ], [ - -1885.3017519980372, - 913.1599537256885, - -2961.9661251204225 + -1885.3017519980376, + 913.1599537256886, + -2961.966125120423 ] ], "velocities": [ [ - -1.9629237646703679, + -1.9629237646703686, -2.80759072221274, - 0.374466578014853 + 0.37446657801485306 ], [ -1.962920608078827, - -2.8075922570664513, + -2.8075922570664518, 0.37447154183051934 ] ], @@ -354,25 +354,25 @@ ], "positions": [ [ - -208246643.00357288, - -7677078.09368972, + -208246643.00357282, + -7677078.093689713, 2103553.070434021 ], [ - -208246643.00396734, + -208246643.0039674, -7677078.138553765, - 2103553.04986676 + 2103553.0498667755 ] ], "velocities": [ [ - -0.2102027789950371, - -23.901883559526876, + -0.21020277899317444, + -23.901883559525015, -10.957471328254789 ], [ - -0.21020277326198994, - -23.90188355931826, + -0.21020277326292125, + -23.901883559320122, -10.957471328315325 ] ],