diff --git a/demo.ipynb b/demo.ipynb index 893ecd6..9deed05 100644 --- a/demo.ipynb +++ b/demo.ipynb @@ -96,6 +96,24 @@ "gyro = simulation.add_sensor(WSEN_ISDS_GYRO, offset=0)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we are not only interested in obtaining sensor measurements but also want certain ground truth values, we need to register so-called `Observer` objects. `Observer`s are simular to sensors but don't add any noise or other transformations to the data. Instead, when called they just return the correct values and write them to the logger.\n", + "\n", + "In this demo we will just observe the rocket's altitude in order to compare it with our model's estimation." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "altitude = simulation.add_observer(['altitude'])" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -112,16 +130,16 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -141,14 +159,14 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "100%|█████████▉| 344.9000000000099/345.0 [01:51<00:00, 3.11it/s] \n" + "100%|█████████▉| 344.9000000000099/345.0 [00:33<00:00, 10.36it/s] \n" ] } ], @@ -162,12 +180,15 @@ " acc = accelerometer()\n", " rot_rate = gyro()\n", "\n", + " # Get the correct altitude data.\n", + " alt = altitude()\n", + "\n", " # TODO: Add your computation here." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -202,7 +223,6 @@ " WSEN_ISDS_ACC/FL_y\n", " WSEN_ISDS_ACC/FL_z\n", " ...\n", - " WSEN_ISDS_ACC/B_z\n", " WSEN_ISDS_ACC/acc_x_noise\n", " WSEN_ISDS_ACC/acc_y_noise\n", " WSEN_ISDS_ACC/acc_z_noise\n", @@ -212,6 +232,7 @@ " WSEN_ISDS_GYRO/out_0\n", " WSEN_ISDS_GYRO/out_1\n", " WSEN_ISDS_GYRO/out_2\n", + " general/altitude\n", " \n", " \n", " \n", @@ -222,22 +243,22 @@ " 0.0\n", " 0.007016\n", " 339.067143\n", - " -0.211031\n", - " 975.287447\n", + " 0.842335\n", + " 976.340813\n", " -0.0\n", " 4.044397\n", " 33.066113\n", " ...\n", - " 5.665419\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 32.608105\n", - " -4.096233\n", - " -5.632976\n", + " 32.623429\n", + " -4.020263\n", + " -5.677741\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.319118\n", " \n", " \n", " 1\n", @@ -246,22 +267,22 @@ " 0.0\n", " 0.013913\n", " 339.065795\n", - " 0.916733\n", - " 976.374447\n", + " -0.998771\n", + " 974.458942\n", " -0.0\n", " 3.97431\n", " 32.663091\n", " ...\n", - " 5.596367\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 32.256931\n", - " -4.030458\n", - " -5.624039\n", + " 32.142847\n", + " -3.994765\n", + " -5.614795\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.319468\n", " \n", " \n", " 2\n", @@ -270,22 +291,22 @@ " 0.0\n", " 0.020692\n", " 339.063569\n", - " 1.899961\n", - " 977.290347\n", + " -0.363539\n", + " 975.026847\n", " -0.0\n", " 3.903998\n", " 32.258775\n", " ...\n", - " 5.527094\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 31.836485\n", - " -3.877788\n", - " -5.505637\n", + " 31.770757\n", + " -3.886765\n", + " -5.512629\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.320046\n", " \n", " \n", " 3\n", @@ -294,22 +315,22 @@ " 0.0\n", " 0.027351\n", " 339.060477\n", - " -2.359224\n", - " 972.937664\n", + " 0.700004\n", + " 975.996892\n", " 0.0\n", " 3.83641\n", " 31.870123\n", " ...\n", - " 5.460504\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 31.425801\n", - " -3.897955\n", - " -5.482794\n", + " 31.523523\n", + " -3.759221\n", + " -5.532761\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.320849\n", " \n", " \n", " 4\n", @@ -318,22 +339,22 @@ " 0.0\n", " 0.033927\n", " 339.056534\n", - " 0.077\n", - " 975.25467\n", + " 0.112829\n", + " 975.290499\n", " -0.0\n", " 3.808092\n", " 31.70728\n", " ...\n", - " 5.432604\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 31.240602\n", - " -3.84319\n", - " -5.405694\n", + " 31.345873\n", + " -3.834753\n", + " -5.383155\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.321872\n", " \n", " \n", " ...\n", @@ -366,22 +387,22 @@ " 0.0\n", " 0.015286\n", " 339.111824\n", - " -2.041576\n", - " 974.809001\n", + " -2.321929\n", + " 974.528648\n", " -0.0\n", " 0.0\n", " 9.811295\n", " ...\n", - " 9.811276\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 0.086998\n", - " 0.038977\n", - " -9.853244\n", + " 0.076978\n", + " 0.017459\n", + " -9.739685\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.307517\n", " \n", " \n", " 3445\n", @@ -390,22 +411,22 @@ " 0.0\n", " 0.015286\n", " 339.11382\n", - " -2.824255\n", - " 974.086774\n", + " 1.090926\n", + " 978.001954\n", " -0.0\n", " 0.0\n", " 9.811295\n", " ...\n", - " 9.811276\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 0.015518\n", - " 0.009905\n", - " -9.91929\n", + " 0.023716\n", + " -0.065154\n", + " -9.798154\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.306998\n", " \n", " \n", " 3446\n", @@ -414,22 +435,22 @@ " 0.0\n", " 0.015285\n", " 339.115816\n", - " 2.670845\n", - " 979.642325\n", + " -1.034095\n", + " 975.937385\n", " -0.0\n", " 0.0\n", " 9.811295\n", " ...\n", - " 9.811276\n", " 0.0\n", " 0.0\n", " 0.0\n", - " -0.090768\n", - " 0.031445\n", - " -9.793827\n", + " 0.065746\n", + " 0.113411\n", + " -9.76346\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.30648\n", " \n", " \n", " 3447\n", @@ -438,22 +459,22 @@ " 0.0\n", " 0.015285\n", " 339.117812\n", - " -0.448349\n", - " 976.583582\n", + " -2.728543\n", + " 974.303388\n", " -0.0\n", " 0.0\n", " 9.811295\n", " ...\n", - " 9.811276\n", " 0.0\n", " 0.0\n", " 0.0\n", - " -0.040433\n", - " 0.036262\n", - " -9.835422\n", + " -0.032622\n", + " 0.033615\n", + " -9.912886\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.305962\n", " \n", " \n", " 3448\n", @@ -462,26 +483,26 @@ " 0.0\n", " 0.015284\n", " 339.119808\n", - " 0.051062\n", - " 977.143444\n", + " -1.735287\n", + " 975.357095\n", " -0.0\n", " 0.0\n", " 9.811295\n", " ...\n", - " 9.811276\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 0.056069\n", - " -0.069178\n", - " -9.789629\n", + " -0.02422\n", + " 0.069812\n", + " -9.781453\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 0.305443\n", " \n", " \n", "\n", - "

3449 rows × 22 columns

\n", + "

3449 rows × 23 columns

