Refactoring UKF chapter.
Still a lot of work to be done, but I'm writing more realistic examples, and reordering the material.
This commit is contained in:
1 parent
872a4eb947
commit
48f7eadc3e
4 files changed
+774
-29
No files matched your search
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:0c11a3f653ab708c71e39819bb537fb47bbf046e6ebfe25b6e0a58dd7400264e"
|
||||
"signature": "sha256:1402b869961da31f2a076967286e733b2a5d96cafe6925e3b256534e9198b554"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
@@ -29,6 +29,8 @@
|
||||
"input": [
|
||||
"#format the book\n",
|
||||
"%matplotlib inline\n",
|
||||
"%load_ext autoreload\n",
|
||||
"%autoreload 2\n",
|
||||
"from __future__ import division, print_function\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import book_format\n",
|
||||
@@ -259,7 +261,7 @@
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 1,
|
||||
"text": [
|
||||
"<IPython.core.display.HTML at 0x7fa98ef8b6a0>"
|
||||
"<IPython.core.display.HTML at 0x7ff6a35804e0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -299,13 +301,13 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAxQAAAGaCAYAAACWpgUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVOUeP/DPOQMMMywDIig7KIuguKIplbsm7ll26+Z1\n6Za3xXs1u/d262ep1S/Lut26Xdv7qa2WWmrmmgtqWoKKO7gDyiKy79uc3x/IyGEGBJzhzMDn/ZIX\nM9+zfc8Mnuc855zneQRJkiQQERERERG1gqh0AkREREREZLtYoSAiIiIiolZjhYKIiIiIiFqNFQoi\nIiIiImo1ViiIiIiIiKjVWKEgIiIiIqJWY4WCiIiICMD777+Pnj17QqvVQhRFLF26VJE8EhISMHbs\nWHh5eUEURQQHByuShzmIoogRI0YonQZZGCsU1KFZw4F61apVihZcREQttXfvXoiiiDlz5iiditms\nWbMG8+fPR01NDebPn48lS5YociJcWFiICRMmYP/+/bj//vuxZMkSPPvss22eR3M1pxwVBKGNsiGl\n2CmdAJHSrOVAZy15EBE1V3s6bm3evBkA8MUXX2DQoEGK5XH48GFkZ2fjySefxAcffKBYHi3R1N9B\nUlIStFptG2ZDSmCFgshKcNB6IrI17em4lZ6eDgDo0qUL8zCjsLAwpVOgNsBHnsjq/fDDDxgxYgR0\nOh00Gg0iIyOxePFilJSUyOYLCgpq9LZr3WNFq1evBnDrdj0AXLlyBaIoGn7q38Kvu5VbUFCAp59+\nGj4+PtBoNOjVq5fJK0d1623s8aXhw4cbtgsAs2fPxmOPPQYAWLp0qSyPffv2teBTIiJqG0uWLMHI\nkSMBAKtXr5YdtxoeY+fMmYPk5GRMnz4dnp6eUKlUOHHiBABgz549mDt3LiIjI6HT6aDVatGrVy8s\nWbIE5eXlJrdbt409e/Zg+PDhcHV1hU6nw8SJE5GUlGS0zPXr1/HPf/4TPXr0gLOzM3Q6HcLCwvDo\no48a8qhb7969ewEAwcHBhv2p78KFC3j88ccRGBgIR0dHeHl5Ydq0aTh27FiTuW7ZsgVDhw6Fq6sr\nOnXq1OjnWlcWzZ49G4C8TPjiiy8AGJch9TVW/tQtk5KSgo8//hhRUVHQaDTo2rUr/vKXv6CwsNDk\n+q5du4YFCxYgLCwMWq0WnTp1QnR0NBYvXozq6uoWlaOmHh0rKirCokWL0KNHD2g0Gri7u2PUqFHY\ntGlTo5/NiBEjkJOTg7lz58Lb2xuOjo7o1asXVq1a1ejnSm2DdyjIqr388st47bXX4OHhgT/+8Y9w\nc3PDjh078Oqrr2LTpk3Yv38/nJ2dDfPf7vZ73fTg4GAsXrwYS5cuhU6nkz2f2rdvX9kylZWVGD16\nNIqKijBjxgyUl5dj7dq1mDdvHs6dO4d333230e00lQMA3H///SgoKMDGjRsxfPhwDB8+3DAtMDCw\nyX0hIlLCiBEjkJKSgtWrV6Nv376YOnWqYVq/fv1k8164cAGDBw9GZGQkZs2ahcLCQsPjL8uXL0dy\ncjJiYmIwadIklJeX48CBA3jllVewZ88e7N69GyqVymj7mzdvxsaNGzF+/Hg89dRTOH36NLZs2YL4\n+HicOXMGHh4eAIDS0lLExMTg0qVLGD16NCZPngwASE1Nxa5duzBq1Cj07t0bI0aMgCAIWLVqFVJS\nUrBgwQK4ubnJtrl7925MmTIFlZWVmDhxIkJDQ3H16lX88MMP2Lp1KzZu3IixY8ca5bp27Vps374d\nEydOxDPPPIOsrKxGP1d3d3csXrwYiYmJRmVC/XKpueVcQ//4xz+wY8cOTJ48GePGjcPu3bvx6aef\n4sKFC9i1a5ds3oSEBIwbNw65ubkYOnQopk2bhvLycpw9exZvvPEGnnvuuRaVow1zKigowD333IPT\np0+jf//+WLBgAfLy8rB27VpMnToVS5cuxUsvvWS0D/n5+bj77ruhVqvx0EMPoaKiAt9//z0ee+wx\niKKImTNnNvnZkAVJRFbq0KFDkiAIkr+/v5SRkSGbNmvWLEkQBGnevHmGWGBgoBQcHGxyXStXrpQE\nQZBWr14tiwuC0OgyddMFQZDuvfdeqbKy0hC/ceOGFBwcLAmCIB08eNAQ37NnjyQIgrR06VKT6xs2\nbJgkiqLJ3BpbhojI2uzdu1cSBEGaM2eOyel1x0JBEKRFixaZnOfSpUsm4y+99JIkCIK0Zs0aWXzx\n4sWSIAiSvb29tHv3btm0F154QRIEQVq+fLkhtmnTJkkQBOnZZ5812oZer5fy8/NlsWHDhkmCIEgp\nKSmyeH5+vuTh4SF17txZOnv2rGza2bNnJRcXF8nHx0eqqKgwylWlUknbt283uZ+NaapMMFWG1Gms\n/Knbr8DAQCktLc0Qr66uloYOHSoJgiAdPnzYEK+oqJCCgoIkURSlL7/80mg7WVlZUnV1teF9c8rR\nESNGyGJPPvmkJAiC9Oc//1kWv3r1quTt7S2JoijFx8cb4pcvXzb8PT3xxBOSXq83TDtz5oxkZ2cn\nRUZGNpoDWR4feSKr9fnnnwMAXnzxRXTt2lU2bfny5XB0dMSqVatQU1Nj0TwEQcCyZctgb29viHl4\neOCFF14AAKxcudKi2ycisjZSM9tOdO3aFS+//LLJaY09orpgwQIAwM6dO01Of/jhh40eoZk7dy4A\nID4+3mh+R0dHo5ggCNDpdI0nXs8XX3yB3NxcLF68GD169JBN69GjBx5//HFkZGQYXeUHgClTppi8\nc6GEl19+GX5+fob3KpXK8GhS/c/tp59+QkpKCsaPH48ZM2YYrcfLy8vknaPmqqqqwhdffAEnJycs\nX75cNs3X1xcvvvgiJEnCZ599ZrSsk5MT3nnnHdkdj4iICMTExCApKQmlpaWtzovuDB95Iqt19OhR\nADA8q1ufl5cXoqKiEB8fj3PnziEiIsJiedjZ2SEmJsYoPmzYMABAYmKixbZNRGTL+vTpI7sYU19J\nSQnee+89/Pjjjzh37hyKi4tlFZVr166ZXC46OtooVneinJeXZ4gNHz4cvr6+ePPNN5GQkIDx48fj\n7rvvRv/+/Vt0Qvzrr78CAI4fP44lS5YYTU9OTgYAnD17FrGxsbJpSvYW1VBzP7fffvsNAIz2xVyS\nkpJQVlaGwYMHm2xTMnr0aAAw2TYlNDRU9phzHX9/f0iShLy8PPYopRBWKMhqFRQUQBAEo7sTdby9\nvQHUPlNpSZ07dzb5TKqXlxeA2jyJiMhYY8fvqqoqjBw5EvHx8YiKisIjjzwCT09P2NvbQ5IkLF26\nFBUVFSaXbdi+Aai98ANAdsfaxcUFv//+O5YuXYpNmzbhl19+MSz/2GOP4dVXX4VGo7ntPuTk5AC4\nddfcFEEQjDoKARrffyU093OrK1N9fX0tkkddmdnYZ1MXN1W2m9oHwPR+UNtihYKsVt3t6IyMDLi6\nuhpNz8jIkM0niiKqq6tNrutOKh03btyAJElGlYq6xnX1b5vX9XhhiTyIiGxNYw2EN27ciPj4eMyZ\nM8foRD0jI8NsA336+Pjg448/xscff4zk5GTs3bsXH330Ed555x3k5eU1WUmoU3eMP3r0qFFj49sx\n9zgddWWMXq836u3JXOVL3Un71atXzbK+huo+z8zMTJPTG5btZBvYhoKs1oABAyBJEvbs2WM07fr1\n6zh16hScnZ0RHh4OoLaHjKysLJMn86aeqwVqD/a3u6JRXV1tuOVdX1xcHAB5rybu7u4AansRaaig\noADnzp0zitfdeueVFSKyFXd63Lpw4QIAYNq0aUbT6o6t5hYeHo6//OUv2L9/PxwcHLBhw4ZmLVf3\nyKs1dOXt7u4OSZJMljGNlXMtNWTIEADA1q1bmzV/c8rR+iIiIqDRaHDy5EnD3Z/66tqiDBgwoNnr\nJOWxQkFWq258htdff13W1Z4kSXj++edRVlaGWbNmGQq2wYMHo6qqCp9++qlsPdu3b8eaNWtMbsPD\nwwPZ2dkm+zyvv70XX3wRlZWVhtiNGzewbNkyCIIg6287IiICOp0OGzZskOVcXV2NBQsWmNxO586d\nAQApKSmN5kBEZE3qumZt7XGrrkF2wwtGly5dwvPPP39nyd105swZk1fBb9y4gaqqKpPP2pu6ozBn\nzhy4u7vj1VdfNbQvqE+SJBw4cABVVVVmybspgwcPBgB8+OGHsnhiYiLee++9RpdryZ2SSZMmISgo\nCFu2bMFXX31lND0rK0tWgWhOOVqfnZ0dZs6ciZKSEkPnJnXS09OxbNkyiKJoOAcg28BHnshqDR48\nGC+88AKWLVuGXr16Yfr06XB1dcXOnTtx7Ngx9O7dG8uWLTPM/7e//Q0rV67EvHnzsHv3bgQFBeHM\nmTPYuXMnHnjgAaxbt85oG2PHjsU333yDcePG4d5774VarUbfvn0xceJEwzze3t4oKytDVFQUJk+e\njPLycqxbtw5ZWVmYP3++4QAP1B4on332WSxZsgT9+vXD1KlTIQgC9uzZA0EQ0KdPHxw/flyWQ0xM\nDJycnLBmzRrY29sjICAAgiBg5syZCAgIsMAnS0R0Z3r06AF/f3/s378fM2bMQGhoKFQqFaZMmYKo\nqKjbLj9p0iSEhITgnXfewcmTJ9G3b1+kpqbi559/xsSJExu9CNQSO3bswN///nfExMQgNDQUXbp0\nQWZmJjZu3AgARiezgOneq9zd3bF+/XpMnToVMTExGDlyJCIjI2Fvb4+0tDT8/vvvSEtLQ35+fqMN\n0M3lsccew9tvv4233noLJ06cQFRUFC5duoSffvoJDzzwQKOfW3N75QIAe3t7rF27Fvfddx9mzpyJ\nzz77DHfddRcqKyuRnJyMXbt2ITs72/AocnPK0YbeeOMN7N+/H5999hmOHTuGUaNGIT8/H2Line truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7fa97635a5c0>"
|
||||
"<matplotlib.figure.Figure at 0x7ff686693c18>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 8
|
||||
"prompt_number": 2
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -313,7 +315,7 @@
|
||||
"source": [
|
||||
"I generated this by taking 500,000 samples from the input, passing it through the nonlinear transform, and building a histogram of the result. From the output histogram we can compute a mean and standard deviation which would give us an updated, albeit approximated Gaussian.\n",
|
||||
"\n",
|
||||
"It has perhaps occurred to you that this sampling process constitutes a solution to our problem. Suppose for every update we generated 500,000 points, passed them through the function, and then computed the mean and variance of the result. 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, and does not require a closed form solution. No matter how nonlinear or poorly behaved the transfer function is, as long as we sample with enough points we will build an accurate output distribution.\n",
|
||||
"It has perhaps occurred to you that this sampling process constitutes a solution to our problem. Suppose for every update we generated 500,000 points, passed them through the function, and then computed the mean and variance of the result. 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, and does not require a closed form solution. No matter how nonlinear or poorly behaved the function is, as long as we sample with enough points we will build an accurate output distribution.\n",
|
||||
"\n",
|
||||
"\"Enough 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 only needed $50$ points for 1 dimension, you'd need $50^2=2,500$ for two dimensions, $50^3=125,000$ for three dimensions, and so on. So while this approach does work, it is very computationally expensive. The Unscented Kalman filter uses a similar technique but reduces the amount of computation needed by a drastic amount by using a deterministic method of choosing the points."
|
||||
]
|
||||
@@ -348,11 +350,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f077707be10>"
|
||||
"<matplotlib.figure.Figure at 0x7ff6a3571e80>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 4
|
||||
"prompt_number": 3
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -429,20 +431,20 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAykAAAGNCAYAAAAVeD67AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl4VNX9/9/n3smQEJKZySSTsERCIARESxGxUlGLCuJS\n0ccCAi5Y97qAWrfqt/B1Adzr0p97QUHc0FKrVakbXxG1SBVEhUCAAAJJZk3AhMzcc35/nDl3lkyS\nSZhs5PN6njxk7j33LHfIOedzPhsTQggQBEEQBEEQBEF0EbTO7gBBEARBEARBEEQ0JKQQBEEQBEEQ\nBNGlICGFIAiCIAiCIIguBQkpBEEQBEEQBEF0KUhIIQiCIAiCIAiiS0FCCkEQBEEQBEEQXQoSUgiC\nIAiCIAiC6FKkVEj561//ipEjR8Jms8Fms+HXv/41/vWvf8WUmTdvHvr374/evXtj/Pjx+OGHH1LZ\nBYIgCIIgCIIgujkpFVIKCwvxwAMP4JtvvsG6detwyimn4Nxzz8X69esBAPfffz8eeeQRPPnkk1i7\ndi1cLhcmTJiA/fv3p7IbBEEQBEEQBEF0Y1h7Z5x3Op1YuHAhLr/8cvTr1w833HAD7rjjDgBAfX09\nXC4XHnroIVx55ZXt2Q2CIAiCIAiCILoJ7eaTYhgGXn31VdTX1+Okk07C9u3bUVlZiYkTJ5pl0tPT\ncdJJJ2HNmjXt1Q2CIAiCIAiCILoZllRX+N1332Hs2LE4ePAgMjIy8Prrr6O0tNQURPLz82PKu1wu\n7NmzJ+ZaIBBIdbcIgiCIMDabrbO70OnQOkMQBNF+pGKdSbmQMmzYMGzYsAGBQABvvPEGLrjgAnzy\nySfNPsMYS3U3CIIgCIIgCILopqTc3CstLQ3FxcUYNWoU5s+fj+OPPx5//etf0bdvXwBAZWVlTPnK\nykoUFBSkuhsEQRAEQRAEQXRTUq5JiccwDHDOMWjQIBQUFGDlypUYPXo0AOk4v3r1ajz00ENNPp9K\ns4Svv/4aAHDsscemrM6uSk8aK0DjPdzpSeNtr7GSeVPTHK7mbz3h76Yjxsi5QHW1/N3pjMQa8niY\neU3TGDSNmeWjn1Xl8vJglmkNbR2j6oemsZgxOBwcmsZgschz6lCIY/NmIBQy4HAI1NZaYLNx+P0M\njDGUlso61PNtHUdz0P/Vw4NUrzMpFVJuv/12nH322RgwYABqa2uxbNkyrFq1Cu+//z4AYM6cOZg/\nfz6GDRuGkpIS3HvvvcjKysKMGTNS2Q2CIAiCIIg2Eb25T4THwyCEgGFwUziJL6uEEyEAIYQpKDRX\nb6ppqh2LRYu5Z7FoGDw4hLIyYPt2DQ4Hh65rGDpUQNPk/WjBiyA6ipQKKZWVlbjwwguxb98+2Gw2\njBw5Eu+//z4mTJgAALj11ltRV1eHa6+9Fj6fD8cffzxWrlyJzMzMVHaDIAiCIAii1cRqTSJCSF6e\n2qRHNveMyZ9Ez0cLJ7m5AkC0RkV0mKCiiB5DorYtFg26LrVCQ4YIWK0M0WNt6XmCaA9SKqQsWrSo\nxTJz587F3LlzU9ksQRAEQRBEyuBcwO2WQki8UJGXJ8A54PFoMeWjYUwKJ5oGaFrnaiKS0eBYLBpK\nSzkABotFRyjEUV2NOAGNBBSiY2l3nxSCIAiCIIjugNqUSyEk8Ya8sXYFMf4aeXmqnBbzTGdoIqI1\nQy1pcJRZVyjE4XYDXq/0XwmFAJ9PS6oOgkglJKQQBEEQBEGEiRdCEjnEKyLXWt64d7XNfbyGRQk0\nnEsNUk6OFNa8XumDw5i819XGQRy+kJBCEARBEAQRJpF5VMTXRECE5RIhBHw+BqcTYdMuWb6yUhbI\nz49E1oqvr6OI1/hwHnHib0rDomksHMWMwe2W43Q4BHw+DR4PI20K0WGQkEIQBEEQBIHE5lGccxw8\neBAZGfK6iFKo9OoFpKUBwaD0QxFCwGqV9w4elP8Gg/LftLS2Ja8eOHAgAJm2oa0IIdDQIDUkaWny\nmhrPwYORfmVny8GFQnIsGRlAKCTL9O4tn48unypSMcauTncfo9VqjTFh7AhISCEIgiAIgkiAElDS\n09ORkZHcxlxt/pv63FrS09MPrYIm+pFMvw6178mSqjF2ZbrzGIUQqK+vR69evTpUUCEhhSAIgiAI\nAo0d3Ovq6pGenp5yzQFBdCcYY0hPTzcF9o6ChBSCIAiCIIgw8f4WJKAQROf8HXSscRlBEARBEEQ3\ngQQUgug8SEghCIIgCIIgCKJLQUIKQRAEQRAEQRBdCvJJIQiCIAiCiINzASEaJ3BMhoMHD+KLL75A\neXl5m9sfMGAAxo0bh8zMzDbXcajs2LEDxcXFWLRoES655JJO60cyLF68GL///e+xY8cOHHHEER3W\n7qxZs7Bq1Sps3769w9rsKZCQQhAEQRAEgdis8tXVMgRvW8LwWq1WGIaByy+/vM19efvtt9G7d+82\nP98SalP/5Zdf4rjjjmuyHGOs2/jmdFY/k2l31qxZeOmll9CnTx9UVVU1ipK1c+dOFBUVAQDmzp2L\nuXPntkdXuxVk7kUQBEEQRI9HJXKsro4VVtoCYwyjRo3C6aef3qbnR48ejTFjxnS6cFBUVIS6ujpc\neOGFndqPZLj44otRV1fXoVoURbIaN13XcfDgQbz99tuN7i1btswUXDr7e+8qkJBCEARBEAQRhcyX\nEsnO3hYcDgduueWWNj07d+5c5Ofnt73xFNIZmcZbw4EDBwAAmqbBarV2cm+ax2KxYMKECVi2bFmj\ne8uWLcNZZ53VCb3qunTd/3UEQRAEQRAdhBJM8vLk7/H5UlpLW7UpXUWLAkifFE3T8OKLL5rX5s2b\nB03TUFZWhlmzZsHhcMBut+P3v/896urqGtWxbNkyjBkzBr1790ZOTg6mTp2KHTt2xJT57LPPMG3a\nNAwcOBDp6eno168frrzySvh8vphyqu3vv/8eF110EXJycnD00UcDkOZrmqZh586dAIBPP/0UmqYl\n/Bk0aFBMvStXrsTJJ5+MrKwsZGVl4YwzzsD69esbjWXFihU46qijkJGRgaOPPhp///vfW/1OZ8yY\ngffffz9mbN999x02btyImTNnJnwmEAjgpptuwhFHHIFevXph8ODBuPfee8E5jyn38MMPY9y4ccjL\ny0NGRgZ+8Ytf4IUXXmhUX1FREc444wysXr0axx13HDIyMjB48GAsWbKk1eNpT8gnhSAIgiAIArGJ\nHA/V5AuIaFM++OCDpJ/pSloURSKB6YILLsDgwYOxcOFCrFu3Ds8//zxcLhcWLlxollm4cCHuvPNO\nTJkyBZdddhm8Xi+efPJJnHDCCVi/fj1yc3MBAMuXL0dtbS2uvvpquFwurF+/Hs8//zw2btyINWvW\nNGp72rRpKC4uxvz589HQ0JCwz0ceeSSWLl0ac83r9eLmm2+Oeb/Lli3DRRddhIkTJ2LhwoWor6/H\ns88+ixNPPBFr165FaWkpACnInH/++RgxYgQWLFgAr9eLyy67DP37909aoGSM4dxzz8WVV16J5cuX\n44orrjD7MHDgQIwbN67RM3V1dRg/fjx27tyJq6++GkVFRfjqq68wb948VFRU4LnnnjPL/uUvf8Fv\nf/tbXHDBBWCMYcWKFbjiiisQCoVw1VVXxfRj+/btmDJlCi6//HJceumleOGFFzBr1iyMHj0aRx55\nZFLjaW9ISCEIgiAIgogiFOKorgYyM9vmOK+I1qYkI6h0JS1KSxxzzDF4/vnnzc8ejwcvvPCCKaTs\n3LkT//M//4P//d//xV133WWWu+CCCzBixAg8+uijuO+++wBIYSYj7kWPHTsWM2fOxOeff44TTjgh\n5t7w4cPxxhtvNNs/l8uFGTNmmJ855zjrrLOQnp6OxYsXA5CmYtdddx0uvfTSmLFcdtllKC0txd13\n342XX34ZAHDbbbehoKAAn3/+ObKysgAA48ePx6mnnmo6vCdD7969cc455+Dll1/GFVdcASEEXnnl\nFcyYMSPh9/7oo49i8+bN+OabbzB06FAAwOWXX45Bgwbhrrvuwi233GJe37JlS4xD/rXXXovTTz8d\nDz30UIyQIoRAWVkZ/u///s8UjKZMmYLCwkIsWrQIDz74YNLjaU/I3IsgCIIgCCIM5wJuN+D1Am2M\nQBxDa3xTuqIWpSmUFkAxbtw4eDwe7N+/HwDw1ltvwTAMTJ06FW632/zJzs7GUUcdhU8++cR8Vgko\nQgjU1NTA7XZj7NixAID//ve/jdq+5pprWt3fO++8Ex988AEWL16MYcOGAQD+/e9/w+/3Y/r06TF9\nDIVCGDdunNnHvXv3Yv369bjoootMAQWQQsqIESNa3Zfp06fjs88+w+7du/H5559j586dmDlzZkIH\n/Ndffx0nnnginE5nTB9PPfVUANKsTaEElGAwCK/XC7fbjd/85jcoLy9HbW1tTL2lpaUxmpvc3FyU\nlpZ2qVDKpEkhCIIgCIKIgjEGp1MgFX7YyWpTupMWBUCjKFoOhwMA4PP50KdPH5SVlQGAKRDEM3jw\nYPP3Xbt24ZZbbsF7773XaDMdCASafTYZ3njjDdx///3405/+hPPOO8+8rvo4YcKEhM/pug4AqKio\nAACUlJQ0KlNSUoJvv/02qX4oIWTSpElwOBx45ZVXsG3bNhx99NEYMWIE3G53o2fKysqwYcMG5OXl\nNbrHGEN1dbX5+R//+AfuuecerF+/HoZhxJQLBAIxAlaiKGh2u72RH1BnQkIKQRAEQRBEGOlALwAw\nNDSkRmBIxjelO2lRgMgGPh61EVdO3e+//z4slsbbTaU9MQwDEydOhMfjwZ/+9CcMHz4cmZmZMAwD\nkyZNauQcHv1sMnz33Xe49NJLMWnSJNx7770x91TdL774Ivr37590nYdKWloafve73+Gll1Line truncated
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7fa976479208>"
|
||||
"<matplotlib.figure.Figure at 0x7ff67e970c18>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"output_type": "stream",
|
||||
"stream": "stdout",
|
||||
"text": [
|
||||
"Difference in mean x=0.023, y=43.344\n"
|
||||
"Difference in mean x=0.020, y=43.466\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 10
|
||||
"prompt_number": 4
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -482,11 +484,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAyoAAAGNCAYAAAD+T4W4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlclPW+B/DPMMzAgCgiu6IogruIgArighKJlLmlWVnu\nYSdLvVnHjvfeU3mO5xw7HtOOaGlqmoalueKCCyhLKiJu4IoKKjMCKuICAzNz/+iesUcWTQd+M/B5\nv17+8XyehY/0vJIv8ywyg8FgABERERERkRmxEl2AiIiIiIjocRxUiIiIiIjI7HBQISIiIiIis8NB\nhYiIiIiIzA4HFSIiIiIiMjscVIiIiIiIyOxwUCEiIiIiIrNj8kFlyZIlaN26NVQqFYKCgpCcnPxU\n+124cAEODg5wcHCotC4pKQmBgYFQqVTw8fHBsmXLTF2biIiIiIjMiEkHlbi4OEyfPh1z5sxBZmYm\nQkNDERUVhby8vBr302q1eO2119CvXz/IZDLJusuXL2Pw4MEICwtDZmYmZs+ejWnTpmHTpk2mrE5E\nRERERGZEZso30/fs2RPdunWTfOLh5+eHkSNH4q9//Wu1+82YMQN3795F37598d5776GkpMS47uOP\nP8bmzZtx7tw5YzZ58mScOXMGqamppqpORERERERmxGSfqGi1WmRkZCAyMlKSR0ZG1jhQ7NixAzt2\n7MDixYtR1cyUlpZW5THT09Oh0+lMU56IiIiIiMyKtakOVFhYCJ1OBzc3N0nu6uoKtVpd5T43btzA\nlClTsHnzZtjZ2VW5jUajqXRMNzc3VFRUoLCw0LiuuLjYBH8LIiIiIiKqa02aNKmUCX3q19ixYzF1\n6lQEBweLrEFERERERGbGZIOKs7Mz5HI5NBqNJNdoNPDw8KhynwMHDuDTTz+FQqGAQqHApEmTcP/+\nfSgUCixfvhwA4O7uXukTGY1GA2trazg7O5uqPhERERERmRGTXfqlVCoRGBiIPXv2YMSIEcY8ISEB\nr776apX7nD59WrK8efNm/OUvf8HRo0fh6ekJAAgJCcHPP/8s2S4hIQHBwcGQy+VVHreqj45IKj09\nHQAQFBQkuAnVJzyvqDbwvKLawnOLagPPq6f3pFs3TDaoAMDMmTMxduxY9OjRA6GhoVi6dCnUajVi\nYmIAALNnz8bRo0exd+9eAEDHjh0l+x85cgRWVlaSPCYmBl999RVmzJiBKVOmICUlBatXr8YPP/xg\nyupERERERGRGTDqojBo1CkVFRZg7dy7y8/PRpUsXxMfHw8vLCwCgVquRk5NT4zEef4+Kt7c34uPj\nMWPGDMTGxqJ58+ZYvHgxhg0bZsrqRERERERkRkz6HhWRfvvRES/9ejJ+LEm1gecV1QaeV1RbeG5R\nbeB59fSe9PO70Kd+ERERERERVYWDChERERERmR0OKkREREREZHY4qBARERERkdnhoEJERERERGaH\ngwoREREREZkdDipERERERGR2OKgQEREREZHZ4aBCRERERERmh4MKERERERGZHQ4qRERERERkdjio\nEBERERGR2eGgQkREREREZoeDChERERERmR0OKkREREREZHY4qBARERERkdnhoEJERERERGaHgwoR\nEREREZkdDipERERERGR2OKgQEREREZHZ4aBCRERERERmh4MKERERERGZHQ4qRERERERkdjioEBER\nERGR2eGgQkREREREZoeDChERERERmR0OKkREREREZHY4qBARERERkdnhoEJERERERGbH5IPKkiVL\n0Lp1a6hUKgQFBSE5ObnabbOyshAeHg53d3eoVCr4+PjgT3/6E8rLy43bJCYmwsrKqtKf8+fPm7o6\nERERERGZCWtTHiwuLg7Tp09HbGwswsLC8O9//xtRUVHIysqCl5dXpe1tbGwwfvx4BAQEwNHREZmZ\nmZg8eTK0Wi3mz58v2TYrKwtOTk7GZWdnZ1NWJyIiIiIiM2LSQWXBggUYP348Jk6cCABYtGgRdu3a\nhdjYWPz1r3+ttL2Pjw98fHyMy15eXnj99deRkpJSaVsXFxc0a9bMlHWJiIiIiMhMmezSL61Wi4yM\nDERGRkryyMhIpKamPtUxLl68iN27d1c6BgAEBQXB09MTERERSExMNEVlIiIiIiIyUyb7RKWwsBA6\nnQ5ubm6S3NXVFWq1usZ9Q0NDcfz4cZSVlWHcuHH485//bFzn6emJpUuXIjg4GGVlZVizZg0GDhyI\npKQkhIWFVXm89PT05/77NBT8XlFt4HlFtYHnFdUWnltUG3hePZmvr2+N60166dez2rBhA+7du4fM\nzEzMmjULH330Ef7xj38AAPz8/ODn52fctlevXrhy5Qrmz59f7aBCRERERESWzWSDirOzM+RyOTQa\njSTXaDTw8PCocd8WLVoAANq3bw+dTocJEyZg3rx5kMvlVW7fo0cPxMXFVXu8oKCg39m+4fnPlM/v\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f0776de6278>"
|
||||
"<matplotlib.figure.Figure at 0x7ff67ea25eb8>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 7
|
||||
"prompt_number": 5
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -503,8 +505,6 @@
|
||||
"\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 two most typically used methods. They have 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."
|
||||
]
|
||||
},
|
||||
@@ -522,11 +522,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAv4AAAF0CAYAAABbpj2aAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3WlwHGWeJvAn61KVVKpUqUpXSfIh2ZYPbIMvbGwDNtiY\nwxjUDRiGpnFPT/d2z+zQXzZ2JmI/zLfdjf3S3Tvb19IN2wxgTCOmwbhpGxsMvm9s4wtLsq37qEtS\nqUqqqsz9UBbY40tHVr1Zlc8voiM6RDh4hCvz/9SbmW9KqqqqICIiIiKinGYSHYCIiIiIiNKPxZ+I\niIiIyABY/ImIiIiIDIDFn4iIiIjIACy3+gfhcDiTOYiIiIiISCOyLN/wM674ExEREREZAIs/ERER\nEZEB3PJWn2vd7FIBERERERHpx51u1eeKPxERERGRAbD4ExEREREZAIs/EREREZEBsPgTERERERkA\niz8RERERkQGw+BMRERERGQCLPxERERGRAbD4ExEREREZAIs/EREREZEBsPgTERERERkAiz8RERER\nkQGw+BMRERERGQCLPxERERGRAbD4ExEREREZAIs/EREREZEBsPgTERERERkAiz8RERERkQGw+BMR\nERERGQCLPxERERGRAbD4ExEREREZAIs/EREREZEBsPgTERERERkAiz8RERERkQGw+BMRERERGQCL\nPxERERGRAbD4ExEREREZAIs/EREREZEBsPgTERERERkAiz8RERERkQGw+BMRERERGQCLPxERERGR\nAbD4ExEREREZAIs/EREREZEBsPgTERERERkAiz8RERERkQGw+BMRERERGQCLPxERERGRAbD4ExER\nEREZAIs/EREREZEBsPgTERERERkAiz8RERERkQGw+BMRERERGQCLPxERERGRAbD4ExEREREZAIs/\nEREREZEBsPgTERERERkAiz8RERERkQGw+BMRERERGQCLPxERERGRAbD4ExEREREZAIs/EREREZEB\nsPgTERERERkAiz8RERERkQGw+BMRERERGQCLPxERERGRAbD4ExEREREZAIs/EREREZEBsPgTERER\nERkAiz8RERERkQGw+BMRERERGQCLPxERERGRAbD4ExEREREZAIs/EREREZEBWEQHoNyTTCYRDAbh\n9/vh9/vR2urHwMAQhocTiMeTSCYVmM0mWK1mWK1mOJ15qKrywONJ/c/tdsNi4UeTaLxUVUU0Gv3m\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f076d3e0ef0>"
|
||||
"<matplotlib.figure.Figure at 0x7ff6862759e8>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 8
|
||||
"prompt_number": 6
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -558,15 +558,16 @@
|
||||
"P = array([[4, 2],\n",
|
||||
" [2, 4]])\n",
|
||||
"\n",
|
||||
"sigmas_kp5 = UKF.sigma_points(x=x, P=P, kappa=.5)\n",
|
||||
"sigmas_kp5 = UKF.sigma_points(x=x, P=P, kappa=0)\n",
|
||||
"sigmas_k2 = UKF.sigma_points(x=x, P=P, kappa=2)\n",
|
||||
"W0 = UKF.weights(2, kappa=.5)\n",
|
||||
"W0 = UKF.weights(2, kappa=0)\n",
|
||||
"W1 = UKF.weights(2, kappa=2)\n",
|
||||
"\n",
|
||||
"for i in range(len(W0)):\n",
|
||||
" plt.scatter(sigmas_kp5[i,0], sigmas_kp5[i,1], s=W1[i]*500, c='g')\n",
|
||||
" plt.scatter(sigmas_k2[i,0], sigmas_k2[i,1], s=W0[i]*500, c='b')\n",
|
||||
" p1 = plt.scatter(sigmas_kp5[i,0], sigmas_kp5[i,1], s=W1[i]*500, c='g')\n",
|
||||
" p2 = plt.scatter(sigmas_k2[i,0], sigmas_k2[i,1], s=W0[i]*500, c='b')\n",
|
||||
"\n",
|
||||
"plt.legend([p1, p2], ['Kappa = 0.5', 'Kappa = 2'])\n",
|
||||
"plot_covariance_ellipse(x, P, facecolor='g', alpha=0.2, std=[1,2])"
|
||||
],
|
||||
"language": "python",
|
||||
@@ -575,9 +576,9 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAxQAAAGNCAYAAACIdTczAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3WuMZeld3/vv2vf7pS67bt093T0XoG0DEWNbMQcPxA4a\nbJ9AjHBORCIOCYriYIbgCF5g4oMUKyCsEyUGQiRbCjmQSIACtgAzAcIwsTUaxATs2G6IZ6Znpruu\nu/b9tu7rOS+quzzj6bl0za7ee6/6faSeqdnVXeup6j1rrd96/s/zt4wxBhERERERkRNIzHoAIiIi\nIiKyuBQoRERERETkxBQoRERERETkxBQoRERERETkxBQoRERERETkxBQoRERERETkxBQoRERERETk\nxKYaKPb29vihH/ohGo0G+XyeN73pTfyP//E/pnkIERERERGZI6lpfaFer8e3f/u38853vpPPfvaz\nrK6ucu3aNRqNxrQOISIiIiIic8aaVqfsn/7pn+Zzn/scn/vc56bx5UREREREZAFMreTp05/+NG97\n29v4e3/v77G2tsbf+Bt/g1/+5V+e1pcXEREREZE5NLUZilwuh2VZfPjDH+YDH/gAf/mXf8mP/diP\n8fM///P86I/+6PHv6/f70ziciIiIiIjcZdVq9WWvTS1QZDIZ3va2t/H5z3/++LWPfOQj/M7v/A5X\nr149fk2BQkRERERkMd0uUEyt5Glzc5MrV6685LVv/MZv5Pr169M6hIiIiIiIzJmp7fL07d/+7fz1\nX//1S1776le/ysWLF1/xz9wu4cjtPfXUUwA8+OCDMx6JxIXeUzJtek/JadD7SqZN76k791oVRlOb\nofiJn/gJnnzySf71v/7XPPPMM/zWb/0Wv/iLv/iS9RMiIiIiIhIvUwsUDz74IJ/+9Kf5zd/8Td7y\nlrfwL//lv+RjH/sYH/zgB6d1CBERERERmTNTK3kCeM973sN73vOeaX5JERERERGZY1OboRARERER\nkbNHgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5M\ngUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJE\nRERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERE\nRE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5M\ngUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJE\nRERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERE\nRE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE5M\ngUJERERERE5MgUJERERERE5MgUJERERERE5MgUJERERERE7s1ALFz/3cz5FIJPixH/ux0zqEiIiI\niIjM2KkEiieffJJPfvKTfPM3fzOWZZ3GIUREREREZA5MPVD0+33+wT/4B/zH//gfqdfr0/7yIiIi\nIiIyR6YeKP7JP/kn/MAP/AAPPfQQxphpf3kREZGZ0/VNRORrUtP8Yp/85Ce5du0a/+W//BeA1yx3\neuqpp6Z5+DNBPzOZNr2nZNoW8T0VRQYviPDDiDAyL/oVEUbc/Lchuvl6dDNPJKyja93L/330cSJh\nkUklyKaTZNMJMqnkbL/RBbaI7yuZb3pPvX7333//q35+aoHif//v/81HPvIRPv/5z5NMHp0wjTF6\niiMiInPDmKPg4PoRrh/i+iFOEOH5IX7kEZiA0EREJiQ0EYaI0ISEUYQxESFHnzMYwMLiKEBYJLj1\nTyyLhJUggUXCSpKyUmSSGdJWmmwqTfpWwLj571uBQ0RkUVlmSnf8v/qrv8o/+kf/6DhMAIRhiGVZ\nJJNJxuMx6XSafr9//PlqtTqNQ58Jt1L0gw8+OOORSFzoPSXTNm/vqSgyjGyPietjuz62G+B4AW7g\n4YYObuDihC5u4OJHHplUgkw6QTJhkUxaJBIWqeTRfyduvpa6+XEiYR0fIzIGY44+NgYiY44/DiOD\n64V4NwNMEEA2lSGTzJJNZckmM2STOYrZHLVSjmoxS6WY1YYmLzJv7ytZfHpP3bnXun+f2gzF3/27\nf5e3ve1tx/9tjOGHf/iHeeCBB/jpn/5p0un0tA4lIiLyMrcCxHDiMrK9ozAR2Ni+jRu6uIGDF3ok\nk5DLJMlmklQyCbLpDJl07kQ38YnEzVmJOxjjUbjwcT2Hvh/hjEMgRblfppwtU84WqRSyxwEjmVTL\n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 truncated
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAxQAAAGNCAYAAACIdTczAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcXXVh///XOXff5s6eyUI2CGBS0lAiYhNAWppv2Mq3\nUOAr1ga1VHgopLjk+8UNvj5aI/gVLXwRBKlYWQQKpSp8odbGNEgiYMGfkmoiAZLZZ+6+b+f8/phk\nZMgkmQx3cpd5Px+PITPnfuaez71zOPe8z2czbNu2ERERERERmQaz1hUQEREREZHGpUAhIiIiIiLT\npkAhIiIiIiLTpkAhIiIiIiLTpkAhIiIiIiLTpkAhIiIiIiLTpkAhIiIiIiLTVtVAMTAwwIYNG+ju\n7sbn87FixQr+4z/+o5q7EBERERGROuKs1hPF43HWrFnDWWedxdNPP01XVxd79uyhu7u7WrsQERER\nEZE6Y1RrpezPfOYzbNu2jW3btlXj6UREREREpAFUrcvTk08+yemnn84VV1zBnDlzOPXUU7nzzjur\n9fQiIiIiIlKHqtZC4fV6MQyDT3ziE1x++eW8/PLLXHfddXz5y1/mYx/72Hi5RCJRjd2JiIiIiMgx\nFg6HD9pWtUDhdrs5/fTTee6558a3ffazn+Wf//mf2blz5/g2BQoRERERkcY0WaCoWpenefPmsXz5\n8gnbTj75ZPbu3VutXYiIiIiISJ2p2ixPa9as4de//vWEbbt27WLx4sWH/J3JEo5M7qWXXgJg9erV\nNa6JNAsdU1JtOqZkJui4kmrTMXX0jtTDqGotFDfccAM7duzgS1/6Er/97W957LHHuOOOOyaMnxAR\nERERkeZStUCxevVqnnzySR599FFOOeUUPv/5z/O3f/u3XHvttdXahYiIiIiI1JmqdXkCOP/88zn/\n/POr+ZQiIiIiIlLHqtZCISIiIiIis48ChYiIiIiITJsChYiIiIiITFtVx1CIiIiIyNGxbZtisUiV\n1hqWI1i0aBEA+Xy+xjWpD4Zh4Ha7MQxj2s+hQCEiIiJSI5ZlUSgUcLvdOByOWldnVvB6vbWuQl2p\nVCrk83k8Hg+mOb3OS+ryJCIiIlIjxWIRr9erMCE143A48Hq9FIvFaT+HAoWIiIhIDb2TriYi1fBO\nj0EFChERERERmTYFChERERERmTYFChERERERmTYFChERERERmTYFChERERGpuvvvvx/TNHnhhRcm\nbE+n05x55pm43W6eeOKJGtWuftm2za233srSpUvx+XyccsopPPjgg1P63Z/85CeYpjnp19v/DtWk\ndShERERE5JjIZDKcf/75vPDCC3zve9/jkksuqXWV6s5nPvMZbrnlFq6++mpOP/10nnzyST74wQ9i\nGAZXXnnllJ7j4x//OGecccaEbccff/xMVBdQoBARERGRY+BAmPjZz37Gww8/rDAxib6+Pr761a9y\n7bXXcueddwLwkY98hLPPPptPf/rTXHHFFVNas2Tt2rVcfvnlM13dceryJCIiItJkLMuiXC5TqVSw\nbbvW1SGbzXLBBRewY8eOScPE97//fS666CKOO+44vF4vixcvZtOmTRQKhQnlrrrqKnw+H3v37uWC\nCy4gFArR09PDjTfeSKVSmVDWNE2uvfZaHnnkEZYvX47P52PVqlU8++yzE8rFYjE+/elPs3LlSlpa\nWgiFQpxzzjk899xzM/NmHMa//Mu/UC6Xufbaaydsv/baaxkYGJhynWzbJp1OUy6XZ6KaB1ELhYiI\niEiTsG2bX/b/ki1vbOEHu3/AkvASLnvXZZyx6AxafC01qVMmk+GCCy5g+/bth2yZuP/++/H5fGzc\nuJFwOMz27dv52te+xr59+3j44YcnlLUsi/Xr13Pqqady6623smXLFm655RYSiQTf+MY3JpT96U9/\nyqOPPsrGjRsJBoPcc889XHTRRWzZsoU1a9YA8Nprr/H4449zxRVXsHTpUmKxGPfddx/nnnsuL774\nIqeccsphX18ulyOTyUzpvejs7Dzs4y+//DJer5ff+73fm7D93e9+NwCvvPIKZ5999hH3c/XVV5NO\np3E4HKxdu5Zbb711/DlmggKFiIiISJN4ed/LXPToRfRn+se3fev/+xZ/f+7f89F3fxSP23PM6/Sh\nD32I/v7+w46ZePDBB/H5fOM/X3311SxbtozPfe5zfOUrX2HBggXjj5VKJc4++2zuuusuYOzu/YYN\nG/jmN7/JDTfcwLJly8bLvvrqqzz//PO85z3vAcZaOJYtW8b/+l//i23btgGwcuVK9uzZM6E+f/3X\nf83JJ5/M7bffzr333nvY13fLLbfwxS9+8Yjvg2EYB7WivN3AwABz5sw5aPvcuXMB6O/vP+ixt/J4\nPPz5n/85559/Pp2dnbz66qv8n//zfzjrrLPYtm0bq1evPmI9p0OBQkRERKQJFEtF7vvFfRPCxAGf\n+vdPsea4NZy28LRjXq/h4WG8Xi8LFy48ZJkDYcKyLFKpFKVSiTVr1mDbNi+//PKEQAFw/fXXH/Tz\nd7/7XZ5++mk2btw4vn316tXjYQKgvb2dK6+8kjvvvJNEIkE4HMbtdo8/ns/nyWQy2LbN6tWr+fnP\nf37E17dhwwbOOuusI5abilwuh8dzcOjzer3jjx/Oe9/7Xt773veO/3zhhRfy53/+56xcuZIbb7yR\nH/3oR1Wp59spUIiIiIg0gd54Lw++Ovn0oiWrxK7orpoEim9+85t86lOf4rzzzmPr1q0sX778oDK/\n+tWv2LRpE1u3bj3oojmRSEz42TAMTjjhhAnbDrRKvPnmm5NuP1TZlStXYlkWt956K/fccw9vvPHG\nhLJLly494utbsmQJS5YsOWK5qfD5fOTz+YO2H9j21lacqTr++OO5+OKLefzxx6lUKlMa1H20FChE\nREREmoBhGDiMQ18sHu6xmXTSSSfx7LPPcs4557Bu3Tq2bds24QI8kUhwzjnnEAqF+NKXvsQJJ5yA\nz+ejt7eXq666CsuyZrR+mzdv5vOf/zxXXXUV69ato6OjA9M02bx580FdoSaTyWRIpVJT2ldPT89h\nH587dy4//vGPD9o+MDAAwLx586a0n7dbsGABpVKJVCpFa2vrtJ7jcBQoRERERJrAwraFXL3qam7Z\ncctBj/mcPk7uPLkGtRqzatUqfvjDH7Ju3Tr+5E/+hG3bto2PC9iyZQuRSIQnnniCM888c/x3DtU9\nx7Ztdu/ePaGlY9euXQAsXrx4Qtndu3cf9PsHyi5atAiAxx57jHPOOYd/+Id/mFDuC1/4wpRe21e+\n8pWqjaE49dRTue+++/jlL385YTD4z372M2DsfZyOPXv24PF4aGmZmYH5ChQiIiIiTcDhcPAXp/wF\nP9j9A3ZGdo5vNw2Te867h+U9B3c1OpbWrFnD448/zsUXX8y6devYunUr7e3t411w3toSYVkWt912\n2yGf6/bbb+fuu+8e//mOO+7ANE3OP//8CeVeeuklduzYMb7IWyQS4aGHHmLNmjWEw2EAnE7nQa0g\nzz//PNu3bz8ooEymmmMoLr74Ym644Qbuuuuu8RmrbNvm7rvvZu7cuaxdu3a8bCQSYWRkhEWLFo13\nhRoZGaGrq2vCc/7iF7/g+9//Pv/tv/03THNmVoxQoBARERFpEivmruDJy5/kxb4X2d63nXnBeZy5\n8Ezefdy7cTpqf9m3fv16HnjgAd7//vdz3nnn8eMf/5i1a9fS0dHBhg0buO6663A6nfzTP/3TIadi\ndblcbNu2jQ984AOsWbOGLVu28Pjjj/PRj370oLEVK1as4MILL+S6664bnzY2k8mwefPm8TJ/+qd/\nys0338yGDRtYu3Ytu3fv5t5772XFihWk0+kjvqZqjqGYP38+f/M3f8NXvvIVKpUK7373u/mXf/kX\nnnvuOf7xH/9xwviHO+64gy9+8Yts2bJlfCrZK664Ar/fz3vf+166u7vZuXMn99xzD4FAgFtvvbUq\ndZxM7Y8sEREREakKwzBY1r2ME7pO4IqVV2AYxozdlZ5qfd7usssuI5lMcvXVV3PxxRfz9NNP89RT\nT/HJT36Sm266iVAoxKWXXso111zDypUrD/p9h8PBM888wzXXXMOmTZsIBoNs2rSJv/u7vzuo7Nq1\na3nf+97HzTffzJ49ezj55JN58sknJ9zpv/HGG8lmszz44IM89thjnHLKKTzyyCM8/PDDbN26tbpv\nyBR8+ctfpr29nW9+85t85zvfYdmyZfzjP/4jf/EXfzGhnGEY418H/Nmf/RkPPvggX/va10gmk3R1\ndXHppZdy0003cfzxx89YnQ37GC+f+NaR+geamuTIXnrpJYAZmz9YZh8dU1JtOqZkJjT7cZXP58en\nBJUju+qqq3jkkUeOOH0qjK2Ufc011xy02J1M7nDH4pGu32sXWUVEREREjtJkrR5SWwoUIiIiItIw\njnHnGpkCBQoRERERaQhvHzMg9UGDskVERESkIXz729/m29/+9pTKzvSCePI7aqEQEREREZFpU6AQ\nEREREZFpU6AQEREREZFpU6AQEREREZFpU6AQEREREZFpU6AQEREREZFpU6AQEREREZFpU6AQERER\nEZFpU6AQEREREZFpU6AQERERkaq7//77MU2TF154YcL2dDrNmWeeidvt5oknnqhR7erTr3/9azZt\n2sSqVatoaWlh3rx5XHjhhfz85z+vddUOS4FCREREpInYts3QUJHdu/O8/nqBUqlS6yqNy2QynH/+\n+bzwwgt873vf45JLLql1lerKt771Lb71rW9x+umnc9ttt/GJT3yC3/zmN5xxxhn827/9W62rd0jO\nWldARERERN4527bZtavIT39qc9ttLn77Wxd+v80HP1jmkkuKnHGGG4/HUbP6HQgTP/vZz3Line truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f076d3c7438>"
|
||||
"<matplotlib.figure.Figure at 0x7ff67ce84208>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -590,6 +591,579 @@
|
||||
"We can see that the sigma points lie between the first and second deviation, and that the larger $\\kappa$ spreads the points out further. Furthermore, the larger $\\kappa$ weighs the mean (center point) higher than the smaller $\\kappa$, and weighs the rest of the sigma points less. This should fit our intuition - the further a point is from the mean the less we should weight it. We don't know *how* these weights and sigma points are selected yet, but the choices look reasonable."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"##Handling the Nonlinearities"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"I explained at the beginning of the chapter that there are two places for nonlinearities to occur. The first is in the state transition function, and the second is in the measurement function. For the linear Kalman filter we use the equation\n",
|
||||
"\n",
|
||||
"$$ \\mathbf{x}^-=\\mathbf{Fx}$$\n",
|
||||
"\n",
|
||||
"to propogate the state from one epoch to the next. As you remember F defines a set of linear equations that performs this calculation. However, suppose we are tracking a ball or missile in flight. Air drag causes the behavior to be nonlinear, and therefore there are no linear equations that will compute the state.\n",
|
||||
"\n",
|
||||
"The linear Kalman filter uses the measurement function in this equation\n",
|
||||
"\n",
|
||||
"$$\\hat{\\mathbf{x}} = \\mathbf{K}(\\mathbf{z-Hx}^-)$$\n",
|
||||
"\n",
|
||||
"to incorporate the measurements into the state. The term $\\mathbf{Hx}$ converts $\\mathbf{x}$ to a measurement using the linear equations implied by \\mathbf{H}$.\n",
|
||||
"\n",
|
||||
"The UKF assumes that both the measurement function and state transition function are nonlinear, though in some problems only one or the other are nonlinear. If they are nonlinear we can not represent them with a matrix. Instead, we will define a function $h(x)$ for the measurement function and $f(x)$ for the state transition function. We will implement these as Python functions that take a state $x$ and return either a state $x$ for the state transition function, or a measurement vector $z$ for the measurement function. The functions will look something like:\n",
|
||||
"\n",
|
||||
" def hx(x):\n",
|
||||
" z = # do something to compute z\n",
|
||||
" return z\n",
|
||||
" \n",
|
||||
" def fx(x, dt):\n",
|
||||
" x_est = x propagated forward in time by dt\n",
|
||||
" return x_est"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Tracking an Aircraft"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So far we haven't been very concrete, so let's jump into solving a problem. In the *Multivariate Kalman Filter* chapter I presented an example of tracking an aircraft with two radar stations. This is a nonlinear problem so we were not able to construct a Kalman filter for that situation in that chapter. We are now able to do so.\n",
|
||||
"\n",
|
||||
"Assume we want to track an aircraft in 2 dimensions. We will ignore altitude to simplify the exposition and code. There are two radar stations on the ground, each which provides a range (straight line distance) and bearing to the aircraft from the station's position. The radars have a $1\\sigma$ error of $0.5^\\circ$ in the bearing measurement, and a $1\\sigma$ error of 0.1km for the range.\n",
|
||||
"\n",
|
||||
"We will assume that the aircraft does not engage in high dynamic flight, so we will chose a constant velocity process model for it. In other words, our state will contain the position and velocity of the aircraft in the $x$ and $y$ coordinates, like so.\n",
|
||||
"\n",
|
||||
"$$\\mathbf{x} = \\begin{bmatrix}x\\\\ \\dot{x} \\\\ y \\\\ \\dot{y}\\end{bmatrix}$$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now we need to design our state transition function. With a linear Kalman filter, for a constant velocity model we would set\n",
|
||||
"\n",
|
||||
"$$\\bf{F} = \\begin{bmatrix}\n",
|
||||
"1&dt&0&0 \\\\\n",
|
||||
"0&1&0&0 \\\\\n",
|
||||
"0&0&1&dt \\\\\n",
|
||||
"0&0&0&1\n",
|
||||
"\\end{bmatrix}$$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"so that $\\bf{Fx}$ computes the next position with the Newtonian equation $\\bf{x}^- = \\bf{x} + \\dot{\\bf{x}}\\,\\Delta t$.\n",
|
||||
"\n",
|
||||
"We are assuming linear behavior for the aircraft over short time periods in this problem so this formulation suffices. However FilterPy's UKF implementation is designed to handle nonlinear problems, so we need to implement this as a function. The state transition function has the signature\n",
|
||||
" \n",
|
||||
" def fx(x, dt)\n",
|
||||
" \n",
|
||||
"where x is the state variable (a one dimensional numpy.array), and dt is a float specifying the time step. Note that the name `fx` is not required, you may name it anything you like. We might implement this function as"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"def fx(x, dt):\n",
|
||||
" \"\"\" state transition function for a constant velocity aircraft\"\"\"\n",
|
||||
" \n",
|
||||
" F = np.array([[1, dt, 0, 0],\n",
|
||||
" [0, 1, 0, 0],\n",
|
||||
" [0, 0, 1, dt],\n",
|
||||
" [0, 0, 0, 1]])\n",
|
||||
" return np.dot(F, x)"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 15
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Alternatively, if `dt` is always a constant we might take advantage of the fact that functions can own variables, and do something like this."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"def fx(x, dt):\n",
|
||||
" \"\"\" state transition function for a constant velocity aircraft\"\"\"\n",
|
||||
" return np.dot(fx.F, x)\n",
|
||||
"\n",
|
||||
"dt = 0.1\n",
|
||||
"fx.F = np.array([[1, dt, 0, 0],\n",
|
||||
" [0, 1, 0, 0],\n",
|
||||
" [0, 0, 1, dt],\n",
|
||||
" [0, 0, 0, 1]])"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 16
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"That is perhaps not as readable, but it is faster since we only construct `F` once instead of for every call of `fx()`.\n",
|
||||
"\n",
|
||||
"Finally, for such a simple problem we might just compute the positions directly as in the next code block."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"def fx(x, dt):\n",
|
||||
" x_est = x.copy()\n",
|
||||
" x_est[0] += x[1]*dt\n",
|
||||
" x_est[2] += x[3]*dt\n",
|
||||
" return x_est"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 17
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"It doesn't matter which you choose, just do whatever is most useful for your situation."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The next step is to design the measurement function. As in the linear Kalman filter the measurement function converts the filter's state into a measurement. So for this problem we need to position and velocity of the aircraft and convert it to the bearing and range from the radar station.\n",
|
||||
"\n",
|
||||
"If we represent the position of the radar station with an (x,y) coordinate computation of the range and bearing is straightforward. To compute the range we use the Pythagorean theorem:\n",
|
||||
"\n",
|
||||
"$$range = \\sqrt{(x_{ac} - x_{radar})^2 + (y_{ac} - y_{radar})^2}$$\n",
|
||||
"\n",
|
||||
"To compute the bearing we need to use the arctangent function.\n",
|
||||
"\n",
|
||||
"$$bearing = \\tan^{-1}{\\frac{y_{ac} - y_{radar}}{x_{ac} - x_{radar}}}$$\n",
|
||||
"\n",
|
||||
"As with the state transition function we need to define a Python function to compute this for the filter. Our first attempt might look like this."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from math import sqrt, atan2\n",
|
||||
"def hx(x):\n",
|
||||
" dx = x[0] - hx.radar_pos[0]\n",
|
||||
" dy = x[2] - hx.radar_pos[1]\n",
|
||||
" \n",
|
||||
" rng = sqrt(dx**2 + dy**2)\n",
|
||||
" brg = atan2(dy, dx)\n",
|
||||
" \n",
|
||||
" return np.array([rng, brg])\n",
|
||||
" \n",
|
||||
"hx.radar_pos = np.array([0., 0.])"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 18
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here we used the ability of a function to own a variable to store the radar's position. However, we have a problem. We have two radar systems, not one, and FilterPy's UKF code does not have a way to provide it with multiple measurement functions. Instead, we have to define the measurement function to return all of the measurements at once. So, our second attempt, incorporating both radar systems at once, might look like the following."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"def hx(x):\n",
|
||||
" dx = x[0] - hx.radar1_pos[0]\n",
|
||||
" dy = x[2] - hx.radar1_pos[1]\n",
|
||||
" \n",
|
||||
" rng1 = sqrt(dx**2 + dy**2)\n",
|
||||
" brg1 = atan2(dy, dx)\n",
|
||||
" \n",
|
||||
" dx = x[0] - hx.radar2_pos[0]\n",
|
||||
" dy = x[2] - hx.radar2_pos[1]\n",
|
||||
" \n",
|
||||
" rng2 = sqrt(dx**2 + dy**2)\n",
|
||||
" brg2 = atan2(dy, dx)\n",
|
||||
" return np.array([rng1, brg1, rng2, brg2])\n",
|
||||
"\n",
|
||||
"hx.radar1_pos = np.array([0., 0.])\n",
|
||||
"hx.radar2_pos = np.array([200., 0.])"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 20
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"I chose the ordering (range 1, bearing 1, range 2, bearing 2) for the return values somewhat arbitrarily. When we pass the measurements to the UKF they will have to be ordered the same way. If you use a different order for `hx` just change the ordering for the measurement.\n",
|
||||
"\n",
|
||||
"All that is left is to define the measurement error matrix $\\bf{R}$, the process noise matrix $\\bf{Q}$, and the covariance $\\bf{P}. These are always linear, so the process is the same as for the linear filter.\n",
|
||||
"\n",
|
||||
"The measurement function used the ordering (range 1, bearing 1, range 2, bearing 2), so $\\bf{R}$ will need to use the same order. The bearing $1\\sigma$ error is $0.5^\\circ$ and the range error is 0.1 km, so we have to set\n",
|
||||
"\n",
|
||||
"$$ \\mathbf{R} = \\begin{bmatrix}0.001745^2&0&0&0 \\\\\n",
|
||||
"0&0.1^2&0&0 \\\\\n",
|
||||
"0&0&0.001745^2&0 \\\\\n",
|
||||
"0&0&0&0.1^2\n",
|
||||
"\\end{bmatrix}$$\n",
|
||||
"\n",
|
||||
"The design of Q is the same as for the linear Kalman filter. We will not focus on it here, and just use the computation that FilterPy provides.\n",
|
||||
"\n",
|
||||
"So let's construct the filter. FilterPy's UKF is named `UnscentedKalmanFilter` and is in the `filterpy.kalman` module. Let's look at the help."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from filterpy.kalman import UnscentedKalmanFilter as UKF\n",
|
||||
"help(UKF.__init__)"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"stream": "stdout",
|
||||
"text": [
|
||||
"Help on function __init__ in module filterpy.kalman.UKF:\n",
|
||||
"\n",
|
||||
"__init__(self, dim_x, dim_z, dt, hx, fx, kappa=0.0)\n",
|
||||
" Create a Kalman filter. You are responsible for setting the\n",
|
||||
" various state variables to reasonable values; the defaults below will\n",
|
||||
" not give you a functional filter.\n",
|
||||
" \n",
|
||||
" **Parameters**\n",
|
||||
" \n",
|
||||
" dim_x : int\n",
|
||||
" Number of state variables for the filter. For example, if\n",
|
||||
" you are tracking the position and velocity of an object in two\n",
|
||||
" dimensions, dim_x would be 4.\n",
|
||||
" \n",
|
||||
" \n",
|
||||
" dim_z : int\n",
|
||||
" Number of of measurement inputs. For example, if the sensor\n",
|
||||
" provides you with position in (x,y), dim_z would be 2.\n",
|
||||
" \n",
|
||||
" dt : float\n",
|
||||
" Time between steps in seconds.\n",
|
||||
" \n",
|
||||
" hx : function(x)\n",
|
||||
" Measurement function. Converts state vector x into a measurement\n",
|
||||
" vector of shape (dim_z).\n",
|
||||
" \n",
|
||||
" fx : function(x,dt)\n",
|
||||
" function that returns the state x transformed by the\n",
|
||||
" state transistion function. dt is the time step in seconds.\n",
|
||||
" \n",
|
||||
" kappa : float, default=0.\n",
|
||||
" Scaling factor that can reduce high order errors. kappa=0 gives\n",
|
||||
" the standard unscented filter. According to [1], if you set\n",
|
||||
" kappa to 3-dim_x for a Gaussian x you will minimize the fourth\n",
|
||||
" order errors in x and P.\n",
|
||||
" \n",
|
||||
" **References**\n",
|
||||
" \n",
|
||||
" [1] S. Julier, J. Uhlmann, and H. Durrant-Whyte. \"A new method for\n",
|
||||
" the nonlinear transformation of means and covariances in filters\n",
|
||||
" and estimators,\" IEEE Transactions on Automatic Control, 45(3),\n",
|
||||
" pp. 477-482 (March 2000).\n",
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 22
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"With that we can construct our filter and initialize it. As with the linear Kalman filter $\\bf{x}$, $\\bf{P}$, $\\bf{Q}$, and $\\bf{R}$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from filterpy.common import Q_discrete_white_noise\n",
|
||||
"dt = 1.\n",
|
||||
"kf = UKF(dim_x=4, dim_z=4, dt=dt, hx=hx, fx=fx, kappa=0)\n",
|
||||
"\n",
|
||||
"# initialize position at (100,100) with a velocity of 100m/s\n",
|
||||
"kf.x = np.array([100, 0.1, 100, 0.1])\n",
|
||||
"\n",
|
||||
"range_var = 0.1**2\n",
|
||||
"bearing_var = math.radians(0.5)**2\n",
|
||||
"\n",
|
||||
"kf.R = np.diag([range_var, bearing_var, range_var, bearing_var])\n",
|
||||
"kf.P = np.eye(4)\n",
|
||||
"\n",
|
||||
"q = Q_discrete_white_noise(2, 0.02)\n",
|
||||
"kf.Q[0:2, 0:2] = q\n",
|
||||
"kf.Q[2:4, 2:4] = q"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NameError",
|
||||
"evalue": "name 'math' is not defined",
|
||||
"output_type": "pyerr",
|
||||
"traceback": [
|
||||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[1;32m<ipython-input-30-42652386d07c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[0mrange_var\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.1\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mbearing_var\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mradians\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[0mkf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mR\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdiag\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mrange_var\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbearing_var\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrange_var\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbearing_var\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
|
||||
"\u001b[1;31mNameError\u001b[0m: name 'math' is not defined"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 30
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We need to simulate the Radar stations and the movement of the aircraft. By now this should be second nature for you, so I will present the code without much discussion."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from numpy.linalg import norm\n",
|
||||
"\n",
|
||||
"class RadarStation(object):\n",
|
||||
" \n",
|
||||
" def __init__(self, pos, range_std, bearing_std):\n",
|
||||
" self.pos = asarray(pos)\n",
|
||||
" \n",
|
||||
" self.range_std = range_std\n",
|
||||
" self.bearing_std = bearing_std\n",
|
||||
"\n",
|
||||
" \n",
|
||||
" def reading_of(self, ac_pos):\n",
|
||||
" \"\"\" Returns actual range and bearing to aircraft as tuple. \n",
|
||||
" Bearing is in radians.\n",
|
||||
" \"\"\"\n",
|
||||
" \n",
|
||||
" diff = np.subtract(self.pos, ac_pos)\n",
|
||||
" rng = norm(diff)\n",
|
||||
" brg = atan2(diff[1], diff[0]) \n",
|
||||
" return rng, brg\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" def noisy_reading(self, ac_pos):\n",
|
||||
" \"\"\" Compute range and bearing to aircraft with simulated noise\"\"\"\n",
|
||||
" \n",
|
||||
" rng, brg = self.reading_of(ac_pos) \n",
|
||||
" rng += randn() * self.range_std\n",
|
||||
" brg += randn() * self.bearing_std \n",
|
||||
" return rng, brg\n",
|
||||
" \n",
|
||||
" \n",
|
||||
"class ACSim(object):\n",
|
||||
" \n",
|
||||
" def __init__(self, pos, vel, vel_std):\n",
|
||||
" self.pos = asarray(pos, dtype=float)\n",
|
||||
" self.vel = asarray(vel, dtype=float)\n",
|
||||
" self.vel_std = vel_std\n",
|
||||
" \n",
|
||||
" \n",
|
||||
" def update(self):\n",
|
||||
" \"\"\" compute next position. Incorporates random variation in\n",
|
||||
" velocity. Returns new position.\"\"\"\n",
|
||||
" \n",
|
||||
" vel = self.vel + (randn() * self.vel_std) \n",
|
||||
" self.pos += vel\n",
|
||||
" \n",
|
||||
" return self.pos"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 51
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now we just need to run the filter. As with the linear filter, we implement a loop where we collect the measurements and then call the predict and update functions of the filter.\n",
|
||||
"\n",
|
||||
"For ease in reading I'll repeat all of the code from above into the code block below.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from numpy import asarray\n",
|
||||
"from math import radians\n",
|
||||
"import book_plots as bp\n",
|
||||
"\n",
|
||||
"dt = 1.\n",
|
||||
"\n",
|
||||
"def hx(x):\n",
|
||||
" r1, b1 = hx.R1.reading_of((x[0], x[2]))\n",
|
||||
" r2, b2 = hx.R2.reading_of((x[0], x[2]))\n",
|
||||
" \n",
|
||||
" return array([r1, b1, r2, b2])\n",
|
||||
" pass\n",
|
||||
"\n",
|
||||
"def fx(x, dt):\n",
|
||||
" x_est = x.copy()\n",
|
||||
" x_est[0] += x[1]*dt\n",
|
||||
" x_est[2] += x[3]*dt\n",
|
||||
" return x_est\n",
|
||||
"\n",
|
||||
"range_std = 0.1\n",
|
||||
"bearing_std = radians(0.5)\n",
|
||||
"\n",
|
||||
"f = UKF(dim_x=4, dim_z=4, dt=dt, hx=hx, fx=fx, kappa=1)\n",
|
||||
"aircraft = ACSim ((100,100), (0.1, 0.1), 0.0)\n",
|
||||
"\n",
|
||||
"R1 = RadarStation ((0,0), range_std, bearing_std)\n",
|
||||
"R2 = RadarStation ((200,0), range_std, bearing_std)\n",
|
||||
"\n",
|
||||
"hx.R1 = R1\n",
|
||||
"hx.R2 = R2\n",
|
||||
"\n",
|
||||
"f.x = array([100, 0.1, 100, 0.1])\n",
|
||||
"kf.R = np.diag([range_std**2, bearing_std**2, \n",
|
||||
" range_std**2, bearing_std**2])\n",
|
||||
"kf.P = np.eye(4)*1000\n",
|
||||
"\n",
|
||||
"q = Q_discrete_white_noise(2, 0.2)\n",
|
||||
"kf.Q[0:2, 0:2] = q\n",
|
||||
"kf.Q[2:4, 2:4] = q\n",
|
||||
"\n",
|
||||
"xs = []\n",
|
||||
"track = []\n",
|
||||
"ps = []\n",
|
||||
"\n",
|
||||
"for i in range(int(60/dt)): \n",
|
||||
" pos = aircraft.update()\n",
|
||||
" \n",
|
||||
" r1, b1 = R1.noisy_reading(pos)\n",
|
||||
" r2, b2, = R2.noisy_reading(pos)\n",
|
||||
" \n",
|
||||
" z = np.array([r1, b1, r2, b2])\n",
|
||||
" track.append(pos.copy())\n",
|
||||
"\n",
|
||||
" f.predict()\n",
|
||||
" f.update(z)\n",
|
||||
" xs.append(f.x)\n",
|
||||
" ps.append(f.P.diagonal())\n",
|
||||
"\n",
|
||||
"xs = asarray(xs)\n",
|
||||
"track = asarray(track)\n",
|
||||
"\n",
|
||||
"time = np.arange(0,len(xs)*dt, dt)\n",
|
||||
"\n",
|
||||
"plt.figure()\n",
|
||||
"bp.plot_filter(time, xs[:,0], label='UKF', lw=3)\n",
|
||||
"bp.plot_track(time, track[:,0])\n",
|
||||
"plt.legend(loc=4)\n",
|
||||
"plt.xlabel('time (sec)')\n",
|
||||
"plt.ylabel('x (m)')\n",
|
||||
"\n",
|
||||
"plt.figure()\n",
|
||||
"bp.plot_filter(time, xs[:,2], label='UKF')\n",
|
||||
"bp.plot_track(time, track[:,1])\n",
|
||||
"plt.legend(loc=4)\n",
|
||||
"plt.xlabel('time (sec)')\n",
|
||||
"plt.ylabel('y (m)')\n",
|
||||
"plt.show()\n",
|
||||
"\n",
|
||||
"plt.figure()\n",
|
||||
"\n",
|
||||
"plt.subplot(211)\n",
|
||||
"bp.plot_filter(time, xs[:,1], lw=2)\n",
|
||||
"plt.title('velocity')\n",
|
||||
"plt.legend(loc=4)\n",
|
||||
"plt.xlabel('time (sec)')\n",
|
||||
"plt.ylabel(\"x' km/sec\")\n",
|
||||
"\n",
|
||||
"plt.subplot(212)\n",
|
||||
"plt.title('velocity')\n",
|
||||
"bp.plot_filter(time, xs[:,3], lw=2)\n",
|
||||
"plt.ylabel(\"y' km/s\")\n",
|
||||
"plt.legend(loc=4)\n",
|
||||
"plt.xlabel('time (sec)')\n",
|
||||
"\n",
|
||||
"plt.show()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7ff67ca77828>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7ff67e9b4f98>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7ff67ce045c0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 70
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "heading",
|
||||
"level": 2,
|
||||
|
||||
+10
-5
@@ -10,12 +10,15 @@ import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
|
||||
def plot_transfer_func(data, f, lims,num_bins=1000):
|
||||
def plot_transfer_func(data, f, lims, num_bins=1000):
|
||||
ys = f(data)
|
||||
|
||||
|
||||
|
||||
h = np.histogram(ys, num_bins, density=False)
|
||||
|
||||
#plot output
|
||||
plt.subplot(2,2,1)
|
||||
plt.hist(ys, num_bins, orientation='horizontal', histtype='step', lw=3)
|
||||
plt.plot(h[0], h[1][1:], lw=4)
|
||||
plt.ylim(lims)
|
||||
plt.gca().xaxis.set_ticklabels([])
|
||||
plt.title('output')
|
||||
@@ -34,8 +37,10 @@ def plot_transfer_func(data, f, lims,num_bins=1000):
|
||||
plt.title('transfer function')
|
||||
|
||||
# plot input
|
||||
h = np.histogram(data, num_bins, density=True)
|
||||
|
||||
plt.subplot(2,2,4)
|
||||
plt.hist(data, num_bins, histtype='step', lw=3)
|
||||
plt.plot(h[1][1:], h[0], lw=4)
|
||||
plt.xlim(lims)
|
||||
plt.gca().yaxis.set_ticklabels([])
|
||||
plt.title('input')
|
||||
@@ -54,4 +59,4 @@ if __name__ == "__main__":
|
||||
return (np.cos(4*(x/2+0.7)))*np.sin(0.3*x)-1.6*x
|
||||
|
||||
|
||||
plot_transfer_func (data, g, lims=(-3,3), num_bins=300)
|
||||
plot_transfer_func (data, g, lims=(-3,3), num_bins=100)
|
||||
@@ -0,0 +1,163 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Sun Feb 15 14:29:23 2015
|
||||
|
||||
@author: rlabbe
|
||||
"""
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Sun Feb 8 09:34:36 2015
|
||||
|
||||
@author: rlabbe
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
from numpy import array, asarray
|
||||
from numpy.linalg import norm
|
||||
from numpy.random import randn
|
||||
import math
|
||||
from math import atan2, radians, degrees
|
||||
|
||||
|
||||
from filterpy.kalman import UnscentedKalmanFilter as UKF
|
||||
|
||||
|
||||
class RadarStation(object):
|
||||
|
||||
def __init__(self, pos, range_std, bearing_std):
|
||||
self.pos = asarray(pos)
|
||||
|
||||
self.range_std = range_std
|
||||
self.bearing_std = bearing_std
|
||||
|
||||
|
||||
def reading_of(self, ac_pos):
|
||||
""" Returns range and bearing to aircraft as tuple. bearing is in
|
||||
radians.
|
||||
"""
|
||||
|
||||
diff = np.subtract(self.pos, ac_pos)
|
||||
rng = norm(diff)
|
||||
brg = atan2(diff[1], diff[0])
|
||||
return rng, brg
|
||||
|
||||
|
||||
def noisy_reading(self, ac_pos):
|
||||
rng, brg = self.reading_of(ac_pos)
|
||||
rng += randn() * self.range_std
|
||||
brg += randn() * self.bearing_std
|
||||
return rng, brg
|
||||
|
||||
|
||||
|
||||
|
||||
class ACSim(object):
|
||||
|
||||
def __init__(self, pos, vel, vel_std):
|
||||
self.pos = asarray(pos, dtype=float)
|
||||
self.vel = asarray(vel, dtype=float)
|
||||
self.vel_std = vel_std
|
||||
|
||||
|
||||
def update(self):
|
||||
vel = self.vel + (randn() * self.vel_std)
|
||||
self.pos += vel
|
||||
print(pos)
|
||||
|
||||
return self.pos
|
||||
|
||||
|
||||
|
||||
dt = 1.
|
||||
|
||||
|
||||
def hx(x):
|
||||
r1, b1 = hx.R1.reading_of((x[0], x[2]))
|
||||
r2, b2 = hx.R2.reading_of((x[0], x[2]))
|
||||
|
||||
return array([r1, b1, r2, b2])
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def fx(x, dt):
|
||||
x_est = x.copy()
|
||||
x_est[0] += x[1]*dt
|
||||
x_est[2] += x[3]*dt
|
||||
return x_est
|
||||
|
||||
|
||||
|
||||
|
||||
f = UKF(dim_x=4, dim_z=4, dt=dt, hx=hx, fx=fx, kappa=1)
|
||||
aircraft = ACSim ((100,100), (0.1,0.1), 0.0)
|
||||
|
||||
R1 = RadarStation ((0,0), range_std=1.0, bearing_std=radians(0.5))
|
||||
R2 = RadarStation ((200,0), range_std=1.0, bearing_std=radians(0.5))
|
||||
|
||||
hx.R1 = R1
|
||||
hx.R2 = R2
|
||||
|
||||
f.x = array([100, 1, 100, 1])
|
||||
f.R = np.diag([1.0, 0.5, 1.0, 0.5])
|
||||
f.Q *= 0.0020
|
||||
|
||||
|
||||
|
||||
|
||||
xs = []
|
||||
track = []
|
||||
|
||||
for i in range(int(20/dt)):
|
||||
|
||||
pos = aircraft.update()
|
||||
|
||||
r1, b1 = R1.noisy_reading(pos)
|
||||
r2, b2, = R2.noisy_reading(pos)
|
||||
|
||||
z = np.array([r1, b1, r2, b2])
|
||||
track.append(pos.copy())
|
||||
|
||||
f.predict()
|
||||
f.update(z)
|
||||
xs.append(f.x)
|
||||
|
||||
|
||||
xs = asarray(xs)
|
||||
track = asarray(track)
|
||||
time = np.arange(0,len(xs)*dt, dt)
|
||||
|
||||
plt.figure()
|
||||
plt.subplot(411)
|
||||
plt.plot(time, track[:,0])
|
||||
plt.plot(time, xs[:,0])
|
||||
plt.legend(loc=4)
|
||||
plt.xlabel('time (sec)')
|
||||
plt.ylabel('x position (m)')
|
||||
|
||||
|
||||
|
||||
plt.subplot(412)
|
||||
plt.plot(time, track[:,1])
|
||||
plt.plot(time, xs[:,3])
|
||||
plt.legend(loc=4)
|
||||
plt.xlabel('time (sec)')
|
||||
plt.ylabel('y position (m)')
|
||||
|
||||
|
||||
plt.subplot(413)
|
||||
plt.plot(time, xs[:,1])
|
||||
plt.legend(loc=4)
|
||||
plt.xlabel('time (sec)')
|
||||
plt.ylabel('x velocity (m/s)')
|
||||
|
||||
plt.subplot(414)
|
||||
plt.plot(time, xs[:,3])
|
||||
plt.ylabel('y velocity (m/s)')
|
||||
plt.legend(loc=4)
|
||||
plt.xlabel('time (sec)')
|
||||
|
||||
plt.show()
|
||||
@@ -5,6 +5,9 @@ Created on Sun Feb 8 09:34:36 2015
|
||||
@author: rlabbe
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
from numpy import array, asarray
|
||||
from numpy.random import randn
|
||||
import math
|
||||
|
||||
Reference in new issue
Block a user