From 87e7903e080e2aa58a00b90eb8803e64f24bb66d Mon Sep 17 00:00:00 2001 From: Roger Labbe Date: Wed, 28 May 2014 19:16:41 -0700 Subject: [PATCH] Significant additions to the UKF chapter. Added UKF code. --- Designing_Kalman_Filters.ipynb | 15 +- Multidimensional_Kalman_Filters.ipynb | 10 +- UKF.py | 84 +++++ Unscented_Kalman_Filter.ipynb | 440 +++++++++++++++++++++++++- stats.py | 4 +- styles/custom2.css | 6 +- ukf_internal.py | 74 +++++ 7 files changed, 601 insertions(+), 32 deletions(-) create mode 100644 UKF.py create mode 100644 ukf_internal.py diff --git a/Designing_Kalman_Filters.ipynb b/Designing_Kalman_Filters.ipynb index fc0a7d5..ed0dba8 100644 --- a/Designing_Kalman_Filters.ipynb +++ b/Designing_Kalman_Filters.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:e2baeba25a3174dd9f44aa961606fbda4ef44c61e180085a8179c69f0e69bad4" + "signature": "sha256:47e47ce6c78a985606fd325605b42a0e55e381111a625eb69820fb2771542ce2" }, "nbformat": 3, "nbformat_minor": 0, @@ -53,7 +53,7 @@ "\n", " .text_cell_render h1 {\n", " font-weight: 200;\n", - " font-size: 36pt;\n", + " font-size: 30pt;\n", " line-height: 100%;\n", " color:#c76c0c;\n", " margin-bottom: 0.5em;\n", @@ -63,7 +63,6 @@ " } \n", " h2 {\n", " font-family: 'Open sans',verdana,arial,sans-serif;\n", - " text-indent:1em;\n", " }\n", " .text_cell_render h2 {\n", " font-weight: 200;\n", @@ -71,8 +70,8 @@ " font-style: italic;\n", " line-height: 100%;\n", " color:#c76c0c;\n", - " margin-bottom: 1.5em;\n", - " margin-top: 0.5em;\n", + " margin-bottom: 0.5em;\n", + " margin-top: 1.5em;\n", " display: block;\n", " white-space: nowrap;\n", " } \n", @@ -243,13 +242,13 @@ ], "metadata": {}, "output_type": "pyout", - "prompt_number": 2, + "prompt_number": 1, "text": [ - "" + "" ] } ], - "prompt_number": 2 + "prompt_number": 1 }, { "cell_type": "heading", diff --git a/Multidimensional_Kalman_Filters.ipynb b/Multidimensional_Kalman_Filters.ipynb index fcc8637..9affed2 100644 --- a/Multidimensional_Kalman_Filters.ipynb +++ b/Multidimensional_Kalman_Filters.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:254e89db7aa7d5d122fc4ca120623bf57e0bbb51df939e2b783e03617022220b" + "signature": "sha256:00dc5e666bed6e6a433a1c086c374cef621d05ba381473abe5a36db5a5cd4ef7" }, "nbformat": 3, "nbformat_minor": 0, @@ -53,7 +53,7 @@ "\n", " .text_cell_render h1 {\n", " font-weight: 200;\n", - " font-size: 36pt;\n", + " font-size: 30pt;\n", " line-height: 100%;\n", " color:#c76c0c;\n", " margin-bottom: 0.5em;\n", @@ -70,8 +70,8 @@ " font-style: italic;\n", " line-height: 100%;\n", " color:#c76c0c;\n", - " margin-bottom: 1.5em;\n", - " margin-top: 0.5em;\n", + " margin-bottom: 0.5em;\n", + " margin-top: 1.5em;\n", " display: block;\n", " white-space: nowrap;\n", " } \n", @@ -244,7 +244,7 @@ "output_type": "pyout", "prompt_number": 1, "text": [ - "" + "" ] } ], diff --git a/UKF.py b/UKF.py new file mode 100644 index 0000000..4817b80 --- /dev/null +++ b/UKF.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed May 28 17:40:19 2014 + +@author: rlabbe +""" + +from numpy import matrix, zeros, asmatrix, size +from numpy.linalg import cholesky + + +def sigma_points (mu, cov, kappa): + """ Computes the sigma points and weights for an unscented Kalman filter. + xm are the means, and P is the covariance. kappa is an arbitrary constant + constant. Returns tuple of the sigma points and weights. + + This is the original algorithm as published by Julier and Uhlmann. + Later algorithms introduce more parameters - alpha, beta, + + Works with both scalar and array inputs: + sigma_points (5, 9, 2) # mean 5, covariance 9 + sigma_points ([5, 2], 9*eye(2), 2) # means 5 and 2, covariance 9I + """ + + mu = asmatrix(mu) + cov = asmatrix(cov) + + n = size(mu) + + # initialize to zero + Xi = asmatrix (zeros((n,2*n+1))) + W = asmatrix (zeros(2*n+1)) + + + # all weights are 1/ 2(n+kappa)) except the first one. + W[0,1:] = 1. / (2*(n+kappa)) + W[0,0] = float(kappa) / (n + kappa) + + + # use cholesky to find matrix square root of (n+kappa)*cov + # U'*U = (n+kappa)*P + U = asmatrix (cholesky((n+kappa)*cov)) + + # mean is in location 0. + Xi[:,0] = mu + + for k in range (n): + Xi[:,k+1] = mu + U[:,k] + + for k in range (n): + Xi[:, n+k+1] = mu - U[:,k] + + return (Xi, W) + + + +def unscented_transform (Xi, W, NoiseCov=None): + """ computes the unscented transform of a set of signma points and weights. + returns the mean and covariance in a tuple + """ + W = asmatrix(W) + Xi = asmatrix(Xi) + + n, kmax = Xi.shape + + # initialize results to 0 + mu = matrix (zeros((n,1))) + cov = matrix (zeros((n,n))) + + for k in range (kmax): + mu += W[0,k] * Xi[:,k] + + for k in range (kmax): + cov += W[0,k]*(Xi[:,k]-mu) * (Xi[:,k]-mu).T + + return (mu, cov) + + +xi = matrix ([[1,2,3,4,5,6,7],[1,2,3,4,5,6,7],[1,2,3,4,5,6,7]]) +mu = matrix ([1,2,3,4,5,6,7]) + +m,c = unscented_transform(xi, mu) +print m +print c diff --git a/Unscented_Kalman_Filter.ipynb b/Unscented_Kalman_Filter.ipynb index 62ae4f7..cdec725 100644 --- a/Unscented_Kalman_Filter.ipynb +++ b/Unscented_Kalman_Filter.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:5478490f2384cc166dd45368779e2c93fa7ab3ef0d0a4ef4c3f103c9c96f1a9a" + "signature": "sha256:388572360fc3834b2b47f1ac29bc861fe9c4c097c10c029badd3c3aab4674e6c" }, "nbformat": 3, "nbformat_minor": 0, @@ -53,7 +53,7 @@ "\n", " .text_cell_render h1 {\n", " font-weight: 200;\n", - " font-size: 36pt;\n", + " font-size: 30pt;\n", " line-height: 100%;\n", " color:#c76c0c;\n", " margin-bottom: 0.5em;\n", @@ -63,7 +63,6 @@ " } \n", " h2 {\n", " font-family: 'Open sans',verdana,arial,sans-serif;\n", - " text-indent:1em;\n", " }\n", " .text_cell_render h2 {\n", " font-weight: 200;\n", @@ -71,8 +70,8 @@ " font-style: italic;\n", " line-height: 100%;\n", " color:#c76c0c;\n", - " margin-bottom: 1.5em;\n", - " margin-top: 0.5em;\n", + " margin-bottom: 0.5em;\n", + " margin-top: 1.5em;\n", " display: block;\n", " white-space: nowrap;\n", " } \n", @@ -243,13 +242,13 @@ ], "metadata": {}, "output_type": "pyout", - "prompt_number": 1, + "prompt_number": 2, "text": [ - "" + "" ] } ], - "prompt_number": 1 + "prompt_number": 2 }, { "cell_type": "markdown", @@ -258,7 +257,7 @@ "In the previous chapter we developed the Extended Kalman Filter to allow us to use the Kalman filter with nonlinear problems. It is by far the most commonly used Kalman filter. However, it requires that you be able to analytically derive the Jacobian blah blah limp prose.\n", "\n", "\n", - "However, for many problems finding the Jacobian is either very difficult or impossible. Futhermore, being an approximation, the EKF can diverge. For all these reasons there is a need for a different way to approximate the Gaussian being passed through a nonlinear transfer function. Recall the result of this transform:" + "However, for many problems finding the Jacobian is either very difficult or impossible. Futhermore, being an approximation, the EKF can diverge. For all these reasons there is a need for a different way to approximate the Gaussian being passed through a nonlinear transfer function. In the last chapter I showed you this plot:" ] }, { @@ -269,7 +268,7 @@ "from numpy.random import normal\n", "import numpy as np\n", "\n", - "data = normal(loc=0.0, scale=1, size=5000000)\n", + "data = normal(loc=0.0, scale=1, size=500000)\n", "\n", "def g(x):\n", " return (np.cos(4*(x/2+0.7)))*np.sin(0.3*x)-1.6*x\n", @@ -282,9 +281,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\nnNSMfI/e6Quq6+BZBfPdyve4dPeCElUU5XGXNGAS+dxOLZ1dpKWziz70875YQqd6o3r7bL/aIjEl\nU2md7Auq841WeVxODafSCnhdcjsdKs53qzjfo4qiPOU5nfK4HMr3OOVx2TNJS9MLAJAkbT7QfsXf\np9Lpy+52kEylR/wqdDiZuvCml0qn5XA45M9zKc/lUJHXLZfToZJ8j64rK1Rpoecj/84Te17Swzff\nOcH/UeY0NzebjjAiW7ORa3xsyFXkdauuwq+6Cv+Fnz3x5s/0uZXnXpPJ//sQG0um1DM4rNZwTJ39\ncQ0n0xpOptQXS0o6dx5wOR0Xzh+xREreEcaPLj1njCaZTivP5ZTTIV07hsezZRkAQFu3bpXP5zMd\nAwAmJBqNas2aNVd8DE0vAAAAcp49gxYAAABAhtD0AgAAIOfR9AIAACDn0fQCAAAg57FlGQDggqGh\nIX3hC1/Qvffeq/vuu890HPX19Wnjxo1KJBKSpPvvv1+33Xab4VRST0+PvvOd72hwcFBut1sPPfSQ\nlixZYjqWJGnz5s3asWOHAoGANm3aZDqOdu/erS1btkiSGhoatHz5csOJzrGtTpK9zytbX4fnjfW8\nRdMLALjgpZdeUm1trTU3fygoKNDjjz8ur9ervr4+PfbYY1q1apWcTrNfVLpcLq1fv141NTXq6urS\nV7/6VT311FNGM523atUq1dfX64knnjAdRYlEQs8995w2btyoeDyur3/969Y0vTbV6Txbn1e2vg7P\nG+t5y460AADj2traFIlEVFtbK1t2s3S5Lt72dGBgQB6Px3Cic4LBoGpqaiRJpaWlSiQSF1bBTFu0\naJH8fv/oD5wCx44dU3V1tQKBgEpLS1VaWqpTp06ZjiXJrjqdZ+vzytbXoTS+8xYrvQAASdJzzz2n\ndevW6bXXXjMd5UOi0ai+8pWvqKOjQ48++qg1q0vnHTp0SLW1tXK7eUv9/8LhsEpKSvTKK6/I7/cr\nGAwqFAqZjpUVbHte2fo6HM95y45KAgCmzNatW/Xqq69+6Gcej0d1dXUqLS01tsp7uVwrV67Upz/9\naW3atEmtra365je/qSVLlkzp3eOulCsUCunZZ5/VF7/4xSnLM5Zctlm9erUkae/evYaTZAeTz6uR\n+Hw+o6/Dy9m/f78qKyvHfN6i6QWAaWbNmjUfuV3n888/r927d2v//v2KRCJyOp0qKSlRfX290VyX\nqqqqUllZmVpbW7VgwQLjueLxuL797W+roaFB5eXlU5ZntFw2KS4uVm9v74Xj8yu/GJnp59VoTL0O\nL+f48ePau3fvmM9bNL0AAK1du1Zr166VJL3wwgvKz8+f0oZ3JD09PfJ4PCoqKlIoFFJbW5sVjUA6\nndaTTz6p+vp63XTTTabjWGvhwoVqaWlRJBJRPB5Xd3e35s6dazqWtWx9Xtn6OhzveYumFwBgra6u\nLj399NOSzjUEDQ0NKioqMpxKOnr0qPbu3au2tjZt27ZNkvTlL39ZxcXFhpNJzzzzjPbt26dIJKJH\nHnlEjY2NxnZMcLvdevDBB/W1r31NkrRu3TojOS7HpjqdZ+vzytbX4Xg50rZcogsAAABkiB2X3gEA\nAAAZRNMLAACAnEfTCwAAgJxH0wsAAICcR9MLAACAnEfTCwAAgJxH0wsAAICcR9MLAACAnPe/+TFf\nFoZBhB8AAAAASUVORK5CYII=\n", + "png": "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\nx2+LjAAAAABJRU5ErkJggg==\n", "text": [ - "" + "" ] } ], @@ -294,9 +293,422 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For the Kalman filter predict-update cycle to work, we need an approximation of the mean and variance of the Gaussian being passed through the transfer function. The EKF solves this by performing a Taylor Series expansion...\n", - "\n" + "I generated this by taking 500,000 samples from the input, passing it through the nonlinear tranform, and building a histogram of the result. From that histogram we can then compute a mean and a variance that we compared to the output of the EKF.\n", + "\n", + "It has perhaps occured to you that this sampling process constitutes a solution to our problem. This is called a 'monte carlo' approach, and it used by some Kalman filter designs, such as the *Ensemble filter*. Sampling requires no specialized knowledge programming, and does not require a closed form solution. No matter how nonlinear or poorly behaved the tranfer function is, as long as we sample with enough points we will build an accurate output distribution.\n", + "\n", + "\"Enought points\" is the rub. The graph above was created with 500,000 points, and the output is still not smooth. You wouldn't need to use that many points to get a reasonable estimate of the mean and variance, but it will require many points. What's worse, this is only for 1 dimension. In general, the number of points required increases by the power of the number of dimensions. If you need 50 points for 1 dimension, you need 50^2 for two dimensions, 50^3 for three dimensions, and so on. So while this approach does work, it is very computationally expensive. The Unscented Kalman filter, the topic of this chapter, uses a somewhat similar technique but reduces the amount of computation needed by a drastic amount. \n", + "\n", + "It is somewhat hard to understand some aspects of this problem by looking at the histogram, so consider this alternative representation, this time for 2 variables/dimensions." ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import ukf_internal\n", + "ukf_internal.show_2d_transform()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\noaD/D63JG5Ui0QBuAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here on the left we show an ellipse depicting the $1\\sigma$ distribution of two variables. The arrows show how three randomly sampled points might be transformed by some arbitrary nonlinear function to a new distribution. The ellipse on the right is drawn semi-transparently to indicate that it is an *estimate* of the mean and variance of this collection of points - if we were to sample, say, a million points the shape of the points might be very far from an ellipse. " + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Choosing Sigma Points" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So what would be fewest number of sampled points that we can use, and what kinds of constraints does this problem formulation put on the points? We will assume that we have no special knowledge about the nonlinear tranform as we want to find a generalized algorithm. For reasons that come clear in the next section, we will call these points *sigma points*.\n", + "\n", + "Let's consider the simplest possible case, and see if it offers any insight. The simplest possible system is *identity* - the transformation does not alter the input. It should be clear that if this does not work then the filter will never converge.\n", + "\n", + "The fewest number of points that we can use is one per dimension. This is the number that the linear Kalman filter uses. The input to a Kalman filter for the distribution $\\mathcal{N}(\\mu,\\sigma^2)$ is just $\\mu$ itself. So while this works for the linear case, it is not a good answer for the nonlinear case.\n", + "\n", + "If we were to pass some value $\\mu+\\Delta$ instead, the *identity* system would not converge, so this is not a possible algorithm. Since we cannot set our one point sample to $\\mu$, or any value that is not $\\mu$, we must conclude that a one point sample will not work.\n", + "\n", + "So, what is the next lowest number we can choose? Consider the fact that Gaussians are symmetric, and that we probably want to always have one of our sample points be the mean of the input. Two points would require us to select the mean, and then one other point. That one other point would introduce an asymmetry in our input that we probably don't want. I recognize that this is rather vague, but I don't want to spend a lot of time on a scheme that doesn't work. \n", + "\n", + "The next lowest number is 3 points. 3 points allows us to select the mean, and then one point on each side of the mean, as depicted on the chart below." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ukf_internal.show_3_sigma_points()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAECCAYAAAASDQdFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlYW/eZL/CvFiTEJnZLtiUv2AiMBcGE2DFkGkLASWy3\ntZuQNJmmTuYm3Dptx23T27Fv8kyXGV/m3qbFSZMZMvXQplO3wTVpAk3i2GQz2FFCiLGCASPbGCQQ\n+w5CLLp/EJAJmxDSOT9J7+d5+scRh6OXb3+8Pnk5Okdgs9lsIIQQ4hOEfBdACCGEO9T0CSHEh1DT\nJ4QQH0JNnxBCfAg1fUII8SHU9AkhxIc43fSLiooQGxsLjUaD0tLSBffr6upCamoqbrnlFiQlJaGo\nqGjmayKRCMnJyUhOTsahQ4ecLYUQQoiDBM5cp2+1WhEXFwedTgeLxYKMjAwYDIZ59x0fH4fVakVA\nQAC6uroQHx8Ps9kMoVCI4OBgDAwMrPiHIIQQ4hinzvR1Oh0SEhIQFRUFlUoFlUqF6urqefcVi8UI\nCAgAAPT09EAqlTpfLSGEkBVxqum3tbVBqVSioKAAJ0+ehEKhQGtr64L7Dw4OQqvVIjExES+88AKE\nwqm3tVgsSElJQXp6Os6dO+fcT0AIIcRh4pV8c25uLgCguLgYAoFgwf2CgoKg1+tRV1eHPXv2ICsr\nC4GBgTCZTIiOjkZlZSX27dsHg8FA/yVACCFu5FTTVyqVs87szWYzlErlkt8XFxeHdevWoba2Frfe\neiuio6MBALfeeitWr16NxsZGaDSaWd/z2muvISQkxJkyCSHEp2VmZs55zammn5qaipqaGnR0dMBi\nscBoNCIxMREAcPjwYQgEAhw9ehQA0NLSAqlUioiICJjNZtTX12PDhg3o6emBv78/ZDIZGhsbYTKZ\noFar57xXSEgItm3b5kyZLlNSUoK9e/fyWgMrKAs7ysKOsrBjJYuqqqp5X3eq6UskEuTl5SEtLQ0A\nkJ+fP/M1s9k8a9TT1NSEJ598EgBgs9nw3HPPISIiAufPn8fjjz8OqVQKkUiE48ePQyaTOVOO2zU1\nNfFdAjMoCzvKwo6ysGM9C6dn+jk5OcjJyZnzemFh4aztHTt24NKlS3P227lzJ+rq6px9e0IIIU6g\nT+Q64O677+a7BGZQFnaUhR1lYcd6FtT0HfDlPy77MsrCjrKwoyzsWM+Cmr4DysvL+S6BGZSFHWVh\nR1nYsZ4FNX1CCPEhTt17h0tlZWW8X7JJyM0mJ4HmZiFGR4HQUBuio5n+FSI+qqqqat7r9OlMn5Bl\nMBiE+PnP/ZGWFoIdO+TIygrGq6/6oauL78oIcQw1fQewPqPjki9nce2aEN/8ZiCef16G4eGpz6I0\nN4vwne8E4Te/8cfQEM8F8siX18WXsZ4FNX1CHPTBB2JcvTr/R1uOHfOHwSDiuCJClo+avgPS09P5\nLoEZvppFfz/w29/6AwCEknEEqvsQurUd/tFDgHASgACXL/vur5Ovrov5sJ7Fiu6ySYiv6B4ag3Cb\nAVv3dsMvZBSW9kCM9UvgHz08td0WiJrhSExMyiESLnzHWUL4Rk3fAeXl5cz/680VX8tiZGwCpz7v\nwF8/b8eGjVE4W5AIS6cMmLSf1U+d+ffD/I9X8T+LW/FYqhK3q+WL3m7c2/jaulgM61n47n+PErKE\n690jeOJULZp7LXj+axr86K61QH/ArIYPAJNWMeLDg/F/sjfhie2r8bvKVvz07HWMjE3wVDkhC6Pr\n9AmZx2ctAzj6biMO3r4WGTFhAACbDTh/XoSDBwPR3Dz9R1sb7r13DL/4xQg2bpwEAIxNTOLX5c1o\n7rXgF9kbESrz4+mnIL5soev0abxDyJe8a+jGv39kwjN3rUfS6uCZ1wUCIC1tAu+8MwCDQYjBQQFW\nrbJh8+YJBAbav99PJMSP/06N31W24lBJA47eE4PVIfREOMIGGu84gPXrbrnk7Vm8d7Ubv/2kBf/3\nvk2zGv7NVq2yIS1tAoGB7+OWW2Y3/GkCgQCPpa7G/dpo/Ki0Ae2DVjdXzi9vXxfLwXoW1PQJ+UJ9\nxxBeumDCv+6KwYZw1zzQZ098JPYlROGnZ67BMj7pkmMSshI00ycEQNfQGL73ej2+m7YWO9eFuvTY\nNpsN/++DGxibsOHIXet96qoewh+69w4hCxgdn8RPz17D3i2RLm/4wNSo51C6Gm2DVpy42Oby4xOy\nHNT0HcD6jI5L3pjFSxeMUAZL8FDSqmV933KykIiF+OesjfhbXScqjf3LLZF53rgunMV6Fk43/aKi\nIsTGxkKj0aC0tHTB/bq6upCamopbbrkFSUlJKCoqWvYxCHGXT439+NTUj0PparePXSIC/PCjO9TI\nL2/CkJWu4Sf8cGqmb7VaERcXB51OB4vFgoyMDBgMhnn3HR8fh9VqRUBAALq6uhAfHw+z2Yzx8XGH\njkEzfeIuw9YJ5BbX4R/TVbh1bQhn7/urD5sgFgnw/TQVZ+9JfI9LZ/o6nQ4JCQmIioqCSqWCSqVC\ndXX1vPuKxWIEBAQAAHp6eiCVSpd9DELc4b8qW3DL6iBOGz4APLl9NT660YfqlgFO35cQwMmm39bW\nBqVSiYKCApw8eRIKhQKtra0L7j84OAitVovExES88MILEAqFyz4Gn1if0XHJW7K41DqI8419eHL7\nGqeP4WwWQVIxvp+uwq/ONXnNrRq8ZV24AutZrOgTubm5uQCA4uLiReehQUFB0Ov1qKurw549e5CV\nlYXpqZIjxzh48CDUajUAQC6XQ6vVztzQaDpgd27r9XpO34/lbb1ez1Q9zmxP2IDftYbju2lrUf3J\nR7zV8/7VHuSVVCIreoypfJzZnsZKPXxu89UvysvLceLECQCAWq1GdnY25uPUTL+iogJ5eXkoKSkB\nAGRkZODYsWNITExc8nszMzORl5cHq9Xq0DFopk9crfjzdlSZBvAvu2J4raN7eAxPnKrFb76mgZJu\n00BczKUz/dTUVNTU1KCjowPNzc0wGo0zzfrw4cM4cuTIzL4tLS3o+uIBomazGfX19di4ceOixyDE\nXfot4/jTxTb8j9tW810KwgP8sG9rNI5/0sJ3KcSHONX0JRIJ8vLykJaWhszMTOTn5898zWw2w2w2\nz2w3NTUhIyMDiYmJyMrKwnPPPYeIiIhFj8Ea1md0XPL0LP500Yz09XKsD1v5bRZckcX92mhcbh/C\n5TbPfsCup68LV2I9C6dn+jk5OcjJyZnzemFh4aztHTt24NKlS8s6BiHu0No/incauvGf34jnu5QZ\n/mIhDqQo8bLOhF/v3Uy3aCBuR5/IdQDLT8HhmidncfyTFuzfGo3wANfc395VWdy9ORyjE5M4d73X\nJcfjgyevC1djPQtq+sQn1LYP4XL7EL6hjea7lDmEAgGe3L4Gxz9pwfgk0/c/JF6Amr4DWJ/RcclT\ns/jjZ2Z8M2kV/MWuW/KuzCJ5dTCigyR419DtsmNyyVPXhTuwngU1feL1rnQM41rXCHZpIvguZVGP\nJCvwp4ttmKCzfeJG1PQdwPqMjkuemMUfL5rxQGI0JCLXLndXZ5GkDEKYTIz3r/W49Lhc8MR14S6s\nZ0FNn3i1q13DqO8Ywn1xkXyXsiSBQICHvzjbn2T72UbEg1HTdwDrMzoueVoWJy624f6t0ZC6cJY/\nzR1ZpKwJhsxPiHIPu5LH09aFO7GeBTV94rUae0agbx3E7nj2z/KnCQQC/H2yAn/8zExn+8QtqOk7\ngPUZHZc8KYtXq9uwb2sUZH4itxzfXVncpgqBSCiArslznrDlSevC3VjPgpo+8UqdQ1Z83NyPvR50\nlj9NIBDggcRoFH/ezncpxAtR03cA6zM6LnlKFq9f7sRdMeEIkq7o7uGLcmcWd2wIg6l/FA2dw257\nD1fylHXBBdazoKZPvM7I2ATequvEvq1RfJfiNLFQgK8nRNHZPnE5avoOYH1GxyVPyOJMQze0iiCs\ndvM96t2dxX2aCHzc3I/OIatb38cVPGFdcIX1LKjpE68yMWlD8ecdTN5jZ7mCpGJkbgrH65c7+S6F\neBFq+g5gfUbHJdaz0DX3IVgqQsKqQLe/FxdZ7EuIwlt1ncw/S5f1dcEl1rOgpk+8yil9B/Zvjfaa\n+9IrQ6RIVAbhTINn3oiNsIeavgNYn9FxieUsrnWNoKV/FHdsCOXk/bjK4usJ0Xi9pgNOPM6aMyyv\nC66xngU1feI1Sms7cV9cBMRC7zjLn6ZVBEIoFKC6dZDvUogXoKbvANZndFxiNYsh6wTev9aD+zTc\nfRiLqywEAgH2xkeipJbdP+iyui74wHoWTjf9oqIixMbGQqPRoLS0dMH9TCYT0tPTsXXrVqSkpODs\n2bMzXxOJREhOTkZycjIOHTrkbCmEoMzQjeQ1wYgIdM2jEFmTuSkcF1sG0DU0xncpxMMJbE4MCq1W\nK+Li4qDT6WCxWJCRkQGDwTDvvu3t7Whra4NWq0VTUxN27twJo9EIAAgODsbAwMCi71VWVoZt27Yt\nt0TiQ2w2G548VYendq7FLauD+S7HbZ6vaEaYTIxvbVPyXQrxAFVVVcjMzJzzulNn+jqdDgkJCYiK\nioJKpYJKpUJ1dfW8+0ZHR0Or1QIA1Go1rFYrxsbobIW4jt48iEmbDUnKIL5Lcau98ZF4s66LnqNL\nVsSppt/W1galUomCggKcPHkSCoUCra2tS37f6dOnkZKSAj+/qf8Et1gsSElJQXp6Os6dO+dMKZxg\nfUbHJRazKLncib1boji/TJPrLDaEy6AMkeDCjT5O39cRLK4LvrCexYruRpWbmwsAKC4uXvIXzmw2\n4+mnn8Ybb7wx85rJZEJ0dDQqKyuxb98+GAwGSKVzPzp/8OBBqNVqAIBcLodWq525LGo6YHdu6/V6\nTt+P5W29Xs9UPW+9XwHdDRkO3aFmoh53b8cKu/CHC/24Y8OtTNTz5QbHSj18bvPVL8rLy3HixAkA\nU1OV7OxszMepmX5FRQXy8vJQUlICAMjIyMCxY8eQmJg47/4WiwVZWVl49tlnFyxk+/bteOWVV6DR\naGa9TjN9spg/XTTDPGDFD75o+t5ubGISj/ypBr/euxlr5P58l0MY5tKZfmpqKmpqatDR0YHm5mYY\njcaZhn/48GEcOXJkZl+bzYbHHnsMDz/88KyG39PTg5GREQBAY2MjTCbTzNk8IY6YtNnwVn0X7tVE\n8F0KZ/xEQty9ORxv1XfxXQrxUE41fYlEgry8PKSlpSEzMxP5+fkzXzObzTCbzTPbFRUVOHXqFF5+\n+eWZyzNbW1tRW1uL5ORkJCUlYf/+/Th+/DhkMtnKfyI3YH1GxyWWsqhuGUSAnxCaqABe3p+vLO7V\nROBMQzdTf9BlaV3wjfUsnJ7p5+TkICcnZ87rhYWFs7bT09Nhtc69NaxSqURdXZ2zb08I3qzvxL2a\nSK+5z46jVKH+WCv3x0c3+pDO0S0niPegT+Q6gPV7aXCJlSz6LOOoNA7grk1hvNXAZxb3aiLwZj07\nn9BlZV2wgPUsqOkTj3S2oRs71CEIduPjEFl2x4ZQ1HcMo32Q/QesELZQ03cA6zM6LrGQhW3mD7j8\nPvSczyykYiEyYsLwNiN/0GVhXbCC9Syo6ROPc7ltCJM2G7QK9z8ohWX3aiJw+koXJhj6gy5hHzV9\nB7A+o+MSC1m8Vd+FezQRvP8Bl+8sYiICEB7gh09N/bzWAfCfBUtYz4KaPvEow9YJVNzoQ9amcL5L\nYcKu2AicvkJP1SKOo6bvANZndFziO4sPr/ciURGEsAD+b6HMdxYAcOfGUFSZBtBvGee1DhayYAXr\nWVDTJx7lnStd2KWhs/xpQVIxblOF4N2rPXyXQjwENX0HsD6j4xKfWRj7LDD2jeI2lZy3Gm7GyrrY\nFRuO01f4vYqHlSxYwHoW1PSJx3jnSjfu3hzudc/AXalbVgdjYHQcV7uG+S6FeABq+g5gfUbHJb6y\nmJi04WxDN7Jj2RntsLIuhAIBsjfz+wddVrJgAetZUNMnHqHKNICIQD+sD2Pzpnx8y4oNx3tXe2Cd\nmOS7FMI4avoOYH1GxyW+sjh9pQu7Ytm6hTJL60IZLMX6MH981MTPU7VYyoJvrGdBTZ8wr98yjk9N\nA7hzI91RcjG7YiPwDl2zT5ZATd8BrM/ouMRHFu9f60Hq2mAEMXZzNdbWRdp6OS63DaFreIzz92Yt\nCz6xngU1fcK8Mw3dyGZstMMimZ8IaevleNdAZ/tkYdT0HcD6jI5LXGdxo2cEnUNjSF4dzOn7OoLF\ndZG1OQLvNHTDiUdfrwiLWfCF9Syo6RMmTU4C4+NTZ/l3bwqDiK7Nd8hWRSCs45No6BrBPA+sI4Sa\nviNYn9Fxyd1ZtLQIUFLihwcfDMSerwbhjeoexIj5vW/+QlhcF5YRAeJkkfjnwj7s3RuMH/1IhgsX\nRBgacu/7spgFX1jPwummX1RUhNjYWGg0GpSWli64n8lkQnp6OrZu3YqUlBScPXt22ccgvqGpSYAn\nngjEt78dhLIyCeq6+9HZLMO3963Cp5+K+C6PecPDwH//twTHfqCGWdKFyiohCgv9sXt3MH7/e6nb\nGz/xDAKbE8M/q9WKuLg46HQ6WCwWZGRkwGAwzLtve3s72traoNVq0dTUhJ07d8JoNDp8jLKyMmzb\ntm35PxnxOMeOSfGznwXMbG98+HMMXAtFx0drERMzjjffHERUFD0wZCGVlSJkZwcDECA2twrtFWvR\n+3n0F1+14fTpAaSmTvBZIuFQVVUVMjMz57zu1Jm+TqdDQkICoqKioFKpoFKpUF1dPe++0dHR0Gq1\nAAC1Wg2r1YqxsbFlHYN4P5NJgOef95/ZFsnGEKLpRnf1KgDA1atiXLlC08jFlJX5AZj620dXpRKR\nt5pv+qoAp0/zfztqwj+nfova2tqgVCpRUFCAkydPQqFQoLW1dcnvO336NFJSUuDn5wez2ezUMfjA\n+oyOS+7KwmIBenrsyzEssR39V8IxMWJvVP39bP0xl7V10dBgH4H16KMQtKEX4iD7X3Pr6tw3ImMt\nCz6xnsWKPu2Sm5sLACguLl7y0XVmsxlPP/003njjDQCY2d+RYxw8eBBqtRoAIJfLodVqZy6Lmg7Y\nndt6vZ7T92N5W6/Xu+X4mzffgTVrJmEyTTX+yFtb0Vq2HjeLjLTx/vOzvJ2cPI7iYgkAYNIqRm9N\nJCKSzWg7N/W7k5Iyjo8//hhWq9Xl7z+NpTz42uarX5SXl+PEiRMApqYq2dnZmI9TM/2Kigrk5eWh\npKQEAJCRkYFjx44hMTFx3v0tFguysrLw7LPPzhTi6DFopu87XnlFgkOHAiGNGoIm9zNcOroTmJz6\nRyA1dQyvvjqIULoTw4IuXRIiMzMEExNTJ0/BMT1Q7W3A5fzbIBLZcPbsAJKSaKbvK1w6009NTUVN\nTQ06OjrQ3NwMo9E406wPHz6MI0eOzOxrs9nw2GOP4eGHH571L89ixyC+KTt7DN/85igit5nR/dmq\nmYa/bt048vOHqeEvYcuWSRQWDkEsnjqPG7gWCpH/OILW9uO3vx3Cli3U8ImT4x2JRIK8vDykpaUB\nAPLz82e+ZjabZ41pKioqcOrUKdTV1eHll18GALz11ltQKBQLHoM15eXlzH/KjivuzEKhsOHnvxhC\n7hst2NIVD9v6EezYMYHExHGoVOxdtcPauhCLgXvvHcN77/Xj44/FaGgQYTg8HHcfbcLue9ZA7MZb\nF7GWBZ9Yz8LpZZCTk4OcnJw5rxcWFs7aTk9Ph3WBjwYudAziu26MDCBaLsbPD4gAWPgux+OIREBC\nwiQSEqZ+50x9ofhByRVAuBrTV/YQ30bXwDmA5X+1uebuLM40dCNrMztPx1qMJ6yLNXIp1sil+KS5\n363v4wlZcIX1LKjpE2YMWSfwUVM/MmLC+C7Fq2RtDseZBn4fnE7YQU3fAaxfd8sld2Zx7novkpRB\nCJV5xoeIPGVdfGVjGD5rGUS/Zdxt7+EpWXCB9Syo6RNmeNJox5MESkS4TRWCd6/28F0KYQA1fQew\nPqPjkruyaOkfRVOvBbepQtxyfHfwpHXh7hGPJ2XhbqxnQU2fMOFsQzfuigmDn4iWpDskrw5Gz8g4\nrneP8F0K4Rn9hjmA9Rkdl9yRxaTN9sUjET1rtONJ60IkFCBrUzjONLjnUYqelIW7sZ4FNX3Cu+rW\nQQRJRYiJCFh6Z+K0rNhwlBm6MT7J3gfdCHeo6TuA9Rkdl9yRxZkrXcj2wD/getq6WCv3hzLYPdfs\ne1oW7sR6FtT0Ca+GrBO4QNfmcyY7lq7Z93XU9B3A+oyOS67O4kMPuzb/Zp64Lqav2e9z8TX7npiF\nu7CeBTV9wqszV7o87g+4nmz6mv336Jp9n0VN3wGsz+i45MosTH0WGPtGcZtK7rJjcslT18Wu2HCc\nvuLaEY+nZuEOrGdBTZ/w5vSVbty9ORxiId39kUu3rA7GwOg4DJ3DfJdCeEBN3wGsz+i45KosJian\nrs3f5cGjHU9dF0KBANmbI1x6tu+pWbgD61lQ0ye8qDT2IzrID+vCZHyX4pN2xUbgvas9sI5P8l0K\n4Rg1fQewPqPjkquyeLu+C7tiI1xyLL548rpYFSxBTEQAKm70ueR4npyFq7GeBTV9wrmekTFcbB3E\nVzbStfl8ukfj2hEP8QzU9B3A+oyOS67IoszQg53r5AiUiFxQEX88fV2krZPD0DmMtoH5H2e6HJ6e\nhSuxnoXTTb+oqAixsbHQaDQoLS1ddN+nn34aCoUCWq121usikQjJyclITk7GoUOHnC2FeBCbzYbT\nXjDa8QYSsRAZMWF4hz6h61MENptt2XdfslqtiIuLg06ng8ViQUZGBgwGw4L7X7hwARKJBAcOHIBe\nr595PTg4GAMDA4u+V1lZGbZt27bcEgmjatuH8G/v30DhA/EQCOhSTb4ZOofxs7PX8fsHt0BI/394\nlaqqKmRmZs553akzfZ1Oh4SEBERFRUGlUkGlUqG6unrB/W+//XZERNCZHQHequvCrthwaviM2BQZ\ngGCpCFWmxU++iPdwqum3tbVBqVSioKAAJ0+ehEKhQGtr67KPY7FYkJKSgvT0dJw7d86ZUjjB+oyO\nSyvJYsg6gfLGXq8Z7XjLurgvLhJv1q1sxOMtWbgC61mIV/LNubm5AIDi4mKnztxMJhOio6NRWVmJ\nffv2wWAwQCqVztnv4MGDUKvVAAC5XA6tVjtzWdR0wO7c1uv1nL4fy9vT4zlnvv+9qz1YKxnF5Sod\nMz8PbZdDNgFcbAlBz/AYaqp0Th1vGgs/D9/bfPWL8vJynDhxAgCgVquRnZ2N+Tg106+oqEBeXh5K\nSkoAABkZGTh27BgSExMX/J7Gxkbs3bt31kz/Ztu3b8crr7wCjUYz63Wa6XuPg6/V4fHU1bh1rec8\nB9dXPPfhDayV++PBpFV8l0JcxKUz/dTUVNTU1KCjowPNzc0wGo0zDf/w4cM4cuTIksfo6enByMjU\n8zobGxthMplmzuaJ97nSOYyB0QlsWxPMdylkHvfFReKt+k5MLv8ckHgYp5q+RCJBXl4e0tLSkJmZ\nifz8/Jmvmc1mmM3mWfs/9dRT2LlzJ+rr66FSqVBaWoq6ujokJycjKSkJ+/fvx/HjxyGTsfmRfNZn\ndFxyNou36jpxjybCq64Q8aZ1ERcVAKlIiOrWQae+35uyWCnWs3B6pp+Tk4OcnJw5rxcWFs557cUX\nX8SLL7445/W6ujpn3554kJGxCXx4vRcF++P4LoUsQCAQfPEH3U4kr6b/GvNm9IlcB7B+Lw0uOZPF\n+9d6sXVVECIDJW6oiD/eti7u2hSGSuMAekfGlv293pbFSrCeBTV94nZv1nXivjjvuEzTmwVLxbh9\nnRzvNHTzXQpxI2r6DmB9Rsel5WZR3zGE3pFxr7xixxvXxd74SPytdvl/0PXGLJzFehbU9IlbldZ2\nYk98JET0dCyPEBcVgECJCJXGfr5LIW5CTd8BrM/ouLScLPot4yhv7PPop2MtxhvXhUAgwN4tUSi5\n3Lms7/PGLJzFehbU9InbvHOlCzvUIQiV+fFdClmGjJgw1LYPoXVglO9SiBtQ03cA6zM6LjmaxaTN\nhtK6Tnx1S5SbK+KPt64Lf7EQd28Ox5u1jp/te2sWzmA9C2r6xC0+NQ4gwE+EuKgAvkshTtgTH4m3\nr3TTM3S9EDV9B7A+o+OSo1mU1HZgb3ykV99C2ZvXxVq5P2IiZPjweq9D+3tzFsvFehbU9InLtQ6M\noqZtCHfG0DNwPdne+Ei8frmD7zKIi1HTdwDrMzouOZLF6zUd2BUbAZmfZz8Ddynevi52qOXos4yj\ntn1oyX29PYvlYD0LavrEpYasEzjT0I2vefEfcH2FSCjA1xOiUPx5O9+lEBeipu8A1md0XFoqi3eu\ndCF5dTBWBXvXfXbm4wvrYldsBKpMA2gftC66ny9k4SjWs6CmT1xmYtKG1y93YN9WOsv3FoESEe7e\nFI4Smu17DWr6DmB9RselxbLQNfchWCrGluhADivij6+si68nROGt+i6MjE0suI+vZOEI1rOgpk9c\n5rXPO7AvIcqrL9P0RcoQKbYqgnCW7r7pFajpO4D1GR2XFsriatcwjH2juGNDKMcV8ceX1sX+rVF4\nraZjwbtv+lIWS2E9C2r6xCX+om/HV7dEwk9ES8obaRVB8BcLoWuiu296OvoNdQDrMzouzZeFeWAU\nHzf3Y298JA8V8ceX1oVAIMCDSavwanXbvF/3pSyWwnoWTjf9oqIixMbGQqPRoLS0dNF9n376aSgU\nCmi1WqePQdh1St+BezURCJI6/chl4gHS14ei1zKGz83OPTydsEFgsy3zETkArFYr4uLioNPpYLFY\nkJGRAYPBsOD+Fy5cgEQiwYEDB6DX65d1jLKyMmzbtm25JRKO9I6M4R/+UouXvxGPiAC6hbK3K63t\nhK6pD7/YFcN3KWQJVVVVyMzMnPO6U2f6Op0OCQkJiIqKgkqlgkqlQnV19YL733777YiImP2M1OUe\ng7Dp9cuduGNDKDV8H5G9ORwNncO43j3CdynESU41/ba2NiiVShQUFODkyZNQKBRobW3l/BhcYX1G\nx6WbsxhC77qCAAATmklEQVQZm0BpbSce0EbzWBF/fHFdSMRC7NsajaJLs2f7vpjFQljPYkVD2Nzc\nXABAcXGx09dmO3KMgwcPQq1WAwDkcjm0Wu3MZVHTAbtzW6/Xc/p+LG9Pj+fS09PxZl0X1vhZcF1f\niTWM1Efb7t+OmACKmkNgHhiFofoT3IyF+vje5qtflJeX48SJEwAAtVqN7OxszMepmX5FRQXy8vJQ\nUlICAMjIyMCxY8eQmJi44Pc0NjZi7969M03D0WPQTJ9N1vFJHCi6jJ9mb0RsJD0oxdcc/6QFQ9YJ\nfD9NxXcpZAEunemnpqaipqYGHR0daG5uhtFonGnWhw8fxpEjR1Z0DMK+N+u7sClSRg3fR92vjcYH\n13qWvBEbYY9TTV8ikSAvLw9paWnIzMxEfn7+zNfMZjPMZvOs/Z966ins3LkT9fX1UKlUKC0tXfQY\nrGF9Rsel8vJyjI5P4tXqNnxrm5Lvcnjly+tC7i/GfXGR+NPFqd91X87iy1jPwumZfk5ODnJycua8\nXlhYOOe1F198ES+++KLDxyBse7OuE7FRAdhMZ/k+7X5tNB4/eRkPJSn4LoUsA30i1wGs30uDS6k7\nduLVS234VjL9ovv6upD7i7E7LhInLpp9PoubsZ4FNX2yLKW1nYiLCsQmOssnmDrbL2/sRevAKN+l\nEAdR03cA6zM6rljGJ/HHymZ8axud5QO0LgAgxF+MPfGRyH+bPlg5jfV1QU2fOOy1z9uhDphETASd\n5RO7+7XRqB8Uo6nHwncpxAHU9B3A+oyOC70jYzilb8eP76HLaqfRupgSLBXjkZQ1OP5JC9+lMIH1\ndUFNnzjkj5+1ISMmHGvkUr5LIQz62pYoXOsewaVWugMn66jpO4D1GZ27mfpG8d7VbjySvMrns7gZ\nZWH38UfnceBWJf7zYxOc+JC/V2F9XVDTJ0sqrGzBN7TRCJXRnTTJwjJiwjAxacO56718l0IWQU3f\nAazP6Nyptn0Il9uHsG/r1J00fTmLL6Ms7NLT0yEUCPDEbWvwX5UtGJuY5Lsk3rC+LqjpkwVN2mx4\n6YIRB1KU8BfTUiFLS14TjLVyf7z2eQffpZAF0G+yA1if0bnL2/VdEAkEuHtz+MxrvprFfCgLu5uz\n+M6OtSi61IaOId+8GRvr64KaPplXv2Ucv6tsxffS1kLo5LMSiG9aI5di75YovPyRie9SyDyo6TuA\n9RmdOxRWtuArG0PnfBDLF7NYCGVh9+UsHkxahbqOYVSZ+nmqiD+srwtq+mSO+o4hXLjRh2+n+Pat\nk4nz/MVCfOf2NXjxvNGn/6jLImr6DmB9RudKE5M2vFBhxOOpqxEknXvnbV/KYimUhd18WdyulkMR\nLMVf9O08VMQf1tcFNX0yy1/07QiQCJF10x9vCXGGQCDA99LW4pS+ne7LwxBq+g5gfUbnKk09FvxF\n344f3qFe8CH1vpKFIygLu4WyUARL8e0UJX754Q1MTPrGJ3VZXxfU9AmAqbHOLz+8gUe3KaAIpvvr\nENfZHR8JqViI4s99a8zDKmr6DmB9RucKxZ+3QyoWYnd85KL7+UIWjqIs7BbLQigQ4Id/p8ar1W1o\n6vX+MQ/r68Lppl9UVITY2FhoNBqUlpY6ta9IJEJycjKSk5Nx6NAhZ0shK3SjZwRFl9rxw79T0zX5\nxC2UwVI8mqLELz+4gXEfGfOwSmBz4pZ4VqsVcXFx0Ol0sFgsyMjIgMFgWPa+wcHBGBgYWPS9ysrK\nsG3btuWWSBxkGZ/E916vxze2RuMeTQTf5RAvNmmz4dnT17AxQoZ/SF3Ndzler6qqCpmZmXNed+pM\nX6fTISEhAVFRUVCpVFCpVKiunv9xafPte+nSJWfelrjBv18wIiZchl2xdLUOcS+hQIAff0WNsoZu\nVBp970NbrHCq6be1tUGpVKKgoAAnT56EQqFAa2vrsve1WCxISUlBeno6zp075/xP4Wasz+ic9d7V\nHlxqHcT301QLXq3zZd6ahTMoCztHswiV+eEnd67DLz+4ga7hMTdXxQ/W18XcT98sQ25uLgCguLh4\nyaZx877TTCYToqOjUVlZiX379sFgMEAqnXvlyMGDB6FWqwEAcrkcWq125rKo6YDdua3X6zl9Py62\nN2hT8dIFI3IUA6j6+ILD36/X65mon7bZ2p7m6P6742Pwb+83Yk9wG4QC/uv3hn5RXl6OEydOAADU\najWys7MxH6dm+hUVFcjLy0NJSQkAICMjA8eOHUNi4tznpzq67/bt2/HKK69Ao9HMep1m+q43ZJ3A\nD0quYE98JL66JYrvcogPmpi04fDbBmyOCMAT29fwXY5XculMPzU1FTU1Nejo6EBzczOMRuNMEz98\n+DCOHDmy5L49PT0YGRkBADQ2NsJkMs2czRP3mZi0Ie+9RiSsCsTeJS7PJMRdREIBnrlrAypu9OH0\nlS6+y/EpTjV9iUSCvLw8pKWlITMzE/n5+TNfM5vNMJvNS+5bW1uL5ORkJCUlYf/+/Th+/DhkMtkK\nfxz3YH1GtxzHP2nB6MQkntrp+Bz/Zt6UxUpRFnbOZBHiL8bPszfitx+3QG/2ngeqs74unJ7p5+Tk\nICcnZ87rhYWFDu27c+dO1NXVOfv2xAmnr3Th/I0+PP/VWIiFdD0+4Z861B8/uXMd/rXsOn791Vgo\n6dPgbufUTJ9LNNN3jY+a+vCrD5vwyz2boQ7157scQmZ543IHXvu8A8/t2YzwAD++y/EKLp3pE8/y\nWcsAnvuwCT/P3kgNnzDpq1uikLkpDIffMqDfMs53OV6Nmr4DWJ/RLeZy2xCOvtuIZzPXIy46cMXH\n8+QsXI2ysHNFFo8kK5CyNgT/+/RVDFsnXFAVP1hfF9T0vVh9xxB+euYafvwVNRKVwXyXQ8iiBAIB\nnrhtNWIiZHj2nWse3fhZRjN9L/WZaQBH32vED+9Q4/Z1cr7LIcRhE5M2vHC+GYbOEfzLro0IldGM\n3xk00/ch5dd7cfS9qZEONXziaURCAf4xTYVta4Lxo9IGtA9a+S7Jq1DTdwDrM7qbldZ24jcXmnH0\nnhi3jHQ8KQt3oyzsXJ2FQCDA46mrca8mAj8svYLr3SMuPb47sb4uVnTvHcKOsYlJvHTBiEutg3hu\n92askdNVOsTz3Z+4CuEBfvhfbxrwvZ1r8Xcbw/guyePRTN8LdA2P4Rdnr0MuE+N/fWUdAiUivksi\nxKUaOofx87PXcWdMGA6kKCGiDxcuiWb6Xurj5j5896/1uHVtMP757g3U8IlX2hwZgBe+Fou69iEc\nfttAc/4VoKbvABZndCNjEzhW3oTnK5rxkzvX4e+3KTl51CGLWfCFsrDjIotQmR/y7t2E5NXBeOqv\n9Tjb0A0WBxWsrwua6XugKlM/nq9oxtZVQSjYH09n98RniIQCfPMWBVLXhuDfPriBisZefOf2tYgO\nkvBdmsegmb4HMQ+M4mWdCYauEXxnx1q6HJP4NOv4JP5c3YY3Lndg/9Zo3K+NhkRMw4tpNNP3YP2W\ncRR+0oLv/rUeMREB+O034qnhE58nEQvxaIoSL3xdgyudw3jiVC3eu9qNiUmmz2N5R03fAXzN6Kab\n/WMnL6PXMo6X9sXhkWQFr2czrM8ruURZ2PGZhTJYip9mbcShdDVer+nEk6dq8a6Bv+bP+rqgmT6D\nrnePoORyJz643oM7NoTixa9roKD7jBOyqOQ1wbhldRA+axnAH6rM+P2nrdgTH4ldsREI8adWN41m\n+owYsk6gorEXb1/pQmu/FffFReA+TSQiAum+I4Qsl81mQ13HMEoud+BCUz92rpPj7s3hSFQE+cw1\n/gvN9OmfPx4NjI6j0jiAc9d7UGUaQNLqYHw9IQo714XSk60IWQGBQID46EDERweid2QMZxq68Z86\nE7pHxvCVDWFIWx+KLasCffL3jJq+A8rLy5Genr7i41jHJ3GlcxiXWgfxibEf17tHoFUEIW19KH54\nhxpBUvb/73BVFt6AsrBjOYtQmR8eSFyFBxJXobnXgvev9aBAZ0RrvxXJa4KRsiYYWxVBUMmlTj03\n+stYzgJYQdMvKirCM888A4FAgOeeew579uxZ9r7LOYanmZi0wdhnQUPnCK52DaO+YxiGrhGoQ/2x\nVRGIR5IVSFQE0SVmhHBIFeqPb21T4lvblOgeHkOlsR+ftQzgTxfbYBmfxJZVgdgcGYDNETJsighA\neIDYJf8QsMSpmb7VakVcXBx0Oh0sFgsyMjJgMBiWta+jx2B5pm+dmETX0BjMg1a0DVjROjAKY98o\nmnstaOkfRWSgBJsiZNgUKUNsZADiowMh86MPUhHCoo4hK2rMQzB0TZ2gGTqHYQOgkvtDFSrFGrkU\niiApVgVLsCpIglCZmJNPwTvLpTN9nU6HhIQEREVFAQBUKhWqq6uRlJTk8L79/f0OH4NPw9YJFNd0\noN8yjr4v/tczPIau4TEMj00iTCaGInhqISiCJEhfL4dKvgpr5FJq8IR4kKhACe6MkeDOmKk7edps\nNvRaxtHcO4rmPgtMfaNo6OxF24AVbYNWDFknEOovRkSgHx6+ReExn51xqum3tbVBqVSioKAA4eHh\nUCgUaG1tnbdhL7Tv4OCgw8fgk1AowLXGG9i6eQNiIwMg9xcjPECM8AA/yP3Z/pfeHVifV3KJsrDz\nxiwEAgHCZH4Ik/khURk05+vWiUn0DI+je2QMkTddZcd6Fiv6y2Fubi4AoLi4eMm51837LvcYBw8e\nhFqtBgDI5XJotdqZUKc/COGu7cqPziPKrMf+fdtnvt4KIIaj92dtW6/XM1UPbbOxPY2VerjYloiE\naKj+GAAQf9PX9Xo9L/WUl5fjxIkTAAC1Wo3s7GzMx6mZfkVFBfLy8lBSUgIAyMjIwLFjx5CYmOjw\nvgMDAw4dg+WZPiGEsMqlM/3U1FTU1NSgo6MDFosFRqNxplkfPnwYAoEAR48eXXRfq9W64DEIIYS4\nh1PXC0okEuTl5SEtLQ2ZmZnIz8+f+ZrZbIbZbF5y38WOwRrW76XBJcrCjrKwoyzsWM/C6Zl+Tk4O\ncnJy5rxeWFjo8L4LvU4IIcQ96N47hBDiheh++oQQQqjpO4L1GR2XKAs7ysKOsrBjPQtq+oQQ4kNo\npk8IIV6IZvqEEEKo6TuC9RkdlygLO8rCjrKwYz0LavqEEOJDaKZPCCFeiGb6hBBCqOk7gvUZHZco\nCzvKwo6ysGM9C2r6hBDiQ2imTwghXohm+oQQQqjpO4L1GR2XKAs7ysKOsrBjPQtq+oQQ4kNopk8I\nIV6IZvqEEEKca/pFRUWIjY2FRqNBaWmp0/uLRCIkJycjOTkZhw4dcqYUTrA+o+MSZWFHWdhRFnas\nZ7HsZ+RarVb80z/9E3Q6HSwWCzIyMrBnzx6n9g8ICMBnn33mfPUcuflB776OsrCjLOwoCzvWs1j2\nmb5Op0NCQgKioqKgUqmgUqlQXV29rP0vXbq0oqK5JpVK+S6BGZSFHWVhR1nYsZ7Fspu+2WyGUqlE\nQUEBTp48CYVCgdbW1gX3b2trW3B/i8WClJQUpKen49y5c87/FIQQQhyy6HgnPz8fx48fn/WazWbD\nzp07kZubCwAoLi6GQCBY8o1u3n+ayWRCdHQ0KisrsW/fPhgMBib/lWxqauK7BGZQFnaUhR1lYcd6\nFsu+ZLOiogJ5eXkoKSkBAGRkZODYsWNITExc0f7bt2/HK6+8Ao1GM+v1srKy5ZRHCCHkC/Ndsrns\nP+SmpqaipqYGHR0dsFgsMBqNsxr44cOHIRAIcPTo0UX37+npgb+/P2QyGRobG2EymaBWqx0qmhBC\niHOW3fQlEgny8vKQlpYGYGoEdDOz2Txr3LPQ/rW1tXj88cchlUohEolw/PhxyGQyp38QQgghS2P+\nE7mEEEJchz6RSwghPoSaPiGE+JBlz/R92cjICA4dOoQ9e/Zg7969fJfDi+7ubvz617/G8PAwxGIx\nHnnkkQWv3PJm58+fx6uvvgoAePTRR5GSksJzRfyg9TAX632Cmv4yFBcXY+PGjQ59LsFbiUQiPPHE\nE1Cr1ejs7MQzzzyD//iP/+C7LE6Nj4/jxIkTOHr0KKxWK372s5/5bNOn9TAX632Cmr6DWlpa0N/f\nj40bN8KX//Ytl8shl8sBAJGRkRgfH8f4+DjEYt9ZSg0NDVi7di1CQkIATOXQ2NiI9evX81sYD2g9\nzOYJfYJm+g46ceIEHnjgAb7LYMrFixexceNGn/sF7+vrQ1hYGM6cOYMLFy5ALpejt7eX77J456vr\n4Wae0Cd89/+dBfztb3/Du+++O+s1Pz8/aLVaREZGMvuvtzvMl8Vtt92GBx98EL29vfjDH/6An/zk\nJzxVx7+srCwAUzcV9HW0HoDKykoolUrm+wQ1/S/ZvXs3du/ePeu1P//5zzh//jwqKyvR398PoVCI\nsLAwpKen81QlN+bLApi6XfavfvUrPProo4iOjuahMn6Fhoaip6dnZnv6zN9X+fp6mGYwGKDT6Zjv\nE9T0HfDQQw/hoYceAgCcPHkSMpmMuf8juWKz2fDSSy8hPT0dSUlJfJfDi02bNsFoNKK/vx9WqxVd\nXV1Yt24d32XxgtaDnaf0CWr6ZFnq6+uh0+nQ0tKCs2fPAgCOHDmC0NBQnivjjlgsxsMPP4xnn30W\nAHDgwAF+C+IRrQfPQ7dhIIQQH0JX7xBCiA+hpk8IIT6Emj4hhPgQavqEEOJDqOkTQogPoaZPCCE+\nhJo+IYT4EGr6hBDiQ/4/OgnGgO8i/e4AAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this to work for all *identity* cases we will want the sums of the weights to equal one. We can always come up with counterexamples, but in general if the sum is greater or less than one the sampling will not yield the correct output. Given that, we then have to select *sigma points* $\\mathcal{X}$ and their corresponding weights so that they compute to the mean and variance of the input Gaussian. So we can write\n", + "\n", + "$$\\begin{aligned}\n", + "1 &= \\sum_i{w_i}\\;\\;\\;&(1) \\\\\n", + "\\mu &= \\sum_i w_i\\mathcal{X}_i\\;\\;\\;&(2) \\\\\n", + "\\Sigma &= \\sum_i w_i{(\\mathcal{X}_i-\\mu)(\\mathcal{X}_i-\\mu)^T}\\;\\;\\;&(3)\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "If we look at this is should be clear that there is no one unique answer - the problem is unconstrained. For example, if you choose a smaller weight for the point at the mean for the input, you could compensate by choosing larger weights for the rest of the $\\mathcal{X}$, and vice versa if you chose a larger weight for it. Indeed, these equations do not require that any of the points be the mean of the input at all, though it seems 'nice' to do so, so to speak.\n", + "\n", + "Methods for selecting these sigma points is it own topic. In the next section I will develop the most typically used method in practice. It has the virtue of requiring only 3 sigma points per dimension, which is far lower than we might expect to provide good results. Despite the low number of points, the computations for the weight selections are very easy and efficient, and the numerical performance of the filter is as good as, and usually better than the EKF.\n", + "\n", + "But before we go on I want to make sure the idea is clear. We are choosing 3 points for each dimension in our covariances. That choice is *entirely deterministic*. Below are three different examples for the same covariance ellipse." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ukf_internal.show_sigma_selections()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that while I chose the points to lie along the major and minor axis of the ellipse, nothing in the constraints above require me to do that; however, it is fairly typical to do this. Furthermore, in each case I show the points evenly spaced; again, the constraints above do not require that. However, the technique that we develop in the next section *does* do this. It is a reasonable choice, after all; if we want to accurately sample our input it makes sense to sample in a symmetric manner." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "The Unscented Transform" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So our desire is to have an algorithm for selecting sigma points based on some criteria. Maybe we know something about our nonlinear problem, and we know we want our sigma points to be very close together, or very far apart. Or through experimentation we decide that a certain choice of basis vectors from our hyperellipse are the best axis to choose our sigma points from. But we want this to be an algorithm - we don't want to have to hard code in a specific selection algorithm for each different problem. So we are going to want to be able to set some parameters to tell the algorithm how to automatically select the points and weights for us. That may seem a bit abstract, so let's just launch into it, and try to develop an intuitive understanding as we go.\n", + "\n", + "Our first choice is always going to be the mean of our input. We will number this $\\mathcal{X}_0$. So,\n", + "\n", + "$$ \\mathcal{X}_0 = \\mu$$\n", + "\n", + "So for each dimension we need to select 2 more points. We want them to be symmetric around the mean so that for the linear case they cancel out and we are just left with the mean as the result. Here is how we are going to do that:\n", + "\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "\\mathcal{X}_i &= \\mu + (\\sqrt{(n+\\lambda)\\Sigma})_i\\,\\,\\,\\, &\\text{for i=1..n} \\\\\n", + "\\mathcal{X}_i &= \\mu - (\\sqrt{(n+\\lambda)\\Sigma})_{i-n}\\,\\,\\,\\, &\\text{for i=n+1..2n}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Let's talk through this. For the moment, just think of this in one dimension, so we can ignore the subscript $i$. $n$ is just our dimensionality, and $\\lambda$ is a scaling factor that controls how far away from the mean we want the points to be. A larger lambda will choose points further away from the mean, and a smaller lambda will choose points nearer the mean. So in one dimension we get something like:\n" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import stats\n", + "import math\n", + "\n", + "# generate the Gaussian data\n", + "\n", + "xs = np.arange(-4, 4, 0.1)\n", + "mean = 0\n", + "sigma = 1.5\n", + "ys = [stats.gaussian(x, mean, sigma*sigma) for x in xs]\n", + "\n", + "def sigma_points (mean, sigma, lambda_):\n", + " sigma1 = mean + math.sqrt ((1+lambda_)*sigma) \n", + " sigma2 = mean - math.sqrt ((1+lambda_)*sigma) \n", + " return mean, sigma1, sigma2\n", + " \n", + "#generate our samples\n", + "lambda_ = 1.4\n", + "x0,x1,x2 = sigma_points (mean,sigma,lambda_)\n", + "\n", + "samples = [x0,x1,x2]\n", + "for x in samples:\n", + " p1 = plt.scatter ([x], [stats.gaussian(x, mean, sigma*sigma)], s=80, color='k')\n", + "\n", + "lambda_ = 0.5\n", + "x0,x1,x2 = sigma_points (mean,sigma,lambda_)\n", + "\n", + "samples = [x0,x1,x2]\n", + "for x in samples:\n", + " p2 = plt.scatter ([x], [stats.gaussian(x, mean, sigma*sigma)], s=80, color='b')\n", + "\n", + "plt.legend([p1,p2],['$\\lambda$=1.4', '$\\lambda$=0.5'])\n", + "plt.plot(xs, ys)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAECCAYAAAASDQdFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtcVHX++PHXcBWQiyDIqCB4AS+hIZIp1C7hZbvZZt/Y\nVsutfluWbWWbu6Wbte1uLblrq+7Wru36dbMNS9OtpDbT2ky8UHhB8goqIpdBBOQiDAMz8/uDr0wk\nyMwIc87MvJ+PR49H58yZcz7z9sObw3s+5/PRmM1mM0IIIdyCh9INEEII4TiS9IUQwo1I0hdCCDci\nSV8IIdyIJH0hhHAjkvSFEMKN2J30N2zYQFxcHPHx8WRnZ3d7XHV1NcnJyVx77bVMmDCBDRs22HwO\nIYQQvUNjzzh9g8HA6NGjyc3NRa/Xk5aWRlFRUZfHtrW1YTAY8Pf3p7q6mjFjxqDT6Whra7P6HEII\nIXqHXXf6ubm5jBs3jvDwcKKiooiKiiI/P7/LY728vPD39wegtrYWX19fm88hhBCid3jZ86bKykq0\nWi2rV68mNDSUyMhIKioqmDBhQpfHNzY2MmXKFE6ePElWVhYeHh42n0MIIcTVu6ovcufPn8/dd98N\ngEaj6fa4/v37U1BQwP79+1m0aBEXL17kUlXJ2nMIIYS4enbd6Wu1WioqKjq2dTodWq22x/eNHj2a\nYcOGceTIEQYPHmzVOf79738TFBRkTzOFEMKtpaenX7bPrqSfnJzM4cOHqaqqQq/XU1payvjx4wFY\nvHgxGo2Gl19+GYDy8nJ8fX0JCwtDp9Nx/Phxhg8fTmBgYLfn+LagoCAmTpxoTzN7zZYtW7j99tsV\nbYNaSCwsJBYWEgsLtcRi//79Xe63K+n7+PiQmZlJSkoKACtWrOh4TafTdSrTlJSU8PDDDwNgNptZ\nvnw5YWFhAN2eQ21KSkqUboJqSCwsJBYWEgsLtcfCrqQPkJGRQUZGxmX7165d22n7+uuv59ChQzad\nQwghRN+QJ3KtMG3aNKWboBoSCwuJhYXEwkLtsZCkb4X4+Hilm6AaEgsLiYWFxMJC7bGwu7zjTnJy\nckhNTVW6GaogsbCQWFhcTSwaGxupq6tzmSHbdXV1BAcH9/l1zGYzwcHB9O/f36b3SdIXQiimuroa\ngMGDB7tM0h88eLBDrmM2m6mpqaGlpaVjcIw1pLxjBbmbs5BYWEgsLOyNxaWE5SoJ35E0Gg1hYWG0\ntLTY9D5J+kII4UYk6VshJydH6SaohsTCQmJhIbFwHlLTF0I4pQMHDrBu3TpaW1u5+eabufnmm/Hw\nkPvYnkiErCC1WwuJhYXEwqK3Y2E0Gtm8eTPPPvssf/zjH6mqqup4rba2llmzZjF79mzefPNNsrKy\neOihh0hLS+PIkSO92o6r8fHHHzNjxgy0Wi2PPfaYze/fs2cPYWFhvPXWW73aLrnTF0KoyrZt2/j1\nr3/NyZMnMRgMALz55pvcdNNNLF++nLlz57J3795O79Hr9RQUFHD//fezdetWvLy8WL58OV9++SUX\nL14kICCAG2+8kaeffprAwECb27R69WrOnTvH0qVLrX5PcHAwTzzxBDt27KCpqcmm67W1tfHiiy8S\nFxfX619yy52+FaReaSGxsJBYWPRWLA4dOsRTTz3F0aNHOxI+QFlZGevXr2fu3LndTusCUFRUxLJl\ny5g1axarVq3i4MGDFBYWcvDgQVatWsWsWbO4cOGCze16+OGHef/99zl37pzV70lJSeG2224jJCTE\n5uu98cYbzJw5k/DwcJvf2xNJ+kII1cjMzKS8vLzL19ra2sjJyenxrnnjxo3drsKXn5/PwoULbW6X\nRqPhrrvu4t133wXaJ4iMjY297L85c+bYfO7vqqysZP369SxYsOCqz9UVKe9YQWq3FhILqKy8yK9/\nfYzycl+++qqAhQuvwcPDvceZ90a/MJvNnDhx4orHNDc393iexsbGK76en59PfX29zet0zJkzhzlz\n5vD444+zcOFCu355WOP555/n5z//ecfSsr1N7vSFsJLJZGb69DwSEtp4992b2LlzBr/7XRJDh1ay\natVhpZvn9MxmM62trVd9nra2tiu+XllZycmTJ20+7/nz52lubmbfvn32Nq1He/fu5cyZM9x5550d\n+y6tMthbJOlbQWq3Fu4ci1tu2c++fVNpa4vB8qMTgF4/ht/+NoZNm2xPJK6iN/qFh4dHj9MJ+Pv7\nExkZ2e3rgYGB+Pn5XfEcPj4++Pv729S27du3s3//fp5++mmysrL405/+RHR09GX//ehHP7LpvN91\n8OBBvv76a8LCwggLC2PXrl0sXLiQX/3qV1d13m+TpC+EFaqrm9m/fwQQ0OXrRuNQliy58h2m6NnM\nmTPx9PTs9vVRo0bxu9/9rsulVYOCgnjwwQcZOXLkFa8RGxtLXFyc1W1677332LlzJw8//DB33HEH\n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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here I have plotted two different choices for lambda - 05 and 1.4 - to show how lambd affects the distribution of the points. \n", + "\n", + "Perhaps the reason for calling these *sigma points* is clear. While we are not selecting exactly $1\\sigma$ for the position of our points, we are scaling by some factor of $\\sigma$.\n", + "\n", + "\n", + "On to larger dimensions ($n>1$). The term $(\\sqrt{(n+\\lambda)\\Sigma})_i$ has to be a matrix because $\\Sigma$ is a matrix. The subscript $i$ is choosing the column vector of the matrix. And thus the square root is not the square root of a scalar, but of a matrix.\n", + "\n", + "What is the 'square root of a matrix'? The usual definition is that the square root of a matrix $\\Sigma$ is just the matrix $S$ that, when multiplied by itself, yields $\\Sigma$.\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\text{if }\\Sigma = SS \\\\\n", + "\\\\\n", + "\\text{then }S = \\sqrt{\\Sigma}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "However, there is an alternative definition, and we will chose that because it has numerical properties that makes it much easier for us to compute its value. We can alternatively define the square root as a matrix S, when multiplied by its transpose, returns $\\Sigma$:\n", + "$$\n", + "\\Sigma = SS^T \\\\\n", + "$$\n", + "\n", + "If this makes you uncomfortable, I advise not worrying about it. We are just defining an algorithm for choosing our sigma points; if the 'square' root in method of computation ($SS$) is slightly different than the other case ($SS^T), it shouldn't really matter. Plus, this still works for the one dimensional case, as the transpose of a scalar is just the scalar. \n", + "\n", + "I will derive the math for computing this in a later section in this chapter. For now I will say that this is a well worn area of linear algebra, and performing this 'square root' uses something called the Cholesky decomposition. This is a library procedure that is available in any linear algebra library. For example, numpy provides it in $\\verb ,numpy.linalg.cholesky(),$, and we will be using that function in our code. If your language of choice is Fortran, C, C++, or the like the standard libraries like LAPACK also provide this routine. And, of course, matlab provides $\\tt chol()$, which does the same thing." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Implementation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So let's just implement this algorithm. First, let's write the code to compute the mean and covariance given the sigma points. Unfortunately, this requires a short diversion into the intricacies of numpy's data types. Through historical accidents, numpy provides several data structures to represent matrices, and they do not 'play well' with each other. Most sources recommend using the type $\\verb,numpy.array,$, however, it is quite cumbersome to use for intensive linear algebra. Since everything I do in this book is linear algebra, I choose to use $\\verb,numpy.matrix,$ instead. Fortunately, numpy provides $\\verb,numpy.asmatrix(),$. It will convert a variable to $\\verb,numpy.matrix,$ if it is not already one; better yet, it will turn a scalar into a $1{\\times}1$ matrix. The result is that we can pass scalars, $\\verb,numpy.array,$'s, or $\\verb,numpy.matrix,$s into my code and it will work.\n", + "\n", + "So we will store the sigma points and weights in matrices, like so:\n", + "\n", + "$$ \n", + "\\begin{aligned}\n", + "weights &= \n", + "\\begin{bmatrix}\n", + "w_1&w_2& \\dots & w_n\n", + "\\end{bmatrix} \n", + "\\\\\n", + "sigmas &= \n", + "\\begin{bmatrix}\n", + "\\mathcal{X}_{0,0} & \\mathcal{X}_{0,1} & \\dots & \\mathcal{X}_{0,n} \\\\\n", + "\\mathcal{X}_{1,0} & \\mathcal{X}_{1,1} & \\dots & \\mathcal{X}_{1,n} \\\\\n", + "\\mathcal{X}_{2,0} & \\mathcal{X}_{2,1} & \\dots & \\mathcal{X}_{2,n}\n", + "\\end{bmatrix}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "In other words, each column contains the 3 sigma points for one dimension in our problem. The $0th$ sigma point is always the mean, so first row of sigma's contains the mean of each of our dimensions. The second row contains the $\\mu+(\\sqrt{(n+\\lambda)\\Sigma})$ term, and the third row contains the $\\mu-(\\sqrt{(n+\\lambda)\\Sigma})$ term." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "\n", + "def unscented_transform (Xi, W, NoiseCov=None):\n", + " \"\"\" computes the unscented transform of a set of signma points and weights.\n", + " returns the mean and covariance in a tuple\n", + " \"\"\"\n", + " W = np.asmatrix(W)\n", + " Xi = np.asmatrix(Xi)\n", + "\n", + " n, kmax = Xi.shape\n", + "\n", + " # initialize results to 0\n", + " mu = np.mat (np.zeros((n,0)))\n", + " cov = np.mat (np.zeros((n,n)))\n", + "\n", + " for k in range (kmax):\n", + " mu += W[0,k] * Xi[:,k]\n", + "\n", + " for k in range (kmax):\n", + " cov += W[0,k]*(Xi[:,k]-xm) * (Xi[:,k]-xm).T\n", + "\n", + " return (mu, cov)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's review a bit of numpy nomenclature. The odd looking\n", + "\n", + " Xi[:,i]\n", + " \n", + "term is merely saying 'take the *ith* column of Xi'. So This produces a $1{\\times}n$ column vector, like so:\n", + "\n", + "$$\n", + "\\begin{bmatrix}\n", + "\\mathcal{X}_{0,i} \\\\\n", + "\\mathcal{X}_{1,i} \\\\\n", + "\\mathcal{X}_{2,i} \\\\\n", + "\\vdots \\\\\n", + "\\mathcal{X}_{n,i} \n", + "\\end{bmatrix}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is confusing if you haven't seen it before so I will belabor this point. Read this as $\\tt Xi[A,B]$, where $\\tt A$ indexes the row, and $\\tt B$ the column. In this case the row value is ':', which is Python's way to taking a *slice*. For example, for a one dimensional list $\\tt x$, $\\tt x[3:5]$ returns a list containing $\\tt x[3]$ and $\\tt x[4]$. If you leave one of the slice elements out it just selects everything on that side of the slice, so $\\tt x[3:]$ would return a list of elements number 2 to the last element in $\\tt x$. Therefore, $\\tt x[:]$ just returns $\\tt x$ itself - it asks for all elements in $\\tt x$. So, in a form like $\\tt Xi[:,i]$ we take all rows from the ith column; effectively, a 1xn column vector. \n", + "\n", + "\n", + "We write this way in numpy for two reasons. First, it is very close to the mathematical notation our equations use. Second, and more importantly, when you write this way numpy uses C routines to implement the functionality, making the code much faster. Avoiding for loops in numerical code is 'Pythonic'. If you are used to packages like Matlab you are already familar with notation; if you are coming from a language like C recognize I could have written this loop:\n", + "\n", + " for k in range (kmax):\n", + " mu += W[0,k] * Xi[:,k]\n", + " \n", + "as:\n", + "\n", + " for k in range (kmax):\n", + " for i in range (n):\n", + " mu += W[0,k] * Xi[i,k]\n", + "\n", + "\n", + "\n", + "So if you look at this code you should see that it is just performing the computations\n", + "$$\\begin{aligned}\n", + "\\mu &= \\sum_i w_i\\mathcal{X}_i \\\\\n", + "\\Sigma &= \\sum_i w_i{(\\mathcal{X}_i-\\mu)(\\mathcal{X}_i-\\mu)^T}\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "Even if you are not a strong numpy programmer it should be reasonably clear that this is not a difficult bit of code. Furthermore, as with our previous Kalman filter codes, we just need to write it once - we will call this function for *any* problem we are solving, and it will perform the Unscented transform for us." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are half done! Now we need to write the function that selects the sigma points based on this term $\\sqrt{(n+\\lambda)\\Sigma}$. It is a bit longer, but still straightforward." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def sigma_points (mu, P, kappa):\n", + " \"\"\" Computes the sigma points and weights for an unscented Kalman filter.\n", + " xm are the means, and P is the covariance. kappa is an arbitrary constant\n", + " constant. Returns tuple of the sigma points and weights.\n", + "\n", + " Works with scalar, array, and matrix inputs:\n", + " sigma_points (5, 9, 2) # mean 5, covariance 9\n", + " sigma_points ([5, 2], 9*eye(2), 2) # means 5 and 2, covariance 9I\n", + " \"\"\"\n", + "\n", + " mu = asmatrix(mu)\n", + " cov = asmatrix(cov)\n", + "\n", + " n = size(mu)\n", + "\n", + " # initialize to zero\n", + " Xi = asmatrix (zeros((n,2*n+1)))\n", + " W = asmatrix (zeros(2*n+1))\n", + "\n", + "\n", + " # all weights are 1/ 2(n+kappa)) except the first one.\n", + " W[0,1:] = 1. / (2*(n+kappa))\n", + " W[0,0] = float(kappa) / (n + kappa)\n", + "\n", + "\n", + " # use cholesky to find matrix square root of (n+kappa)*cov\n", + " # U'*U = (n+kappa)*P\n", + " U = asmatrix (cholesky((n+kappa)*cov))\n", + "\n", + " # mean is in location 0.\n", + " Xi[:,0] = mu\n", + "\n", + " for k in range (n):\n", + " Xi[:,k+1] = mu + U[:,k]\n", + "\n", + " for k in range (n):\n", + " Xi[:, n+k+1] = mu - U[:,k]\n", + "\n", + " return (Xi, W)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 10 } ], "metadata": {} diff --git a/stats.py b/stats.py index 00c9fa7..3428bbf 100644 --- a/stats.py +++ b/stats.py @@ -61,7 +61,7 @@ def norm_plot(mean, var): max_x = mean + var * 1.5 xs = np.arange(min_x, max_x, 0.1) - ys = [gaussian(x,23,5) for x in xs] + ys = [gaussian(x,mean,var) for x in xs] plt.plot(xs,ys) @@ -106,7 +106,7 @@ def plot_covariance_ellipse (cov, x=0, y=0, sigma=1,title=None, axis_equal=True) """ e = sigma_ellipse (cov, x, y, sigma) plot_sigma_ellipse(e, title, axis_equal) - + def plot_sigma_ellipse(ellipse, title=None, axis_equal=True): """ plots the ellipse produced from sigma_ellipse.""" diff --git a/styles/custom2.css b/styles/custom2.css index 841fe34..270fc41 100644 --- a/styles/custom2.css +++ b/styles/custom2.css @@ -19,7 +19,7 @@ .text_cell_render h1 { font-weight: 200; - font-size: 36pt; + font-size: 30pt; line-height: 100%; color:#c76c0c; margin-bottom: 0.5em; @@ -36,8 +36,8 @@ font-style: italic; line-height: 100%; color:#c76c0c; - margin-bottom: 1.5em; - margin-top: 0.5em; + margin-bottom: 0.5em; + margin-top: 1.5em; display: block; white-space: nowrap; } diff --git a/ukf_internal.py b/ukf_internal.py new file mode 100644 index 0000000..b13e889 --- /dev/null +++ b/ukf_internal.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue May 27 21:21:19 2014 + +@author: rlabbe +""" +import matplotlib.pyplot as plt +from matplotlib.patches import Ellipse,Arrow +import stats +import numpy as np + + +def arrow(x1,y1,x2,y2): + return Arrow(x1,y1, x2-x1, y2-y1, lw=2, width=0.1, ec='k', color='k') + +def show_2d_transform(): + ax=plt.gca() + + ax.add_artist(Ellipse(xy=(2,5), width=2, height=3,angle=70,linewidth=1,ec='k')) + ax.add_artist(Ellipse(xy=(7,5), width=2.2, alpha=0.3, height=3.8,angle=150,linewidth=1,ec='k')) + + ax.add_artist(arrow(2, 5, 6, 4.8)) + ax.add_artist(arrow(1.5, 5.5, 7, 3.8)) + ax.add_artist(arrow(2.3, 4.1, 8, 6)) + + ax.axes.get_xaxis().set_visible(False) + ax.axes.get_yaxis().set_visible(False) + + plt.axis('equal') + plt.xlim(0,10); plt.ylim(0,10) + plt.show() + + +def show_3_sigma_points(): + xs = np.arange(-4, 4, 0.1) + var = 1.5 + ys = [stats.gaussian(x, 0, var) for x in xs] + samples = [0, 1.2, -1.2] + for x in samples: + plt.scatter ([x], [stats.gaussian(x, 0, var)], s=80) + + plt.plot(xs, ys) + plt.show() + +def show_sigma_selections(): + ax=plt.gca() + ax.add_artist(Ellipse(xy=(2,5), alpha=0.5, width=2, height=3,angle=0,linewidth=1,ec='k')) + ax.add_artist(Ellipse(xy=(5,5), alpha=0.5, width=2, height=3,angle=0,linewidth=1,ec='k')) + ax.add_artist(Ellipse(xy=(8,5), alpha=0.5, width=2, height=3,angle=0,linewidth=1,ec='k')) + ax.axes.get_xaxis().set_visible(False) + ax.axes.get_yaxis().set_visible(False) + + plt.scatter([1.5,2,2.5],[5,5,5],c='k', s=50) + plt.scatter([2,2],[4.5, 5.5],c='k', s=50) + + plt.scatter([4.8,5,5.2],[5,5,5],c='k', s=50) + plt.scatter([5,5],[4.8, 5.2],c='k', s=50) + + plt.scatter([7.2,8,8.8],[5,5,5],c='k', s=50) + plt.scatter([8,8],[4,6],c='k' ,s=50) + + plt.axis('equal') + plt.xlim(0,10); plt.ylim(0,10) + plt.show() + + + + + + + +if __name__ == '__main__': + show_sigma_selections() +