{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github", "tags": [ "no-tex" ] }, "source": [ "\"Open" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "id": "JoW4C_OkOMhe", "tags": [ "remove-cell" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install -q -U gtbook\n" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "id": "10-snNDwOSuC", "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "import numpy as np\n", "try:\n", " import google.colab\n", "except:\n", " import plotly.io as pio\n", " pio.renderers.default = \"png\"\n", "\n", "import gtsam\n", "from gtbook.display import show\n", "from gtbook import logistics\n", "\n", "N = 5\n", "indices = range(1, N+1)\n", "u = {k:gtsam.symbol('u',k) for k in indices[:-1]} # controls u_k\n", "x = {k:gtsam.symbol('x',k) for k in indices} # states x_k\n", "z = {k:gtsam.symbol('z',k) for k in indices} # measurements z_k\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "nAvx4-UCNzt2" }, "source": [ "# Sensor Models with Continuous State\n", "\n", "> From Gaussian to non-Gaussian sensors.\n", "\n", "\"Splash" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the previous chapters, we have used sensors that could be characterized using fairly simple probabilistic\n", "models, either discrete conditional probability distributions (e.g., conductivity for the trash-sorting robot\n", "and light sensing for the vacuum cleaning robot), or one-dimensional Gaussian distributions (as for the trash-sorting robot's weight sensor). In this section we introduce three more realistic sensors,\n", "each of which are similar to sensors that are frequently used in modern robotic systems:\n", "- a proximity sensor\n", "- an RFID range sensor, which has a non-linear measurement prediction model\n", "- a GPS-like location sensor, which uses a Gaussian conditional density" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The proximity sensor detects when the robot is near an obstacle. \n", "Therefore, this sensor's response depends on the geometry of the environment.\n", "Let us extend the example from the Section 4.1, a warehouse of 100m x 50m, by imagining four sets of shelves placed at regular intervals.\n", "\n", "We can represent this in code using a 2D image. We can simply use a `numpy` array to do so, and indeed this is what we do. A base map for this environment is defined in `gtbook.logistics`." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "type(base_map): \n", "base_map.dtype: float64\n", "base_map.shape: (50, 100)\n" ] } ], "source": [ "base_map = logistics.base_map\n", "print(\"type(base_map):\", type(base_map))\n", "print(\"base_map.dtype:\", base_map.dtype)\n", "print(\"base_map.shape:\", base_map.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below we plot this `base_map` as an image, using the conveniently defined `show_map` function:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAH0CAYAAADfWf7fAAAgAElEQVR4Xu3de5ydVXkv8DWEW8AYboJpPVaKrZUiWAu2aC0XlYsgih9RAUXuBkUoiCZClQiJaBVQIyCCpYViRbBqARXlqoVS20ppOfQU5YgeqBdQQSAEQpjz2S9NTOQys5mdd73v83znnxazs9da399aix979uwZGx8fHy++CBAgQIAAAQIECAQVGFN4gyZrWQQIECBAgAABAo2AwmsjECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWkDhDR2vxREgQIAAAQIECCi89gABAgQIECBAgEBoAYU3dLwWR4AAAQIECBAgoPDaAwQIECBAgAABAqEFFN7Q8VocAQIECBAgQICAwmsPECBAgAABAgQIhBZQeEPHa3EECBAgQIAAAQIKrz1AgAABAgQIECAQWmDKhfe+RQ82QKuvNlbGVivlkaXjZel4aDOLe4oCY/+zT5Y8YoM8RcLwf23aYJOU4g4Jn/RTX+Dg3zWPPDJeHnnqT+FvBhdYY9pYWaKIBE95+OVNufCWRXcNP6q/QYAAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlAYW3JWjDECBAgAABAgQI1BFQeOu4G5UAAQIECBAgQKAlgUkX3nvvW1QeXrq0rD9zxspTW3RXS1M1DAECBAgQIECAAIHhBVYqvHf8+K7y2gP+vOz92h3L0W97Q/Nsix5YXObMP7Ncee0NzT9vuflmZeH8I8pGG8x8dDSFd3h1f4MAAQIECBAgQKA1geWFd/AK7r7vmF9u/cF/l4P2ftXywnv2Zy8tF158dTlv4XFl+tprlsPmnlo2ffascuJ7DlR4W4vJQAQIECBAgAABAk9VoCm8g7cqHH7sx8ozn7Fh+eV9i8qzZm20vPC+/pDjy87bb1MO2Xf3ZozLrv52OXre6eWmq84pY2NjXuF9qvL+HgECBAgQIECAQCsCTeH94CfOL9/7/u3lzL94V5mz4NMrFd5tdp1d5s85qCm9g6+bb7mt7HXovHLdxaeVmTPWVXhbickgBAgQIECAAAECT1Vg7LNfvHz8ry74Wvn8mfPKzKev27x6u+wV3vHx8bLFDgeU0086qmy37VbNGLfedkfZY//jyuUXnFxmbbKhwvtU5f09AgQIECBAgACBVgTGdnrTMeO/9axNynOf85vNgFf8w3fKjKets/xtDINXeBfMPbjstN3WXuFtJRKDECBAgAABAgQIjFJg7HNfumL8nnvvX/6cX/raP5QN1nt6efUrty1vfM2OZfAe3l12eHE5eJ/dmsd4D+8o+T0XAQIECBAgQIDAqhZ4zOfwrviWhsHgZ51/SbnokmuaT2lYZ/paZfacU3xKw6pOxfMTIECAAAECBAiMTGDCwnv/osXlmBPOKN+8/sZm0C2et2lZuODIsvFG6z06CZ/DO7Iwoj7RvBfNirq0J1zXvO/8KOyaM+Y5CDNqpvKMd1QzZhr1fMbbnfVWNOnftDZ428OSJQ//6hdOLJuzwlsvvZ6M7PLtSVCTnGbGPBXeSW6OHj0sckHKeEYj59mjY9XpqU668D7hKhTeTgfchcm5fLuQwujmkDFPhXd0+6crzxS5IGU8o5Hz7MqZ6fs8FN6+J9iD+bt8exDSEFPMmKfCO8QG6clDIxekjGc0cp49OVKdn6bC2/mI+j9Bl2//M1xxBRnzVHhj7eHIeTZr83MT8TasFU1ZQOGdMqEnmEjA5TuRUL/+PGOekQuSPPt1/iYz24yZeoV3Mjsj92MU3tz5t7J6l28rzK0NkjFPhbe17dXaQJELUsYzGjnP1g5F8IEU3uABd2F5Lt8upDC6OWTMU+Ed3f7pyjNFLkgZz2jkPLtyZvo+D4W37wn2YP4u3x6ENMQUM+ap8A6xQXry0MgFKeMZjZxnT45U56ep8HY+ov5P0OXb/wxXXEHGPBXeWHs4cp7N2vzQWrwNa0VTFlB4p0zoCSYScPlOJNSvP8+YZ+SCJM9+nb/JzDZjpl7hnczOyP0YhTd3/q2s3uXbCnNrg2TMU+FtbXu1NlDkgpTxjEbOs7VDEXwghTd4wF1Ynsu3CymMbg4Z81R4R7d/uvJMkQtSxjMaOc+unJm+z0Ph7XuCPZi/y7cHIQ0xxYx5KrxDbJCePDRyQcp4RiPn2ZMj1flpKrydj6j/E3T59j/DFVeQMU+FN9YejpxnszY/tBZvw1rRlAUU3ikTeoKJBFy+Ewn1688z5hm5IMmzX+dvMrPNmKlXeCezM3I/RuHNnX8rq3f5tsLc2iAZ81R4W9terQ0UuSBlPKOR82ztUAQfSOENHnAXlufy7UIKo5tDxjwV3tHtn648U+SClPGMRs6zK2em7/NQePueYA/m7/LtQUhDTDFjngrvEBukJw+NXJAyntHIefbkSHV+mgpv5yPq/wRdvv3PcMUVZMxT4Y21hyPn2azND63F27BWNGUBhXfKhJ5gIgGX70RC/frzjHlGLkjy7Nf5m8xsM2bqFd7J7Izcj1F4c+ffyupdvq0wtzZIxjwV3ta2V2sDRS5IGc9o5DxbOxTBB1J4gwfcheW5fLuQwujmkDFPhXd0+6crzxS5IGU8o5Hz7MqZ6fs8FN6+J9iD+bt8exDSEFPMmKfCO8QG6clDIxekjGc0cp49OVKdn6bC2/mI+j9Bl2//M1xxBRnzVHhj7eHIeTZr80Nr8TasFU1ZQOGdMqEnmEjA5TuRUL/+PGOekQuSPPt1/iYz24yZeoV3Mjsj92MU3tz5t7J6l28rzK0NkjFPhbe17dXaQJELUsYzGjnP1g5F8IEU3uABd2F5Lt8upDC6OWTMU+Ed3f7pyjNFLkgZz2jkPLtyZvo+D4W37wn2YP4u3x6ENMQUM+ap8A6xQXry0MgFKeMZjZxnT45U56ep8HY+ov5P0OXb/wxXXEHGPBXeWHs4cp7N2vzQWrwNa0VTFlB4p0zoCSYScPlOJNSvP8+YZ+SCJM9+nb/JzDZjpl7hnczOyP0YhTd3/q2s3uXbCnNrg2TMU+FtbXu1NlDkgpTxjEbOs7VDEXwghTd4wF1Ynsu3CymMbg4Z81R4R7d/uvJMkQtSxjMaOc+unJm+z0Ph7XuCPZi/y7cHIQ0xxYx5KrxDbJCePDRyQcp4RiPn2ZMj1flpKrydj6j/E3T59j/DFVeQMU+FN9YejpxnszY/tBZvw1rRlAUU3ikTeoKJBFy+Ewn1688z5hm5IMmzX+dvMrPNmKlXeCezM3I/RuHNnX8rq3f5tsLc2iAZ81R4W9terQ0UuSBlPKOR82ztUAQfSOENHnAXlufy7UIKo5tDxjwV3tHtn648U+SClPGMRs6zK2em7/NQePueYA/m7/LtQUhDTDFjngrvEBukJw+NXJAyntHIefbkSHV+mgpv5yPq/wRdvv3PcMUVZMxT4Y21hyPn2azND63F27BWNGUBhXfKhJ5gIgGX70RC/frzjHlGLkjy7Nf5m8xsM2bqFd7J7Izcj1F4c+ffyupdvq0wtzZIxjwV3ta2V2sDRS5IGc9o5DxbOxTBB1J4gwfcheW5fLuQwujmkDFPhXd0+6crzxS5IGU8o5Hz7MqZ6fs8FN6+J9iD+bt8exDSEFPMmKfCO8QG6clDIxekjGc0cp49OVKdn6bC2/mI+j9Bl2//M1xxBRnzVHhj7eHIeTZr80Nr8TasFU1ZQOGdMqEnmEjA5TuRUL/+PGOekQuSPPt1/iYz24yZeoV3Mjsj92MU3tz5t7J6l28rzK0NkjFPhbe17dXaQJELUsYzGjnP1g5F8IEU3uABd2F5Lt8upDC6OWTMU+Ed3f7pyjNFLkgZz2jkPLtyZvo+D4W37wn2YP4u3x6ENMQUM+ap8A6xQXry0MgFKeMZjZxnT45U56ep8HY+ov5P0OXb/wxXXEHGPBXeWHs4cp7N2vzQWrwNa0VTFlB4p0zoCSYScPlOJNSvP8+YZ+SCJM9+nb/JzDZjpl7hnczOyP0YhTd3/q2s3uXbCnNrg2TMU+FtbXu1NlDkgpTxjEbOs7VDEXwghTd4wF1Ynsu3CymMbg4Z81R4R7d/uvJMkQtSxjMaOc+unJm+z0Ph7XuCPZi/y7cHIQ0xxYx5KrxDbJCePDRyQcp4RiPn2ZMj1flpKrydj6j/E3T59j/DFVeQMU+FN9YejpxnszY/tBZvw1rRlAUU3ikTeoKJBFy+Ewn1688z5hm5IMmzX+dvMrPNmKlXeCezM3I/RuHNnX8rq3f5tsLc2iAZ81R4W9terQ0UuSBlPKOR82ztUAQfSOENHnAXlufy7UIKo5tDxjwV3tHtn648U+SClPGMRs6zK2em7/NQePueYA/m7/LtQUhDTDFjngrvEBukJw+NXJAyntHIefbkSHV+mssL7333P1B+cc+9ZYP1nl7WXWftx0z83vsWlYeXLi3rz5yx8p8tuqvzizTBugIu37r+ox49Y54K76h3Uf3ni1yQMp7RyHnWPy0xZjB2/6IHxvd9x/xyy/+9ffmK9tnz5WXu4fuWadNWK4seWFzmzD+zXHntDc2fb7n5ZmXh/CPKRhvMfPTxCm+MnbAKV+HyXYW4FZ46Y54Kb4WNtoqHjFyQMp7RyHmu4qOQ5unH7r1v0fhfXfC18ppdXlp+Y5ONynX/clOZPeeUct7CY8uLXvC75ezPXlouvPjqct7C48r0tdcsh809tWz67FnlxPccqPCm2SZTW6jLd2p+XfvbGfNUeLu2C6c+n8gFKeMZjZzn1He7ZxgIPOY9vLfedkfZY//jypfPWVCeu+lvltcfcnzZefttyiH77t6IXXb1t8vR804vN111ThkbG/MKr300oYDLd0KiXj0gY54Kb6+26KQmG7kgZTyjkfOc1Ib2oAkFlhfe2390Z/n8319VLv/Wv5ZX7fjH5fAD92z+8ja7zi7z5xzUlN7B18233Fb2OnReue7i08rMGesqvBMSe4DLN9YeyJinwhtrD0fOs1mbXzwRb8Na0ZQFlhfe//zuD8qZ511c/vXf/6tst+0Ly/FHv7Wsvvq0ssUOB5TTTzqqbLftVs1gy14BvvyCk8usTTZUeKccQfwncPnGyjhjnpELkjxjnU+FN16eVjQagce8peGee+8vr3jDu8r7jnpL2WOnlzav8C6Ye3DZabutvcI7GvN0z5LxX6iRv72WMU+FN9615YzGyjRynrGSqreax/0c3le9eU7Zc9eXNe/bHbyHd5cdXlwO3me3Zpbew1svrL6OnLEgRb58M+ap8Pb19nnieTujsTKNnGespOqtZuw7/3HL+H9+94flFS/7w7Le09ctl15xffnzD3+mnPuJY8sfbvm75azzLykXXXJN8ykN60xfq/kEB5/SUC+wPo6csSBFvnwz5qnw9vHmefI5O6OxMo2cZ6yk6q1m7N9vvnX87e89tfz87nuXz2LOO/Yu++21c/PP9y9aXI454YzyzetvbP55i+dtWhYuOLJsvNF6jz7e5/DWS68nI2csSJEv34x5Krw9uWyGmKYzOgRWDx4aOc8e8Pdiis1bGsbHx8vdv7yvDH7b2jM33rCssfq0x0x+8N7eJUse/tUvnFj2CIW3F0HXnGTGghT58s2Yp8Jb8wZZNWM7o6vGtdazRs6zlmm0cR/3PbxDLVLhHYor44MzFqTIl2/GPBXeeDeXMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreapYX3nvuvb88+OCSsvFG6z3ubO69b1F5eOnSsv7MGSv/+aK76s3eyL0QyFiQIl++GfNUeHtx1Qw1SWd0KK7OPzhynp3H78kEx+782d3j+x3xwfKD23/STHmz3/qNcsi+u5dX7/SS5p8XPbC4zJl/Zrny2huaf95y883KwvlHlI02mPnoEhXenkRdb5oZC1LkyzdjngpvvftjVY3sjK4q2TrPGznPOqLxRh37yZ2/GP/S175V9tj5pWXd6WuX8y76ejnngq+Vb37xE2X62muWsz97abnw4qvLeQuPa/75sLmnlk2fPauc+J4DFd54+2GVrChjQYp8+WbMU+FdJVdD1Sd1Rqvyj3zwyHmOHCvpEz7mPby3/+jOsvPe7y7nLTy2vOgFv1tef8jxZeftt2le9R18XXb1t8vR804vN111ThkbG/MKb9KNM8yyMxakyJdvxjwV3mFOfD8e64z2I6fJzjJynpM18LgnF3hM4f3iV79V/vzDnynf+tLCssF6M8o2u84u8+cc1JTewdfNt9xW9jp0Xrnu4tPKzBnrKrx22IQCGQtS5Ms3Y54K794nTC4AAB5rSURBVITHvHcPcEZ7F9mTTjhynrGSqrealQrvd79/e9nn7fPLW/fauRx+4J5lfHy8bLHDAeX0k44q2227VTPLW2+7o+yx/3Hl8gtOLrM22VDhrZddb0bOWJAiX74Z81R4e3PdTHqizuikqXrxwMh59iKAHkxyeeG948d3lbe8c0HZ5oW/Vz4495AybdpqzfQHr/AumHtw2Wm7rb3C24NAuzjFjAUp8uWbMU+Ft4s3y9Tm5IxOza9rfztynl2z7ut8msL7ve/fUQ446kNlxz95UXnfUfuV1adNW76ewXt4d9nhxeXgfXZr/jfv4e1r1PXmnbEgRb58M+ap8Na7P1bVyM7oqpKt87yR86wjGm/Usf/zvR+Ov+6g95XdXv7H5Z0Hva6sttqjr+yuM32t5jN3zzr/knLRJdc0n9Iw+N9mzznFpzTE2werdEUZC1LkyzdjngrvKr0iqjy5M1qFfZUNGjnPVYaW7InHvnLF9ePHnHDGY5Y9+BzeDx17aLl/0eIy+PNvXn9j85gtnrdpWbjgyF/9ggqfw5tsywy/3IwFKfLlmzFPhXf4c9/1v+GMdj2h4eYXOc/hJDz6iQQm/auFB7+JbcmSh3/1CyeWPaPCa3dNIJCxIEW+fDPmqfDGu+ac0ViZRs4zVlL1VjPpwvuEU1R466XXk5EzFqTIl2/GPBXenlw2Q0zTGR0CqwcPjZxnD/h7MUWFtxcx9XuSGQtS5Ms3Y54Kb7/voMebvTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3moU3nr2aUbOWJAiX74Z81R4411XzmisTCPnGSupeqtReOvZpxk5Y0GKfPlmzFPhjXddOaOxMo2cZ6yk6q1G4a1nn2bkjAUp8uWbMU+FN9515YzGyjRynrGSqrcahbeefZqRMxakyJdvxjwV3njXlTMaK9PIecZKqt5qFN569mlGzliQIl++GfNUeONdV85orEwj5xkrqXqrUXjr2acZOWNBinz5ZsxT4Y13XTmjsTKNnGespOqtRuGtZ59m5IwFKfLlmzFPhTfedeWMxso0cp6xkqq3GoW3nn2akTMWpMiXb8Y8Fd5415UzGivTyHnGSqreahTeevZpRs5YkCJfvhnzVHjjXVfOaKxMI+cZK6l6q1F469mnGTljQYp8+WbMU+GNd105o7EyjZxnrKTqrUbhrWefZuSMBSny5ZsxT4U33nXljMbKNHKesZKqtxqFt559mpEzFqTIl2/GPBXeeNeVMxor08h5xkqq3mpWKrwPL11aVhtbray22thjZnTvfYvK4M/Xnzlj5T9bdFe92Ru5FwIZC1LkyzdjngpvL66aoSbpjA7F1fkHR86z8/g9meDywvvA4ofKG982rxz65leX3V+57fLpL3pgcZkz/8xy5bU3NP/blptvVhbOP6JstMHMRx+j8PYk6nrTzFiQIl++GfNUeOvdH6tqZGd0VcnWed7IedYRjTdqU3g/+qkLyjmf+2qzug8f97aVCu/Zn720XHjx1eW8hceV6WuvWQ6be2rZ9NmzyonvOVDhjbcfVsmKMhakyJdvxjwV3lVyNVR9Ume0Kv/IB4+c58ixkj5hU3jvvue+svihh8o+bz+xHH3oG1YqvK8/5Piy8/bblEP23b0huuzqb5ej551ebrrqnDI2NuYV3qQbZ5hlZyxIkS/fjHkqvMOc+H481hntR06TnWXkPCdr4HFPLrDSe3h33vvd5Z0Hvm6lwrvNrrPL/DkHNaV38HXzLbeVvQ6dV667+LQyc8a6Cq8dNqFAxoIU+fLNmKfCO+Ex790DnNHeRfakE46cZ6yk6q3mSQvv+Ph42WKHA8rpJx1Vttt2q2aWt952R9lj/+PK5RecXGZtsqHCWy+73oycsSBFvnwz5qnw9ua6mfREndFJU/XigZHz7EUAPZjkpF7hXTD34LLTdlt7hbcHgXZxihkLUuTLN2OeCm8Xb5apzckZnZpf1/525Dy7Zt3X+UxYeAfv4d1lhxeXg/fZrVmj9/D2Nep6885YkCJfvhnzVHjr3R+ramRndFXJ1nneyHnWEY03alN4B5+vO/7IeNl9v/eW2fvtUXZ/xbZljTVWb1Z71vmXlIsuuab5lIZ1pq9VZs85xac0xNsHq3RFGQtS5Ms3Y54K7yq9Iqo8uTNahX2VDRo5z1WGluyJm8I7+NSFwSu3K35dcu5JTbG9f9HicswJZ5RvXn9j88dbPG/TsnDBkWXjjdZ79OE+hzfZlrFcAgQIECBAgEC/BCb9q4Xvuff+smTJw7/6hRPL1qnw9itxsyVAgAABAgQIJBOYdOF9QheFN9mWsVwCBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BBTefuVltgQIECBAgAABAkMKKLxDgnk4AQIECBAgQIBAvwQU3n7lZbYECBAgQIAAAQJDCii8Q4J5OAECBAgQIECAQL8EFN5+5WW2BAgQIECAAAECQwoovEOCeTgBAgQIECBAgEC/BCZdeO+9b1F5eOnSsv7MGSuvcNFd/Vqx2RIgQIAAAQIECKQSmLDwLnpgcZkz/8xy5bU3NDBbbr5ZWTj/iLLRBjMfhVJ4U20YiyVAgAABAgQI9E1gwsJ79mcvLRdefHU5b+FxZfraa5bD5p5aNn32rHLiew5UePuWtvkSIECAAAECBBIKTFh4X3/I8WXn7bcph+y7e8Nz2dXfLkfPO73cdNU5ZWxszCu8CTeNJRMgQIAAAQIE+iQwYeHdZtfZZf6cg5rSO/i6+Zbbyl6HzivXXXxamTljXYW3T2mbKwECBAgQIEAgocCTFt7x8fGyxQ4HlNNPOqpst+1WDc+tt91R9tj/uHL5BSeXWZtsqPAm3DSWTIAAAQIECBDok8CkXuFdMPfgstN2W3uFt0/JmisBAgQIECBAgEAjMGHhHbyHd5cdXlwO3me35i94D6+dQ4AAAQIECBAg0CeBCQvvWedfUi665JrmUxrWmb5WmT3nFJ/S0KeEzZUAAQIECBAgkFxgwsJ7/6LF5ZgTzijfvP7GhmqL521aFi44smy80XrNP9+36MHm/66+2lgZW62UR5aOl6XjyVUt/3EFxv5nnyx5xAaxRR5fYNpgk5TiDrFBnlBg8O+aRx4ZL48wIvAEAmtMGytLFBH749cEJiy8yx5/z733lyVLHv7VL5xASYAAAQIECBAgQKAHApMuvD1YiykSIECAAAECBAgQeIyAwmtTECBAgAABAgQIhBYYWeF96KEl5Rf33Ne8t7f5DWy+UgsM3mP387t/WdZYY/VHf0HJ43zde9+i8vDSpWX9mTNSW1n8Ewvc9fN7yjrT125+YNZXXoHB2+l++rO7yzM2mFnWXHON5RCDe+anP/tF81a71adNywuUfOWDe+Jp604va6+15mMkdJPkm2OF5U+58A5+OcUZ5/59Oe2cLzZPu8F6M8onP/hnZavNN6OcVOAf/+V/lyPet7AsemBxI7DNC3+vHHPYG5sfeBx8Df73OfPPLFdee0Pzz1tuvllZOP8I7w9Pul+u+ccby9vfe+pKv+Dmh3f8pPlEmB/c/pNG5XWv+tPy/qPfWtZYXanJtE2+/8Mflfd/5Jzynf+4pVn2+47ar7zpNTs2//9g3wx+oHrZPXP80W8tb9hjh0w86dd67T/fVD55zhfL7f/907L4wSVl2603Lx+ce0hTfnWT9NvjMQBTLrw33PTd8ubDF5TzFh5bXvB7v10+8Zm/K5de8Y/l8gtOKaut5pXejFvu+u/cXO686+7yp9tuVRYvfqiccOpfNz9VfcaHjmo4zv7speXCi69uPupu+tprlsPmnrryR91lREu65v+69f8198egtKz4Gx0PffdHm39pLZh7SPnxT39W3vC2D5T3H7VfefVOL0kqlW/ZP7nzF2XHvY4qu+74R2WfPV9env87zymLH3yw+Y7QA4sfKn+65xHl8AP3LPu+7hXl6uv+rRz5voXlsr/9SHnWrGfkw0q44sF3B7d6+UHNHpj9lj3KA4sfLIPfG/D63bcrB77pVUU3SbgpJljylAvvyZ/6fPnP7/2gnP3RdzdD/fSuu8sOr/+zctFZHyjP/53fIk6gXPz168rcD3663HjFZ5pvOw4upZ2336Ycsu/ujc5jfpkJsxQCd/7s7vLG2R8oRx/6hvKBU/66fPT9hzW/wnzwiTAvefU7yt988rjyB1v8TmOx4OPnlR//9OfNRyL6yiHwF6f9bbn4G9eVq77wsce8XWHZdwVu+PpZy9/i8Ko3z2nK776ve2UOoOSrXPTAg2WbXd9W5s85qOy568sajWNPOqtMmzatnPieA4tuknyDPM7yp1x4B99SWn/m08pxR75l+dP//vb7r/RqDfbcAoOy+73v39H8R9Dga5tdZzeX1KD0Dr5uvuW2steh88p1F5/2hO/3zS0Yb/WDV+j2P/Kk8rI/2rJ5hWawJ5YV3ltvu6Pssf9x5eovfKw8Y8NHP+/7vIu+Xr582bXL91A8ESv6dYE93npsmb72WmXWJhuWH/3kZ80LKLPfukd55jM2KJ+/+OryVxd8tXzlbz68/K+987iPl+f8r1nlXbPfADOJwClnfr585m+/Ug54067N/vjQwvPLpz9yTPP/6yZJNsEQy5xy4R186/F5mz17pUtm8C+vecfsX3Z7+R8PMRUPjSiw7NXdwXcAtt3695v3VW2xwwEr/QfRsoJz+QUnN/9y8xVbYPD2lsG/jAZfg5I7eOvTioV32bciV/wPoEHB+dS5Xy5XXnhqbByrW+mFkz/6g+c3r96tuebq5azzL23e+vLlcxaUv77wsvK1q7690n8ADfbU09aZ3vy7x1cOgcHb5959whnNz4EM3tby0m22KB95/2HNCye6SY49MMwqp1x4B5fM4AfVjj3izStdVCu+H2+YCXlsHIHBDxQMLp1f/2GSQblZMPfgstN2WzeL9QpvnMwns5Jlb3savNdu3elrN39lUGC2f8kLyx47vbQ89zm/0bzCe83ffXz5DzJ6hXcysrEeM/hO4SdOPKK8/GUvahY2+AG23fd7b/m7z5xYbrz5Vq/wxop76NUse+vTX546pwz+w2jwg66HH/vx8txNn1VOmff25j+qdZOhWUP/hSkX3sH7ZP7r1h8230YYfHkPb+j9MunFLXtf7orvr1r2lwfv4d1lhxeXg/fZrfmfvId30qwhHjh4le5vvvCNldby8bO/UHZ/5bZl91ds27xa8+vv4T3x1HPLT+/6hffwhtgBk1vE4J4YfJdw8O3qwdey7wR97lPHl5//4pfNJ3v82zfObj76cPC1897vLvvttZP38E6Ot/eP+tY//UeZPefkcu2XP1nWm/m0Zj3nXnhZWfiXXyz//NVPNe/h1U16H/NIFzDlwvurn4Q8rrzg+b9dPn72ReUrV1zvUxpGGlO/nmzwXsvBDw/MPXyfsuOfPPrqzOBr8F7vwWeqnnX+JeWiS65pPqVh8Pmqg4+f2vTZs5ofNPCVU2DFtzQMBA4+5iPl6U9bt/lOgE9pyLkn/vJzXynnfO6rZVBwB5/YceqZF5Yr/uFfy9c/d3Lz1qjBDyzNecfeZR+f0pByg9zx47vKTm86prz9ra8ph7751eWBBx8qb597apnxtHWaTwTSTVJuiydd9JQL7+DiGXwO3qfO/ftmoEGh+fRH3rX8p6uR5xM44dRzywVfvvIxC1/2au/9ixY332765vU3No8ZfD7v4KfvB7+0xFdOgV8vvINvXw/+Q+j2H93ZgLx2lz8p8961//JX83Iq5Vr14BcGHPuhs8tXr/ynZuGbPGP98rEPHN58B2DwNfgc78EPqi37+vM/e0vZ+7Uvz4WUfLWD7w6ed9E3yuDjDQdfg7fJvfOg1zU/2KibJN8cj7P8KRfeZc+5+MGHmm8zPXPjDX3+rn02KYHBe7AGv0Fp8FuSfBF4PIHBZ7EOXt1bd51H3+vrK5/AL+9bVO6//4HyzI03eMxv8Vy69JHy4zt/XjbecD3/MZRvayxf8eAjDp8+Y92y1gq/hU83SbwhnmDpIyu8aAkQIECAAAECBAh0UUDh7WIq5kSAAAECBAgQIDAyAYV3ZJSeiAABAgQIECBAoIsCCm8XUzEnAgQIECBAgACBkQkovCOj9EQECBAgQIAAAQJdFFB4u5iKOREgQIAAAQIECIxMQOEdGaUnIkCAAAECBAgQ6KKAwtvFVMyJAAECBAgQIEBgZAIK78goPREBAgQIECBAgEAXBRTeLqZiTgQIECBAgAABAiMTUHhHRumJCBAgQIAAAQIEuiig8HYxFXMiQIAAAQIECBAYmYDCOzJKT0SAAAECBAgQINBFAYW3i6mYEwECBAgQIECAwMgEFN6RUXoiAgQIECBAgACBLgoovF1MxZwIECBAgAABAgRGJqDwjozSExEgQIAAAQIECHRRQOHtYirmRIAAAQIECBAgMDIBhXdklJ6IAAECBAgQIECgiwIKbxdTMScCBAgQIECAAIGRCSi8I6P0RAQIECBAgAABAl0UUHi7mIo5ESBAgAABAgQIjExA4R0ZpSciQIAAAQIECBDoooDC28VUzIkAAQIECBAgQGBkAgrvyCg9EQECBAgQIECAQBcFFN4upmJOBAgQIECAAAECIxNQeEdG6YkIECBAgAABAgS6KKDwdjEVcyJAgAABAgQIEBiZgMI7MkpPRIAAAQIECBAg0EUBhbeLqZgTAQIECBAgQIDAyAQU3pFReiICBAgQIECAAIEuCii8XUzFnAgQIECAAAECBEYmoPCOjNITESBAgAABAgQIdFFA4e1iKuZEgAABAgQIECAwMgGFd2SUnogAAQIECBAgQKCLAgpvF1MxJwIECBAgQIAAgZEJKLwjo/REBAgQIECAAAECXRRQeLuYijkRIECAAAECBAiMTEDhHRmlJyJAgAABAgQIEOiigMLbxVTMiQABAgQIECBAYGQCCu/IKD0RAQIECBAgQIBAFwUU3i6mYk4ECBAgQIAAAQIjE1B4R0bpiQgQIECAAAECBLoooPB2MRVzIkCAAAECBAgQGJmAwjsySk9EgAABAgQIECDQRQGFt4upmBMBAgQIECBAgMDIBBTekVF6IgIECBAgQIAAgS4KKLxdTMWcCBAgQIAAAQIERiag8I6M0hMRIECAAAECBAh0UUDh7WIq5kSAAAECBAgQIDAyAYV3ZJSeiAABAgQIECBAoIsCCm8XUzEnAgQIECBAgACBkQkovCOj9EQECBAgQIAAAQJdFFB4u5iKOREgQIAAAQIECIxMQOEdGaUnIkCAAAECBAgQ6KKAwtvFVMyJAAECBAgQIEBgZAIK78goPREBAgQIECBAgEAXBRTeLqZiTgQIECBAgAABAiMTUHhHRumJCBAgQIAAAQIEuiig8HYxFXMiQIAAAQIECBAYmYDCOzJKT0SAAAECBAgQINBFAYW3i6mYEwECBAgQIECAwMgEFN6RUXoiAgQIECBAgACBLgoovF1MxZwIECBAgAABAgRGJqDwjozSExEgQIAAAQIECHRRQOHtYirmRIAAAQIECBAgMDKB/w9yBAh7wloO3AAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#| caption: The logistics warehouse base map that we use throughout this section.\n", "#| label: fig:logistics_base_map\n", "logistics.show_map(base_map)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the remainder of this section we then show how to use this map to simulate the three sensors we listed above." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A proximity sensor\n", "\n", "> A binary sensor over a continuous space.\n", "\n", "We consider a sensor that measures the *proximity* of the robot to obstacles. For example, this could be operationalized using small infrared sensor/receiver pairs, or a magnetic sensor that measures proximity to one of the metal structures within the warehouse.\n", "\n", "This is a *binary* sensor, just like the conductivity sensor we saw in the trash sorting example. However, a big difference is that the measurement $z_k$ of this sensor at time $k$ depends on the *continuous* state $x_k$. \n", "In other words, this is a kind of *hybrid*, discrete-continuous sensor model." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "This sensor can be modeled using a **signed distance function** (SDF), which is a well-known concept from graphics.\n", "An SDF measures the distance from any point $x$ to the nearest obstacle, is positive if this location is outside the obstacle, and negative if it is inside the obstacle. Robots will never see negative SDF values.\n", "Let $X_{obs}$ denote the set of points on the boundary of the obstacles (the borders of the shelves, and the\n", "walls that enclose the warehouse).\n", "For a given point $x \\in {\\cal D}$, the distance to the nearest obstacle can be defined by\n", "\n", "$$\n", "d(x) = \\min_{y \\in X_{obs}} \\|x - y\\|\n", "$$" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We now define the signed distance to be negative for $x$ is inside the obstacle, and positive for points outside the obstacle:\n", "\n", "$$\n", "\\mathop{sdf}(x)\n", "= \n", "\\left\\{\n", " \\begin{array}{lcr} - d(x) & & x \\mathop{\\; inside\\; obstacle}\\\\\n", " + d(x) & & x \\mathop{\\; outside\\; obstacle}\\\\\n", "\\end{array}\n", "\\right.\n", "$$" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We can use the function *sdf* to model our proximity sensor by defining a conditional probability\n", "distribution $P(z_k=\\text{ON}|x_k)$ as a function of $\\mathrm{sdf}(x)$.\n", "For example, if obstacle detection is very reliable for for $d(x) < d_0$,\n", "but degrades rapidly as $d(x)$ increases (i.e., as the robot moves further from obstacles),\n", "we might define\n", "\n", "$$\n", "P(z_k=\\text{ON}|x_k) = \n", "\\left\\{\n", " \\begin{array}{lcr} 1 & & d(x) < d_0 \\\\\n", " e^{- \\alpha d(x)} && \\mathrm{otherwise}\\\\\n", "\\end{array}\n", "\\right.\n", "$$\n", "\n", "where the value of $\\alpha > 0$ determines how rapidly the probability decreases.\n", "Because the conditional probability $P(\\cdot | x_k)$ is a valid probability distribution,\n", "we can immediately conclude that\n", "$P(z_k=\\text{OFF}|x_k) = 1 - P(z_k=\\text{ON}|x_k)$.\n", "\n", "Below, we use a simpler model, which assumes that the proximity sensor perfectly\n", "detects when the robot is within distance $d_0$ of an obstacle:\n", "\n", "$$\n", "P(z_k=\\text{ON}|x_k)\n", "= \n", "\\left\\{\n", " \\begin{array}{lcr} 1 & & d(x) < d_0 \\\\\n", " 0 && \\mathrm{otherwise}\\\\\n", "\\end{array}\n", "\\right.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The figure below shows the likelihood for $z_k = \\text{ON}$.\n", "Recall that the likelihood $l(x_k;z_k=\\text{ON})\\propto P(z_k=\\text{ON}|z_k)$ is a function *of the state* $x_k$, so we can show it as a map:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAH0CAYAAADfWf7fAAAgAElEQVR4Xu3de7hfVXXu8bkTAgSM4SaY1mOl2IoUwVJii9ZyUbkIoviICihyNyhCQTSRqERIRKsQNQIiWFooVgSrNqCiXLVQalsoLYeeghzRA0XFCwgJgZDs86zlk11iwKw11pwj452/7/6njaw911ifd+y93+z8sjM2Pj4+nnhDAAEEEEAAAQQQQKBSgTEKb6XJ8lgIIIAAAggggAACrQCFl0VAAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWoDCW3W8PBwCCCCAAAIIIIAAhZcdQAABBBBAAAEEEKhagMJbdbw8HAIIIIAAAggggACFlx1AAAEEEEAAAQQQqFqAwlt1vDwcAggggAACCCCAAIWXHUAAAQQQQAABBBCoWmBw4b33rrtaoMmTJ6VJYymtWDmeVq4crxqNh7MJjI2lNHnSpPTEipW2A3iv6gUmNZ9EUuJzSPVJ2x+w+VqzcuXKNM6XGTti5e85ZfKktJyvM5Wn3P/xBhfeedtO6X9X3gMBBBBAAAEEEEAAAScBCq8TNLdBAAEEEEAAAQQQWDcCFN51485dEUAAAQQQQAABBJwEKLxO0NwGAQQQQAABBBBAYN0IUHjXjTt3RQABBBBAAAEEEHASoPA6QXMbBBBAAAEEEEAAgXUjQOFdN+7cFQEEEEAAAQQQQMBJgMLrBM1tEEAAAQQQQAABBNaNAIV33bhzVwQQQAABBBBAAAEnAQqvEzS3QQABBBBAAAEEEFg3AhTedePOXRFAAAEEEEAAAQScBCi8TtDcBgEEEEAAAQQQQGDdCFB41407d0UAAQQQQAABBBBwElhnhXfeLfc7PSK3QQABBBBAAAEEEKhBYN5OM0yPQeE1sfFOCCCAAAIIIIAAAt4CFF5vce6HAAIIIIAAAggg4CpA4XXl5mYIIIAAAggggAAC3gIUXm9x7ocAAggggAACCCDgKkDhdeXmZggggAACCCCAAALeAhReb3HuhwACCCCAAAIIIOAqQOF15eZmCCCAAAIIIIAAAt4CFF5vce6HAAIIIIAAAggg4CpA4XXl5mYIIIAAAggggAAC3gIUXm9x7ocAAggggAACCCDgKkDhdeXmZggggAACCCCAAALeAhReb3HuhwACCCCAAAIIIOAqQOF15eZmCCCAAAIIIIAAAt4CFF5vce6HAAIIIIAAAggg4CpA4XXl5mYIIIAAAggggAAC3gIUXm9x7ocAAggggAACCCDgKkDhdeXmZggggAACCCCAAALeAhReb3HuhwACCCCAAAIIIOAqQOF15eZmCCCAAAIIIIAAAt4CFF5vce6HAAIIIIAAAggg4CpA4XXl5mYIIIAAAggggAAC3gIUXm9x7ocAAggggAACCCDgKkDhdeXmZggggAACCCCAAALeAhReb3HuhwACCCCAAAIIIOAqQOF15eZmCCCAAAIIIIAAAt4CFF5vce6HAAIIIIAAAggg4CpA4XXl5mYIIIAAAggggAAC3gIUXm9x7ocAAggggAACCCDgKkDhdeXmZggggAACCCCAAALeAhReb3HuhwACCCCAAAIIIOAqQOF15eZmCCCAAAIIIIAAAt4CFF5vce6HAAIIIIAAAggg4CpA4XXl5mYIIIAAAggggAAC3gIUXm9x7ocAAggggAACCCDgKkDhdeXmZggggAACCCCAAALeAhReb3HuhwACCCCAAAIIIOAqQOF15eZmCCCAAAIIIIAAAt4CFF5vce6HAAIIIIAAAggg4CpA4XXl5mYIIIAAAggggAAC3gIUXm9x7ocAAggggAACCCDgKkDhdeUezZtZl2w0tWxPPe+W+23vaHgv8jSg9XwXzzyb0ci0Z0CGyz0zJU9DQD3fxTPPnqNx+dMIWD8uxsbHx8eHqM7bdorp3VkyE9s6fSfrkq3TocVu7vlxQZ7ll8MzTwpv+TxbY35T6gPtdBfPPJ0eqfrbWL92UXirX418D2hdsnwT1H+S5ydf8iy/T555UnjL50nh9TH2vIv3x6jns9V6L+vXLgpvrRtR4LmsS1ZglGqP9PzkS57l18gzTwpv+TwpvD7Gnnfx/hj1fLZa72X92kXhrXUjCjyXdckKjFLtkZ6ffMmz/Bp55knhLZ8nhdfH2PMu3h+jns9W672sX7s6F96HH1manlixIm06fdpqhryGt9aVWvO5rEs2OkLDn9Tzky95Ds9rbSd45knhXVsaef67Z6Z8jObJ7Ded4pln+acZjTtYPy5WK7z3/ein6XWHvz8d9Lo90klvf2Mrt/TRZWn2/PPStTfe2v56h+22SYvmH5+22Gx6+2sK72gsGF9MfXL2/ORr/aThI1HHXTzz5GPUZ2c8M+VjtHymnnmWf5rRuIP142Ki8DbfwT3knfPT3T/473TkQa+eKLwXfP7KdNni69PFi+amqRuun46dszBt/dwZ6fT3HkHhHY3dmnhK65KNGNOgx/X85Eueg6Lq9M6eeVJ4O0Uy+CLPTPkYHRzXWg/wzHOtw3BBJwHrx0VbeJuXKhx3yifSs5+1efrlI0vTc2ZsMVF433D0qWmv3Wamow/Zrx3kquu/m06ad066/boL09jYGN/h7RRPHRdZl6yOp/d5Cs9PvuRZPlPPPCm85fNsjfmxZD7QTnfxzNPpkaq/jfVrV1t4P/ypS9L3vn9vOu8v3p1mL/jsaoV35j6z0vzZR7alt3m748570oHHzEs3LT47TZ+2MYW3+tX6nwe0LtkIEQ1+VM9PvuQ5OK61HuCZJ4V3rXFkucAzUz5Gs0T2Gw/xzLP804zGHawfF2Of//LV43916TfSF8+bl6Y/c+P2u7ervsPb/JsU2+9+eDrnjBPTrrvs2Erefc99af/D5qarLz0zzdhqcwrvaOxX+5TWJRshosGP6vnJlzwHx7XWAzzz5GN0rXFkucAzUz5Gs0RG4S3P6HoH68fF2J5vPnn8d56zVXr+8367Hfiaf7glTXvGRhMvY2i+w7tgzlFpz113bv873+F1zTXUzaxLFuohgg/DF9PgAfUczzNPCm/PcIyXe2bK51xjSD3ezTPPHmNx6W8QsH5cjH3hK9eMP/Twkomjv/KNf0ibbfLM9JpX7ZLe9No9UvMa3r13f0k66uB922t4De/o7qF1yUZXrP+Te37yJc/++fR9D888Kbx907Fd75kpH6O2jPq8l2eefebi2qcXsH5crPFzeJ/8kobmdudfckW6/Iob2p/SsNHUDdKs2WfxUxpGdBOtSzaiXKbH9vzkS56miHq9k2eeFN5e0Zgv9syUj1FzTJ3f0TPPzkNx4W8UsH5crLXwLlm6LJ182rnp2zff1g6w/Qu2TosWnJC23GKT9tf8HN7R2Uzrko3iJxQFK4UZI310Wby8d19hxiiZWqzar3kCP6XBc0byjCIwOnNYP3Y7/0trzcseli9/YuIfnFhFS+FlydYmwCfftQn9z3/3tLJ+0vCcsbtc+SstXt5WCjOWT6rbHSxWFN5utuviKoU814VLjfe0Zt258D4dGoW3xnV66meyLpn3F/0IiShYKcwYIcuJ39zvNKP3ON67b8nUe8beiIXewWJF4S0URoZjFfLM8JgcMeAnRlF4WZ/OAnxC6Uxl/hFunuWDPLvn2RYdCm8/sOBXW/Kk8MYNVSHPuHpak1mzpvBq5bxOp7UumWeJW6dAT7q5gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZU3hVEg4wp3XJKLzdw/O0Is/uuVB4+1kpXK2w/wozRskaqyhJlJ/DmjWFt3w21dzBumSeJS4KtoKVwoxR8qTwRkoizywK+68wY540hp+C1XBDlROsWVN4VRIOMKd1ySi83cPztCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5o1hbd8NtXcwbpkniUuCraClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlTeFUSDjCndckovN3D87Qiz+65UHj7WSlcrbD/CjNGyRqrKEmUn8OaNYW3fDbV3MG6ZJ4lLgq2gpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZTxTeR5Y8mn7x0MNps02emTbeaMM1nvvhR5amJ1asSJtOn7baf5u37RST0SiWIBNUoHeyLtkoZq1gpTBjoPVPFi/v3VeYMUqmFqv2Nz633O/2CAozumGs5UZYRUmi/BzWrMeWLH10/JB3zk93/t97J6Y8+IBXpDnHHZImT56Ulj66LM2ef1669sZb2/++w3bbpEXzj09bbDa9/TWFt3y4Ue5gXTLPLxBYdRcgz+5WfIe3n5XC1Qr7rzBjlKyxipJE+TmsWY89/MjS8b+69BvptXu/LP3WVlukm/7l9jRr9lnp4kWnpJ1e9Pvpgs9fmS5bfH26eNHcNHXD9dOxcxamrZ87I53+3iMovOVzDXUH65JReLvH6GlFnt1zofD2s1K4WmH/FWaMkjVWUZIoP4c16zVew3v3Pfel/Q+bm7564YL0/K1/O73h6FPTXrvNTEcfsl/7FFdd/9100rxz0u3XXZjGxsb4Dm/5bMPcwbpkniUuCpaClcKMUfKk8EZKIs8sCvuvMGOeNIafgtVwQ5UTrFlPFN57738gffHvr0tXf+df06v3+JN03BEHtM8+c59Zaf7sI9vS27zdcec96cBj5qWbFp+dpk/bmMKrsiEZ5rQuGYW3O76nFXl2z4XC289K4WqF/VeYMUrWWEVJovwc1qwnCu9/3vWDdN7Fi9O//vt/pV13eXE69aS3pfXWm5y23/3wdM4ZJ6Zdd9mxfYpV3wG++tIz04ytNqfwls82zB2sS+ZZ4qJgKVgpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGa9RovaXjo4SXplW98d/rAiW9N++/5svY7vAvmHJX23HVnvsOrsg2F5rQuGYW3eyCeVuTZPRcKbz8rhasV9l9hxihZYxUlifJzWLN+yp/D++q3zE4H7PPy9nW7zWt49979Jemog/dtn4LX8JYPM+odrEvmWeKi2ClYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmvXYLf9x5/h/3vXD9MqX/1Ha5JkbpyuvuTm9/6OfSxd96pT0Rzv8fjr/kivS5Vfc0P6Uho2mbtD+BAd+SoPKWuSd07pkFN7uOXhakWf3XCi8/awUrlbYf4UZo2SNVZQkys9hzXrs3++4e/wd71uYfv7gwxNTzn7nQenQA/dqf71k6bJ08mnnpm/ffFv76+1fsHVatOCEtOUWm7S/5ufwlg83yh2sS+ZZ4rDqLkCe3a0ovP2sFK5W2H+FGaNkjVWUJMrPYc26fUnD+Ph4evCXj6TmX1t79pabpynrTV5j4ua1vcuXPzHxD06suoDCWz7cKHewLhmFt3uCnlbk2T0XCm8/K4WrFfZfYcYoWWMVJYnyc1izfsrX8PYZl8LbR0v7WuuSeZa4KMIKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KP4aAPgAACAASURBVNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmTeFVSTjAnNYlo/B2D8/Tijy750Lh7WelcLXC/ivMGCVrrKIkUX4Oa9YU3vLZVHMH65J5lrgo2ApWCjNGyZPCGymJPLMo7L/CjHnSGH4KVsMNVU6wZk3hVUk4wJzWJaPwdg/P04o8u+dC4e1npXC1wv4rzBgla6yiJFF+DmvWFN7y2VRzB+uSeZa4KNgKVgozRsmTwhspiTyzKOy/wox50hh+ClbDDVVOsGZN4VVJOMCc1iWj8HYPz9OKPLvnQuHtZ6VwtcL+K8wYJWusoiRRfg5r1hTe8tlUcwfrknmWuCjYClYKM0bJk8IbKYk8syjsv8KMedIYfgpWww1VTrBmPVF4H3p4SXrsseVpyy02ecpnfviRpemJFSvSptOnrfbf5207xWQ0iiXIBBXonaxLNopZK1gpzBho/ZPFy3v3FWaMkqnFqv2Nzy33uz2CwoxuGGu5EVZRkig/hzXrsQd+9uD4ocd/OP3g3h+3U27zO7+Vjj5kv/SaPV/a/nrpo8vS7PnnpWtvvLX99Q7bbZMWzT8+bbHZ9PbXFN7y4Ua5g3XJPL9AYNVdgDy7W7Wf63aa0e8dnMuRyoy9EQu9gyVPCm+hMDIcq5BnhsfkCOPn4gZu7McP/GL8K9/4Ttp/r5eljadumC6+/Jvpwku/kb795U+lqRuuny74/JXpssXXp4sXzW1/feychWnr585Ip7/3CArviK0en1C6B65gpTBjd/HyV1q8vH+zpzBj+aS63cFiReHtZrsurlLIc1241HhPa9ZrvIb33vsfSHsd9J508aJT0k4v+v30hqNPTXvtNrP9rm/zdtX1300nzTsn3X7dhWlsbIzv8Na4TU/zTNYl8/6iHyESBSuFGSNkuWoGi5f37ivMGCVTixWFN0p6a86hkGdcPa3JrFmvUXi//PXvpPd/9HPpO19ZlDbbZFqauc+sNH/2kW3pbd7uuPOedOAx89JNi89O06dtTOHV2pNB01qXzPuL/qCHzPTOClYKM2aKI8sxFi/v3VeYMUsYGQ6xWFF4M8AXOkIhz0KPPnLHWrNerfDe9f1708HvmJ/eduBe6bgjDkjj4+Np+90PT+eccWLadZcdW9S777kv7X/Y3HT1pWemGVttTuEdoVWzLpn3F/0IkShYKcwYIUu+wxsphXyzKOy/woz5Ehl2ElbD/JTe25r1ROG970c/TW9914I088Xbpg/POTpNnjypff7mO7wL5hyV9tx1Z77Dq7QRBWa1LhmFt3sYnlbk2T2X9jt7/KW1fmDBr7bkyXd444aqkGdcPa3JrFm3hfd7378vHX7iR9Ief7pT+sCJh6b1Jk+eePrmNbx77/6SdNTB+7b/G6/h1VqMnNNal8yzxOV83iFnKVgpzDgkg9zva/Hy3n2FGXPnYj3PYkXhtWqXfz+FPMsrjMYdrFmP/Z/v/XD89Ud+IO37ij9J7zry9WnSpF99Z3ejqRu0P3P3/EuuSJdfcUP7Uxqa/23W7LP4KQ2jsVNrPKV1yby/6EeIR8FKYcYIWa6aweLlvfsKM0bJ1GJF4Y2S3ppzKOQZV09rMmvWY1+75ubxk087d42nbX4O70dOOSYtWbosNf/92zff1l6z/Qu2TosWnDDxD1Twc3i1FmXItNYl8/6iP+QZc72vgpXCjLnyyHGOxct79xVmzJFFjjMsVhTeHPJlzlDIs8yTj96p1qw7/9PCzb/Etnz5ExP/4MTEdz34l9ZGZtusS+b9RT9CIApWCjNGyJLv8EZKId8sCvuvMGO+RIadhNUwP6X3tmbdufA+HQbf4VVak2GzWpeMwtvd3dOKPLvn0n5nj7+01g8s+NWWPPkOb9xQFfKMq6c1mTVrCq9Wzut0WuuSeZa4dQr0pJsrWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGaNYVXJeEAc1qXjMLbPTxPK/LsnguFt5+VwtUK+68wY5SssYqSRPk5rFlTeMtnU80drEvmWeKiYCtYKcwYJU8Kb6Qk8syisP8KM+ZJY/gpWA03VDnBmjWFVyXhAHNal4zC2z08Tyvy7J4LhbeflcLVCvuvMGOUrLGKkkT5OaxZU3jLZ1PNHaxL5lniomArWCnMGCVPCm+kJPLMorD/CjPmSWP4KVgNN1Q5wZo1hVcl4QBzWpeMwts9PE8r8uyeC4W3n5XC1Qr7rzBjlKyxipJE+TmsWVN4y2dTzR2sS+ZZ4qJgK1gpzBglTwpvpCTyzKKw/woz5klj+ClYDTdUOcGa9WqF94kVK9KksUlp0qSxNZ774UeWpua/bzp92mr/bd62U0xGo1iCTFCB3sm6ZKOYtYKVwoyB1j9ZvLx3X2HGKJlarNrf+Nxyv9sjKMzohrGWG2EVJYnyc1iznii8jy57PL3p7fPSMW95TdrvVbtMTLz00WVp9vzz0rU33tr+bztst01aNP/4tMVm09tfU3jLhxvlDtYl8/wCgVV3AfLsbsV3ePtZKVytsP8KM0bJGqsoSZSfw5p1W3g//plL04Vf+Ho75Ufnvn21wnvB569Mly2+Pl28aG6auuH66dg5C9PWz52RTn/vERTe8rmGuoN1ySi83WP0tCLP7rlQePtZKVytsP8KM0bJGqsoSZSfw5p1W3gffOiRtOzxx9PB7zg9nXTMG1crvG84+tS0124z09GH7Nc+xVXXfzedNO+cdPt1F6axsTG+w1s+2zB3sC6ZZ4mLgqVgpTBjlDwpvJGSyDOLwv4rzJgnjeGnYDXcUOUEa9arvYZ3r4Pek951xOtXK7wz95mV5s8+si29zdsdd96TDjxmXrpp8dlp+rSNKbwqG5JhTuuSUXi743takWf3XCi8/awUrlbYf4UZo2SNVZQkys9hzfo3Ft7x8fG0/e6Hp3POODHtusuO7VPcfc99af/D5qarLz0zzdhqcwpv+WzD3MG6ZJ4lLgqWgpXCjFHypPBGSiLPLAr7rzBjnjSGn4LVcEOVE6xZd/oO74I5R6U9d92Z7/CqbEOhOa1LRuHtHoinFXl2z4XC289K4WqF/VeYMUrWWEVJovwc1qzXWnib1/DuvftL0lEH79s+Ba/hLR9m1DtYl8yzxEWxU7BSmDFKnhTeSEnkmUVh/xVmzJPG8FOwGm6ocoI167bwNj9fd3zleNrv0PelWYfun/Z75S5pypT12mc//5Ir0uVX3ND+lIaNpm6QZs0+i5/SoLIVmee0LhmFt3sQnlbk2T0XCm8/K4WrFfZfYcYoWWMVJYnyc1izbgtv81MXmu/cPvntiovOaIvtkqXL0smnnZu+ffNt7X/e/gVbp0ULTkhbbrFJ+2t+Dm/5cKPcwbpkUeZXmEOh8Co4RpnRM09rKY9ipTKHZ6Z8zi2/FZ55ln+a0biD9eOi8z8t/NDDS9Ly5U9M/IMTq1gpvKOxYHwx9cnZ85Ov9ZOGj0Qdd/HMk49Rn53xzJSP0fKZeuZZ/mlG4w7Wj4vOhffpGCm8o7FgfDH1ydnzk6/1k4aPRB138cyTj1GfnfHMlI/R8pl65ln+aUbjDtaPCwrvaOxHlqe0LlmWm4/IIZ6ffMmz/FJ55knhLZ9na3zL/T43au610wy3e43qjTzzHFXj3M9t/big8OZOouLzrEtWMUn2R/P85Eue2eNb40DPPCm85fOk8PoYe97F+2PU89lqvZf1axeFt9aNKPBc1iUrMEq1R3p+8iXP8mvkmSeFt3yeFF4fY8+7eH+Mej5brfeyfu2i8Na6EQWey7pkBUap9kjPT77kWX6NPPOk8JbPk8LrY+x5F++PUc9nq/Ve1q9dFN5aN6LAc1mXrMAo1R7p+cmXPMuvkWeeFN7yeVJ4fYw97+L9Mer5bLXey/q1i8Jb60YUeC7rkhUYpdojPT/5kmf5NfLMk8JbPk8Kr4+x5128P0Y9n63We1m/dlF4a92IAs9lXbICo1R7pOcnX/Isv0aeeVJ4y+dJ4fUx9ryL98eo57PVei/r1y4Kb60bUeC5rEtWYJRqj/T85Eue5dfIM08Kb/k8Kbw+xp538f4Y9Xy2Wu9l/dpF4a11Iwo8l3XJCoxS7ZGen3zJs/waeeZJ4S2fJ4XXx9jzLt4fo57PVuu9rF+7KLy1bkSB57IuWYFRqj3S85MveZZfI888Kbzl86Tw+hh73sX7Y9Tz2Wq9l/VrF4W31o0o8FzWJSswSrVHen7yJc/ya+SZJ4W3fJ4UXh9jz7t4f4x6Plut97J+7aLw1roRPBcCCCCAAAIIIFCZAIW3skB5HAQQQAABBBBAAIHVBSi8bAQCCCCAAAIIIIBA1QIU3qrj5eEQQAABBBBAAAEEKLzsAAIIIIAAAggggEDVAhTequPl4RBAAAEEEEAAAQQovOwAAggggAACCCCAQNUCFN6q4+XhEEAAAQQQQAABBCi87AACCCCAAAIIIIBA1QIU3qrj5eEQQAABBBBAAAEEKLzsAAIIIIAAAggggEDVAhTequPl4RBAAAEEEEAAAQQovOwAAggggAACCCCAQNUCFN6q4+XhEEAAAQQQQAABBCi87AACCCCAAAIIIIBA1QIU3qrj5eEQQAABBBBAAAEEKLzsAAIIIIAAAggggEDVAhTequPl4RBAAAEEEEAAAQQovOwAAggggAACCCCAQNUCFN6q4+XhEEAAAQQQQAABBCi87AACCCCAAAIIIIBA1QIU3qrj5eEQQAABBBBAAAEEKLzsAAIIIIAAAggggEDVAhTequPl4RBAAAEEEEAAAQQovOwAAggggAACCCCAQNUCFN6q4+XhEEAAAQQQQAABBCi87AACCCCAAAIIIIBA1QIU3qrj5eEQQAABBBBAAAEEKLzsAAIIIIAAAggggEDVAhTequPl4RBAAAEEEEAAAQQovOwAAggggAACCCCAQNUCFN6q4+XhEEAAAQQQQAABBCi87AACCCCAAAIIIIBA1QIU3qrj5eEQQAABBBBAAAEEKLzsAAIIIIAAAggggEDVAhTequPl4RBAAAEEEEAAAQQovOwAAggggAACCCCAQNUCFN6q4+XhEEAAAQQQQAABBCi87AACCCCAAAIIIIBA1QIU3qrj5eEQQAABBBBAAAEEKLzsAAIIIIAAAggggEDVAnKFt+o0eDgEEEAAAQQQQACBMAJj4+Pj40OmmbftlCHvzvsigAACCCCAAAIIIFBUgMJblJfDEUAAAQQQQAABBNa1AIV3XSfA/RFAAAEEEEAAAQSKCnQuvA8/sjQ9sWJF2nT6tNUG4iUNRfPhcAQQQAABBBBAAIGBAmstvEsfXZZmzz8vXXvjre2tdthum7Ro/vFpi82mt7+m8A5MgHdHAAEEEEAAAQQQKCqw1sJ7weevTJctvj5dvGhumrrh+unYOQvT1s+dkU5/7xEU3qLRcDgCCCCAAAIIIIBADoG1Ft43HH1q2mu3menoQ/Zr73fV9d9NJ807J91+3YVpbGyM7/DmSIEzEEAAAQQQQAABBIoJrLXwztxnVpo/+8i29DZvd9x5TzrwmHnppsVnp+nTNqbwFouGgxFAAAEEEEAAAQRyCPzGwtv8iN7tdz88nXPGiWnXXXZs73f3Pfel/Q+bm66+9Mw0Y6vNKbw5UuAMBBBAAAEEEEAAgWICnb7Du2DOUWnPXXfmO7zFYuBgBBBAAAEEEEAAgVICay28zWt49979Jemog/dtZ+A1vKWi4FwEEEAAAQQQQACBEgJrLbznX3JFuvyKG9qf0rDR1A3SrNln8VMaSiTBmQgggAACCCCAAAJFBNZaeJcsXZZOPu3c9O2bb2sH2P4FW6dFC05IW26xSfvre++6q/2/kydPSpPGUlqxcjytXDleZFgO1RYYG0tp8qRJ6YkVK7UfhOmLCUxqPomkxOeQYsL6Bzdfa1auXJnG+TKjH2ahJ5gyeVJazteZQrq6x6618K56tIceXpKWL39i4h+c0H1kJkcAAQQQQAABBBAYJYHOhXeUUHhWBBBAAAEEEEAAgXoEKLz1ZMmTIIAAAggggAACCDyFQLbC+/jjy9MvHnqkfW1v8y+w8TbaAs3ruH/+4C/TlCnrtf9AyVO9PfzI0vTEihVp0+nTRhuLp39agZ/+/KG00dQN278wy9voCjQvp/vJzx5Mz9pselp//SkTEM3nmZ/87BftS+3Wmzx5dIFG/MmbzxPP2Hhq2nCD9deQoJuM+HI86fEHF97mH6c496K/T2df+OX22M02mZY+/eE/Tztutw3KIyrwj//yv9PxH1iUlj66rBWY+eJt08nHvqn9C4/NW/O/z55/Xrr2xlvbX++w3TZp0fzjeX34iO7LDf94W3rH+xau9g/c/PC+H7c/EeYH9/64VXn9q/8sffCkt6Up61FqRmlNvv/D+9MHP3ZhuuU/7mwf+wMnHpre/No92v+/2ZvmL1Sv+jxz6klvS2/cf/dR4hn5Z73xn29Pn77wy+ne//5JWvbY8rTLztulD885ui2/dJORX481AAYX3ltvvyu95bgF6eJFp6QXbfu76VOf+7t05TX/mK6+9Ky06m9cwz5aAjffckd64KcPpj/bZce0bNnj6bSFf93+rftzP3JiC3HB569Mly2+vv1Rd1M3XD8dO2fhaj/qbrS0Rvtp/+vu/9d+/mhKt4+2wQAACwZJREFUy5P/Rcdj3vPx9ovWgjlHpx/95GfpjW//UPrgiYem1+z50tEGG6Gn//EDv0h7HHhi2mePP04HH/CK9MLfe15a9thj7Z8IPbrs8fRnBxyfjjvigHTI61+Zrr/p39IJH1iUrvrbj6XnzHjWCCmN7qM2fzq44yuObHdg1lv3T48ueyw1/27AG/bbNR3x5lcnusno7sbTPfngwnvmZ76Y/vN7P0gXfPw97T1+8tMH0+5v+PN0+fkfSi/8vd9BHIG0+Js3pTkf/my67ZrPtX/s2HxS2mu3menoQ/ZrdX79HzOBbDQEHvjZg+lNsz6UTjrmjelDZ/11+vgHj23/CfPmJ8K89DXvTH/z6bnpD7f/vRZjwScvTj/6yc/bH4nI22gI/MXZf5sWf+umdN2XPrHGyxVW/anArd88f+IlDq9+y+y2/B7y+leNBtCIP+XSRx9LM/d5e5o/+8h0wD4vbzVOOeP8NHny5HT6e49IdJMRX5CnePzBhbf5I6VNpz8jzT3hrRPH/8Fuh6323RrYR1ugKbvf+/597W+CmreZ+8xqP0k1pbd5u+POe9KBx8xLNy0++2lf7zvagvU9ffMdusNOOCO9/I93aL9D0+zEqsJ79z33pf0Pm5uu/9In0rM2/9XP+7748m+mr15148QO1SfCE/26wP5vOyVN3XCDNGOrzdP9P/5Z+w2UWW/bPz37WZulLy6+Pv3VpV9PX/ubj06827vmfjI973/NSO+e9UYwR0TgrPO+mD73t19Lh795n3Y/PrLokvTZj53c/v90kxFZgh6PObjwNn/0+IJtnrvaJ5nmi9e8kw9L+77iT3qMwqU1Cqz67m7zJwC77PwH7euqtt/98NV+Q7Sq4Fx96ZntFzfe6hZoXt7SfDFq3pqS27z06cmFd9UfRT75N0BNwfnMRV9N1162sG4cnm61b5z88R++sP3u3frrr5fOv+TK9qUvX71wQfrry65K37juu6v9BqjZqWdsNLX92sPbaAg0L597z2nntn8PpHlZy8tmbp8+9sFj22+c0E1GYwf6POXgwtt8kmn+otopx79ltU9UT349Xp+BuLYegeYvFDSfdH79L5M05WbBnKPSnrvu3D4s3+GtJ/MuT7LqZU/Na+02nrph+y5NgdntpS9O++/5svT85/1W+x3eG/7ukxN/kZHv8HaRreua5k8KP3X68ekVL9+pfbDmL7Dtd+j70t997vR02x138x3euuLu/TSrXvr0lwtnp+Y3Rs1fdD3ulE+m52/9nHTWvHe0v6mmm/RmrfodBhfe5nUy/3X3D9s/RmjeeA1v1fvS+eFWvS73ya+vWvXOzWt49979Jemog/dt/ydew9uZtYoLm+/S/c2XvrXas3zygi+l/V61S9rvlbu036359dfwnr7wovSTn/6C1/BWsQHdHqL5PNH8KWHzx9XN26o/CfrCZ05NP//FL9uf7PFv37qg/dGHzdteB70nHXrgnryGtxuv/FXf+af/SLNmn5lu/Oqn0ybTn9E+z0WXXZUW/eWX0z9//TPta3jpJvIxZ32AwYX3f/4m5Nz0ohf+bvrkBZenr11zMz+lIWtMWoc1r7Vs/vLAnOMOTnv86a++O9O8Na/1bn6m6vmXXJEuv+KG9qc0ND9ftfnxU1s/d0b7Fw14G02BJ7+koRE46uSPpWc+Y+P2TwL4KQ2juRN/+YWvpQu/8PXUFNzmJ3YsPO+ydM0//Gv65hfObF8a1fyFpdnvPCgdzE9pGMkFue9HP017vvnk9I63vTYd85bXpEcfezy9Y87CNO0ZG7U/EYhuMpJr8RsfenDhbT7xND8H7zMX/X17o6bQfPZj757429WQj57AaQsvSpd+9do1HnzVd3uXLF3W/nHTt2++rb2m+fm8zd++b/7REt5GU+DXC2/zx9fNb4Tuvf+BFuR1e/9pmvfuwya+mzeaSqP11M0/GHDKRy5IX7/2n9oH3+pZm6ZPfOi49k8Amrfm53g3f1Ft1dv7//yt6aDXvWK0kEb8aZs/Hbz48m+l5scbNm/Ny+TedeTr27/YSDcZ8eV4iscfXHhXnbnsscfbP2Z69pab8/N32bNOAs1rsJp/Qan5V5J4Q+CpBJqfxdp8d2/jjX71Wl/eRk/gl48sTUuWPJqeveVma/wrnitWrEw/euDnacvNN+E3Q6O3GhNP3PyIw2dO2zht8KR/hY9uMsIL8TSPnq3wQosAAggggAACCCCAQEQBCm/EVJgJAQQQQAABBBBAIJsAhTcbJQchgAACCCCAAAIIRBSg8EZMhZkQQAABBBBAAAEEsglQeLNRchACCCCAAAIIIIBARAEKb8RUmAkBBBBAAAEEEEAgmwCFNxslByGAAAIIIIAAAghEFKDwRkyFmRBAAAEEEEAAAQSyCVB4s1FyEAIIIIAAAggggEBEAQpvxFSYCQEEEEAAAQQQQCCbAIU3GyUHIYAAAggggAACCEQUoPBGTIWZEEAAAQQQQAABBLIJUHizUXIQAggggAACCCCAQEQBCm/EVJgJAQQQQAABBBBAIJsAhTcbJQchgAACCCCAAAIIRBSg8EZMhZkQQAABBBBAAAEEsglQeLNRchACCCCAAAIIIIBARAEKb8RUmAkBBBBAAAEEEEAgmwCFNxslByGAAAIIIIAAAghEFKDwRkyFmRBAAAEEEEAAAQSyCVB4s1FyEAIIIIAAAggggEBEAQpvxFSYCQEEEEAAAQQQQCCbAIU3GyUHIYAAAggggAACCEQUoPBGTIWZEEAAAQQQQAABBLIJUHizUXIQAggggAACCCCAQEQBCm/EVJgJAQQQQAABBBBAIJsAhTcbJQchgAACCCCAAAIIRBSg8EZMhZkQQAABBBBAAAEEsglQeLNRchACCCCAAAIIIIBARAEKb8RUmAkBBBBAAAEEEEAgmwCFNxslByGAAAIIIIAAAghEFKDwRkyFmRBAAAEEEEAAAQSyCVB4s1FyEAIIIIAAAggggEBEAQpvxFSYCQEEEEAAAQQQQCCbAIU3GyUHIYAAAggggAACCEQUoPBGTIWZEEAAAQQQQAABBLIJUHizUXIQAggggAACCCCAQEQBCm/EVJgJAQQQQAABBBBAIJsAhTcbJQchgAACCCCAAAIIRBSg8EZMhZkQQAABBBBAAAEEsglQeLNRchACCCCAAAIIIIBARAEKb8RUmAkBBBBAAAEEEEAgmwCFNxslByGAAAIIIIAAAghEFKDwRkyFmRBAAAEEEEAAAQSyCVB4s1FyEAIIIIAAAggggEBEAQpvxFSYCQEEEEAAAQQQQCCbAIU3GyUHIYAAAggggAACCEQUoPBGTIWZEEAAAQQQQAABBLIJUHizUXIQAggggAACCCCAQEQBCm/EVJgJAQQQQAABBBBAIJsAhTcbJQchgAACCCCAAAIIRBSg8EZMhZkQQAABBBBAAAEEsglQeLNRchACCCCAAAIIIIBARAEKb8RUmAkBBBBAAAEEEEAgmwCFNxslByGAAAIIIIAAAghEFKDwRkyFmRBAAAEEEEAAAQSyCVB4s1FyEAIIIIAAAggggEBEAQpvxFSYCQEEEEAAAQQQQCCbAIU3GyUHIYAAAggggAACCEQUoPBGTIWZEEAAAQQQQAABBLIJUHizUXIQAggggAACCCCAQEQBCm/EVJgJAQQQQAABBBBAIJsAhTcbJQchgAACCCCAAAIIRBSg8EZMhZkQQAABBBBAAAEEsglQeLNRchACCCCAAAIIIIBARAEKb8RUmAkBBBBAAAEEEEAgm8D/B8u9EBNjDmdfAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#| caption: The likelihood of locations in the map when the proximity sensor reads ON.\n", "#| label: fig:logistics_proximity_map_on\n", "logistics.show_map(logistics.proximity_map_on)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we denote a likelihood over a continuous variable with lowercase $l()$, in analogy to the lowercase $p()$ we use for densities. For this specific sensor model, at any location, the likelihood $l(x_k;z_k=\\text{OFF})$ of $x_k$ given that the sensor is OFF will be the mirror image of the map above, as shown below." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#| caption: The likelihood of locations in the map when the proximity sensor reads OFF.\n", "#| label: fig:logistics_proximity_map_off\n", "logistics.show_map(logistics.proximity_map_off)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Range Sensor\n", "\n", "> A range sensor returns the distance to a landmark.\n", "\n", "Let us assume that the operator of the warehouse has installed a number of *beacons* throughout the warehouse, at strategically placed locations. The measurement function $h(x_k; b_i)$ for a sensor measuring the range to a beacon at location $b_i$ is given by:\n", "\n", "$$\n", "h(x_k;b_i) = \\|x_k - b_i\\| = \\sqrt{(x_k - b_i)^T(x_k - b_i)}\n", "$$\n", "\n", "The energy emitted by an RFID beacon is, of course, finite. Therefore, there is some maximal\n", "distance, say $d_{\\max}$, beyond which the sensor is unable to detect the beacon.\n", "In this case, the sensor does not return any range measurement, and indicates\n", "\"no beacon present.\"\n", "\n", "\n", "This is actually not an unrealistic model;\n", "there is a technology called [radio frequency identification (RFID)](https://en.wikipedia.org/wiki/Radio-frequency_identification), which can be detected using a small radio receiver, and some of the more expensive variants allow for the range to the RFID to be measured, if not very accurately." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As with the motion model described above, it is typical to assume additive Gaussian\n", "noise for sensors, leading to the measurement model:\n", "\n", "$$z_k = h(x_k;b_i) + w_k$$\n", "\n", "in which $w_k$ is the noise term (unrelated to the noise in our motion model).\n", "Using this model, we see that the conditional probability of a range measurement $z_k$ given a continuous state $x_k$ *is* a Gaussian, even though its mean $\\mu$ is computed as a nonlinear function of $x_k$.\n", "\n", "$$\n", "\\begin{aligned}\n", "p(z_k|x_k; b_i) &= \\mathcal{N}(z_k;\\mu=h(x_k;b_i), \\sigma^2) \\\\\n", "&= \\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\{-\\frac{1}{2\\sigma^2}(z_k-h(x_k;b_i))^2\\}\n", "\\end{aligned}\n", "$$\n", "\n", "Note that the range is one-dimensional, so we again use the simpler univariate Gaussian, and we use the variance $\\sigma^2$ to characterize the zero-mean Gaussian noise." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The equation below for the *likelihood* of the state $x_k$ given a measurement $z_k$ (to beacon $b_i$) seems similar to a Gaussian density:\n", "\n", "$$\n", "L(x_k;z_k, b_i) = \\exp\\{-\\frac{1}{2\\sigma^2}(z_k-h(x_k;b_i))^2\\}.\n", "$$\n", "\n", "However, because the likelihood is a function of $x_k$, and not a function of $z_k$ (remember, $z_k$ is *given*\n", "when we compute the likelihood for state $x_k$),\n", "the likelihood does not even remotely look like a Gaussian! \n", "In fact, the likelihood will be high where the state agrees with the given range measurement, i.e., in an *annulus* of the right radius around the beacon. The \"width\" of the annulus will be proportional to the measurement noise $\\sigma$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To make this concrete, let us add eight beacons to the base map, at either end of the shelves, which seems very useful for robot navigation. Again, we define these in `gtbook.logistics.beacons`, and we show them below on the base map:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#| caption: The eight beacons in the logistics warehouse, at the locations shown in the base map.\n", "#| label: fig:logistics_beacons\n", "logistics.show_map(base_map, logistics.beacons)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can implement a range function that works with any beacon:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def rfid_range(position, beacon, max_range=8):\n", " \"\"\"return range to given beacon\"\"\"\n", " range = np.linalg.norm(position-beacon)\n", " return float('inf') if range>max_range else range\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, if the robot is at $(20.5, 7.5)$, we are within range of beacon $0$:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "range to beacon 0 = 4.03\n" ] } ], "source": [ "state = gtsam.Point2(20.5, 7.5)\n", "beacon0 = logistics.beacons[0]\n", "zk = rfid_range(state, beacon0)\n", "print(f\"range to beacon 0 = {zk:.2f}\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are in a position to show the annulus-like likelihood images:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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BQTeUrdXcQQIECBAgAABAgKvGSBAgAABAgQIECi1gMBb6vYqjgABAgQIECBAQOA1AwQIECBAgAABAqUWEHhL3V7FESBAgAABAgQICLxmgAABAgQIECBAoNQCAm+p26s4AgQIECBAgAABgdcMECBAgAABAgQIlFpA4C11exVHgAABAgQIECAg8JoBAgQIECBAgACBUgsIvKVur+IIECBAgAABAgQEXjNAgAABAgQIECBQagGBt9TtVRwBAgQIECBAgIDAawYIECBAgAABAgRKLSDwlrq9iiNAgAABAgQIEBB4zQABAgQIECBAgECpBQTeUrdXcQQIECBAgAABAgKvGSBAgAABAgQIECi1gMBb6vYqjgABAgQIECBAQOA1AwQIECBAgAABAqUWEHhL3V7FESBAgAABAgQICLxmgAABAgQIECBAoNQCAm+p26s4AgQIECBAgAABgdcMECBAgAABAgQIlFpA4C11exVHgAABAgQIECAg8JoBAgQIECBAgACBUgsIvKVur+IIECBAgAABAgQEXjNAgAABAgQIECBQagGBt9TtVRwBAgQIECBAgIDAawYIECBAgAABAgRKLSDwlrq9iiNAgAABAgQIEBB4zQABAgQIECBAgECpBQTeUrdXcQQIECBAgAABAgKvGSBAgAABAgQIECi1gMBb6vYqjgABAgQIECBAQOA1AwQIECBAgAABAqUWEHhL3V7FESBAgAABAgQICLxmgAABAgQIECBAoNQCAm+p26s4AgQIECBAgAABgdcMECBAgAABAgQIlFpA4C11exVHgAABAgQIECAg8JoBAgQIECBAgACBUgsIvKVur+IIECBAgAABAgQEXjNAgAABAgQIECBQagGBt9TtVRwBAgQIECBAgIDAawYIECBAgAABAgRKLbA68C5YuCheeuW12GjIBjGgf992Rb+2oDWWLV8eGw4e1PZY64ulBlIcAQIECBAgQIBAYwtUFrYuqh702RnxxP99ZnUlE/b5aEw95qDo0aMlWhctjikzLot7HngkPb7NVlvE7BnHxrCNBq98v8Db2BNg9wQIECBAgACBkgtUXlvQWv3WnNtjr112iLcOHxYP/vKxmDzlgrhm9qnx/ve+K6647ra4Ye59cc3sadGvb+84auqsGLH5pnHWFw4XeEs+HMojQIAAAQIECJRBoN09vE8+/WyMP3Ra3HLVzHjniLfFJyadHjvvOComHbRHWu8d9z0cJ0y/JB6796qoVCqu8JZhCtRAgAABAgQIECixwOrA+8zf5sV3f3Bv3PXTX8VuO/1rHHP4PmnZo3adHDOmHJGG3uT1+BNPx35HTo8H514cgwcNEHhLPBxKI0CAAAECBAiUQWB14P3dH/8cl10zN371P3+IMaPfF6ef8Ono2bNHjBx7WFxyzvExZvS2ab2rrgDfNef82HT4UIG3DFOgBgIECBAgQIBAiQXa3dLwymsL42P7nxinHf+pGD9uh/QK78ypE2PcmO1c4S3xICiNAAECBAgQIFBWgQ6fw7vbwVNin10/kt63m9zDu8vY7WPihN1TA/fwlnUU1EWAAAECBAgQKKdA5de/eaL6uz/+JT72kQ/EkA0GxG13PxRf/PKVcfVFp8YHtnlXXH7trXHjrfenT2no369P+gQHT2ko5zCoigABAgQIECBQRoHK/zz+ZPXoU2bF319+bXV9Uz57YByy387pPy9sXRwnnXlp/OShR9N/HrnliJg987jYZNiQle/3HN4yzoWaCBAgQIAAAQKlEUhvaahWq/Hyqwsi+W1rb9lkaPTq2aNdgcm9vUuXLvvHL5xY9Q6BtzTDoBACBAgQIECAQBkFOryHt0uFCrxd4vJmAgQIECBAgACBfAUE3ny9rUaAAAECBAgQIJCzgMCbM7jlCBAgQIAAAQIE8hUQePP1thoBAgQIECBAgEDOAgJvzuCWI0CAAAECBAgQyFdA4M3X22oECBAgQIAAAQI5Cwi8OYNbjgABAgQIECBAIF8BgTdfb6sRIECAAAECBAjkLCDw5gxuOQIECBAgQIAAgXwFBN58va1GgAABAgQIECCQs4DAmzO45QgQIECAAAECBPIVEHjz9bYaAQIECBAgQIBAzgICb87gliNAgAABAgQIEMhXQODN19tqBAgQIECAAAECOQsIvDmDW44AAQIECBAgQCBfAYE3X2+rESBAgAABAgQI5Cwg8OYMbjkCBAgQIECAAIF8BQTefL2tRoAAAQIECBAgkLOAwJszuOUIECBAgAABAgTyFRB48/W2GgECBAgQIECAQM4CAm/O4JYjQIAAAQIECBDIV0DgzdfbagQIECBAgAABAjkLCLw5g1uOAAECBAgQIEAgXwGBN19vqxEgQIAAAQIECOQsIPDmDG45AgQIECBAgACBfAUE3ny9rUaAAAECBAgQIJCzgMCbM7jlCBAgQIAAAQIE8hUQePP1thoBAgQIECBAgEDOAgJvzuCWI0CAAAECBAgQyFdA4M3X22oECBAgQIAAAQI5Cwi8OYNbjgABAgQIECBAIF8BgTdfb6sRIECAAAECBAjkLCDw5gxuOQIECBAgQIAAgXwFBN58va1GgAABAgQIECCQs4DAmzO45QgQIECAAAECBPIVEHjz9bYaAQIECBAgQIBAzgICb87gliNAgAABAgQIEMhXQODN19tqBAgQIECAAAECOQsIvDmDW44AAQIECBAgQCBfAYE3X2+rESBAgAABAgQI5Cwg8OYMbjkCBAgQIECAAIF8BQTefL2tRoAAAQIECBAgkLOAwJszuOUIECBAgAABAgTyFRB48/W2GgECBAgQIECAQM4CAm/O4JYjQIAAAQIECBDIV0DgzdfbagQIECBAgAABAjkLCLw5g1uOAAECBAgQIEAgXwGBN19vqxEgQIAAAQIECOQsIPDmDG45AgQIECBAgACBfAUE3ny9rUaAAAECBAgQIJCzgMCbM7jlCBAgQIAAAQIE8hUQePP1thoBAgQIECBAgEDOAgJvzuCWI0CAAAECBAgQyFdA4M3X22oECBAgQIAAAQI5Cwi8OYNbjgABAgQIECBAIF8BgTdfb6sRIECAAAECBAjkLCDw5gxuOQIECBAgQIAAgXwFVgfeV15bGEuWLI1Nhg3pcAevLWiNZcuXx4aDB7U93vpivju2GgECBAgQIECAAIEuCFTmzX+5esixZ8efn3k+/dgWb39rTDpoj9hz3IfSf25dtDimzLgs7nngkfSft9lqi5g949gYttHglcsIvF3g9lYCBAgQIECAAIG8BSrPz3upevPtP43xO+8QA/r1jWtuvDOumnN7/OSmi6Jf395xxXW3xQ1z74trZk9L//moqbNixOabxllfOFzgzbtb1iNAgAABAgQIEOiyQLt7eJ/527zY+cCT45rZp8b73/uu+MSk02PnHUelV32T1x33PRwnTL8kHrv3qqhUKq7wdpncBwgQIECAAAECBPIUaBd4b/rRT+OLX74yfnrz7NhoyKAYtevkmDHliDT0Jq/Hn3g69jtyejw49+IYPGiAwJtnt6xFgAABAgQIECDQZYE2gfePTz0TE46eEZ/eb+c45vB9olqtxsixh8Ul5xwfY0Zvm578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" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#| caption: The likelihood of locations in the map when measuring a range of 4 meters to beacon 0.\n", "#| label: fig:logistics_likelihood_beacon0\n", "dist = np.array([[rfid_range(xy, beacon0) for xy in row] for row in logistics.map_coords])\n", "sigma = 1 # In meters\n", "likelihood = np.exp(-1/(2 * sigma**2) * (zk - dist)**2)\n", "logistics.show_map(likelihood, logistics.beacons)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, *all* positions at a range of approximately 4 meters have a high likelihood. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Case of No Beacons in Sensing Range\n", "\n", "> The absence of beacons in the sensor data can be informative.\n", "\n", "The likelihood model above is useful when a beacon is within sensing range of the RFID reader. But what happens when all beacons are out of range? Let us assume that the RFID reader always returns the range to the closest beacon, along with its identification number, but it returns a special value when all the beacons are out of range. Formally, we can model this as a *pair* of values that is returned by the sensor,\n", "\n", "$$z_{RFID}\\in \\bar{N} \\times \\mathbb{\\bar{R}}^+,$$\n", "\n", "where $\\bar{N}$ is the set of integers extended with `None`, and $\\mathbb{\\bar{R}}^+$ is the set of positive real numbers extended with $\\infty$. Note that in the case of additive Gaussian sensor noise, it is possible to\n", "have $z_k < 0$ returned by the range sensor. In such cases, we might simply assign $z_k = 0$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In code this easy to implement: if all sensors are out of range we return `None` for the identification and `float('inf')` for the range. For example, here is some code that returns the range to the nearest beacon (given in a list `beacons`) and `None, float('inf')` if all are out of range:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(0, 4.716990566028302)\n", "(None, inf)\n" ] } ], "source": [ "def rfid_measurement(position, max_range=8):\n", " \"\"\"Simulate RFID reader that returns nearest RFID range or (None,inf).\"\"\"\n", " ranges = [rfid_range(position, beacon, max_range) for beacon in logistics.beacons]\n", " range = min(ranges)\n", " return (np.argmin(ranges), range) if range<=max_range else (None,range)\n", "\n", "print(rfid_measurement(gtsam.Point2(20,7)))\n", "print(rfid_measurement(gtsam.Point2(7,7)))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The special \"out of range\" measurement conveys a lot of information as well! If we are within range of a sensor, the likelihood function is as above (an annulus). But when we are *out* of range, the likelihood function has a very strange shape indeed: it will be 1.0 for all continuous states out of range of all beacons, and zero for states within range of a beacon. This makes sense: if the robot were within range of a beacon, the sensor would have returned\n", "an actual range, *not* infinity. This in turn tells us that the robot must be somewhere outside the range of all beacons, which is very powerful information. The likelihood for this case can be plotted with the following code." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "def out_of_rfid_range(position, max_range=8):\n", " id, _ = rfid_measurement(position, max_range)\n", " return id == None\n", "\n", "out_of_bound_map = np.array([[out_of_rfid_range(xy) for xy in row] for row in logistics.map_coords])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAH0CAYAAADfWf7fAAAgAElEQVR4Xu3dCZRdVZ3v8X9V5okECGBsH5pGBTGAjQSNqCGgCUMIw2IGGZMYEBLDlEAESpIQbIQIJWOCUSJDBAVMkEGGgIJIt9C0iALyQB4085ikUhnrrXPslCkrw7n/e+6u//7vb6311uvIGfb+/Pbd9cupWzd1LS0tLcIXAggggAACCCCAAAJOBeoovE6TZVoIIIAAAggggAACuQCFl4WAAAIIIIAAAggg4FqAwus6XiaHAAIIIIAAAgggQOFlDSCAAAIIIIAAAgi4FqDwuo6XySGAAAIIIIAAAghQeFkDCCCAAAIIIIAAAq4FKLyu42VyCCCAAAIIIIAAAhRe1gACCCCAAAIIIICAawEKr+t4mRwCCCCAAAIIIIAAhZc1gAACCCCAAAIIIOBagMLrOl4mhwACCCCAAAIIIEDhZQ0ggAACCCCAAAIIuBag8LqOl8khgAACCCCAAAIIUHhZAwgggAACCCCAAAKuBSi8ruNlcggggAACCCCAAAIUXtYAAggggAACCCCAgGsBCq/reJkcAggggAACCCCAAIWXNYAAAggggAACCCDgWoDC6zpeJocAAggggAACCCBA4WUNIIAAAggggAACCLgWoPC6jpfJIYAAAggggAACCFB4WQMIIIAAAggggAACrgUovK7jZXIIIIAAAggggAACFF7WAAIIIIAAAggggIBrAQqv63iZHAIIIIAAAggggACFlzWAAAIIIIAAAggg4FqAwus6XiaHAAIIIIAAAgggQOFlDSCAAAIIIIAAAgi4FqDwuo6XySGAAAIIIIAAAghQeFkDCCCAAAIIIIAAAq4FKLyu42VyCCCAAAIIIIAAAhRe1gACCCCAAAIIIICAawEKr+t4mRwCCCCAAAIIIIAAhZc1gAACCCCAAAIIIOBagMLrOl4mhwACCCCAAAIIIEDhZQ0ggAACCCCAAAIIuBag8LqOl8khgAACCCCAAAIIUHhZAwgggAACCCCAAAKuBSi8ruNlcggggAACCCCAAAIUXtYAAggggAACCCCAgGsBCq/reJkcAggggAACCCCAAIWXNYAAAggggAACCCDgWoDC6zpeJocAAggggAACCCBA4WUNIIAAAggggAACCLgWoPC6jpfJIYAAAggggAACCFB4WQMIIIAA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CyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJkDhLY2SCyGAAAIIIIAAAghYFKDwWkyFMSGAAAIIIIAAAgiUJvD/AVEKdFCdcko4AAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#| caption: The likelihood of locations in the map when the range to the nearest beacon is out of range.\n", "#| label: fig:logistics_likelihood_out_of_bound\n", "logistics.show_map(out_of_bound_map, logistics.beacons)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A GPS-Like Location Sensor\n", "\n", "> A simple conditionally Gaussian measurement.\n", "\n", "The last sensor we will consider, a GPS-like location sensor, is a bit of a cheat. In fact, there are no great indoor GPS-like sensors.\n", "People have tried all kinds of things, like triangulating WiFi signals etc., but a cheap and reliable GPS-like sensor that works indoors is still not available at the time of writing. \n", "However, it is a good illustrative example to introduce a simple, conditionally Gaussian measurement. \n", "Also, it can be a good way to model a more complicated sensor, e.g., a camera-based localization system that uses some type of map." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The **measurement model** $h(x_k)$, that predicts the measurement $z_k$ given the state $x_k$, will again be a conditional Gaussian. In this example, let us assume the measurement is simply the location of the robot, but with coordinates measured in *cm*. The measurement model in this case is *linear*, and we again assume additive noise:\n", "\n", "$$\n", "{z}_k = h(x_k) + w_k = C x_k + w_k\n", "$$\n", "\n", "The matrix $C$ performs a linear transformation on the state, such as converting\n", "between different units.\n", "Suppose for example that the state is defined in meters and the sensor measures in\n", "centimeters.\n", "In this case, we could use the $2\\times2$ diagonal matrix $C=\\text{diag}(100,100)$ to\n", "apply the appropriate scaling factor to convert from meters to centimeters. \n", "Under the assumption that $w_k$ is again zero-mean, Gaussian noise, the conditional density $p(z_k|x_k)$ of the measurement $z_k$ given the state $x_k$ is then\n", "\n", "$$\n", "\\begin{aligned}\n", "p(z_k|x_k) &= \\mathcal{N}(z_k;\\mu=C x_k, \\Sigma=R) \\\\\n", "&= \\frac{1}{\\sqrt{2\\pi |R|}} \\exp\\{-0.5 (z_k-C x_k)^TR^{-1}(z_k-C x_k)\\}\n", "\\end{aligned}\n", "$$\n", "\n", "where $R$ is the traditional symbol used for measurement model covariance,\n", "and $|R|$ in the denominator denotes the determinant of $R$. Assuming a fairly inaccurate sensor, with 30cm standard deviation, we have $R=\\text{diag}(30^2,30^2)$ if the uncertainties in the $x$ and $y$ directions are independent of one another. Note that the $2\\times 2$ measurement covariance matrix $R$ is expressed in the units of the measurement, i.e., centimeters, *not* the units of the state." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simulating States *and* Measurements\n", "\n", "> Dynamic Bayes nets to the rescue, again!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now extend the Gaussian DBN from the previous section to include measurements, so that we can\n", "encode the joint density $p(X,Z|U)$ on states $X$ *and* measurements $Z$, given the controls $U$:\n", "\n", "$$\n", "p(X,Z|U) = p(x_1)p(z_1|x_1) \\prod_{k=2}^N p(x_k|x_{k-1}, u_{k-1})p(z_k|x_k).\n", "$$\n", "\n", "Let us add the measurement conditionals to the DBN from the previous section to get an extended dynamic Bayes net:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "gaussianBayesNet = gtsam.GaussianBayesNet()\n", "A, B, C = np.eye(2), np.eye(2), 100 * np.eye(2)\n", "motion_model_sigma = 0.2\n", "measurement_model_sigma = 30\n", "for k in indices:\n", " gaussianBayesNet.push_back(gtsam.GaussianConditional.FromMeanAndStddev(\n", " z[k], C, x[k], [0, 0], measurement_model_sigma))\n", "for k in reversed(indices[:-1]):\n", " gaussianBayesNet.push_back(gtsam.GaussianConditional.FromMeanAndStddev(\n", " x[k+1], A, x[k], B, u[k], [0, 0], motion_model_sigma))\n", "p_x1 = gtsam.GaussianDensity.FromMeanAndStddev(x[1], [20,10], 0.5)\n", "gaussianBayesNet.push_back(p_x1)\n" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "var8430738502437568513\n", "\n", "u1\n", "\n", "\n", "\n", "var8646911284551352322\n", "\n", "x2\n", "\n", "\n", "\n", "var8430738502437568513->var8646911284551352322\n", "\n", "\n", "\n", "\n", "\n", "var8430738502437568514\n", "\n", "u2\n", "\n", "\n", "\n", "var8646911284551352323\n", "\n", "x3\n", "\n", "\n", "\n", "var8430738502437568514->var8646911284551352323\n", "\n", "\n", "\n", "\n", "\n", "var8430738502437568515\n", "\n", "u3\n", "\n", "\n", "\n", "var8646911284551352324\n", "\n", "x4\n", "\n", "\n", "\n", "var8430738502437568515->var8646911284551352324\n", "\n", "\n", "\n", "\n", "\n", "var8430738502437568516\n", "\n", "u4\n", "\n", "\n", "\n", "var8646911284551352325\n", "\n", "x5\n", "\n", "\n", "\n", "var8430738502437568516->var8646911284551352325\n", "\n", "\n", "\n", "\n", "\n", "var8646911284551352321\n", "\n", "x1\n", "\n", "\n", "\n", "var8646911284551352321->var8646911284551352322\n", "\n", "\n", "\n", "\n", "\n", "var8791026472627208193\n", "\n", "z1\n", "\n", "\n", "\n", "var8646911284551352321->var8791026472627208193\n", "\n", "\n", "\n", "\n", "\n", "var8646911284551352322->var8646911284551352323\n", "\n", "\n", "\n", "\n", "\n", "var8791026472627208194\n", "\n", "z2\n", "\n", "\n", "\n", "var8646911284551352322->var8791026472627208194\n", "\n", "\n", "\n", "\n", "\n", "var8646911284551352323->var8646911284551352324\n", "\n", "\n", "\n", "\n", "\n", "var8791026472627208195\n", "\n", "z3\n", "\n", "\n", "\n", "var8646911284551352323->var8791026472627208195\n", "\n", "\n", "\n", "\n", "\n", "var8646911284551352324->var8646911284551352325\n", "\n", "\n", "\n", "\n", "\n", "var8791026472627208196\n", "\n", "z4\n", "\n", "\n", "\n", "var8646911284551352324->var8791026472627208196\n", "\n", "\n", "\n", "\n", "\n", "var8791026472627208197\n", "\n", "z5\n", "\n", "\n", "\n", "var8646911284551352325->var8791026472627208197\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#| caption: A dynamics Bayes Net for our logistics robot.\n", "#| label: fig:logistics_bayes_net\n", "position_hints = {'u': 2, 'x': 1, 'z': 0}\n", "show(gaussianBayesNet, hints=position_hints, boxes=set(list(u.values())))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This now allows us to simulate a trajectory and *simultaneously* simulate a set of measurements:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "control_tape = gtsam.VectorValues()\n", "for k, (ux,uy) in zip(indices[:-1], [(2,0), (2,0), (0,2), (0,2)]):\n", " control_tape.insert(u[k], gtsam.Point2(ux,uy))\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Variablevalue
u12 0
u22 0
u30 2
u40 2
x119.4638 10.9436
x221.6906 11.2071
x323.5828 10.831
x423.4509 12.6035
x523.7099 14.7211
z11990.14 1089.54
z22182.73 1104.23
z32346.99 1135.15
z42315.04 1306.03
z52388.71 1467.75
\n", "
" ], "text/plain": [ "VectorValues: 14 elements\n", " u1: 2 0\n", " u2: 2 0\n", " u3: 0 2\n", " u4: 0 2\n", " x1: 19.4638 10.9436\n", " x2: 21.6906 11.2071\n", " x3: 23.5828 10.831\n", " x4: 23.4509 12.6035\n", " x5: 23.7099 14.7211\n", " z1: 1990.14 1089.54\n", " z2: 2182.73 1104.23\n", " z3: 2346.99 1135.15\n", " z4: 2315.04 1306.03\n", " z5: 2388.71 1467.75" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gaussianBayesNet.sample(control_tape)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GPS-style Likelihoods\n", "\n", "> A likelihood is not a probability. A likelihood is not a probability. A likelihood is not a probability.\n", "\n", "Let us recall the definition of the likelihood of a state $x$ from section 2.4, as being a function *proportional* to the conditional density of a measurement $z$, but viewed as a function of $x$:\n", "\n", "$$L(x;z) \\propto p(z|x).$$\n", "\n", "The notation emphasizes that the measurement $z$ is given, and the likelihood is a function defined on the *continuous* state $x$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What is the likelihood function for our GPS-like sensor? That's easy enough: we take the conditional probability, drop the normalization constant, and view it as a function of the state $x_k$ rather than the *known* measurement $z_k$:\n", "\n", "$$\n", "L(x_k;z_k) \\doteq \\exp\\{-0.5 (z_k-C x_k)^TR^{-1}(z_k-C x_k)\\}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It turns out that in this case (when $C$ is a square, nonsingular matrix,\n", "and $x_k, z_k \\in \\mathbb{R}^n$), the likelihood function *looks* just like a Gaussian, because we can re-write the above as\n", "\n", "$$\n", "\\begin{aligned}\n", "L(x_k;z_k) \\doteq \\exp\\{-0.5 (x_k-C^{-1}z_k)^T C^T R^{-1}C(x_k-C^{-1}z_k)\\}\n", "\\end{aligned}\n", "$$\n", "\n", "which is *proportional* to a Gaussian density with mean $C^{-1}z_k$ and covariance matrix $\\Sigma=(C^T R^{-1}C)^{-1}=C^{-1}RC^{-T}$. This actually makes sense: the most *likely* state $x_k$ given a measurement $z_k$ is just the measurement, now *divided* by 100 to convert to meters, hence the $C^{-1}$. The covariance is scaled down by 10,000. However, it is important not to go too far and start interpreting this Gaussian-shaped function as a probability: it does not normalize to 1, and it is a coincidence that for *linear-conditional* Gaussians, the likelihood turns out to be Gaussian-shaped as well." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GTbook 101\n", "\n", "> About code defined in gtbook library.\n", "\n", "Again we used some code defined in the `gtbook` library:\n", "- `logistics.base_map`: a 50x100 image with the warehouse shelves\n", "- `logistics.beacons`: an 8x2 array of beacon locations" ] } ], "metadata": { "colab": { "collapsed_sections": [], "include_colab_link": true, "name": "S43_logistics_sensing.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3.8.12 ('gtbook')", "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.9.18" }, "latex_metadata": { "affiliation": "Georgia Institute of Technology", "author": "Frank Dellaert and Seth Hutchinson", "title": "Introduction to Robotics" }, "vscode": { "interpreter": { "hash": "9f7376ced4243bb13dfcffa8a3ba834e0602aa8334cd3a1d8ba8d285f4628083" } } }, "nbformat": 4, "nbformat_minor": 2 }