\n", "" ], "text/plain": [ @@ -499,87 +520,74 @@ "3448 344.9 NaN 0.0 0.015284 339.119808 \n", "\n", " MS5611_01BA03/noise MS5611_01BA03/out WSEN_ISDS_ACC/FL_x \\\n", - "0 -0.211031 975.287447 -0.0 \n", - "1 0.916733 976.374447 -0.0 \n", - "2 1.899961 977.290347 -0.0 \n", - "3 -2.359224 972.937664 0.0 \n", - "4 0.077 975.25467 -0.0 \n", + "0 0.842335 976.340813 -0.0 \n", + "1 -0.998771 974.458942 -0.0 \n", + "2 -0.363539 975.026847 -0.0 \n", + "3 0.700004 975.996892 0.0 \n", + "4 0.112829 975.290499 -0.0 \n", "... ... ... ... \n", - "3444 -2.041576 974.809001 -0.0 \n", - "3445 -2.824255 974.086774 -0.0 \n", - "3446 2.670845 979.642325 -0.0 \n", - "3447 -0.448349 976.583582 -0.0 \n", - "3448 0.051062 977.143444 -0.0 \n", + "3444 -2.321929 974.528648 -0.0 \n", + "3445 1.090926 978.001954 -0.0 \n", + "3446 -1.034095 975.937385 -0.0 \n", + "3447 -2.728543 974.303388 -0.0 \n", + "3448 -1.735287 975.357095 -0.0 \n", "\n", - " WSEN_ISDS_ACC/FL_y WSEN_ISDS_ACC/FL_z ... WSEN_ISDS_ACC/B_z \\\n", - "0 4.044397 33.066113 ... 5.665419 \n", - "1 3.97431 32.663091 ... 5.596367 \n", - "2 3.903998 32.258775 ... 5.527094 \n", - "3 3.83641 31.870123 ... 5.460504 \n", - "4 3.808092 31.70728 ... 5.432604 \n", - "... ... ... ... ... \n", - "3444 0.0 9.811295 ... 9.811276 \n", - "3445 0.0 9.811295 ... 9.811276 \n", - "3446 0.0 9.811295 ... 9.811276 \n", - "3447 0.0 9.811295 ... 9.811276 \n", - "3448 0.0 9.811295 ... 9.811276 \n", + " WSEN_ISDS_ACC/FL_y WSEN_ISDS_ACC/FL_z ... WSEN_ISDS_ACC/acc_x_noise \\\n", + "0 4.044397 33.066113 ... 0.0 \n", + "1 3.97431 32.663091 ... 0.0 \n", + "2 3.903998 32.258775 ... 0.0 \n", + "3 3.83641 31.870123 ... 0.0 \n", + "4 3.808092 31.70728 ... 0.0 \n", + "... ... ... ... ... \n", + "3444 0.0 9.811295 ... 0.0 \n", + "3445 0.0 9.811295 ... 0.0 \n", + "3446 0.0 9.811295 ... 0.0 \n", + "3447 0.0 9.811295 ... 0.0 \n", + "3448 0.0 9.811295 ... 0.0 \n", "\n", - " WSEN_ISDS_ACC/acc_x_noise WSEN_ISDS_ACC/acc_y_noise \\\n", - "0 0.0 0.0 \n", - "1 0.0 0.0 \n", - "2 0.0 0.0 \n", - "3 0.0 0.0 \n", - "4 0.0 0.0 \n", - "... ... ... \n", - "3444 0.0 0.0 \n", - "3445 0.0 0.0 \n", - "3446 0.0 0.0 \n", - "3447 0.0 0.0 \n", - "3448 0.0 0.0 \n", + " WSEN_ISDS_ACC/acc_y_noise WSEN_ISDS_ACC/acc_z_noise WSEN_ISDS_ACC/out_0 \\\n", + "0 0.0 0.0 32.623429 \n", + "1 0.0 0.0 32.142847 \n", + "2 0.0 0.0 31.770757 \n", + "3 0.0 0.0 31.523523 \n", + "4 0.0 0.0 31.345873 \n", + "... ... ... ... \n", + "3444 0.0 0.0 0.076978 \n", + "3445 0.0 0.0 0.023716 \n", + "3446 0.0 0.0 0.065746 \n", + "3447 0.0 0.0 -0.032622 \n", + "3448 0.0 0.0 -0.02422 \n", "\n", - " WSEN_ISDS_ACC/acc_z_noise WSEN_ISDS_ACC/out_0 WSEN_ISDS_ACC/out_1 \\\n", - "0 0.0 32.608105 -4.096233 \n", - "1 0.0 32.256931 -4.030458 \n", - "2 0.0 31.836485 -3.877788 \n", - "3 0.0 31.425801 -3.897955 \n", - "4 0.0 31.240602 -3.84319 \n", - "... ... ... ... \n", - "3444 0.0 0.086998 0.038977 \n", - "3445 0.0 0.015518 0.009905 \n", - "3446 0.0 -0.090768 0.031445 \n", - "3447 0.0 -0.040433 0.036262 \n", - "3448 0.0 0.056069 -0.069178 \n", + " WSEN_ISDS_ACC/out_1 WSEN_ISDS_ACC/out_2 WSEN_ISDS_GYRO/out_0 \\\n", + "0 -4.020263 -5.677741 0.0 \n", + "1 -3.994765 -5.614795 0.0 \n", + "2 -3.886765 -5.512629 0.0 \n", + "3 -3.759221 -5.532761 0.0 \n", + "4 -3.834753 -5.383155 0.0 \n", + "... ... ... ... \n", + "3444 0.017459 -9.739685 0.0 \n", + "3445 -0.065154 -9.798154 0.0 \n", + "3446 0.113411 -9.76346 0.0 \n", + "3447 0.033615 -9.912886 0.0 \n", + "3448 0.069812 -9.781453 0.0 \n", "\n", - " WSEN_ISDS_ACC/out_2 WSEN_ISDS_GYRO/out_0 WSEN_ISDS_GYRO/out_1 \\\n", - "0 -5.632976 0.0 0.0 \n", - "1 -5.624039 0.0 0.0 \n", - "2 -5.505637 0.0 0.0 \n", - "3 -5.482794 0.0 0.0 \n", - "4 -5.405694 0.0 0.0 \n", - "... ... ... ... \n", - "3444 -9.853244 0.0 0.0 \n", - "3445 -9.91929 0.0 0.0 \n", - "3446 -9.793827 0.0 0.0 \n", - "3447 -9.835422 0.0 0.0 \n", - "3448 -9.789629 0.0 0.0 \n", + " WSEN_ISDS_GYRO/out_1 WSEN_ISDS_GYRO/out_2 general/altitude \n", + "0 0.0 0.0 0.319118 \n", + "1 0.0 0.0 0.319468 \n", + "2 0.0 0.0 0.320046 \n", + "3 0.0 0.0 0.320849 \n", + "4 0.0 0.0 0.321872 \n", + "... ... ... ... \n", + "3444 0.0 0.0 0.307517 \n", + "3445 0.0 0.0 0.306998 \n", + "3446 0.0 0.0 0.30648 \n", + "3447 0.0 0.0 0.305962 \n", + "3448 0.0 0.0 0.305443 \n", "\n", - " WSEN_ISDS_GYRO/out_2 \n", - "0 0.0 \n", - "1 0.0 \n", - "2 0.0 \n", - "3 0.0 \n", - "4 0.0 \n", - "... ... \n", - "3444 0.0 \n", - "3445 0.0 \n", - "3446 0.0 \n", - "3447 0.0 \n", - "3448 0.0 \n", - "\n", - "[3449 rows x 22 columns]" + "[3449 rows x 23 columns]" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -599,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -608,7 +616,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -632,7 +640,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -655,12 +663,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD4CAYAAAAAczaOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAqhElEQVR4nO3deXxU1f3/8dcn+8qOEVkEKoK4Y1SsGxVFQFustVZrK7W2fG1ta/12w6VqlSpd1Na2X/3ZWsW619ZKFVGKFK0WNCgCyhYQBGQJWwIkIdv5/TF3JpNkAmZmkjvL+/l45JF7z72T+XgNnzn53HPPMeccIiKSHjL8DkBERLqOkr6ISBpR0hcRSSNK+iIiaURJX0QkjWT5HcCB9OnTxw0ePNjvMEREksqiRYu2O+f6RjqW0El/8ODBlJWV+R2GiEhSMbP17R1TeUdEJI0o6YuIpBElfRGRNKKkLyKSRpT0RUTSiJK+iEgaUdIXEUkjSvph3izfTvm2vX6HISLSaRL64ayu9uU/LQRg3fQLfI5ERKRzqKcfQWOTFpYRkdSkpO/Z39AY2laJR0RSlZK+p7KmPrS9parWx0hERDqPkr6nKizpb1PSF5EUpaTvCe/pb9uz38dIREQ6j5K+p1I9fRFJA0r6nvCkX1Xb4GMkIiKd56BJ38z+bGbbzGxZWFsvM5tjZqu97z29djOz+8ys3MyWmNmosNdM9s5fbWaTO+c/J3pVNYFEX9Itl737lfRFJDV9kp7+I8D4Vm1TgbnOuWHAXG8fYAIwzPuaAtwPgQ8J4FbgVOAU4NbgB0WiCPb0+3XPZ5+SvoikqIMmfefca8DOVs2TgBne9gzgorD2R13AAqCHmfUDzgfmOOd2Oud2AXNo+0Hiq8qaegpzMulbnMv2vbqRKyKpKdqafolzbrO3vQUo8bb7AxvCztvotbXX3oaZTTGzMjMrq6ioiDK8jqusqad7fja9C3PYXV1/8BeIiCShmG/kOuccELd5C5xzDzrnSp1zpX37RlzMvVNU1tTTLT+bgpwslXdEJGVFm/S3emUbvO/bvPZNwMCw8wZ4be21J4xgT78wN5Pq+kaaNP+OiKSgaJP+TCA4Amcy8HxY+5XeKJ7RQKVXBnoZGGdmPb0buOO8toRR5SX9gpwsnIPasLl4RERSxUGnVjazJ4ExQB8z20hgFM504BkzuxpYD1zqnT4LmAiUA9XAVQDOuZ1mdgfwtnfe7c651jeHfbWvroGi3CyKcjMD+/sbKcjRzNMikloOmtWcc5e3c2hshHMdcG07P+fPwJ87FF0Mqusa2Lu/gUOK8z7R+TV1TeTlZIYSfXVdA5DbiRGKiATsqa2nKDeLfXWN/O/Ti3nlg62s/vkEsjPj//xsSnZlm5ocI28JVI/uufR4Lh414KCvqa1vJD87k8Kwnr6ISGfYuKua+asqeObtDby3sTLiOcNueqlTFnRKyaS/4MMdoe3/fea9gyZ95xw1XtIP9vT31WkEj4jEbsHaHRTnZVFV08Cu6jq+/fg7vsaTkkn/1CG9+fH44fxy9koAPvi4ipGHdWv3/PpGR2OTIz8nvKevpC8i0Xl9dQXvf1zF2x/uZO6KbQd/QSsPf+1kTh7SqxMiS9Gkn5lhfHvMEWzcVcMTCz9i4n2vH/DPpOBIndysDApzgzV9lXdE5MCWbNzNL2evpHtBNrV1jVEl+CtOHcSPx4+ge352J0TYVkom/aBbLhzJEws/AgLr3mZmWMTzar0En5+TSWGwvKOevogAH++uoV/3PPbVNVK9v4HHF37Eb+eujupnPXLVySzfvIdrzh6KWeR81NlSOunnZWdy0uE9WbR+F/NXbeOcESURz6up95J+diYFOYHyjnr6IumnvrGJxibHdU+9S6/CXJ5866Oofs7QPoX89rITOfqwbmS06myOGX5IPEKNWkonfYAfnz+cLz24gK8/UtZuiSc86QfLO7qRK5K6Ghqb2FPbQM/CHFZsqeKN8h3c8cIHUf+8755zBOOPOZS/LdrELZ8dGcdI4y/lk37p4OabIVsqazm0e9tx+3u9RVMKcrPIzcogw1TeEUk1zjlq65uoqW9k6t+W8MoHW6P+WUtvG0duViZmtBhLf/Rh3eMRaqdK+aQfXsd/YuF6/nfc8DbnBOfS756fjZlRmJOlcfoiSca5wCi8rMwMGpscr62qoK6xicKcLL7y0MIO/7xzjyrh+vOG0acol3+v3MYZw/rSv0d+J0TetVI+6QOU3XwupdP+xb526vTB8k6hV88vzM3ynsgVkWTxs39+wCNvrov69d8e8ykuOrE/ww4panOT9UsnD4oxusSRFkm/V0EOAA/950N+emHbelvwpm1ediDpF+RmtvsBISKJ4fqnF/Pcu9FN1nt47wLOPaqEkm653DlrBW/dNPYTT9mS7NIi6be+e95ardfTD47cKczJolo1fRFfVVbXk5lp1NQ1kpOZwX/X7uCaxxZ1+OecMqQXP/vc0RzVL/IDmlPO+lSsoSaVtEj6AKOH9mLB2p1s2FnNwF4FLY7VhI3Th0DyV09fxD+PL1zPTc8t69BrSrrlcuPEoxh+aDFHHlJ80M5eukqbpP/Z4w9jwdqdvLBkM98a0/KTPVTeyWqu6W+tqu3yGEUEvvfku8x87+ODnndkSRETj+3H1WcMoTiva55mTQVpk/QvLR3IbTPfZ3dNXZtjtfWN5GVnhHoGgRu56umLdJWKPfs5+ef/OuA5540s4RdfOI5ehTldFFVqSpukn52ZwTH9u/PO+l1tjlXXBWbYDCrMydQ4fZEu0NjkuOaxRcyJMGb+vstPZN6Kbfxk/IiIz9dIdNIm6QOcPLgXj7yxzuvZNyf5mvqWq2QV5KinL9KZauoa+ds7G7n5H23r9hef2J97vnQCAJ87/rAujiz1pVXSHzWoBw++1sTKLXs4fmCPUHtNXaC8E1SYm8m+ugacc75NiiSSipxzvFG+o92HpdbeOVE3YDtZWiX9AT0Do3ZeWPJxy6QfoafvHNTWN4VG9IhIbL760EJeX7094rFV0yaQkxX/pQGlrbRK+kccUgTA1qr9LdprWtX0g4uj793foKQvEqNVW/cw7t7XIh4b0qeQl79/lhJ+F0qrpJ+XnckRhxSxY1/LpF9d30iPsAUMCsLm1O9brMXRRaLxh3nlzF9ZwVvrdrZoH3FoMS9dd6ZKpz6JKemb2XXANwED/uic+42Z9QKeBgYD64BLnXO7LPB/+LfARKAa+JpzrssXizz6sG6UrWs5gqe2rpH8bs2jA4LTK+/VCB6RDnv67Y/4yd+Wtmm/eFR/7v7i8Ur2Pos66ZvZMQQS/ilAHTDbzF4ApgBznXPTzWwqMBX4CTABGOZ9nQrc733vUgU5WWzaXcPu6jp6eHPyVNe3LOMU5Wr1LJGO+nD7Pj7z639HPDZ1wgiuOTu9pjtIVLH09I8CFjrnqgHMbD5wMTAJGOOdMwP4N4GkPwl41DnngAVm1sPM+jnnNscQQ4cF16H875odTDi2H+DV9MOSfmhxdM20KXJQT731EVP/3rZnH/T+z84P/fUs/ovl/8Qy4Odm1huoIVC2KQNKwhL5FiC4RmF/YEPY6zd6bS2SvplNIfDXAoMGxX8604nHHsoD89fwevl2JhzbD+ccVTUNdAt7jLsoVN7RWH2RAxk89cWI7bO+dyYjD4s8wZn4K+qk75xbbma/AF4B9gGLgcZW5zgzcx38uQ8CDwKUlpZ26LWfxHEDepCVYezYG7iZW1vfRF1jU4uV6AtV3hE5oBlvruPWme+3aX/wqycx7uhDfYhIPqmY/uZyzj0EPARgZncS6L1vDZZtzKwfsM07fRMwMOzlA7y2LtfQ5Hj5/cBj3+GrZgUp6Yu0VdfQxDceLeO1VRURj7/6g7MZ2reoi6OSjop19M4hzrltZjaIQD1/NDAEmAxM974/750+E/iOmT1F4AZuZVfX81tzzkVO+jnN4/RF0t3u6jrK1u3iG4+WtTn2yy8cx6UnD9TT60kk1rsrf/Nq+vXAtc653WY2HXjGzK4G1gOXeufOIlD3LycwZPOqGN87aicP7snb63axd39DxKSflZlBXnaGevqS1rZU1vJG+XZ+8Nf32hz7vytGMdEbCAEo4SeRWMs7Z0Zo2wGMjdDugGtjeb94mfzpwby9bhcffFxFVW0gsYcnfQjczNWNXElHdQ1NlE6bE/q3Ea5/j3zemHqOD1FJvKTlOKpRg3oCsHrb3tBsm93yW16Kwtws9fQl7cxbsY2rHnm7TfvdXzye844uaTHKTZJTWib9Eu/p21lLN3PuUYERpa17+oU5SvqS+rZW1bJg7Q6GHVLM66sruOulFW3OWXTzufQu0nQkqSItk36mN3Xrrur6UE2/9XJrgfKOkr6krqYmx6l3zo14rE9RDueNLOGH44Yr4aeYtEz6EJhxc/nmKgb1yqdPUU7ogyCoMDeTir3723m1SPKa9sIH/Ok/H7Z7/NlrTqN0cK8ujEi6UtrOZ/r5E/sDMG9FBf175Lc5Hqjp60aupJbybXvaTfgPfOUk1k2/QAk/xaVtT/9o7xHxusYmPhXhgRKVdySV7G9o5PTpr7J9b12bY1ecOog7Jh2jFavSRNom/TOH9Q1t52a3/YNHo3ck2QUfmLrmL4uY/f6WFseyM41pFx3DOSNKtGZEmknbpB9ew99dXd/meGFuYHH0pianHpAklaUbK/ns7/8T8ViGwYIbx9K3KFcPVKWptE36AEtvG8fziz/milPbzuZZFDa9cuuRPSKJ6r0Nu5n0hzciHvvNl07gIu9elqSvtE76xXnZfGX04RGPNU+61khxXjZ1DU2YQXZm2t77lgQ2e9lmrnks8kJ0d118LJefEv9pyiU5pXXSP5CiVksmBh9LXzVtghZxloTy65dX8vt55W3a35x6DodFGJkm6U1Jvx2FOS2nVw7OQ7J0025OOlxD2sR/R978EnUNTW3azxzWh0e/fopq9hKRkn47wufUD8wVF/DRzmolffHNX/67jp8+33bxEoBvnjmEmy4Y2cURSbJR0m9HeHmnuq75Ia0dEcY5i3S2bXtqeXLhBu7916o2xzIzjLdvOpdehTk+RCbJRkm/HeGLo1fVNg/p3LFPSV+6ztzlW3l+8cfMfO/jNsduuXAk4485lEOKc8nSAAP5hJT02xG+OHpwUjYgtLauSGdavrmKL/9xAbsiPEMC8P7Pzg+VIEU6Qr817Qiv6VfVND+Zu1M9felETU2OoTfOinjsspMHMv0Lx3VxRJJqlPTbUZCTiVkg6YcvqajyjnSGN9ds565ZK1i6qbJFe1aG8d8bxlKclxVa8EckFkr67TAzCnMCk65VeUl/UK+CFqUekVg1NDbx42eX8Pd3N0U8Xn7nxC6OSFKdkv4BFOZmtujpD+pdwII1O3yOSlLB9JdW8MD8Ne0e//AuJXvpHEr6BxCcUz84emdgzwJm12wJzV4o0hFbKmtZv2Mfd7+yirfW7Wxz/LbPjmRo3yJO+1Rv/X5Jp1HSP4DgnPqVNfUU5WbRqzCbxibH3v2ahE06xjnH6LsiL034+DdO5fQj+nRxRJKuYkr6ZnY98A3AAUuBq4B+wFNAb2AR8FXnXJ2Z5QKPAicBO4AvOefWxfL+nS24OHpVTQPd87NDi6dX1tQr6csn0tTkOPWuuVTsaTvU95DiXP5x7emaH0e6VNRJ38z6A98DRjrnaszsGeAyYCJwr3PuKTN7ALgauN/7vss5d4SZXQb8AvhSzP8FnagwN4uNu6qpqq2nOC+L7vmBJx4ra+oZ0NPn4CShHWjoJcB7t4yje4E6DtL1Yi3vZAH5ZlYPFACbgXOAL3vHZwC3EUj6k7xtgGeB35uZufCJbRJMUW4m++oC5Z0WPf12HpgRaWpyjPjpbOoa206E9qtLjuOLpQN9iEqkWdRJ3zm3ycx+DXwE1ACvECjn7HbOBZ9m2ggEV23oD2zwXttgZpUESkDbw3+umU0BpgAMGuTvHODBG7lvfRi46RZe3hEJcs7x8vtbWPjhTh5+Y12b4xce148bJx6lMo4khFjKOz0J9N6HALuBvwLjYw3IOfcg8CBAaWmpr38FFOVmtUjw3fIDlyt8Lh5Jb845bp35Po/+d32bYyMOLWb298/yISqR9sVS3jkX+NA5VwFgZn8HTgd6mFmW19sfAASfOtkEDAQ2mlkW0J3ADd2EVZibRWNT4HPnlgtHUuDNsR8+66akn8Ymx67qOr712CLeXrerzfHsTGPO9WczuE+hD9GJHFgsSf8jYLSZFRAo74wFyoB5wCUERvBMBp73zp/p7f/XO/5qItfzgRYTWhXlZVGQE3gMXkk/Pe1vaOSZtze0O599n6Jc3rpxLBkZGmMviSuWmv5CM3sWeAdoAN4lUJZ5EXjKzKZ5bQ95L3kI+IuZlQM7CYz0SWjBxdEBVm7ZQ+5JGZhBjZJ+WvloRzXZWcZpd70a8fjEYw/ld5ePIlPJXpJATKN3nHO3Are2al4LnBLh3Frgi7G8X1cL7+l/b+yw0Hw86umnjz219Zz1q3ntHl98y3n0KNDiJZI89ETuAYQn/eDInfycTGrqG9p7iaSA+sYm1lbs4/zfvBbx+Jzrz2JYSXEXRyUSH0r6B1AUYZGKgpxM9fRT1Ec7qtm2p5ZLHvhvu+fcf8UoJXxJakr6B1CY0/by5Gcr6aei6rqGdss4f7yylPNGlnRxRCKdQ0n/ACJNdFiYm0V1nco7qcQ5x8hbXm7T3i0vi5svHKmELylFSf8AhpcUc+Vph/PNM4eG2gpyMtm7X0k/VXy8u4ZPT285Kuel685kSJ9CrVQlKUlJ/wAyMozbJx3Toi0/OzPijImSnMITflaGaaUqSXkZfgeQbHQjN3XU1jf/fxzat1AJX9KCkn4HBSZhU3kn2W3YWc2In84O7c/63pk+RiPSdZT0O6hbfjZ7ahtI8Bkk5CDO/GXzSJ3XfvQZ1e8lbSjpd1C3vGzqGpvY39B2vnRJDuPunR/avuiEwxjUu8DHaES6lpJ+B4WmV9ac+knpxueWsmrr3tD+by470cdoRLqekn4HBdfG1Zz6ycc5xxMLPwrtL7hhrI/RiPhDQzY7KDjz5r79GsGTTJxzfO3ht0P7a++cqCmQJS2pp99BwYVU9ump3KTyu1fLmb+qAoCbLzhKCV/SlpJ+BwXn46lWTz9pLN1YyT1zVoX2vxH2hLVIulHS76B8b/Us9fSTg3OOz/7+P6H92d/XeHxJb6rpd1ChV9PX6lnJYcgNs0LbS28bF7oRL5Ku1NPvoOaavpJ+olu2qTK0fcdFxyjhi6Ck32GhxdE1FUNCW1Oxlwt/11zWueKUQT5GI5I4lPQ7KDszg5ysDPX0E5hzjrF3Nz91u0bDM0VClPSjUJiTqYVUElRjk2tRx3/l+rPIVMIXCYk66ZvZcDNbHPZVZWbfN7NeZjbHzFZ733t655uZ3Wdm5Wa2xMxGxe8/o2sV5GTp4awE9d0n3wlt9yjI5kitZyvSQtRJ3zm30jl3gnPuBOAkoBp4DpgKzHXODQPmevsAE4Bh3tcU4P4Y4vZVYa56+onod3NXM2vpltD+4lvG+RiNSGKKV3lnLLDGObcemATM8NpnABd525OAR13AAqCHmfWL0/t3qfycLNX0E8z6Hfu4O+wBrLKbz/UxGpHEFa+kfxnwpLdd4pzb7G1vAYKrSvcHNoS9ZqPX1oKZTTGzMjMrq6ioiFN48VWYk0mNevoJo7K6nrN/9e/Q/ls3jaVPUa5/AYkksJiTvpnlAJ8D/tr6mAusNNKh1Uaccw8650qdc6V9+/aNNbxOoZp+Ypn0h+ahmQ9fdTKHFOf5GI1IYotHT38C8I5zbqu3vzVYtvG+b/PaNwEDw143wGtLOqrpJ46/LFjPuh3VAPz+yyfymeGH+ByRSGKLR9K/nObSDsBMYLK3PRl4Pqz9Sm8Uz2igMqwMlFQKVNNPCBt2VvPTfywL7V943GE+RiOSHGKae8fMCoHzgP8Ja54OPGNmVwPrgUu99lnARKCcwEifq2J5bz8V5mTqidwEEL7O7as/ONvHSESSR0xJ3zm3D+jdqm0HgdE8rc91wLWxvF+iKMjNorq+kaYmpyc9fVI6bU5o+7GrT2Vo3yIfoxFJHnoiNwoFOZk4B7UNKvH4YU9tPdv31gEwZnhfzhjWx+eIRJKHkn4UCnO0ZKJf6hqaOPa2V0L7j1x1io/RiCQfJf0oBKdX1pz6XWvf/gaOvPml0P4Ht5/vYzQiyUlJPwrBhVS0elbXcc5x9K0vh/anX3xs6MNXRD45Jf0oBJONxup3nXv/tTq0fcdFx3CZ5scXiYqSfhRCPX3V9LvE3OVbuW9uIOl/9vjD+Orow32OSCR5KelHQT39rlO+bQ9XzygL7f/u8hN9jEYk+SnpR6EwuE6uevqd7tx7Xgttr5w23sdIRFKD7oRFIT+4Tq56+p3GOcevX1kZ2n/8G6eSm5XpY0QiqUE9/Sg0j95RT7+zPPSfD/nDvDUAfP30IZx+hB7AEokHJf0o5GVlYgbVSvqdYvnmKqa9uDy0f8tnR/oYjUhqUXknChkZRkG2Jl2Lt737G3hvw26u+NPCUNtL153pY0QiqUdJP0oFuZpeOd7G3TOfjytrQ/vP/M9pHNWvm48RiaQeJf0oFeZoIZV4C0/4H9x+vp64FekEqulHSUsmxtcl978Z2p5y1lAlfJFOoqQfpcLcTPapph8Xu6vrKFu/K7R/48SjfIxGJLUp6Uepe342u2vq/Q4jJZxwe/OCKGvvnOhjJCKpT0k/SsV52ezdr6Qfi6Ymx+CpL4b2p04YoZXIRDqZCqdRys/J1Hz6MXDOMfTGWaH9n3/+GK44VROpiXQ29fSjVJCdqRu5Mbhz1vIW+0r4Il1DPf0oFeRkUqPF0aNy3j3zWb1tb2hfdXyRrqOefpQKcgOfl1ocvWMWrd/VIuGvm36BPjRFulBMSd/MepjZs2a2wsyWm9lpZtbLzOaY2Wrve0/vXDOz+8ys3MyWmNmo+Pwn+KNAi6NH5Qth4/Ffuf4sHyMRSU+x9vR/C8x2zo0AjgeWA1OBuc65YcBcbx9gAjDM+5oC3B/je/uqR0EOALuq63yOJDns3FfXYqTO/VeM4siSYh8jEklPUSd9M+sOnAU8BOCcq3PO7QYmATO802YAF3nbk4BHXcACoIeZ9Yv2/f3WsyAbgCqN1f9ERt3RPBb/z18rZcKxSfu/XiSpxdLTHwJUAA+b2btm9iczKwRKnHObvXO2ACXedn9gQ9jrN3ptLZjZFDMrM7OyioqKGMLrXIVeTX+Pnso9qIv/743Q9pA+hZwzouQAZ4tIZ4ol6WcBo4D7nXMnAvtoLuUA4JxzgOvID3XOPeicK3XOlfbt2zeG8DpXsZf099Yq6R/MOx/tBqBHQTbzfjjG11hE0l0sSX8jsNE5F5z8/FkCHwJbg2Ub7/s27/gmYGDY6wd4bUmpKM9L+urpt6uyur5FHf+tG8/1MRoRgRiSvnNuC7DBzIZ7TWOBD4CZwGSvbTLwvLc9E7jSG8UzGqgMKwMlnSL19A/q+NtfCW3P/9EYcrI0QljEb7E+nPVd4HEzywHWAlcR+CB5xsyuBtYDl3rnzgImAuVAtXdu0irMUU3/QK594p3Q9ohDizm8d6GP0YhIUExJ3zm3GCiNcGhshHMdcG0s75dIMjKMwpxM9fQj+MO8cl5c0vxH3D+/e4aP0YhIOE3DEIOivCzNqd/K+h37+NXLK0P766Zf4GM0ItKaiqwxKMrN0o3cMLOWbubsX/07tP/wVSf7F4yIRKSefgyK8rKpqtXDWQB1DU18+/HmOn75zyeQlak+hUii0b/KGHTLy2KPavo0NjmOvPml0P6im89VwhdJUPqXGYNu6ukDcMvzy0Lbh/cuoHdRro/RiMiBqLwTg275WVTVpHdP/6qH32LeyubpMl667kwfoxGRg1HSj0G69/RfXbG1RcJfe+dEzY0vkuBU3olBt/xs6hqaqK1Pvzn1q+sa+PojZaH9OdefpYQvkgSU9GPQzZt/J91u5jrnGHnLy6H9f37nDIZpbnyRpKCkH4Nu+d6c+mlW4hlyw6zQ9qlDenHsgO4+RiMiHaGkH4Nueem3kMqPn32vxf6jV5/iUyQiEg0l/Rh0yw+Ud6rSpLzz/OJNPFO2MbS/+JbzyM3K9DEiEekojd6JQTr19P/f/DXc9dKK0P5rP/pMaJ1gEUkeSvoxCNb0U/1G7q59dS0S/spp49XDF0lSKu/EINjTf3PNdp8j6TzLNlVyYtii5ivuUMIXSWZK+jHIyw5cvheWJO0CYAd14e/+E9p+8pujyctWwhdJZirvxMDMGHFoMX1SdK6Zu2YtD21/YdQATvtUbx+jEZF4UNKP0YCeBWzcVe13GHE3/jevsWLLHgC+NeZT/GT8CJ8jEpF4UHknRr0Ks9lVXed3GHE1e9nmUMIHlPBFUoiSfoy65WWn1OidF5Z8zDWPNS+GsvbOiT5GIyLxpqQfo+K8bKrrGmlobPI7lJjt3d/Ad554N7RfdvO5mkRNJMXElPTNbJ2ZLTWzxWZW5rX1MrM5Zrba+97Tazczu8/Mys1siZmNisd/gN+KvUnXUmGt3GNubZ5Ebfnt41P2BrVIOotHT/8zzrkTnHOl3v5UYK5zbhgw19sHmAAM876mAPfH4b1917MwMFb/4921PkcSvUXrdzF46ouh/b9/+9Pk52hopkgq6ozyziRghrc9A7gorP1RF7AA6GFm/Trh/bvUkD5FAHy8u8bnSKL3hfvfDG2fOqQXowb19DEaEelMsSZ9B7xiZovMbIrXVuKcCz6ttAUo8bb7AxvCXrvRa2vBzKaYWZmZlVVUVLQ+nHAOKQ6UQFZsqfI5ko5zzrXo4QM8NWW0T9GISFeINemf4ZwbRaB0c62ZnRV+0DnnCHwwfGLOuQedc6XOudK+ffvGGF7nC9a9n3t3k8+RdNyYX/+7xf6KO8Zjphu3IqkspqTvnNvkfd8GPAecAmwNlm2879u80zcBA8NePsBrS2o5WRlkGAw/NLlWjlqwdgfrdzQ/VLZq2gRNsSCSBqJO+mZWaGbFwW1gHLAMmAlM9k6bDDzvbc8ErvRG8YwGKsPKQEntmP7d2bc/edbJ/cmzS7jswQWh/Xk/HENOlkbviqSDWKZhKAGe88oBWcATzrnZZvY28IyZXQ2sBy71zp8FTATKgWrgqhjeO6H0657Hqq17/Q7jE2lscjxd1nxrZdW0CUr4Imkk6qTvnFsLHB+hfQcwNkK7A66N9v0S2aBeBfx7ZQXOuYSuidfWNzLip7ND+2vunEimHr4SSSvq4sVBSbc89jc0UZnAK2itrdjbIuE/+c3RSvgiaUhJPw76dc8HYHNlYj6gVVvfyDl3zw/tf2X0IE2TLJKmlPTj4LAeeQCs277P50jaqm9satHDv+viY5l20bE+RiQiflLSj4MhfQoBmLdy20HO7Fr7GxoZdtNLof1j+3fn8lMG+RiRiPhNST8OgmvlPlO20edIWhp+8+wW+//87hk+RSIiiUJJPw6C0w8n0sCdE29/pcX+ijvG+xSJiCQSJf04ufyUQfQsyPE7DAAGT32RXdXNI4nW3jlRT9uKCKCkHzf9e+Sxc18d1XX+zqs/f1XLSeoW3DBWC6GISIgWRo+ThqbAvHKvrtjGhccd5ksMX/nTQv5Tvj20v+KO8erhi0gL6unHycRjA0sDvLlmhy/vv3xzVYuE/5svnaCELyJtKOnHSb/ugbH6Tyz8qMvfe+/+Bib89vXQ/gNfOYmLTmyzVIGIiJJ+vBTnZTO8pJj8Lu5d729obLG2LcD4Yw7t0hhEJHko6cfRyq17qKlvZE9t18zB09DY1GIs/jfOGMKaOyd2yXuLSHJS0o+jcSMDK0O+uKTzlwmorKnniLCnbQFuvnCkJlETkQNS0o+js4cHlnec+velnf5ex/+s+eGr04b25oPbz+/09xSR5KekH0eXnDSg09/DOcfkP78V2j/3qEN4cspoCnI0+lZEDk6ZIo5ys5pv4tbWN8Z9yGTrRVAA/jT55Li+h4ikNvX046xbXuBztHVyjpVzrsXPPG5Ad9bqpq2IdJCSfpxN+3znzFV/2l2vttif+Z0zNL2CiHSYkn6cfe745ikYbnwuPjd0p/5tCVuqmlflmvmd0+Pyc0Uk/Sjpd4IfnHckEJ+nc7/12CKeensDANmZxus//gzHDegR888VkfSkpN8Jvjt2WGj7r2Ubov45X31oIS8t2xLaXzVtAgN7FcQUm4ikt5iTvpllmtm7ZvaCtz/EzBaaWbmZPW1mOV57rrdf7h0fHOt7J7LBvQPJ+UfPLmH73v0dem35tj0Mnvoir69unkBt/o/GYIm0SouIJKV49PSvA5aH7f8CuNc5dwSwC7jaa78a2OW13+udl7Je/N6Zoe3Saf/q0GvPvee1Fvtr75zI4b0L4xKXiKS3mJK+mQ0ALgD+5O0bcA7wrHfKDOAib3uSt493fKylcNe1MDeL+y4/MbRfWXPw+XjWVOxl8NQXW7R9eNdEjdIRkbiJtaf/G+DHQJO33xvY7ZwLLh+1EQjO8dsf2ADgHa/0zm/BzKaYWZmZlVVUVLQ+nFTCR/Ic/7NXGDz1RTbuqm5z3va9+xk89UXG3j2/RfuaOyeqpCMicRX1E7lmdiGwzTm3yMzGxCsg59yDwIMApaWlLl4/1y8r7hjf4qGqM34xD4DfXnYC2/fWcccLH7R5Tf8e+bwx9Zwui1FE0kcs0zCcDnzOzCYCeUA34LdADzPL8nrzA4BN3vmbgIHARjPLAroD/iwz1YXysjN579ZxLSZIA7juqcURz7990tFcedrgzg9MRNJS1OUd59wNzrkBzrnBwGXAq865K4B5wCXeaZOB573tmd4+3vFXnXNJ35P/JLrnZ7Nu+gWUHt6z3XMO657H/B+NUcIXkU7VGROu/QR4ysymAe8CD3ntDwF/MbNyYCeBD4q08uy3Ps3yzVX8tWwjs5Zu5ujDunHducM4sqRY69mKSJewRO5sl5aWurKyMr/DEBFJKma2yDlXGumYnsgVEUkjSvoiImlESV9EJI0o6YuIpBElfRGRNKKkLyKSRpT0RUTSiJK+iEgaSeiHs8ysAlgf5cv7ANsPelZiSbaYFW/nUrydK5XjPdw51zfSgYRO+rEws7L2nkhLVMkWs+LtXIq3c6VrvCrviIikESV9EZE0kspJ/0G/A4hCssWseDuX4u1caRlvytb0RUSkrVTu6YuISCtK+iIiaSQlk76ZjTezlWZWbmZT/Y4nEjNbZ2ZLzWyxmZV5bb3MbI6Zrfa+t7++YufH92cz22Zmy8LaIsZnAfd513uJmY1KkHhvM7NN3jVe7K3nHDx2gxfvSjM734d4B5rZPDP7wMzeN7PrvPaEvMYHiDeRr3Gemb1lZu95Mf/Max9iZgu92J42sxyvPdfbL/eOD06QeB8xsw/DrvEJXnt0vxPOuZT6AjKBNcBQIAd4Dxjpd1wR4lwH9GnV9ktgqrc9FfiFj/GdBYwClh0sPmAi8BJgwGhgYYLEexvwwwjnjvR+L3KBId7vS2YXx9sPGOVtFwOrvLgS8hofIN5EvsYGFHnb2cBC79o9A1zmtT8AfMvb/jbwgLd9GfB0gsT7CHBJhPOj+p1IxZ7+KUC5c26tc64OeAqY5HNMn9QkYIa3PQO4yK9AnHOvEVjLOFx78U0CHnUBC4AeZtavSwL1tBNveyYBTznn9jvnPgTKCfzedBnn3Gbn3Dve9h5gOdCfBL3GB4i3PYlwjZ1zbq+3m+19OeAc4FmvvfU1Dl77Z4GxZmZdE+0B421PVL8TqZj0+wMbwvY3cuBfTr844BUzW2RmU7y2EufcZm97C1DiT2jtai++RL7m3/H+9P1zWLksoeL1yggnEujZJfw1bhUvJPA1NrNMM1sMbAPmEPiLY7dzriFCXKGYveOVQG8/43XOBa/xz71rfK+Z5baO1/OJrnEqJv1kcYZzbhQwAbjWzM4KP+gCf78l7HjaRI/Pcz/wKeAEYDNwt6/RRGBmRcDfgO8756rCjyXiNY4Qb0JfY+dco3PuBGAAgb80Rvgb0YG1jtfMjgFuIBD3yUAv4CexvEcqJv1NwMCw/QFeW0Jxzm3yvm8DniPwC7k1+OeZ932bfxFG1F58CXnNnXNbvX9ETcAfaS4vJES8ZpZNIIE+7pz7u9ecsNc4UryJfo2DnHO7gXnAaQTKIFkR4grF7B3vDuzo2kgDwuId75XWnHNuP/AwMV7jVEz6bwPDvDv0OQRuyMz0OaYWzKzQzIqD28A4YBmBOCd7p00Gnvcnwna1F99M4EpvNMFooDKsROGbVvXNzxO4xhCI9zJvtMYQYBjwVhfHZsBDwHLn3D1hhxLyGrcXb4Jf475m1sPbzgfOI3AvYh5wiXda62scvPaXAK96f235Ge+KsE6AEbj/EH6NO/470ZV3p7vqi8Bd7VUE6nc3+R1PhPiGEhjZ8B7wfjBGAvXDucBq4F9ALx9jfJLAn+v1BGqFV7cXH4HRA3/wrvdSoDRB4v2LF88S7x9Iv7Dzb/LiXQlM8CHeMwiUbpYAi72viYl6jQ8QbyJf4+OAd73YlgG3eO1DCXwAlQN/BXK99jxvv9w7PjRB4n3Vu8bLgMdoHuET1e+EpmEQEUkjqVjeERGRdijpi4ikESV9EZE0oqQvIpJGlPRFRNKIkr6ISBpR0hcRSSP/H1t4E4/XZRBmAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -683,7 +691,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] diff --git a/spatz/dataset.py b/spatz/dataset.py index 192d4e0..9e70ce3 100644 --- a/spatz/dataset.py +++ b/spatz/dataset.py @@ -131,7 +131,7 @@ class Dataset(Advanceable): ArrayLike: The current transformation matrix from local to body-fixed coords. """ # Get the rotation in the local coordinate system. - rots = self.__fetch_values(['pitch_l', 'yaw_l', 'roll_l']) + rots = self.fetch_values(['pitch_l', 'yaw_l', 'roll_l']) pitch_l, yaw_l, roll_l = rots[0], rots[1], rots[2] return self.T1(roll_l) @ self.T2(pitch_l - math.pi/2) @ self.T1(-yaw_l) @@ -141,8 +141,8 @@ class Dataset(Advanceable): Returns: ArrayLike: The current transformation matrix from global to local coords. """ - decl = self.__fetch_value('declination') - long = self.__fetch_value('longitude') + decl = self.fetch_value('declination') + long = self.fetch_value('longitude') t0 = self.__df['time'].iloc[0] omega_E = (2*math.pi) / (24*60*60) @@ -189,7 +189,7 @@ class Dataset(Advanceable): """ return self.get_mach_number() > 1 - def __fetch_value(self, name: str) -> float: + def fetch_value(self, name: str) -> float: """Get a specific value from the dataframe. Args: @@ -212,7 +212,7 @@ class Dataset(Advanceable): # Interpolate linearly between the two data points. return (1 - alpha) * self.__df[name].iloc[self.__idx] + alpha * self.__df[name].iloc[self.__idx + 1] - def __fetch_values(self, names: List[str]) -> np.array: + def fetch_values(self, names: List[str]) -> np.array: """Get specific values from the dataframe. Args: @@ -221,14 +221,14 @@ class Dataset(Advanceable): Returns: np.array: Returns a numpy array containing the requested values in the same order as in the input list. """ - return np.asarray([self.__fetch_value(name) for name in names]) + return np.asarray([self.fetch_value(name) for name in names]) def get_velocity(self) -> float: """ Returns: np.array: Returns the velocity at the current time of the simulation. """ - return self.__fetch_value('velocity') + return self.fetch_value('velocity') def get_acceleration(self, frame='FL') -> ArrayLike: """_summary_ @@ -239,7 +239,7 @@ class Dataset(Advanceable): Returns: ArrayLike: _description_ """ - acc = self.__fetch_values(['ax', 'ay', 'az']) + acc = self.fetch_values(['ax', 'ay', 'az']) if frame == 'B': return self.launch_rail_to_body() @ acc @@ -251,7 +251,7 @@ class Dataset(Advanceable): Returns: ArrayLike: Gets the derivatives in angular velocity across all axes of the rocket. """ - return self.__fetch_values(['omega_X', 'omega_Y', 'omega_Z']) + return self.fetch_values(['omega_X', 'omega_Y', 'omega_Z']) def get_velocity(self, frame='FL') -> ArrayLike: """ @@ -262,7 +262,7 @@ class Dataset(Advanceable): ArrayLike: _description_ """ - vel = self.__fetch_values(['vx', 'vy', 'vz']) + vel = self.fetch_values(['vx', 'vy', 'vz']) if frame == 'B': return self.launch_rail_to_body() @ vel @@ -274,63 +274,63 @@ class Dataset(Advanceable): Returns: float: Returns the mach number at the current time of the simulation. """ - return self.__fetch_value('mach') + return self.fetch_value('mach') def get_speed_of_sound(self) -> float: """ Returns: float: Returns the speed of sound at the current time of the simulation. """ - return self.__fetch_value('speedofsound') + return self.fetch_value('speedofsound') def get_rotation_rates(self) -> np.array: """ Returns: np.array: Returns the rotation rates at the current time of the simulation. """ - return self.__fetch_values(['OMEGA_X', 'OMEGA_Y', 'OMEGA_Z']) + return self.fetch_values(['OMEGA_X', 'OMEGA_Y', 'OMEGA_Z']) def get_rotation(self) -> np.array: """ Returns: np.array: _description_ """ - return self.__fetch_values(['pitch_l', 'yaw_l', 'roll_l']) + return self.fetch_values(['pitch_l', 'yaw_l', 'roll_l']) def get_temperature(self) -> float: """ Returns: np.array: Returns the temperature at the current time of the simulation. """ - return self.__fetch_value('temperature') + return self.fetch_value('temperature') def get_pressure(self) -> float: """ Returns: np.array: Returns the pressure at the current time of the simulation. """ - return self.__fetch_value('pressure') + return self.fetch_value('pressure') def get_thrust(self) -> float: """ Returns: float: Returns the thrust value for the current time of the simulation. """ - return self.__fetch_value('thrust') + return self.fetch_value('thrust') def get_drag(self) -> float: """ Returns: float: Returns the drag value for the current time of the simulation. """ - return self.__fetch_value('drag') + return self.fetch_value('drag') def get_mass(self) -> float: """ Returns: float: Returns the mass value for the current time of the simulation. """ - return self.__fetch_value('mass') + return self.fetch_value('mass') if __name__ == '__main__': diff --git a/spatz/observer/__init__.py b/spatz/observer/__init__.py new file mode 100644 index 0000000..74972a5 --- /dev/null +++ b/spatz/observer/__init__.py @@ -0,0 +1,2 @@ +from spatz.sensors import Sensor +from spatz.observer.observer import Observer \ No newline at end of file diff --git a/spatz/observer/observer.py b/spatz/observer/observer.py new file mode 100644 index 0000000..026fff3 --- /dev/null +++ b/spatz/observer/observer.py @@ -0,0 +1,33 @@ +from typing import Any, List, Dict, AnyStr +from numpy.typing import ArrayLike + +from spatz.dataset import Dataset +from spatz.logger import Logger +from spatz.transforms import Transform + + +class Observer: + def __init__(self, dataset: Dataset, logger: Logger, attributes: List[str]): + self._dataset = dataset + self._logger = logger + self.__attrs = attributes + + def _get_name(self) -> AnyStr: + return 'general' + + def set_dataset(self, dataset: Dataset): + self._dataset = dataset + + def set_logger(self, logger: Logger): + self._logger = logger + + def _log(self, name: AnyStr, value: Any): + self._logger.write(name, value, self._get_name()) + + def __call__(self) -> ArrayLike: + data = self._dataset.fetch_values(self.__attrs) + + for attrib, value in zip(self.__attrs, data): + self._log(attrib, value) + + return data diff --git a/spatz/sensors/sensor.py b/spatz/sensors/sensor.py index 473d098..f37fd70 100644 --- a/spatz/sensors/sensor.py +++ b/spatz/sensors/sensor.py @@ -22,6 +22,9 @@ class Sensor: def set_logger(self, logger: Logger): self._logger = logger + def set_transforms(self, transforms: List[Transform]): + self._transforms = transforms + def _log(self, name: AnyStr, value: Any): self._logger.write(name, value, self._get_name()) diff --git a/spatz/simulation.py b/spatz/simulation.py index 24910ad..97178e1 100644 --- a/spatz/simulation.py +++ b/spatz/simulation.py @@ -8,6 +8,7 @@ from spatz.sensors import Sensor from spatz.dataset import Dataset from spatz.logger import Logger from spatz.sensors import Sensor +from spatz.observer import Observer class UniformTimeSteps: @@ -89,11 +90,34 @@ class Simulation: return self def add_sensor(self, sensor, *args, **kwargs) -> Sensor: + """Register a new sensor for this simulation. A registered sensor can be called like a function and returns + the current measurements. The class' constructor arguments have to be given aswell. + + Args: + sensor (_type_): A subclass of the abstract Sensor class. + + Returns: + Sensor: Returns an object of the provided sensor subclass. + """ assert issubclass(sensor, Sensor), "Expected a subclass of Sensor." self.__sensors.append(sensor(self.__dataset, self.__logger, *args, **kwargs)) return self.__sensors[-1] - + + def add_observer(self, attributes: List[str]) -> Observer: + """Register a new observer for this simulation observing the provided attributes. + + Args: + attributes (List[str]): A list of strings describing the attributes to observe. + + Returns: + Observer: An observer object which can be called like a function to obtain the desired data. + """ + assert len(attributes) != 0, "Observed attributes list must be nonempty." + + self.__sensors.append(Observer(self.__dataset, self.__logger, attributes)) + + return self.__sensors[-1] \ No newline at end of file diff --git a/spatz/utils/preprocess.py b/spatz/utils/preprocess.py index 7804592..21e3587 100644 --- a/spatz/utils/preprocess.py +++ b/spatz/utils/preprocess.py @@ -152,6 +152,9 @@ def preprocess_file(path): df = compute_omegas(df) df = preprocess_rotations(df) + # Set the altitude to meters + df['altitude'] *= 1000 + renaming = { 'sonic_velocity': 'speedofsound', 'Time': 'time',