Updated robot localization example.

Put into a function, added parameters so we can run the alg
with different landmarks and sigmas.
This commit is contained in:
Roger Labbe committed 2015-05-31 14:30:53 -07:00
1 parent 54bce9d7a0
commit 2c8a2d0a8e
3 files changed
+356 -220

No files matched your search

+189 -188
View File
@@ -269,10 +269,6 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"**Author's note: this is still being heavily edited and added to - there is a lot of duplicate material, incorrect code, and so on. The examples are just a brain dump, not fully formulated and not ready to be used.**\n",
"\n",
"**The Unscented Kalman filter (UKF) chapter is much further along. The UKF is almost always better performing than the Extended Kalman filter, and is much easier to implement, so if you have an urgent need for nonlinear Kalman filter I'll point you towards that chapter for now.**\n",
"\n",
"At this point in the book we have developed the theory for the linear Kalman filter. Then, in the last two chapters we broached the topic of using Kalman filters for nonlinear problems. I chose to start off with the Unscented Kalman filter, which probably felt like quite a departure from the linear Kalman filter math. It was also a departure from the historical development of the Kalman filter.\n",
"\n",
"Shortly after Dr. Kálmán published his paper on the Kalman filter people recognized that his theory was limited to linear problems and immediately began work on extending the theory to work with nonlinear problems. As I have said elsewhere the only equation we really know how to solve is $\\mathbf{Ax} = \\mathbf{b}$. That is a slight exaggeration. Many of us have spent years at school learning sophisticated tricks and techniques to handle equations that are not linear. Yet after all that work the vast majority of equations that arise from simple physical systems remain intractable. Certainly there is no way to find general analytic solutions to the Kalman filter equations for nonlinear systems. \n",
@@ -316,7 +312,7 @@
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x6e59c88>"
"<matplotlib.figure.Figure at 0x57e9f60>"
]
},
"metadata": {},
@@ -365,7 +361,7 @@
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x6e59438>"
"<matplotlib.figure.Figure at 0x57e9a58>"
]
},
"metadata": {},
@@ -440,7 +436,7 @@
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAr8AAAERCAYAAABy58/tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8jWf+//H3ObJbYo19SWppQ9TEWi0qRRequ5a2iFo6\nSlE1Rauodvqt0l9pO6PaSrXTzuj67fYtQZFB01BKjb1qT6ggBFnP/fvjGokjCQknOUnu1/Px8JDc\n514+55iptyvX57oclmVZAgAAAGzA6e0CAAAAgJJC+AUAAIBtEH4BAABgG4RfAAAA2AbhFwAAALZB\n+AUAAIBtEH4BlGtOp1Pdu3f3dhml2sqVK+V0OhUdHV2o86dNmyan06lVq1YVc2UA4HmEXwDFxul0\nuv2qUKGCqlWrphtvvFFvvvmmsrKySqQOh8NRIs+50PlAWZRf+/fvL/E6L1TYz8nhcOT8AoCyxsfb\nBQAo3xwOh6ZOnSpJysrK0t69e/XFF1/oxx9/1NKlS/XVV195ucLiERoaqmnTprkdsyxL06dPd/tM\nLlS1atUSqu7qjBo1Sv3791fDhg29XQoAFJmDHd4AFBen0ymHw6Hs7Gy347t27VJkZKTOnDmjFStW\nqFu3bsVaw80336wffvih2J5RFAV9Jt60cuVKRUVFafDgwVqwYIG3ywGAYsW0BwAlrlmzZuratask\naf369W6v7dy5UxMnTlS7du1Uq1YtBQQEqEmTJho2bJgOHDiQ7/0yMjI0Y8YMXXPNNQoICFBYWJim\nTJmi9PT0fM8/fPiwXnjhBd14442qU6eO/P39Vb9+fQ0YMEBbt27Nc/7evXtz5g4fPnxYQ4YMUd26\ndeXj4+OxkWun06nQ0FCdOnVKY8eOVePGjeXr66s5c+Zc8eciSUuXLlXfvn1Vu3ZtBQQEqGHDhurT\np4++/fbby9ZkWZYmTJggp9OpPn366MyZM5Jy5/zGxcXl+x7Onj2rCRMmqFGjRgoICFCzZs00c+bM\nAp8xZ84chYeHKzAwUA0aNNDo0aOVkpKiJk2aKDQ0tLAfIQAUCtMeAHjF+R86+fv7ux3/4osv9Pbb\nbysqKko33XST/Pz8tGXLFi1YsEDffPONfv75Z9WvX9/tPv369dPXX3+ta665RqNHj1ZGRoZiYmK0\nefPmfJ8dFxenV155RVFRUYqMjFSlSpW0c+dOff755/r666+1evVqtWnTJs91ycnJ6ty5s6pWraoH\nH3xQLpdLNWrU8Nhnkp6eru7du+vUqVPq3bu3goKCcqYWFPVzkaSpU6dqxowZqlSpku6++241atRI\niYmJio+P14IFC9SnT59L1jJo0CB98sknGjp0qObNmyen8/LjJZmZmerVq5cSExPVu3dv+fj46Msv\nv9TEiROVlpam559/3u38J554QvPmzVO9evU0fPhw+fn56ZtvvlFCQoKysrLk5+d3BZ8kAFyCBQDF\nxOFwWE6nM8/xrVu3WkFBQZbT6bQ2b97s9tqhQ4esjIyMPNfExsZaFSpUsB5//HG34x999JHlcDis\njh07WmlpaTnHT5w4YTVv3txyOBxW9+7d3a45evSolZqamucZmzZtsipVqmTddtttbsd///13y+Fw\nWA6Hwxo0aJCVnZ19+TdfgII+k/P379Wrl3Xu3Lk8rxf1c1myZInlcDis0NBQ6+DBg3muu/DYihUr\nLIfDYUVHR1uWZVnHjx+3unbtajkcDuuFF17Ic+3UqVMth8NhrVq1Kt/30Lt3b7c/i6NHj1pVq1a1\nqlatamVmZuYcj4uLsxwOh9W8eXPr5MmTOcczMjJynh8aGprn+QBwNRj5BVCsrP82eVmW5dbwlpGR\noenTpysiIsLt/Hr16uV7n549eyo8PFyxsbFux2NiYiRJL730ktsoctWqVfXcc89p0KBBee5Vq1at\nfJ/RunVrde/eXUuXLlV2drYqVKjg9rq/v79mzZpVqBHQK+FwODRr1iwFBATkea2on8sbb7whSXr1\n1VfzjAhLyveYJO3bt0933HGHdu/erZiYmHw/v8u9h7lz57r9WdSqVUt9+/bVhx9+qJ07dyo8PFyS\ntHDhQknSpEmTFBwcnHO+r6+vXn75Zd10001FejYAFAbhF0Cxmz59ep5js2bN0lNPPZXv+f/4xz/0\n/vvva9OmTTp58qRbc9jF0yQ2bNggp9OZM4f4QpdqpPvuu+80b948rV+/XsnJyW7LrjkcDh07dky1\na9d2u6ZJkyaqWbNmgfe8WgEBAXn+MXChonwu8fHxcjgcuv322wv9/O3bt+uGG27Q2bNn9d1336lH\njx5Ffg/BwcEKCwvLc/z89I0TJ07kHNu4caMk5RtyO3bsmOcfHwDgCYRfAMXqwpUN0tLSlJCQoBEj\nRmjChAmqXbu2Hn74Ybfzx40bpzlz5qhevXq6/fbbVb9+fQUGBkoyo7wXr4WbkpKi4OBg+fr65nl2\nSEhIvjXNmTNH48aNU/Xq1dWzZ081atRIQUFBcjgc+vLLL7Vp06Z8m+Xq1KlzRZ9BYRVUr1T0z+Xk\nyZOqUqWKgoKCCv38nTt36vjx42rdurXatm17Re+hoOXafHzMXzcXBvaUlBQ5HI48/8iQpAoVKnh0\nPjUAnEf4BVBiAgIC1LVrVy1evFgtW7bUn//8Z91yyy05ofLo0aOaO3euIiIitHbtWlWsWNHt+o8+\n+ijPPYODg5WSkqLMzMw8AfjIkSN5zs/KytK0adNUt25dbdiwIU/wWrNmTYH1F/emDgXd/0o+l6pV\nq+r48eM6c+ZMnvML0rdvX7Vo0UKTJk3Kmf5R0BQRT6hSpYokKSkpSZUrV3Z7LTs7W8nJyUUK7wBQ\nGCx1BqDENW7cWM8884xSU1Pduv/37Nkjy7LUq1evPIHt4MGD2rNnT557tW3bVi6XK9+tdvM7duzY\nMaWkpKhz5855gm9qaqo2bNhQ6nYuu5LP5YYbbpBlWfr++++L9KxnnnlGc+bM0a+//qpu3bopMTHx\nqmq/lMjISFmWpdWrV+d5LT4+vlSthQyg/CD8AvCKcePGqWbNmnr//fe1a9cuSWZOrST9+9//lsvl\nyjk3NTVVw4YNyzcMRUdHS5KeffZZpaWl5Rw/ceKEXnzxxTznh4SEKCgoSOvXr89Zt1YyS3SNGTNG\nycnJHnl/nnR+rduifC6jR4+WJE2YMEEHDx7M8/qhQ4cKfN7o0aP19ttva+fOneratesl1xG+GgMH\nDpQkvfzyyzp58mTO8YyMDE2ePLlYngkAhF8AXlGpUiVNnDhRWVlZmjJliiQzp/ahhx5SQkKC2rRp\no/Hjx2vo0KFq2bKl9u7dqzZt2uSsD3xe//791bdvX61bt06tWrXS+PHj9eSTTyoiIkItW7bM81yn\n06knn3xS+/btU0REhMaOHauRI0eqdevW+r//+z917949zzO8rXbt2kX+XHr27KkpU6Zo3759Cg8P\n16OPPqpnn31Ww4YNU0REhEaNGnXJZw4dOlQffPCB9u7dqy5duuQ7uny1unbtquHDh2v37t1q1aqV\nnnzySU2YMEERERFKT09XvXr1im1lDQD2xX9VAHjNyJEjVa9ePX322WfatGmTJOm9997T5MmTde7c\nOf3tb3/L2aFszZo1Cg4OzndKwqeffpqznNpbb72lb7/9VtHR0Vq0aFG+z50xY4Zmz56twMBAzZ8/\nX//7v/+rDh06KCEhQY0aNSp10x6kK/tcpk+fru+//15dunTR999/r1mzZmnJkiUKDQ3V8OHDL/vM\nAQMGaNGiRUpMTFS3bt20Y8cOSWZuclE/o4Ku+fvf/67XXntNlStX1vz58/XPf/5TvXr1UmxsrFJS\nUnLmBQOApzis0jbEAQCwvV27dqlFixbq379/vg19AHClGPkFAHjN0aNH3eYxS9LZs2c1duxYSdI9\n99zjjbIAlGMsdQYA8Jq5c+fqww8/VPfu3VWnTh0lJSVp+fLlOnTokO644w7df//93i4RQDlD+AUA\neE2PHj20ceNGxcbG6vjx4/L19VXz5s01duzYnNFfAPCkAuf8pqSklHQtAAAAgMcEBwfnOcacXwAA\nANgG4RcAAAC2Uag5v/kNGQMAAAClzeWm7jLyCwAAANsg/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAA\nANsg/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg\n/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg/AIA\nAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2\nCL8AAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2CL8A\nAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2CL8AAACwDcIvAAAAbIPwCwAAANsg/AIAAMA2CL8AANiA\n0yl98YX3nj9tmlS7tqnjgw+8VwdA+AUAoJzYsMGEy5tuyvtaUpLUp0/J1yRJW7ZIL7wgzZ9v6ujX\nT2rSRJo92zv1wN4IvwAAlBPvviu1by/Fx0vbt7u/FhIi+fkVfG1WVtGfl5lZuPN27za/33WXqSMg\nQHI4iv48wBMIvwAAlAPnzkn//Kc0fboUFSW995776xdOe9i713z/r3+Zc4OCzKisJC1cKEVEmIBa\np440eLD7Pf72N+nee6VKlaRnn5VcLumxx6SwMHOf5s2lV1+VLMtcM22aOf/89U6n1L27tG+fNGGC\n+b5ChWL8YICL+Hi7AAAAcPU++0wKDpZuu01KTZWeeEJ6+WXJ5xJ/00+aZKYexMSY8Line truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x6e9b3c8>"
"<matplotlib.figure.Figure at 0x510d2b0>"
]
},
"metadata": {},
@@ -776,9 +772,9 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAwYAAAEtCAYAAACyMncIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd41GWi9//3ZNIgIZUUSEgIkJDQQ0+UIr0pdhbPgo0H\nXLEd3cfn8Pu56qrrrmc5u5xdyyrPsSyoqLsr4CJKUxGIKwRCTQKBFNIT0kP6fJ8/BkaiJJlAEhLy\neV3XXJC5y9xzOYbvZ753MRmGYSAiIiIiIt2aw7UegIiIiIiIXHsKBiIiIiIiomAgIiIiIiIKBiIi\nIiIigoKBiIiIiIigYCAiIiIiIigYiIiIiIgInSQY/Pa3v2XcuHF4enri7+/PLbfcwvHjx39S7/nn\nnycoKIiePXty0003ceLEiUblNTU1PProo/j5+eHu7s7ChQvJyspqVKe4uJglS5bg5eWFl5cXS5cu\npbS0tF3fn4iIiIhIZ9cpgsE333zDI488QlxcHLt27cLR0ZEZM2ZQXFxsq/PKK6/whz/8gVdffZX9\n+/fj7+/PzJkzqaiosNV54okn+Mc//sGGDRv49ttvKSsrY8GCBVgsFlude+65h4SEBL788ku++OIL\nDh48yJIlSzr0/YqIiIiIdDamznjycWVlJZ6enmzatIn58+djGAZ9+/blscceY9WqVQBUV1fj7+/P\n6tWrWb58OaWlpfj7+/Puu++yePFiADIzMwkNDWXr1q3MmjWLxMREhg4dyt69e4mJiQFg7969TJo0\niaSkJCIiIq7ZexYRERERuZY6xR2DHysrK8NiseDt7Q1AamoqeXl5zJo1y1bH1dWVyZMns2/fPgDi\n4+Opq6trVCc4OJioqCji4uIAiIuLw93d3RYKAGJjY3Fzc7PVERERERHpjjplMHj88ceJjo62XcDn\n5uYCEBAQ0Kiev7+/rSw3Nxez2Yyvr2+jOgEBAY3q+Pn5NSo3mUyN+hERERER6Y4cr/UAfuzJJ59k\n37597NmzB5PJ1GL9lupcyUwpLUYWERERka7M09Oz1W061R2Df//3f+ejjz5i165d9O/f3/Z8YGAg\nAHl5eY3q5+Xl2coCAwNpaGjg3LlzzdYpKChoVG4YBvn5+bY6IiIiIiLdUacJBo8//rgtFPx4EXBY\nWBiBgYFs27bN9lx1dTV79uwhNjYWgDFjxuDk5NSoTmZmJklJSbY6MTExVFRUNFpPEBcXR2Vlpa2O\niIiIiEh31Cl2JVq5ciXr169n48aNREVF2Z7v1asXbm5uAPznf/4nL7/8Mu+88w7h4eG89NJL7Nmz\nh+TkZFudhx9+mM8++4x3330XHx8fnnzySUpLS4mPj7dNOZo3bx6ZmZm89dZbGIbB8uXLGTBgAJs2\nbbK97qVTia7kNoxIRzpw4AAAY8eOvcYjEbGPPrPSlejzKp3NqbMGe4/Us+fIOeKOGZzM6E2DxYEt\nq78ndsgQW70ruYbtFGsM3njjDUwmE9OnT2/0/PPPP8+zzz4LwNNPP01VVRUrV66kuLiYiRMnsm3b\nNlsoAFizZg2Ojo4sWrSIqqoqZsyYwfr16xutQ/jggw949NFHmT17NgALFy7k1Vdf7YB3KSIiIiLS\nOkVlBp9+Y7DncBnfJEBajifWS/jGm/J8HudG7JDLdmG3TnHHoLPRHQPpSvRtlnQ1+sxKV6LPq3S0\n0gqDo6fhu+MVfH2wjB37/aitd2qxXexw2PJKme3nLnvHQERERESkuzqYbLB2cz3b99dxJqvHhWfd\nLzxaFt4Ppo25+nEoGIiIiIiIdLDUnAb+urWQj3c6kJjWG+tlecuX5mYzTB4J44bAiIFw4wgICbRO\nm7/aHfcVDERERERE2tnJDIN3tlSw71glSWnOFJR4A/52tQ32h6VzYWwkTBoJvp4tn/V1JRQMRERE\nRETamMVisPdoFR9uK2T7fmdOZwVgz/QgBweICoXhA2HYABg9GKaPBSfH9gkDl1IwEBERERG5SudK\nDRLTGthzJI9t39ewP9GPyip3oJ9d7aePhV/cZv3T0739Q8DlKBiIiIiIiNjJMAzijsG3hyE5HY6n\n1pCcYaKs0hkwA33t6sfRDBOHwvwb4K6bYEDQtQkDjcZ0rQcgIiIiItLZGYbB3iPw7Np6vj506SW0\ni919TBoJi2dCdIR1mpBbj2sfBi6lYCAiIiIi8iMHkw12HICjKRZOnj1Pao6JwhI3WnP57OEGM8fB\n3BiYMwH6+nWuIPBjCgYiIiIi0u3V1BocOwPxybDui2r2HnG9UOKAPecJuDhDeDAMDoHIUJg5HmKG\ndcyi4baiYCAiIiIi3U5VjcHmb2H7fjiQVM+JVAfqGxwulLo22xZg8ii4bYo1BET0g5AAMJu7Tgi4\nHAUDEREREekWSisMPtkFX3xnYdv3BhVV5gsl9l0SuzjDzTfA/7oFZowDk6lrB4EfUzAQERERkevW\nmSyDrd8ZbN9fyZf/cqWm1hHr9KCW3TQaFk62Tg8K8Ibwfp1vwXBbUjAQERERketCdY3Bt4dhxwE4\nnlpLUlotZ7LdARP2rBMICbAeKDZ6sHWx8Nio6zcEXI6CgYiIiIh0aSmZBq/9vZ53tkBZ5cXLW+cL\nj6b5e1u3D5070bqFqJ939woCP6ZgICIiIiJdTmlFA+u+yOOvW+FAUh/svawN8oMHFsCCG2B0RNdf\nMNyWFAxEREREpFOzWAwS0+CL78rY9n0lCSmuFBR7An1abGsyWXcQmjMRbhhuPW3YsQttIdqRFAxE\nREREpNOpqjHYsb+adV+Usn1/L0oregIeFx5N8/GwbiM6JRpCA6zbiXb3KUL2UjAQERERkWvOMAyO\nnm7go52FfPkvC0dSelPf4Io9ZwoAjIuCh2+Hu6dDDxcFgSuhYCAiIiIiHc4wDE5mwLb9xXzxXSVx\nxzwoKfcAAuxqbzJZTxpecCPcMxNGD1YYuFoKBiIiIiLS7krKDb4/Ad8eruGrg5UcTulJZZUr4H3h\n0bxePeHGETBpFEwaad1FqKerwkBbUjAQERERkTbX0GBwIAk+22Nh054ajp/pcaHE5cKjZf0CYOY4\nuHWy9U8XZwWB9qRgICIiIiJtoqjM4Mt/wd+/rmTnAUdKK1ywnjLco6WmAPR0tZ42PHM8zBpvPXHY\nZFIY6CgKBiIiIiJyRQzD4EgKfPpNNRu/reHo6V4YhgPgZld7T3eYMATGD7EGgtjhuitwLSkYiIiI\niIhdMvOt04PScurZd7SUXfGuFJW5Yd05qOXdg4YNgInDrGcJTBxq3UrUwUFBoLNQMBARERGRRgzD\n4JtDsPU7SMuB1ByD1GwL50rNF2o4Ar4t9uPpDrPHw9wY6wFjAT4KAZ2ZgoGIiIiIAFBQbPDeVli7\nGU6dvbTEBJibaNXY8IHWIDA/BmKG6ZThrkTBQERERKSbqq4x+PYw7DsG27+38N0xExajdRfyPV1h\nxliYFwtzJ0K/AAWBrkrBQERERKQbqa4x2PY9fLzTYPMeg4oqhwslDs22A3BxhjGDYegACPazLhye\nEq0Fw9cLBQMRERGR69zFMLD+y2o+j3PkfLUj1ulBTV/QOzka3DbZxNwY6N/H+gjqralB1zMFAxER\nEZHrTEODQVoOJJ+t4d0tpWzZ50VVjTP27hy0ZA7cN8+En7dCQHeiYCAiIiLSxRmGQUYeHEy2sPnb\nUjZ+24PSClesJwz7N9s20BfmxVjPEJg+FkIDFQa6KwUDERERkS7GYjE4mw9fHYQPt1fzr+MOlFU6\nY10n4N1i+0BfuH0K3DUNbhwBZrPCgCgYiIiIiHQJ56sNdh6A9V/W8fk+E5XVFy/jWp4eBBDgA3dM\nVRiQpikYiIiIiHRCFecNPttr3Ub0cEo1x884U1vvCDjZ1d7DDSL6WRcNL5oOt0wCJy0clmYoGIiI\niIh0EnX1BgeT4U+fVPKPr12pqTNjnR7Us8W27j1gZDiMCoep0TA/FlxdFATEfgoGIiIiIteAYRgk\npcN3xyHuaC3fHa8mOb0ndQ2OgFuL7b16wdAw6zkCd91kPXHYwUFBQK6cgoGIiIhIB0rJNPifzxr4\ncEc9GbkuF551vvBoXkgAzI2Bn82ASSMVBKRttXzEXQfYvXs3t9xyC8HBwTg4OPDee+81Kr/vvvtw\ncHBo9IiNjW1Up6amhkcffRQ/Pz/c3d1ZuHAhWVlZjeoUFxezZMkSvLy88PLyYunSpZSWlrb7+xMR\nEZHuLSnd4OHflzD4Z8VELIJX1psvCQVN6xcAv7wHtqyG059A6t/hjf9tYkq0SaFA2lynuGNQWVnJ\niBEjuPfee1m6dCkmU+MPuslkYubMmaxbt872nLNz41T9xBNPsHnzZjZs2ICPjw9PPvkkCxYsID4+\nHgcHa/655557yMzM5Msvv8QwDJYtW8aSJUvYvHlz+79JERER6TYMw2Dj7nI2fVvEwZMGx06HAJ52\nte3bG8YPgZ/Phltu1EnD0nE6RTCYO3cuc+fOBax3B37MMAycnZ3x97/8AR2lpaW8/fbbvPvuu0yf\nPh2AdevWERoayo4dO5g1axaJiYl8+eWX7N27lwkTJgDw5ptvMmnSJE6ePElERET7vDkRERHpFqpr\navj8u1Q2f1vGl/8KIq+oL9Cr2TZOjnDTaJg4DMYMtj76+ikIyLXRKYJBS0wmE3v27CEgIAAvLy+m\nTJnCb37zG/z8/ACIj4+nrq6OWbNm2doEBwcTFRVFXFwcs2bNIi4uDnd3d2JiYmx1YmNjcXNzIy4u\nTsFAREREWsViWMgqSOPbhGT+/Dd/jqQMoqpmsF1tY4bBgzdbzxXwdFcQkM6hSwSDOXPmcMcddxAW\nFkZqairPPPMM06ZNIz4+HmdnZ3JzczGbzfj6+jZqFxAQQG5uLgC5ubm2IHGRyWTC3Line truncated
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x8047390>"
"<matplotlib.figure.Figure at 0x808c710>"
]
},
"metadata": {},
@@ -786,9 +782,9 @@
},
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x80d7240>"
"<matplotlib.figure.Figure at 0x593d5f8>"
]
},
"metadata": {},
@@ -796,9 +792,9 @@
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAwMAAAEtCAYAAABUG7xMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X9cVHXe///HmQEEQUGJgQyzNDVy0xJ/BGX+IsQulfXq\nh4uFa7nFbq0b69W62/WpsHZrt92uLnWrTfebSZSX7ZbtVbulpNX6I7oSXdZKXe2XhQb+AhQEhJnz\n/WOYYQYGHRWcAZ73m3ObOef9PmdeZ+Z4mNd5v9/nGKZpmoiIiIiISLdjCXQAIiIiIiISGEoGRERE\nRES6KSUDIiIiIiLdlJIBEREREZFuSsmAiIiIiEg3pWRARERERKSbUjIgIiIiItJNBSwZ2LhxIzNm\nzCAxMRGLxUJ+fn6rOnv27OHf//3f6dOnD5GRkSQnJ7N79253eX19PfPnzycuLo6oqCgyMzPZv3+/\n1zoqKirIzs4mJiaGmJgY5syZQ1VVVYdvn4iIiIhIsAtYMlBTU8Pw4cNZsmQJERERGIbhVf7ll19y\n7bXXMmjQIN577z0+/fRTHnvsMaKiotx1cnNzWbNmDatXr2bTpk0cO3aMadOm4XA43HVmz55NSUkJ\n69atY+3atWzfvp3s7Ozztp0iIiIiIsHKCIY7EPfq1YtnnnmGOXPmuOfNnj0bq9VKQUGBz2Wqqqqw\n2WysXLmSrKwsAEpLSxkwYABvv/026enp7Nq1i2HDhrFlyxZSUlIA2LJlC+PGjWP37t0MGTKk4zdO\nRERERCRIBeWYAYfDwV//+leSkpLIyMjAZrMxZswY/vSnP7nrbNu2jYaGBtLT093zEhMTSUpKoqio\nCICioiKioqLciQBAamoqkZGR7joiIiIiIt1VUCYDBw8epLq6mscff5yMjAzWr19PVlYWt912G2+9\n9RYAZWVlWK1WYmNjvZaNj4+nrKzMXScuLs6r3DAMbDabu46IiIiISHcVEugAfHH1+f/ud79Lbm4u\nAMOHD6e4uJinn36aG2+8sc1lz7bXkwYVi4iIiEhnFh0dfcbLBGXLwAUXXEBISAhXXHGF1/zLL7+c\nr7/+GoCEhATsdjtHjhzxqlNeXk5CQoK7zqFDh7zKTdPk4MGD7joiIiIiIt1VUCYDYWFhjB492usy\nouC81Ogll1wCQHJyMqGhoRQWFrrLS0tL2b17N6mpqQCkpKRQXV3tNT6gqKiImpoadx0RERERke4q\nYN2Eampq2Lt3L+DsFrRv3z5KSkqIjY2lf//+LFy4kFtvvZVx48YxceJE3nvvPV555RX+93//F3A2\ng8ybN4+FCxdis9no27cvCxYsYMSIEaSlpQG4ByDn5OSwfPlyTNMkJyeH6dOnM3jw4DZjO5smFpHz\nqbi4GIBRo0YFOBIR/2iflc5E+6t0Jufa1T1gLQNbt25l5MiRjBw5krq6OvLy8hg5ciR5eXkAZGZm\nsnz5cp588kmGDx/OM888Q0FBAVOnTnWvY/HixcycOZNZs2Zx3XXX0bt3b958802vexasWrWKESNG\nMGXKFDIyMrj66qvbvFypiIiIiEh3EhT3GQgGnlmVWgYk2OmslXQ22melM9H+Kp3Juf6GDcoxAyIi\nIiIi0vGUDIiIiIiIdFNKBkREREREuiklAyIiIiIi3ZSSARERERGRbkrJgIiIiIhIN6VkQERERESk\nm1IyICIiIiLSTSkZEBERERHpppQMiIiIiIh0U0oGRERERES6KSUDIiIiIiLdlJIBEREREZFuSsmA\niIiIiEg3pWRARERERKSbUjIgIiIiItJNKRkQEREREemmlAyIiIiIiHRTSgZERERERLopJQMiIiIi\nIt2UkgERERERkW5KyYCIiIiISDelZEBEREREpJsKWDKwceNGZsyYQWJiIhaLhfz8fK/yuXPnYrFY\nvB6pqalederr65k/fz5xcXFERUWRmZnJ/v37vepUVFSQnZ1NTEwMMTExzJkzh6qqqg7fPhERERGR\nYBewZKCmpobhw4ezZMkSIiIiMAzDq9wwDG644QbKysrcj7feesurTm5uLmvWrGH16tVs2rSJY8eO\nMW3aNBwOh7vO7NmzKSkpYd26daxdu5bt27eTnZ19XrZRRERERCSYhQTqjadOncrUqVMBZytAS6Zp\nEhYWhs1m87l8VVUVK1asYOXKlUyePBmAgoICBgwYwPr160lPT2fXrl2sW7eOLVu2MHbsWACWLVvG\nuHHj2LNnD0OGDOmYjRMRERER6QSCdsyAYRhs3ryZ+Ph4hg4dyt13382hQ4fc5du2baOhoYH09HT3\nvMTERJKSkigqKgKgqKiIqKgoUlJS3HVSU1OJjIx01xERERER6a4C1jJwOhkZGdx0001ceumlfPnl\nlzz44INMmjSJbdu2ERYWRllZGVarldjYWK/l4uPjKSsrA6CsrIy4uDivcsMwsNls7joiIiIiIt1V\n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 truncated
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x7fdd470>"
"<matplotlib.figure.Figure at 0x58c5668>"
]
},
"metadata": {},
@@ -901,7 +897,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQEAAAAmBAMAAAA2HDP0AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEO+Zu3ZEIokyq83d\nZlSLRjhlAAAD0ElEQVRYCcWXPWgUQRTH/5v72s19ZIlN0MiFWKa5RkQEOSEiVhrkRIRoqmihcAEr\nFbzCYAoTDkQIKBiLKCLiaSPhUC74UeqCBNIEAiJYWEREtBDjzNzO7Oz59uP8wIHczr73n//88mbC\nvaB/eAf+20gMD9voJ7af3n28ToT/RaiHJEjZ93MT/2I7wpMmsPCU0P5eKKqcNAHwNfZ2W6Z3h2lV\nOW86tCyAwNqw8HZ8DoXxEs6u0Evd6DMMVkMEqpzJOs5TOprgktky8b42iHcYx93t1EIZyw/BbMgX\n8umWswcgfxWaYOvR6TEk6zewhFlcWyKN3WByAYVPYQJeznxlH87BfE4dBE0gHHvY7o+MZbM6ELZB\n3wLSP0IEopwfMIRVoEXpQgguVhzMr1bza2PUQhkrlpD+Il+IpyjnkrWAOzDI0wohYNAxxqUarG9R\numXzBJbXC6XuTiHzIspX5GMRnF55gJlqZrFKWIbUgFAToWIt/BSIJf6QS9C32c3Y0Dz6SijoN7Fr\npz+uQa6MfOhfo0ZLTjsIMrFKodcgNYREg7CO7dRB0DvBzeYvU1eG2IaHXqO/TqRiO3UQXBBe5XRL\nPH0fQVgDlXs+nfsS4mTNHNBWdBDsFamGQZxsOd0SyZgfIU5JnNFM/ASGu0nBfTJhWopJLJn85Uk4\nYcJVZVG0vQV+gsR6O7PNuwdJpdWwVCxwQjihrNQf1QzwEwy2M8ZtT+ERaFheOmhGOHkExhNtmZ9g\nFuBN1ZapmpIIAh7UsVQ2cEI4CQLzyPV72Kodgr8G7PBEU/Vms6WsOYEI6lgqGzShnATBWG/jlbFL\n/7731SDlQDVV0psTiKCOJZOBT8pJENSzDnKb37WFimCSBXM84etR7zcfN5tOR1BbTk1pp95mc6TJ\nOvA+75K3F0uC1Ah7r7Af3lTxIVtbcQ9kUGQiPgKd2jfxFup+A0kwdXJCdFGiqeIS2dpyAhXkiagR\n6MQJMhtXUfM7SAIU2Xccy4mmikt63NaWE4hgzOYdgU6cwFg8XbHzO1fX8f4t0muH+Ubyv7bEV+Rs\nFuBDb23FKfBgvOadCYOc2qfABIVjRqtQSjm9Uw57UwSZz7ybbQ+9tU3IYLzmnamDnFCSVgetRrZu\nOtaeOosoAjy0l6WCbG3jNe/cIsoJQ6aTtQftK0aNqT2CW3OKkWxt4zXvnCDKKfNyHNbsFayt2D6C\n7Ah/F4NsbdUZSVXgM8qJ33hveDUofPaixCxm885XRjjhYln39wigf2Hpku7nXTkxguLo/u43+Vsr\nUqOHbKQnT/0tv+59MpOT+AmTXbj1s0kQCQAAAABJRU5ErkJggg==\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQEAAAAmBAMAAAA2HDP0AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEO+Zu3ZEIokyq83d\nZlSLRjhlAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD0ElEQVRYCcWXPWgUQRTH/5v72s19ZIlN0MiF\nWKa5RkQEOSEiVhrkRIRoqmihcAErFbzCYAoTDkQIKBiLKCLiaSPhUC74UeqCBNIEAiJYWEREtBDj\nzNzO7Oz59uP8wIHczr73n//88mbCvaB/eAf+20gMD9voJ7af3n28ToT/RaiHJEjZ93MT/2I7wpMm\nsPCU0P5eKKqcNAHwNfZ2W6Z3h2lVOW86tCyAwNqw8HZ8DoXxEs6u0Evd6DMMVkMEqpzJOs5TOprg\nktky8b42iHcYx93t1EIZyw/BbMgX8umWswcgfxWaYOvR6TEk6zewhFlcWyKN3WByAYVPYQJeznxl\nH87BfE4dBE0gHHvY7o+MZbM6ELZB3wLSP0IEopwfMIRVoEXpQgguVhzMr1bza2PUQhkrlpD+Il+I\npyjnkrWAOzDI0wohYNAxxqUarG9RumXzBJbXC6XuTiHzIspX5GMRnF55gJlqZrFKWIbUgFAToWIt\n/BSIJf6QS9C32c3Y0Dz6SijoN7Frpz+uQa6MfOhfo0ZLTjsIMrFKodcgNYREg7CO7dRB0DvBzeYv\nU1eG2IaHXqO/TqRiO3UQXBBe5XRLPH0fQVgDlXs+nfsS4mTNHNBWdBDsFamGQZxsOd0SyZgfIU5J\nnNFM/ASGu0nBfTJhWopJLJn85Uk4YcJVZVG0vQV+gsR6O7PNuwdJpdWwVCxwQjihrNQf1QzwEwy2\nM8ZtT+ERaFheOmhGOHkExhNtmZ9gFuBN1ZapmpIIAh7UsVQ2cEI4CQLzyPV72Kodgr8G7PBEU/Vm\ns6WsOYEI6lgqGzShnATBWG/jlbFL/7731SDlQDVV0psTiKCOJZOBT8pJENSzDnKb37WFimCSBXM8\n4etR7zcfN5tOR1BbTk1pp95mc6TJOvA+75K3F0uC1Ah7r7Af3lTxIVtbcQ9kUGQiPgKd2jfxFup+\nA0kwdXJCdFGiqeIS2dpyAhXkiagR6MQJMhtXUfM7SAIU2Xccy4mmikt63NaWE4hgzOYdgU6cwFg8\nXbHzO1fX8f4t0muH+Ubyv7bEV+RsFuBDb23FKfBgvOadCYOc2qfABIVjRqtQSjm9Uw57UwSZz7yb\nbQ+9tU3IYLzmnamDnFCSVgetRrZuOtaeOosoAjy0l6WCbG3jNe/cIsoJQ6aTtQftK0aNqT2CW3OK\nkWxt4zXvnCDKKfNyHNbsFayt2D6C7Ah/F4NsbdUZSVXgM8qJ33hveDUofPaixCxm885XRjjhYln3\n9wigf2Hpku7nXTkxguLo/u43+VsrUqOHbKQnT/0tv+59MpOT+AmTXbj1s0kQCQAAAABJRU5ErkJg\ngg==\n",
"text/latex": [
"$$\\left[\\begin{matrix}\\frac{x_{pos}}{\\sqrt{x_{alt}^{2} + x_{pos}^{2}}} & 0 & \\frac{x_{alt}}{\\sqrt{x_{alt}^{2} + x_{pos}^{2}}}\\end{matrix}\\right]$$"
],
@@ -1050,7 +1046,7 @@
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x80b8978>"
"<matplotlib.figure.Figure at 0x8067a90>"
]
},
"metadata": {},
@@ -1483,7 +1479,7 @@
},
{
"cell_type": "code",
"execution_count": 17,
"execution_count": 37,
"metadata": {
"collapsed": true
},
@@ -1492,13 +1488,14 @@
"from filterpy.kalman import ExtendedKalmanFilter as EKF\n",
"from numpy import dot, array, sqrt\n",
"class RobotEKF(EKF):\n",
" def __init__(self, dt, wheelbase):\n",
" def __init__(self, dt, wheelbase, sigma_vel, sigma_steer):\n",
" EKF.__init__(self, 3, 2, 2)\n",
" self.dt = dt\n",
" self.wheelbase = wheelbase\n",
" self.sigma_vel = sigma_vel\n",
" self.sigma_steer = sigma_steer\n",
"\n",
" a, x, y, v, w, theta, time = symbols('a, x, y, v, w, theta, t')\n",
"\n",
" d = v*time\n",
" beta = (d/w)*sympy.tan(a)\n",
" r = w/sympy.tan(a)\n",
@@ -1525,7 +1522,7 @@
" V = array(self.V_j.evalf(subs=self.subs)).astype(float)\n",
"\n",
" # covariance of motion noise in control space\n",
" M = array([[0.1*u[0]**2, 0], [0, sigma_steer**2]])\n",
" M = array([[self.sigma_vel*u[0]**2, 0], [0, self.sigma_steer**2]])\n",
"\n",
" self.P = dot(F, self.P).dot(F.T) + dot(V, M).dot(V.T)\n",
"\n",
@@ -1547,7 +1544,7 @@
" coshb = cos(h + b)\n",
" return x + array([[-r*sinh + r*sinhb],\n",
" [r*cosh - r*coshb],\n",
" [b]])\n"
" [b]])"
]
},
{
@@ -1580,210 +1577,214 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"The rest of the code runs the simulation, and shouldn't need to much comment by now. I create a variable `map` that contains the coordinates of the landmarks. I update the simulated robot position 10 times a second, but run the EKF only once. This is for two reasons. First, we are not using Runge Kutta to integrate the differental equations of motion, so a narrow time step allows our simulation to be more accurate. Second, it is fairly normal in embedded systems to have limited processing speed. This forces you to run your Kalman filter only as frequently as absolutely needed."
"The rest of the code runs the simulation and plots the results, and shouldn't need too much comment by now. I create a variable `landmarks` that contains the coordinates of the landmarks. I update the simulated robot position 10 times a second, but run the EKF only once. This is for two reasons. First, we are not using Runge Kutta to integrate the differental equations of motion, so a narrow time step allows our simulation to be more accurate. Second, it is fairly normal in embedded systems to have limited processing speed. This forces you to run your Kalman filter only as frequently as absolutely needed."
]
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": 113,
"metadata": {
"collapsed": false
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x805b5f8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"outputs": [],
"source": [
"from filterpy.common import plot_covariance_ellipse\n",
"from math import sqrt, tan, cos, sin, atan2\n",
"dt = 1.0\n",
"ekf = RobotEKF(dt, wheelbase=0.5)\n",
"sigma_steer = np.radians(1)\n",
"sigma_h = np.radians(1)\n",
"sigma_r = 0.1\n",
"#np.random.seed(1234)\n",
"\n",
"m = array([[5, 10],\n",
" [10, 5],\n",
" [15, 15]])\n",
"def run_localization(landmarks, sigma_vel, sigma_steer, sigma_range, sigma_bearing):\n",
" ekf = RobotEKF(dt, wheelbase=0.5, sigma_vel=sigma_vel, sigma_steer=sigma_steer)\n",
" ekf.x = array([[2, 6, .3]]).T\n",
" ekf.P = np.diag([.1, .1, .1])\n",
" ekf.R = np.diag([sigma_range**2, sigma_bearing**2])\n",
"\n",
"ekf.x = array([[2, 6, .3]]).T\n",
"u = array([1.1, .01])\n",
"ekf.P = np.diag([.1, .1, .1])\n",
"ekf.R = np.diag([sigma_r**2, sigma_h**2])\n",
"c = [0, 1, 2]\n",
" sim_pos = ekf.x.copy() # simulated position\n",
" u = array([1.1, .01]) # steering command (vel, steering angle radians)\n",
"\n",
"xp = ekf.x.copy()\n",
" plt.scatter(landmarks[:, 0], landmarks[:, 1], marker='s', s=60)\n",
" for i in range(200):\n",
" sim_pos = ekf.move(sim_pos, u, dt/10.) # simulate robot\n",
" plt.plot(sim_pos[0], sim_pos[1], ',', color='g')\n",
"\n",
"plt.scatter(m[:, 0], m[:, 1], marker='s', s=60)\n",
"for i in range(150):\n",
" xp = ekf.move(xp, u, dt/10.) # simulate robot\n",
" plt.plot(xp[0], xp[1], ',', color='g')\n",
" if i % 10 == 0:\n",
" ekf.predict(u=u)\n",
"\n",
" if i % 10 == 0:\n",
" ekf.predict(u=u)\n",
" plot_covariance_ellipse((ekf.x[0,0], ekf.x[1,0]), ekf.P[0:2, 0:2], std=6,\n",
" facecolor='b', alpha=0.08)\n",
"\n",
" plot_covariance_ellipse((ekf.x[0,0], ekf.x[1,0]), ekf.P[0:2, 0:2], std=10,\n",
" facecolor='b', alpha=0.08)\n",
" x, y= sim_pos[0, 0], sim_pos[1, 0]\n",
" for lmark in landmarks:\n",
" d = np.sqrt((lmark[0] - x)**2 + (lmark[1] - y)**2) \n",
" a = atan2(lmark[1] - y, lmark[0] - x) - sim_pos[2, 0]\n",
" z = np.array([[d + randn()*sigma_range], [a + randn()*sigma_bearing]])\n",
"\n",
" for lmark in m:\n",
" d = np.sqrt((lmark[0] - xp[0, 0])**2 + (lmark[1] - xp[1, 0])**2) + randn()*sigma_r\n",
" a = atan2(lmark[1] - xp[1, 0], lmark[0] - xp[0, 0]) - xp[2, 0] + randn()*sigma_h\n",
" z = np.array([[d], [a]])\n",
" ekf.update(z, HJacobian=H_of, Hx=Hx, residual=residual,\n",
" args=(lmark), hx_args=(lmark))\n",
"\n",
" ekf.update(z, HJacobian=H_of, Hx=Hx, residual=residual,\n",
" args=(lmark), hx_args=(lmark))\n",
"\n",
" plot_covariance_ellipse((ekf.x[0,0], ekf.x[1,0]), ekf.P[0:2, 0:2], std=10,\n",
" facecolor='g', alpha=0.4)\n",
"\n",
" #plt.plot(ekf.x[0], ekf.x[1], 'x', color='r')\n",
"\n",
"plt.axis('equal')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Example: A falling Ball"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**author's note: ignore this section for now. **\n",
"\n",
"In the **Designing Kalman Filters** chapter I first considered tracking a ball in a vacuum, and then in the atmosphere. The Kalman filter performed very well for vacuum, but diverged from the ball's path in the atmosphere. Let us look at the output; to avoid littering this chapter with code from that chapter I have placed it all in the file `ekf_internal.py'."
" plot_covariance_ellipse((ekf.x[0,0], ekf.x[1,0]), ekf.P[0:2, 0:2], std=6,\n",
" facecolor='g', alpha=0.4)\n",
" plt.axis('equal')\n",
" #plt.xlim((0,20))\n",
" plt.show()\n",
" return ekf"
]
},
{
"cell_type": "code",
"execution_count": 20,
"execution_count": 110,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAEWCAYAAACkORurAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmUXHd99/n3Xatu7dXVm7pbau2SZVvGQl5iEjC7NZxx\ntiEnGCJrngnwYJxAQgLhIUFMhpAhEB48MSFkMgl6gMxDJicJEEgOT2IsQcwigWUba99637v2qrv/\n5o+2W5IlWbYWW8v3dY7OadW9detXdW5VffrX3/v9aUophRBCCCGEEOJF01/uAQghhBBCCHG1kjAt\nhBBCCCHEBZIwLYQQQgghxAWSMC2EEEIIIcQFkjAthBBCCCHEBZIwLYQQQgghxAWSMC2EEEIIIcQF\net4w/cd//Mfcdttt5PN5uru7uffee3n66afP2O9jH/sY/f39pFIpXvva17Jv377LNmAhhBBCCCGu\nFM8bpnfu3MmDDz7I97//fR555BFM0+QNb3gD5XJ5cZ9PfvKTfOYzn+Hhhx9m9+7ddHd388Y3vpFG\no3HZBy+EEEIIIcTLSXsxKyA2m03y+Txf+9rXeMtb3oJSir6+Pn7zN3+TD3/4wwC4rkt3dzef/vSn\nede73nXZBi6EEEIIIcTL7UXVTNdqNeI4plgsAnD8+HGmpqZ405vetLhPMpnk1a9+NY899tilHakQ\nQgghhBBXmBcVpt/3vvdx66238jM/8zMATE5OAtDT03Paft3d3YvbhBBCCCGEuFaZL3TH3/7t3+ax\nxx7je9/7HpqmnXf/5+5TrVZf/OiEEEIIIYS4QuTz+TNue0Ez07/1W7/FV7/6VR555BGWL1++eHtv\nby8AU1NTp+0/NTW1uE0IIYQQQohr1XnD9Pve977FIL127drTtq1YsYLe3l6+/e1vL97mui7f+973\nuOuuuy79aIUQQgghhLiCPG+Zx3vf+16+/OUv80//9E/k8/nFOuhsNks6nUbTNN7//vfziU98gvXr\n17NmzRo+/vGPk81mue+++8553LNNkYtz27NnDwCbN29+mUcirhRyTohTyfkgnkvOCfFcck5cuPOV\nKj9vmP785z+Ppmm8/vWvP+32j33sY3z0ox8F4IMf/CDtdpv3vve9lMtl7rzzTr797W+TTqcvcuhC\nCCGEEEJc2Z43TMdx/IIOsn37drZv335JBiSEEEIIIcTV4kW1xhNCCCGEEEKcJGFaCCGEEEKICyRh\nWgghhBBCiAskYVoIIYQQQogLJGFaCCGEEEKICyRhWgghhBBCiAskYVoIIYQQQogLJGFaCCGEEEKI\nCyRhWgghhBBCiAskYVoIIYQQQogLJGFaCCGEEEKICyRhWgghhBBCiAskYVoIIYQQQogLJGFaCCGE\nEEKICyRhWgghhBBCiAskYVoIIYQQQogLdN4wvWvXLu69914GBgbQdZ0dO3actr1Wq/HAAw+wdOlS\nUqkU69ev57Of/exlG7AQQgghhBBXCvN8OzSbTTZu3Mj999/P1q1b0TTttO3vf//72blzJ1/+8pdZ\nsWIFO3fu5J3vfCednZ284x3vuGwDF0IIIYQQ4uV23pnpLVu28PGPf5xf/uVfRtfP3H337t1s3bqV\n17zmNSxbtoxf+7Vf48477+RHP/rRZRmwEEIIIYQQV4qLrpnesmULX//61xkdHQXgscceY+/evdxz\nzz0XPTghhBBCCCGuZJpSSr3QnbPZLJ/73OfYunXr4m1KKbZu3cpXvvIVTHOhauThhx/mXe9612n3\nrVariz8fPnz4YscthBBCiEsojGLCWBGGMZFSnJoOTF3DNHVsQ0fXtXMfRIhr0Jo1axZ/zufzZ2w/\nb830+fzO7/wOP/zhD/nGN77B4OAgO3fu5AMf+ACDg4O8+c1vvtjDCyGEEOIyiWKFH0b4YUwQQBhq\nRBFEkf5MmNbQAMOMMc2YRCIinTCxTGkGJsSzLipMN5tNHnroIf7xH/+Rt7zlLQDcdNNN7N27l09/\n+tPnDNObN2++mIe97uzZsweQ102cJOeEOJWcD+K5zndOBGFE2wtx/QjXBd8HDR3T0LEMA8vUT2s4\n4AcRfhgSqYh8DvKZBJZpvCTPRVwa8jlx4U6trjibiwrTSimUUmdcmKjrOi+iekQIIYQQL4Eoimm0\nfVw/pt2GIADbNMkmTQzj3LPNtmVgWwYtL6DeCDDNgEJGwrQQ8AJb4z1b4xzHMUNDQ+zdu5dSqcTS\npUt5/etfz+/93u+RyWRYtmwZO3fu5Etf+hKf+tSnLvvghRBCCHF+SilabkDbC2m2IPA1EpZJOm2e\n0fL2+aQSFuV6iB/ERFH8vAFciOvFed8Fu3fvZtOmTWzatAnXddm+fTubNm1i+/btAHzlK1/hjjvu\n4B3veAc33ngjf/Inf8LHP/5x3vve9172wQshhBDi+Xl+SLnuUq6FVKpAbJJPJ3ES1osK0s+yTAPP\nAy+ILv1ghbgKnXdm+u677yaO43Nu7+rq4q/+6q8u6aCEEEIIcXGUUtRbHi03otEAHYNs0rro2WTT\n0AkjiKWcUwjgEnTzEEIIIcSVJYxiWl5EpRbhuRpOwiJhXbqvfE0DaZAnxAIJ00IIIcQ1pOUG1Nsh\nrZZG4OnkUokzekMrpQjCeKGRwDO36ZqGbclFhUK8WBKmhRBCiGvAQlmHT7MdUa8b2KZBLp1c3B6E\nEX4QEUYxURzjB6BiFhdn0Q1I2BqWaZBOnrueOopjdBNZvEWIZ0iYFkIIIa5ycayotTwazRi3rZFO\nWBjPtKn1ggjXD/ADhe9BGEEUgaHp6LrOs5nZ82KazZhkIiSMIvLp5FkDdRjFpB2kz7QQz5AwLYQQ\nQlzFwiim1vSoNxRhsFDWEceK6WoL7dgkQaAIQ51swiGfSZE0dazk2YNwFMU0PR+IMXWfTCpx2nal\nFLGKscyFCxGFEBKmhRBCiKuWH0TUWx71xkLv6Llag11PHeMHe4/R9F2yo3No6CRMi2wiRyGVYUVP\nidV93dhnmVk2DJ1MMkGt3cZxIpRSp81OB2GMacqstBCnkjAthBBCXIU8P6Te8qnWYHiqxk9PTDA0\nP85kY4oT1ePYFvRbneiaTi1SDFUUdiXFUGWAg6NL2LR6GYPdHWccV9c1DE3HD2KCMD7tokQvCLGT\nyIWKQpxCwrQQQghxlXk2SE/Phfxo/yhHpiY4Uj5CqDfoKJqsS4Fl6vT1OYv3UUpRb4RMTB9mamaU\nut/g1vZKbh7sO+P4pmkQhTFhdDJMx7EiUhHJBCQkTAuxSMK0EEIIcRV5NkiPTfl896kTHJw+ykj9\nBD1dJt2dKSzDYHz8zHpmTdPIZQ1yWYPpWZ8Dk0+gjkE2mWB5T+m0fZVS6Bqcev1h2w+wbUjYL24J\nciGudXL1gBBCCHGVWKiR9pmaDfj3nxxl79jTjLVOsHp5gr7uJJbxwmaMuzst+pZoHK3t40eHj9No\newCs/+8LIVmphSCta8/+X+GHIckkOLbMwwlxKgnTQgghxFUgCCNqTY+5+ZjvPH6c/VNHKAdTrF/l\nkMvYL3q2uKtk4mQ8xhojHBybYv1/1zjwqwtNp+M4RtNP9pJueQuz0knbuOjlyIW41sg7QgghhLjC\nxfHCgizzlYinjk9xeHKCaXeM9asckhcxU7ykx2KmPc7b9wzy5C8HwMIsdKRibGuh/V0UxQRRSDoF\n6aR1qZ6SENcMCdNCCCHEFUwpRbXpMjMfMFvxeOroLCON46xaliRhX9yFgP/nT99DMhXxga7/wUyt\nASzMgFsWWIaBpmm0vGChvCNhyqy0EGch7wohhBDiClZv+UzNeZSrIYeGqky1JkllQgr5i6td3r7n\n3fzvm79AOqXTCGrM15sABFGEZYJlGfhBRExEytFIyay0EGclYVoIIYS4QtVbHhOzLebmI2LfZrrc\nYN6bolCAlufjBQGxil/0cZ8N0gBOUseLXJquTxwrwjjCtsEydNq+TyoFqaQlHTyEOIfzhuldu3Zx\n7733MjAwgK7r7Nix44x9Dh06xC/90i9RLBZJp9O88pWv5MCBA5dlwEIIIcT1wPNDpuabTE/HNOsa\nT5+Y4rHDhzkyPcKRqTEePz7MniPD7D44yk+PTzAyU6Hl+rQ9Hy+IGB41OX5cnXHcU4M0LHTtiFVM\nrBRuEGBbC+3v2n6AZStSSf2i6rKFuNad993RbDbZuHEj999/P1u3bj3jN9Pjx4/zqle9im3btvHR\nj36UQqHAgQMHyGQyl23QQgghxLUsimLG5+ocGXLZd7TKXKPO0ZkRjswfpJWcQLVbC/vFEIVg60lS\n83lyyQz9pQKepzE6alGtBSxdZmAaBtv3vBvgtCC98FgKQzfQNQ0/DMnnQdcgiCNyaY1sKvGSP38h\nribnDdNbtmxhy5YtAGzbtu2M7R/5yEe45557+NSnPrV42/Llyy/ZAIUQQojrSRwrRmdq7PrJFHsP\nztGI55hrT9IKXax0k56SIp03UTFogFIarh/SaEzjthvMHlJMHk8xeiwLmqJaiXh6+QNnhOhntV2F\nY6RI2iYJGyxDwwtDcrmF7h3PtscTQpzdRdVMx3HMP//zP3PDDTdwzz330N3dze23387f/d3fXarx\nCSGEENcNpRQj0xW+tusY3//pMEON/XjmOMtXamQyOmgRmq7Q0TANA8MwME2dTMqgt8vGSniEyXEG\nVk9w480N7rzT4Onlv8GHNz58zsdstmKSRppUwsJxIIoVjgNpxyQh5R1CnNdFhenp6WkajQaf+MQn\nuOeee/i3f/s33va2t/H2t7+db33rW5dqjEIIIcQ1TynFTLnJP+46wo+PDjPaPkxvX0RXl0kUaiil\nY+g6hm6gaWf5+tYgnzcwkwH1qIqdn+cHnQ/wm6v/DKXOrJ0GcL0Y3zNJGTkGujOEULine truncated
"text/plain": [
"<matplotlib.figure.Figure at 0xa0b1550>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.01969482 0.02094075 0.00154535]\n"
]
}
],
"source": [
"landmarks = array([[5, 10], [10, 5], [15, 15], [20, 5]])\n",
"\n",
"ekf = run_localization(landmarks, sigma_vel=0.1, sigma_steer=np.radians(1),\n",
" sigma_range=0.3, sigma_bearing=0.1)\n",
"print(ekf.P.diagonal())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I have plotted the landmarks as solid squares. The path of the robot is drawn with a dashed line, which is admittedly hard to see. The covariance after the predict step is drawn in a very light shade of blue, and the covariance after all of the landmark measurements are incorporated are shown in green. To make them visible at this scale I have set the ellipse boundary at 10$\\sigma$.\n",
"\n",
"From this we can see that there is a lot of uncertainty added by our motion model, and that most of the error in in the direction of motion. We can see that from the shape of the blue ellipses. After a few steps we can see that the filter incorporates the landmark measurements. \n",
"\n",
"We can see the fantastic effect that multiple landmarks has on our uncertainty by only using the first two landmarks."
]
},
{
"cell_type": "code",
"execution_count": 109,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x806fd30>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.02126405 0.04551132 0.00022729]\n"
]
}
],
"source": [
"ekf = run_localization(landmarks[0:2], sigma_vel=1.e-10, sigma_steer=1.e-10,\n",
" sigma_range=1.4, sigma_bearing=.05)\n",
"print(ekf.P.diagonal())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can see that the covariance gets smaller as it passes through the landmarks but quickly expands once past them. Let's see what happens with only one landmark"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0xafeb7b8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.26908765 0.8039095 0.00355399]\n"
]
}
],
"source": [
"ekf = run_localization(landmarks[0:1], sigma_vel=1.e-10, sigma_steer=1.e-10,\n",
" sigma_range=1.4, sigma_bearing=.05)\n",
"print(ekf.P.diagonal())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As you probably suspected, only one landmark produces a very bad covariance. What is worse, the filter starts to diverge from the robot's path. On the other hand, a large number of landmarks allows us to make very accurate estimates."
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAEWCAYAAACkORurAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmUXGd95//3rbq1V3X1Wr1vklpSW0a2sIwlwRgssAcF\n4sSTHJMwOSAIcQgmwSYMB/9CkH/EmJCAh+RgCEvAjgnEghnILxNwnIw3hGwjGXmRJWtttXqt3qtr\nX+69vz/a7ljI2qoXdcuf1zl1VLrP7eqnnqNT/dHt7/0+huM4DiIiIiIicsFcF3sCIiIiIiLLlcK0\niIiIiEiZFKZFRERERMqkMC0iIiIiUiaFaRERERGRMilMi4iIiIiUSWFaRERERKRMZw3T9957L1dc\ncQXRaJRoNMqWLVv4yU9+cso5d955J83NzQSDQa677joOHDiwoBMWEREREVkqzhqmW1tb+au/+iv2\n7dvHM888w9atW/nN3/xNnnvuOQC+8IUvcM899/CVr3yFPXv2EIvFuP7660mlUosyeRERERGRi8m4\n0B0Qa2pq+Mu//Es+9KEP0dTUxJ/8yZ9wxx13AJDL5YjFYnzxi1/klltuWZAJi4iIiIgsFeddM21Z\nFv/0T/9ELpfj2muvpaenh3g8zg033DB7jt/v59prr2X37t0LMlkRERERkaXEPNcJL7zwAps3byaf\nzxMIBNi5cydr1qyZDcz19fWnnB+LxRgcHFyY2YqIiIiILCHnDNNr167l+eefJ5FI8IMf/IDf+Z3f\n4dFHHz3r1xiGcdqxRCJR/ixFRERERC6yaDR62rFzlnl4PB5WrFjBhg0buPvuu9m0aRP33nsvjY2N\nAMTj8VPOj8fjNDQ0zNOURURERESWrgvuM21ZFrZt09nZSUNDAw8//PDsWC6XY9euXWzZsmVeJyki\nIiIishSdtczjU5/6FO9+97tpaWkhmUzyve99j8cff5yHHnoIgNtuu427776btWvX0tXVxV133UUk\nEuG9733vWb/pqy+R7927F4CNGzfO9b28Lmn9yqe1mxut39xo/cqntZsbrd/caP3Kt1zX7lylymcN\n0/F4nN/7vd9jeHiYaDTKFVdcwUMPPcT1118PwCc/+Umy2Sy33nork5OTbNq0iYcffphQKDR/70BE\nREREZIk6a5j+zne+c84X2LFjBzt27Ji3CYmIiIiILBcXXDMtIiIiIiIzFKZFRERERMqkMC0iIiIi\nUiaFaRERERGRMilMi4iIiIiUSWFaRERERKRMCtMiIiIiImVSmBYRERERKZPCtIiIiIhImRSmRURE\nRETKpDAtIiIiIlImhWkRERERkTIpTIuIiIiIlElhWkRERESkTArTIiIiIiJlUpgWERERESmTwrSI\niIiISJkUpkVEREREyqQwLSIiIiJSJoVpEREREZEyKUyLiIiIiJRJYVpEREREpEwK0yIiIiIiZVKY\nFhEREREpk8K0iIiIiEiZFKZFRERERMqkMC0iIiIiUiaFaRERERGRMilMi4iIiIiU6axh+vOf/zxX\nX3010WiUWCzGjTfeyIsvvnjKOdu3b8flcp3y2LJly4JOWkRERERkKThrmH788cf56Ec/ypNPPskj\njzyCaZq84x3vYHJycvYcwzC4/vrrGR4enn385Cc/WfCJi4iIiIhcbObZBh966KFT/v7AAw8QjUbZ\nvXs373rXuwBwHAev10ssFlu4WYqIiCxhBw/m6O0983h7O3R3+xdvQiKyaM4apn/V9PQ0tm1TVVU1\ne8wwDHbt2kV9fT2VlZW89a1v5XOf+xx1dXXzPlkREZGlqLcXtm07c1j+6U9zdHcv4oREZNFcUJj+\n2Mc+xoYNG9i8efPssXe+85381m/9Fp2dnfT09PDpT3+arVu38swzz+D1eud9wiIiIiIiS4XhOI5z\nPid+/OMfZ+fOnezatYuOjo4znjc0NER7ezsPPvggN9100+zxRCIx+/zIkSPlz1hERGSJ6elp5+ab\nz/wb2Z07R+nsPEsdiIgsWV1dXbPPo9HoaePndWX69ttvZ+fOnTz66KNnDdIAjY2NtLS0cPTo0Qub\nqYiIiIjIMnPOMP2xj32MH/zgBzz66KOsXr36nC84OjrKwMAAjY2NZzxn48aNs8/37t172jE5f1q/\n8mnt5kbrNzdav/ItxbUbG8uddTwSiSyZ+S7F9VtOtH7lW65r9+rqitdy1tZ4t956K/fddx//+I//\nSDQanW19l06nAUin03ziE5/gqaee4sSJEzz22GPceOON1NfXn1LiISIiIiJyKTprmP7a175GKpXi\n7W9/O01NTbOPL33pSwC43W7279/Pb/zGb7BmzRq2b99Od3c3Tz75JKFQaFHegIiIiIjIxXLWMg/b\nts/6xX6//7Re1CIiIq837e0z7e/ONi4il6YLao0nIiIip+vu9quPtMjr1FnLPERERERE5MwUpkVE\nREREyqQwLSIiIiJSJoVpEREREZEyKUyLiIiIiJRJYVpEREREpEwK0yIiIiIiZVKYFhEREREpk8K0\niIiIiEiZFKZFRERERMqkMC0iIiIiUiaFaRERERGRMilMi4iIiIiUSWFaRERERKRMCtMiIiIiImVS\nmBYRERERKZPCtIiIiIhImRSmRURERETKpDAtIiIiIlImhWkRERERkTIpTIuIiIiIlElhWkRERESk\nTArTIiIiIiJlUpgWERERESmTwrSIiIiISJkUpkVEREREyqQwLSIiIiJSJoVpEREREZEynTVMf/7z\nn+fqq68mGo0Si8W48cYbefHFF087784776S5uZlgMMh1113HgQMHFmzCIiIiIiJLhXm2wccff5yP\nfvSjXH311di2zWc+8xne8Y53cODAAaqqqgD4whe+wD333MP999/P6tWr+exnP8v111/PoUOHCIfD\ni/ImRESWg4MHc/T2zjxPJtsBGBvLzY63t0N3t/9iTE1ERMp01jD90EMPnfL3Bx54gGg0yu7du3nX\nu96F4zh8+ctf5o477uCmm24C4P777ycWi/G9732PW265ZeFmLiKyzPT2wrZtr4Tl00PzT3+ao7t7\nceckIiJzc0E109PT09i2PXtVuqenh3g8zg033DB7jt/v59prr2X37t3zO1MRERERkSXGcBzHOd+T\nb775Zo4dO8bevXsxDIPdu3fzlre8hZMnT9LS0jJ73gc/+EEGBwdPubKdSCRmnx85cmSepi8isnz0\n9LRz8811ZxzfuXOUzs7eRZyRiIicS1dX1+zzaDR62vhZyzxe7eMf/zi7d+9m165dGIZxzvPP5xwR\nERERkeXsvML07bffzs6dO3n00Ufp6OiYPd7Q0ABAPB4/5cp0PB6fHXstGzdunH2+d+/e047J+dP6\nlU9rNzdavwv36psNX0skEtF6ngf925sbrd/caP3Kt1zX7tXVFa/lnDXTH/vYx3jwwQd55JFHWL16\n9SljnZ2dNDQ08PDDD88ey+Vy7Nq1iy1btpQ5ZRERERGR5eGsV6ZvvfVWvvvd7/LjH/+YaDTK8PAw\nMHP1JBQKYRgGt912G3fffTdr166lq6uLu+66i0gkwnvf+95FeQMiIiIiIhfLWcP01772NQzD4O1v\nf/spx++8804+85nPAPDJT36SbDbLrbfeyuTkJJs2beLhhx8mFAot3KxFRJah9vaZ9ncAyWQSmLk4\n8epxERFZXs4apm3bPq8X2bFjBzt27JiXCYmIXKq6u/2zfaT37t0PLL/aQREROdUF9ZkWEREREZH/\npDAtIiIiIlImhWkRERERkTIpTIuIiIiIlElhWkRERESkTArTIiIiIiJlUpgWERERESmTwrSIiIiI\nSJkUpkVEREREyqQwLSIiIiJSprNuJy4iIrLclSybQtGiWLIoWTYul0HI78XrcV/sqYnIJUBhWkRE\nLkklyyaTK5IrWORyUCqBZYHb7WBF8tREAxiGcbGnKSLLnMK0iIhcUhzHIZ0rksmVyGahUACvaRLw\nuDH9LhLpHCXLwbIdTLfCtIjMjcK0iIhcMgpFi1S2QDrjkMuBz+OhMmTOXoF2HAcHB9MNbpeCtIjM\nncK0iIhcEtLZAulciWQSXLiJBr24fiUwF0oWpgke06USDxGZFwrTIiKyrNm2w3QmTyZrk8mA3+PF\n733tH2/ZfJFQGHxnGBcRuVD6NBERkWWrULRIZvKk0lAsGEQCPtzu1+76ms0XMT0OAb/rjGFbRORC\n6dNERESWpUyuSCKV58RAhnS2SH1lGAAXBn6f55TWd5Zlky8VqaiAkN9zsaYsIpcghWkREVl2pjMF\ndj3fx1P7h0jkkhQti4A7TG24ki2XdVBXbVNl/mfru1SuQCAAIb+Jx1R/aRGZPwrTIiKyrMSnsjz6\nfJyUe5jhzACGu4DP6yKbcmgodPDJf70SgKEPW5hug1Q2j9u0CQYMQgHvRZ69iFxqFKZFRGTZOBmf\n4qFfDnN4/CSBGof2dh9VFSFchotiyeGuZ3+LP61+jPduvQKXYZDOFbCxqIwYVAR9F3v6InIJeu27\nNERERJYQx3EYnkjyb0/3cHRsmKI5xRvWhKiJ+nj6qZkfZXc9+2F+J/o/KTgZ0tk8hZJFyS5REYFI\n0HvGGxNFROZCV6ZFRGRJs22HwfEkB3umeO7oGGnG6GpxzdY+HzwID3n+kP9349d5Zn8Sf9RLMOAl\nVyxQUTETpFUnLSILRWFaRESWrGLJYmg8xbG+DI/vHaJ/ehB/oIjtuNj1c4t/930E1kP781/n3xMF\nYrEANaEIkaCXcBgiQY96SovIgtInjIiILEnZfJHjg1P821O9vNST4OT4KH2ZPvAmKODhcd9HgJkg\n/d9/z2L/oTxtFWvpbo8RiRiEgyYBn9rgicjCUpgWEZElJ50tsOfgED/+2WH6xseZLLine truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x803bb00>"
"<matplotlib.figure.Figure at 0x5834ac8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.00883285 0.00866094 0.00077284]\n"
]
}
],
"source": [
"import ekf_internal\n",
"ekf_internal.plot_ball()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can artificially force the Kalman filter to track the ball by making $Q$ large. That would cause the filter to mistrust its prediction, and scale the kalman gain $K$ to strongly favor the measurments. However, this is not a valid approach. If the Kalman filter is correctly predicting the process we should not 'lie' to the filter by telling it there are process errors that do not exist. We may get away with that for some problems, in some conditions, but in general the Kalman filter's performance will be substandard.\n",
"landmarks = array([[5, 10], [10, 5], [15, 15], [20, 5], [15, 10], \n",
" [10,14], [23, 14], [25, 25], [10, 20]])\n",
"\n",
"Recall from the **Designing Kalman Filters** chapter that the acceleration is\n",
"\n",
"$$a_x = (0.0039 + \\frac{0.0058}{1+\\exp{[(v-35)/5]}})*v*v_x \\\\\n",
"a_y = (0.0039 + \\frac{0.0058}{1+\\exp{[(v-35)/5]}})*v*v_y- g\n",
"$$\n",
"\n",
"These equations will be *very* unpleasant to work with while we develop this subject, so for now I will retreat to a simpler one dimensional problem using this simplified equation for acceleration that does not take the nonlinearity of the drag coefficient into account:\n",
"\n",
"\n",
"$$\\begin{aligned}\n",
"\\ddot{y} &= \\frac{0.0034ge^{-y/20000}\\dot{y}^2}{2\\beta} - g \\\\\n",
"\\ddot{x} &= \\frac{0.0034ge^{-x/20000}\\dot{x}^2}{2\\beta}\n",
"\\end{aligned}$$\n",
"\n",
"Here $\\beta$ is the ballistic coefficient, where a high number indicates a low drag."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is still nonlinear, so we need to linearize this equation at the current state point. If our state is position and velocity, we need an equation for some arbitrarily small change in $\\mathbf{x}$, like so:\n",
"\n",
"$$ \\begin{bmatrix}\\Delta \\dot{x} \\\\ \\Delta \\ddot{x} \\\\ \\Delta \\dot{y} \\\\ \\Delta \\ddot{y}\\end{bmatrix} = \n",
"\\large\\begin{bmatrix}\n",
"\\frac{\\partial \\dot{x}}{\\partial x} & \n",
"\\frac{\\partial \\dot{x}}{\\partial \\dot{x}} & \n",
"\\frac{\\partial \\dot{x}}{\\partial y} & \n",
"\\frac{\\partial \\dot{x}}{\\partial \\dot{y}} \\\\ \n",
"\\frac{\\partial \\ddot{x}}{\\partial x} & \n",
"\\frac{\\partial \\ddot{x}}{\\partial \\dot{x}}& \n",
"\\frac{\\partial \\ddot{x}}{\\partial y}& \n",
"\\frac{\\partial \\dot{x}}{\\partial \\dot{y}}\\\\\n",
"\\frac{\\partial \\dot{y}}{\\partial x} & \n",
"\\frac{\\partial \\dot{y}}{\\partial \\dot{x}} & \n",
"\\frac{\\partial \\dot{y}}{\\partial y} & \n",
"\\frac{\\partial \\dot{y}}{\\partial \\dot{y}} \\\\ \n",
"\\frac{\\partial \\ddot{y}}{\\partial x} & \n",
"\\frac{\\partial \\ddot{y}}{\\partial \\dot{x}}& \n",
"\\frac{\\partial \\ddot{y}}{\\partial y}& \n",
"\\frac{\\partial \\dot{y}}{\\partial \\dot{y}}\n",
"\\end{bmatrix}\\normalsize\n",
"\\begin{bmatrix}\\Delta x \\\\ \\Delta \\dot{x} \\\\ \\Delta \\dot{y} \\\\ \\Delta \\ddot{y}\\end{bmatrix}$$\n",
"\n",
"The equations do not contain both an x and a y, so any partial derivative with both in it must be equal to zero. We also know that $\\large\\frac{\\partial \\dot{x}}{\\partial x}\\normalsize = 0$ and that $\\large\\frac{\\partial \\dot{x}}{\\partial \\dot{x}}\\normalsize = 1$, so our matrix ends up being\n",
"\n",
"$$\\mathbf{F} = \\begin{bmatrix}0&1&0&0 \\\\\n",
"\\frac{0.0034e^{-x/22000}\\dot{x}^2g}{44000\\beta}&0&0&0\n",
"\\end{bmatrix}$$\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\begin{aligned}\\ddot{x} &= -\\frac{1}{2}C_d\\rho A \\dot{x}\\\\\n",
"\\ddot{y} &= -\\frac{1}{2}C_d\\rho A \\dot{y}-g\\end{aligned}$$"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sympy.abc import *\n",
"from sympy import *\n",
"\n",
"init_printing(pretty_print=True, use_latex='mathjax')\n",
"\n",
"x1 = (0.0034*g*exp(-x/22000)*((x)**2))/(2*b) - g\n",
"\n",
"x2 = (a*g*exp(-x/c)*(Derivative(x)**2))/(2*b) - g\n",
"\n",
"#pprint(x1)\n",
"#pprint(Derivative(x)*Derivative(x,n=2))\n",
"#pprint(diff(x2, x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** orphan text\n",
"This approach has many issues. First, of course, is the fact that the linearization does not produce an exact answer. More importantly, we are not linearizing the actual path, but our filter's estimation of the path. We linearize the estimation because it is statistically likely to be correct; but of course it is not required to be. So if the filter's output is bad that will cause us to linearize an incorrect estimate, which will almost certainly lead to an even worse estimate. In these cases the filter will quickly diverge. This is where the 'black art' of Kalman filter comes in. We are trying to linearize an estimate, and there is no guarantee that the filter will be stable. A vast amount of the literature on Kalman filters is devoted to this problem. Another issue is that we need to linearize the system using analytic methods. It may be difficult or impossible to find an analytic solution to some problems. In other cases we may be able to find the linearization, but the computation is very expensive. **\n"
"ekf = run_localization(landmarks, sigma_vel=0.1, sigma_steer=np.radians(1),\n",
" sigma_range=0.3, sigma_bearing=0.1)\n",
"print(ekf.P.diagonal())"
]
}
],
@@ -1803,7 +1804,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.1"
"version": "3.4.3"
}
},
"nbformat": 4,
+163 -28
View File
@@ -16,7 +16,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 1,
"metadata": {
"collapsed": false
},
@@ -30,7 +30,7 @@
"@import url('http://fonts.googleapis.com/css?family=Arimo');\n",
"\n",
" div.cell{\n",
" width: 850px;\n",
" width: 900px;\n",
" margin-left: 0% !important;\n",
" margin-right: auto;\n",
" }\n",
@@ -117,9 +117,6 @@
" font-family: 'Arimo',verdana,arial,sans-serif;\n",
" line-height: 125%;\n",
" font-size: 120%;\n",
" width:740px;\n",
" margin-left:auto;\n",
" margin-right:auto;\n",
" text-align:justify;\n",
" text-justify:inter-word;\n",
" }\n",
@@ -240,7 +237,10 @@
" },\n",
" displayAlign: 'center', // Change this to 'center' to center equations.\n",
" \"HTML-CSS\": {\n",
" scale:85,\n",
" scale:100,\n",
" availableFonts: [\"Neo-Euler\"],\n",
" preferredFont: \"Neo-Euler\",\n",
" webFont: \"Neo-Euler\",\n",
" styles: {'.MathJax_Display': {\"margin\": 4}}\n",
" }\n",
" });\n",
@@ -250,7 +250,7 @@
"<IPython.core.display.HTML object>"
]
},
"execution_count": 3,
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
@@ -368,16 +368,16 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x7f50438>"
"<matplotlib.figure.Figure at 0x6ee6160>"
]
},
"metadata": {},
@@ -488,19 +488,19 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAATBAMAAAC0B+rjAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAIokQdkQymVRmzbur3ZYT\n5QUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABhSURBVAgdY2BgYGAEYiBgQqFMILwwCKUAotgSChuB\nVAXjBC4BBu4JnAJMBxh8gdrYLzBcB1JcGxheMkgyyDUwLGGYyLCdgSGWQYG7AKitcqcaSDvjBBDJ\nwCkApqC2sYA4ADr+DeweQRu1AAAAAElFTkSuQmCC\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAASBAMAAAB/WzlGAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdolEMpnNqyK7EO/d\nVGbrAyG9AAAAX0lEQVQIHWNgYGBgBGIgYEKhjCE8ARDFEppeAaQqFyh0NzBwFjAbsBYwyC9gYmA6\nwHAUqI1zAsNHhoUM6y8wJDJcYShlYLBhUGAPAGqLm6sC0s7xAEQy8DWAKag1YEsBkk8P0x6j9zMA\nAAAASUVORK5CYII=\n",
"text/plain": [
"\\phi"
]
},
"execution_count": 7,
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
@@ -523,14 +523,14 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAwBAMAAAB+l06WAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzRAiu5mrdu/dZjKJ\nRFRer8KoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABOklEQVQ4EWNggAMhOAuJYfIJiQNjqoRhE2Vg\nH76irBk/s2C+H3r0fyzgA328YQ+xGs2yXCCfGSxmGuINk2MWALJ4QDymBIbzF6DCrA+ADLAomwID\nRwNUVBNEq4MIjgkMbL9BDCCIAxG3QQTjJ7go0wSQwAEQAQSc0DTKs4CBgXtD8GOwIMP9AxAaZGwc\n8wJGAzB3CkSQoYqBgWUBlwFPAojP6sDAwAtyHNDYSqDDWMHGlwEFKgQYGNgLGBimAkUZgaoY+AIY\njJnV/wItBXJ+MVgx2D8AMrYyMBQzMH1hYFgD5IgzLGZwBdLMc86EAQ2KN2CYBOTdZDjAEgCkGYGB\nBxS1D+A6AORxR3mdBlIwwPaJUwHEZl4AImGA+89TMJPLACYCpiWEwBQ4HBES70GWAB2NEAGxoL6H\nCAIAAx9b8PUdS4gAAAAASUVORK5CYII=\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAwBAMAAAB+l06WAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzRAiu5mrdu/dZjKJ\nRFRer8KoAAABNklEQVQ4EWNggAMhOAuJYfIJiQNjqoRhE2VgH76irBk/s2C+H3r0fyzgA328YQ+x\nGs2yXDjfNMQbxmYWALLYQTymBIbzF6DCrA+ADB4Qh02BgaMBxAACTRABFuWYwMD2G8QDgjgQcRdE\nMH6CizJNAAkUgAgg4ISmUZ4FDAzcoWLJYEGG+wcgNMjYFIUDFgZg7hSIIEMVAwNLAu8F1gQQn9WB\ngYEX5DigsfUKPAw8QJqBoQyIKwSAzi9gYJgKdBiLA1CAL4DBmFn9L9BSIOc7gzqD/gMgYysDQzED\n0xcGhjVAjjjDa4ZUIM0850wY0KB4A4ZJQN5NhgNsAUCaERh4QFH7AK4DQB53lN9pIAUDbJ84FUBs\n5gUgEga4/zwFM7kMYCJgWkIITIFDDCHxHmQJNMwRoozIWgFe5Vu10Z1KpwAAAABJRU5ErkJggg==\n",
"text/plain": [
" 1 \n",
"───────\n",
@@ -538,7 +538,7 @@
"2⋅╲╱ φ "
]
},
"execution_count": 6,
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
@@ -556,20 +556,20 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAAcBAMAAACjVFE3AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMmYiu80QdonvRN2Z\nVKvu110NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACmUlEQVQ4EZVUO4gTURS9k8lnkszqWNiIkJG1\nWMEihG0sZEO0XDCicRuRAV3ELqVi4bgiNiLW22y0tTBoIeIqg65aiEtAwWoxiBYW4mJhI7Kee+fz\n3mSywb0w95537sl5n3kToh2EtfZmB+ptpTfo27a9/2jsizSPqVbPyktZaixjNCN6meZ6WUVlmOXG\nMQUvYT8rmHC0xNBwkWjMYukANxBvJZucnwgcSVUPxKyQvmQtnSHa5cjY/C3FQrYCgVrilZaYhR7h\nS1Zpln/blnH0W7Y5rAQhMk94ROYmrHwmil3OKi6ss81lIcoDKReJKn7FCTXnw1Kc/+kBPSIq15mJ\n24wlSmxzSWDNk3KPaO/GxxDTJ6GQrjGxRvRACF5xKsSmIOs4FDZ8opWtrUiUtrlCdJsbe+yjsqhI\nhCI24am8ZtZwXn1Q3ZHVPPSohaY9aNApTQQoNrk2k8c5vTfdgjZTejU1h55D06JpusNiFWIz1Wfi\nHJ68m6tbQx6FkbbB3V7GzH2873foLz7jOMlKsTE2Ga7iuUoW2WLKDI1sam7ANtUANqfDfpw1G17N\nKmwKzah5s9N52umclZG8KawGm9rtmq75N9JERWwqyaZ+UYMwZxLpTeG7xxEXurl6PkgkAsQmPOKv\nIBZwevOaIm2DN4WjrfStlIblYmMHDHErcLv81ERpG9wsvn77D844/AMV9vc/X7DMHjOYi4yXreuM\n44ht1ldeuHKLq3W0GnE7XY/IsNxDMV3BcYptwvECUS4AnI7b6XpLhraPkuPZVNxXEN81f3/H8Pg6\nm+BiW6BxFyXz0SUqTDHEgP+2uhqpYD5awQ9QJUVnUNUBNbJrTRRvdVHjxsGZcWSWmwqynMaYTW0w\nCW5MapLtTWzvpPkP4lmKXRXJfWcAAAAASUVORK5CYII=\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAAcBAMAAACjVFE3AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMmYiu80QdonvRN2Z\nVKvu110NAAACmklEQVQ4EZVUPYgTURCezSabzWaTS2MjB4looWAR5JqrLqhY+ROLeI0cC3qIlVtq\ndauHWHiIYHfNLZZn4aGFiKcscqeNhAiCNodBz0Lw5yotRM6Zebv73mY3wQxk5ptvZr837+3bAIxh\n5sarMbqHti7Cl6G1/yjsDXseQ72Zbi+mqUxGa4X0Msz46Q6rn+aymIITsx8ljDm4QVBroMu0fSH7\nWlafSChR2UE8xbkrWYHOAVRrDPVfHOgIzICh4mjSIrHYj+axl26Knm1zHj5rYnJYNgikn3EA9B2U\n8pgQniG5i12Sucp5qccBZSzPEgPCBabAOPnTQfQIoNQkxvLJK1YkmctM1B0OqwB7tt4JDO+ZQrdA\nxAbAAyZS755lCjzHIe4AF2Bld1fgAZlrAEtUmNz8wUOFTRhYRpzKJrHam7nPsjog89CBo1isnjD1\ne0oTQpbJtYk8Tm7b8aaVlZKbqtfgOfachlXoUrM0lqmsETGHv3zf8u0+ZcKSMni3l3llD25jff4Z\n2VnqZBlth+A6/hYcE0wWJQYGNjXTI5lygNeGRxc95BUZmmYdTMi3qIB2s9N52umcZ8xvCqfBTU24\nhmv8ZTZ2LGPFm/oNl+BKL64OTIPfPR5xwa3UqoHsIcQy4oi3MZ2Ft/BN6UieDb6pO3j31sxETyxj\nBwTxVuDt8hILJWXwZtH1mzzwoUYPSLO//vmEY/rE4FqgvTx1nXBkkUx35UWDb3G5iaUjUTkZpzkt\n+Rj0BuPIRTIinwXIBQj3R+VkvMWp7WHI0WrS7ksIYND3dwx/nsrG2Ggz1O5iwO97qOX6WKK/LTez\nJR9O8B2rqW9XeaJcw2Rg10o52uq8wmXBg1lkmqsEaU5h9JaSjIJbo4pgOyPL4xT/AbQYkt2B1tcR\nAAAAAElFTkSuQmCC\n",
"text/plain": [
" ⎛ 2 ⎞\n",
"(φ - 1)⋅⎝φ + 1⎠"
]
},
"execution_count": 7,
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -587,14 +587,14 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAABLCAMAAAB3JhEVAAAAPFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo1xBWAAAAE3RSTlMA\nMquZdlQQQOkwRInN3WYiu+9seupBywAAAAlwSFlzAAAOxAAADsQBlSsOGwAACXhJREFUeAHtXduC\nqygQJIlxz8bcZvP//7qANNAXERAyZjc+nNEWii5KFLE7Rx1edjuq77ajHrjNqih1eJ0GvZ135NvX\nFXU3mhxfRp7Dtzv22QP3rzyyMJfJ3OxvIz4rW3GZlket5JmG02E40lEoW1v63w1rUq9RHX4Ivmwl\nhRoeNpJnGNXxqm4X7JlsxWV2evQYLzelhid2T7biMk2PGsmjh831zhyTrazYFsN4MiN0C8JS3eOk\n1HFQ6vyEzdzowLpUa7MdE2okj/bq9TCuYTJg3ez0IsBVzzfHm216sUzdCXMr+GHCg1XPq57kuVTX\nDK2FCTWT52DmGLQtPSmcrb3Y3O3DYbqyhrcbbgd10d6TzVnPemjR5xIpWXdICLWR5/FSk75Va5/j\nLVi7sXnad+mzfoo33y7H4clld9brQR26vMYTQm3kGY/DZRr0TABtwdqNzcv20eXV/pV61DfMJ3uc\nglVPuKcu7/GEUBt5kCrCQS824+tkWru89CO88abnABc+eMB6me7DkYm33QVK6D3y9GLzeNn76WH+\ns713IoTzfSL3anNStkbVNu5SQu+RZ6PTi9Upm8WCn3KCEsLyzIukO/x3oXvHedgkbm475AIr0RIn\nSgjLI9XYtW1+9pw7TA1+iTYhlJbnMezl6lvorZtddbnnT6wfn0UoLc+RLKItdNLvmQf7bnjiU6wl\nl/bOiBBKyvPIp4274zBNzzYLLWtIN7Oow9desDvh6PcZlRFKynOqfdvTtxyz4NtgW0Ma9dsw+46x\n3O7vMyojlJJndD38KBgIs6B61I3S86AAyV0ZS0jLCqTOOEYFbqgVP/KhVoBkt1PyuEttFF7PZDBt\nPcCr9FkYPSVIHkhJSIvtp0/MjErcCIREPwqgqggl5IHBU7ZwPs3L1uPVD7kwvShCckAqQkr3/fpZ\nx6jIDSX4UcdIAFp1OSHPNA+ES9l61minuuMxLI9ag3GkDGkGUjHSKpuVAjOjMjeU4EcdIwFoxV+l\nluXxg8cPg1UwW+Cph894eoRh78kUTuYMEEbKc2CxFAyeCkLYj0pGFYSW5RncU2R+hshBHZJ10KPN\nhND5Z48nM1vkYBfBaoAw0mLH551wjGoIYT8wI8F17Y9grSDE5LnAjdV178G++8hBHaL1TD9TAZkZ\nSX+zywyBYUB5IrBShNF2Qgoz6kmIyjP8uFdRK7W5Cqwv+j6TG+oxV4g6CcjMJ+RgF8nKgCLMgl3K\naDshL4+FklxXSrJWECLyPMbhNQ8fuDddYDDkhnq4QWI78HjV24/5R98pAQmCXXDUCFhDx8dAwVq6\nxxiBG9mxK8gPiRG43oEQkce8Ttqr/Q4vOwd38UNQB+4esEahHp4+lITRA0gQ7ALn579gDUgMCFfI\nPiKMwA1wHeOANbjhL6tQkDAC10MBswfWgFRBiMmjTnaY+OhVO90JQR2xC8Eah3p4YaEokIGpYG4I\nDAMCwNK/mNF2Qv7m5hh1JMTleZhPDlHXGKFCUEfcNcEah3qwNWGQBwKWc0NgGFDcdsk+YbSZkJfH\nMepIiMujjnpm5QePDmSFZZpEj+jiPnDFTS1CaS/PjATBLqGA2QNrhMSAcI2CI8xoM6Egj4UC17FD\nYN1GSJBHB1acbQCMa893L24/PopCPc5MzYBlkSDYJa5vg2NtYExA4kC4RsERYbSVkMKMehIS5FF6\nrhWWZPSMi3V4omdGmOhJZSySHOzCrEkgCTxlw4zaEbJ9w1y3njBrFSFJnvP8wdvzPc+rnP44tUND\nEXHZAqQ0EIZdPSKMCtxQK37kQ60AyRwkeVRYbZYrfZ71UxkZef768/fndfj/w+N//nxzS3estHhz\n27G/73NNWHLWjcvWbl41k0f6tqBTSsSU025sWgKnF6Iv+dFBW5xqJY+el6SSS7uxwbl+W3qC1JWW\nnOOF6C7JV9oHTKiVPGtfHHqxwbl+pIu3HSYXoqsD5tZ8woRayaNbTX1x6MWG5PqtcS86D0vOuJKz\nnq/3LhnHhFA7eWApHrNx1l5sSK4fbnvjUXIh+nRXXS45QqiRPOHbQtwnwdqLDcn1ixvfvJ9eiH7o\nJPTNTXAAQqiRPOHbQtxisOq39h5saK5f3PjWfVhyxjhg1cvpzT54RC1QQo3kiVoQdzuxoclkYtuV\nxrWF6C6Zv5TQm+TRedsuxriys+RqlI1cqs7KlpwtjGyta0GoRQm9SR7BkxYmmuvXAvNXMSghKs9e\nksewH4tdRnL9hHIYaC9HgqOziRCi8izW2+eJ4uTFfdIIXhFCa/LsIxczuE/2SK4fOSsdfhahNXl6\nzB6lXqu1FSYv9pkO1zov1cOEVuSpfDNeS6CU/JJs6ziFyYvVr/rrnkj+M9s6DCa0Ik9lLqZ+n26S\nW9oKJ3RTJSETO9WCUSlMWh4XBpmfQOlSMfVb6Mbc0vktaQkndHfhXi0hteRJdtfUEUrLU56L6TMo\npYzQkJK12qtJnNXaiwU2ENqYW1pHKCmPu9aKcjFb5ZZynMU+zz+xgVCc4wopUPoX3+KAwLQfVYSS\n8tTkYrbKLeU4afZZZ+sJoRxX/QSZt5I01SpCKXngWivLxWyVW8pwoE/q/9YTapFbWkMoJY+LFS/M\nxWyVW8pw6mWBmojQQpgKD17hKaF+9NiukYN3uLWGkCBPTS5mFOrBUkKBjMsyy42AYTjQycV/RUIm\nOjcveIU7ghn1JMTlqcvFDKEeLIMSyMwnsiNgGE6xLK6CTMj8qnMyXdYz4o4gRl0JMXnqcjGj1YU4\nFVPKxPQ/pC6mYgagGKdWGVNvmVBm8ApyRGKUGdKDcDIZMXnMC6W9OiBBLisXMwr1YBmUcK0BUGYE\nDMPJZMSLLRDyv4GOa7DgFe4IYdSRkCAPyS61050Q1BFzCdYo1ANk9QWBjJs3qcwIGIbjAYt3hORS\nFXyP4YI1MOKOEEYdCUny1ORihlAPtsYNZCAjMjMChuHE3Vi2LxBaT5f1jLgjhFFHQpI8JLs0Jxcz\nCvXQu3jzZGYgiHXBhcAagBgOrlB0VJ5cahbZnC7cEcwIXMcegTWFg2tIR6I8NbmYEOrBU0JxJqaZ\nGSR/Xt0BcRzJ/UxbOSGdirDsCGbUk5AoD8kuLcnFTGZQFuSWJnEyRYmK1SeXph0xjOTgHWpN40Su\nol1ZnvpczHQGZedMTMQMHfQipLIZpTsGORsdyPL897JLPzS5dJbHxhelUt4jQb+77+kB/9/KjuY/\nMB2G8BXjPe1/W0n2gP6pJLOpfwGec844NmVfmwAAAABJRU5ErkJggg==\n",
"image/png": "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\nc844NmVfmwAAAABJRU5ErkJggg==\n",
"text/plain": [
"⎡ x - xₐ y - yₐ ⎤\n",
"⎢ ────────────────────────── 0 ────────────────────────── 0⎥\n",
@@ -609,7 +609,7 @@
"⎣╲╱ (x - x_b) + (y - y_b) ╲╱ (x - x_b) + (y - y_b) ⎦"
]
},
"execution_count": 8,
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
@@ -677,7 +677,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 7,
"metadata": {
"collapsed": false
},
@@ -707,7 +707,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 8,
"metadata": {
"collapsed": false
},
@@ -743,16 +743,16 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x872c860>"
"<matplotlib.figure.Figure at 0x81e45f8>"
]
},
"metadata": {},
@@ -838,6 +838,141 @@
"We start by assuming some function $\\mathbf f$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Example: A falling Ball"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**author's note: ignore this section for now. **\n",
"\n",
"In the **Designing Kalman Filters** chapter I first considered tracking a ball in a vacuum, and then in the atmosphere. The Kalman filter performed very well for vacuum, but diverged from the ball's path in the atmosphere. Let us look at the output; to avoid littering this chapter with code from that chapter I have placed it all in the file `ekf_internal.py'."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<matplotlib.figure.Figure at 0x81ac748>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import ekf_internal\n",
"ekf_internal.plot_ball()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can artificially force the Kalman filter to track the ball by making $Q$ large. That would cause the filter to mistrust its prediction, and scale the kalman gain $K$ to strongly favor the measurments. However, this is not a valid approach. If the Kalman filter is correctly predicting the process we should not 'lie' to the filter by telling it there are process errors that do not exist. We may get away with that for some problems, in some conditions, but in general the Kalman filter's performance will be substandard.\n",
"\n",
"Recall from the **Designing Kalman Filters** chapter that the acceleration is\n",
"\n",
"$$a_x = (0.0039 + \\frac{0.0058}{1+\\exp{[(v-35)/5]}})*v*v_x \\\\\n",
"a_y = (0.0039 + \\frac{0.0058}{1+\\exp{[(v-35)/5]}})*v*v_y- g\n",
"$$\n",
"\n",
"These equations will be *very* unpleasant to work with while we develop this subject, so for now I will retreat to a simpler one dimensional problem using this simplified equation for acceleration that does not take the nonlinearity of the drag coefficient into account:\n",
"\n",
"\n",
"$$\\begin{aligned}\n",
"\\ddot{y} &= \\frac{0.0034ge^{-y/20000}\\dot{y}^2}{2\\beta} - g \\\\\n",
"\\ddot{x} &= \\frac{0.0034ge^{-x/20000}\\dot{x}^2}{2\\beta}\n",
"\\end{aligned}$$\n",
"\n",
"Here $\\beta$ is the ballistic coefficient, where a high number indicates a low drag."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is still nonlinear, so we need to linearize this equation at the current state point. If our state is position and velocity, we need an equation for some arbitrarily small change in $\\mathbf{x}$, like so:\n",
"\n",
"$$ \\begin{bmatrix}\\Delta \\dot{x} \\\\ \\Delta \\ddot{x} \\\\ \\Delta \\dot{y} \\\\ \\Delta \\ddot{y}\\end{bmatrix} = \n",
"\\large\\begin{bmatrix}\n",
"\\frac{\\partial \\dot{x}}{\\partial x} & \n",
"\\frac{\\partial \\dot{x}}{\\partial \\dot{x}} & \n",
"\\frac{\\partial \\dot{x}}{\\partial y} & \n",
"\\frac{\\partial \\dot{x}}{\\partial \\dot{y}} \\\\ \n",
"\\frac{\\partial \\ddot{x}}{\\partial x} & \n",
"\\frac{\\partial \\ddot{x}}{\\partial \\dot{x}}& \n",
"\\frac{\\partial \\ddot{x}}{\\partial y}& \n",
"\\frac{\\partial \\dot{x}}{\\partial \\dot{y}}\\\\\n",
"\\frac{\\partial \\dot{y}}{\\partial x} & \n",
"\\frac{\\partial \\dot{y}}{\\partial \\dot{x}} & \n",
"\\frac{\\partial \\dot{y}}{\\partial y} & \n",
"\\frac{\\partial \\dot{y}}{\\partial \\dot{y}} \\\\ \n",
"\\frac{\\partial \\ddot{y}}{\\partial x} & \n",
"\\frac{\\partial \\ddot{y}}{\\partial \\dot{x}}& \n",
"\\frac{\\partial \\ddot{y}}{\\partial y}& \n",
"\\frac{\\partial \\dot{y}}{\\partial \\dot{y}}\n",
"\\end{bmatrix}\\normalsize\n",
"\\begin{bmatrix}\\Delta x \\\\ \\Delta \\dot{x} \\\\ \\Delta \\dot{y} \\\\ \\Delta \\ddot{y}\\end{bmatrix}$$\n",
"\n",
"The equations do not contain both an x and a y, so any partial derivative with both in it must be equal to zero. We also know that $\\large\\frac{\\partial \\dot{x}}{\\partial x}\\normalsize = 0$ and that $\\large\\frac{\\partial \\dot{x}}{\\partial \\dot{x}}\\normalsize = 1$, so our matrix ends up being\n",
"\n",
"$$\\mathbf{F} = \\begin{bmatrix}0&1&0&0 \\\\\n",
"\\frac{0.0034e^{-x/22000}\\dot{x}^2g}{44000\\beta}&0&0&0\n",
"\\end{bmatrix}$$\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\\begin{aligned}\\ddot{x} &= -\\frac{1}{2}C_d\\rho A \\dot{x}\\\\\n",
"\\ddot{y} &= -\\frac{1}{2}C_d\\rho A \\dot{y}-g\\end{aligned}$$"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sympy.abc import *\n",
"from sympy import *\n",
"\n",
"init_printing(pretty_print=True, use_latex='mathjax')\n",
"\n",
"x1 = (0.0034*g*exp(-x/22000)*((x)**2))/(2*b) - g\n",
"\n",
"x2 = (a*g*exp(-x/c)*(Derivative(x)**2))/(2*b) - g\n",
"\n",
"#pprint(x1)\n",
"#pprint(Derivative(x)*Derivative(x,n=2))\n",
"#pprint(diff(x2, x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** orphan text\n",
"This approach has many issues. First, of course, is the fact that the linearization does not produce an exact answer. More importantly, we are not linearizing the actual path, but our filter's estimation of the path. We linearize the estimation because it is statistically likely to be correct; but of course it is not required to be. So if the filter's output is bad that will cause us to linearize an incorrect estimate, which will almost certainly lead to an even worse estimate. In these cases the filter will quickly diverge. This is where the 'black art' of Kalman filter comes in. We are trying to linearize an estimate, and there is no guarantee that the filter will be stable. A vast amount of the literature on Kalman filters is devoted to this problem. Another issue is that we need to linearize the system using analytic methods. It may be difficult or impossible to find an analytic solution to some problems. In other cases we may be able to find the linearization, but the computation is very expensive. **\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
@@ -869,7 +1004,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.3"
"version": "3.4.1"
}
},
"nbformat": 4,
+4 -4
View File
@@ -40,8 +40,8 @@ def residual(a,b):
return y
sigma_r = 0.1
sigma_h = np.radians(1)
sigma_r = 1
sigma_h = .1#np.radians(1)
sigma_steer = np.radians(1)
#only partway through. predict is using old control and movement code. computation of m uses
@@ -130,8 +130,8 @@ def H_of(x, p):
dist = np.sqrt(hyp)
H = array(
[[-(px - x[0, 0]) / dist, -(py - x[1, 0]) / dist, 0],
[ (py - x[1, 0]) / hyp, -(px - x[0, 0]) / hyp, -1]])
[[(-px + x[0, 0]) / dist, (-py + x[1, 0]) / dist, 0.],
[ -(-py + x[1, 0]) / hyp, -(px - x[0, 0]) / hyp, -1.]])
return H