Interim check in
Got a UKF working, just want to check point it.
This commit is contained in:
1 parent
bf14f2fbc4
commit
dd3177cd02
2 files changed
+570
-22
No files matched your search
@@ -259,13 +259,13 @@
|
||||
],
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 2,
|
||||
"prompt_number": 1,
|
||||
"text": [
|
||||
"<IPython.core.display.HTML at 0x7f7bfc0eda20>"
|
||||
"<IPython.core.display.HTML at 0x7f99f50405c0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 2
|
||||
"prompt_number": 1
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:0c0bb47419d5cc93676b016c0494006e579ca5b7c7b773014800489a190f0e42"
|
||||
"signature": "sha256:71b2584db8f7c39febb9622c86c64ba03269b1ec3d1ac8ede348a51a7357cf44"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
@@ -261,7 +261,7 @@
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 1,
|
||||
"text": [
|
||||
"<IPython.core.display.HTML at 0x7f4785982630>"
|
||||
"<IPython.core.display.HTML at 0x7f47fa1db4e0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -307,13 +307,13 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAsMAAAFwCAYAAABdOnYEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtYlHX6P/D3HGFmODmIUmAmUh6wEjTJDSXyS5mh9bP8\nxtZqnhLjMg+Rkng+hJFLHmotPBRqurSWpZma6PYNqVZz1Vp1M1EzMAl1RJlhhjn+/hjnkYHhKKdh\n3q/r8hJmnnnmM/PMDPfcz/25P6LTp0/bQERERETkgcStPQAiIiIiotbCYJiIiIiIPBaDYSIiIiLy\nWAyGiYiIiMhjMRgmIiIiIo/FYJiIiIiIPJa0ue+gsLCwue+CiIiIiAgA0KVLlwZt3+zBMAD06tWr\nJe6GmlhgYCC2b9+O2NjY1h4KNRCPnXvj8XNvPH7ui8fOvQUGBiI/P7/Bt2OZBBERERF5LAbDRERE\nROSxGAxTrVji4r547Nwbj5974/FzXzx2nofBMNWKHwrui8fOvfH4uTceP/fFY+d5GAwTERERkcdq\nkW4SRERE5BlMJhOuXbsGkUjU2kNpsGvXrgEAzGZzK4+EXLHZbOjQoQNkMlmT7pfBMBERETUJk8mE\nq1evolOnThCLefKZmpbVakVJSQkCAwObNCCu85VqMBgwf/58REdH48EHH8SiRYsA2F/waWlpiIqK\nQlxcHPbs2dNkgyIiIiL3c+3aNQbC1GzEYjE6deokZPCbSp2Z4fT0dBQWFuLLL79EYGAgzp49CwDI\nzs5GQUEB8vLycOrUKSQlJSEyMhLBwcFNOkAiIiJyDyKRiIEwNSuxWNzkJTi1vmINBgN27NiBuXPn\nomPHjhCJRAgPDwcA7N27F6NHj4aPjw8GDBiAyMhI5ObmNungiIiIiIiaU63B8K+//gqRSIT9+/fj\n4YcfxpNPPon9+/cL13Xr1g2vvfYadu/eje7du+P8+fMtMmgiIiIioqZQa5mEVquFyWRCUVERvv76\naxw7dgyTJ0/Gvn37oNfroVQqcebMGfTp0wcqlQrFxcUu9xMYGNgsg6fm5ShO5/FzPzx27o3Hz715\n8vFr6lpOIlekUqnL91djJ9XVGgx7e3vDYrFg3LhxkMvliI6ORrdu3fDjjz9CoVBAr9djx44dAICl\nS5dCpVK53M+SJUuEnwcPHozY2NhGDZaIiIiI3E90dDSee+45vPrqq02632+++QZ5eXkAAIlEgsGD\nBzd4H7UGw126dHFZpGyz2XD33Xfj7NmziIiIAACcPXsWQ4YMcbmf5ORkp9+vXr3a4IFSy3N86+Lx\ncj88du6Nx8+9efLxY39eqklTTnozm83C+6tPnz7o06cPAPt7Lz8/v8H7q7Vm2N/fHw8++CCys7Nh\nNpvxww8/4Pz58+jbty+eeOIJbN68GWVlZTh06BCOHz+O+Pj4RjwkIiIiImc6nRRFRd64dq1pF1io\nyXfffYeoqCiMHz8evXr1QnZ2NuLj43H//ffj4MGDAIAbN25g1qxZeOCBB9CrVy/8+c9/xpkzZ4R9\nFBQUYNy4cYiMjERYWBhiY2OxdetWp/sxmUyYP38++vXrh+7duyMmJgZr164Vri8sLERoaCguXrwo\nXJaZmYmHHnrIaT8ff/wxQkNDceLECSQkJKB79+4YMGAATp48CQAwGo1YunQp+vXrh3vuuQcjRozA\nkSNHhNtHR0fjlVdeQUREBCZNmoQlS5bg3nvvRVpaWrX7iY2NRffu3fHII4/g73//u9P1oaGh2LJl\nC55++mmEh4cjISEBBQUFTvcTGhqKoqIivP322wgNDUVoaChWrFhR7+ekudWrtdrs2bPx4IMPonPn\nzli+fDmCgoIwduxYnDt3DrGxsfD390d6ejo6d+7cEmMmIiIiNyUSiWCxiCCR2GCz2Vxuo9HIsGyZ\nL7Zu9UKfPhasX38DXboYmn1sly9fxuTJk9G1a1fMmzcP27Ztw/79+7F27VoMGjQIo0ePhkwmw8aN\nG+Hv749169YhMTERBw8ehFKphEajQWRkJKZPn47AwEDk5eUhNTUVISEhQonohx9+iE8++QRr165F\nt27d8Ouvv6KwsLDOsdWUWZ0zZw5eeeUV9OrVC//5z3+EutkZM2bg9OnT+Nvf/oY777wT27dvx5//\n/GccPHgQwcHBEIlE6NChAzZu3Ij/9//+H8aNG4ecnBw8/fTTSElJQWBgID766COkp6dj2bJl6Nev\nH3788UfMmDEDHTp0wNChQ4UxrF+/Hm+++Sb8/PyQnJyMRYsWYfPmzQCAPXv2wGKxYNiwYXjqqacw\nefJkAIBSqRRu39jnpKnUGQyHhoYKD8jphlIp0tPTkZ6e3iwDIyIiovZFp5Pgiy9U+Mc/vDFsWAWe\nfVaHgIDqpRU//yzH1q3eAIATJ6Q4cECOsWNdB8PXr8tw6ZIUvr5WhIRU3Nb4AgMDMWDAAGi1Wnz2\n2Wd46KGHoNfrceDAARw8eBBHjx7F0aNHERQUBMA+J+qTTz7B/v37MWLECAwYMAADBgwQ9vf8889j\n8+bNOHDggBAMFxYWonPnzoiJiQEAhISE1GtsNX1xmDJlinBm/q677gIAnDt3Djt27MCXX36JBx54\nAAAwffp0fPbZZ9i+fbtQvvroo4+if//+CAwMxKOPPoqoqCgEBgaiqKgIgYGBWLFiBaZOnYqnnnoK\ngD0mzMvLw5YtW5yC4XHjxiE6OhoAkJiYiHfeeUe4Tq1WA7DX86pUKnTs2LHaY2jsc9JUuBwzERER\ntYgTJ7yRkuIDADh0SIrwcAseeURbbTuZzDnwq2F+PjQaGebN88Pnn3shIMCKTz65gV69yhs9Pm9v\nb+F/x89eXl4wGAw4ceIEbDYbHn74YafbGAwG/PbbbwAAvV6PlStXIjc3F3/88QdMJhMMBoMwvwoA\nnnnmGXz66acYNGgQ/vSnPyE6OhoJCQmQy+WNGrMjCK3sxIkTAIBRo0ZVG+uFCxfq9XivXLmCP/74\nA8uXL8fbb78t3MZkMqFLly5O+w0LCxN+DggIQGlpaYMeQ1M/Jw3FYJiIiIhaRFmZ86n+69ddn/rv\n3bsCS5bosH69N/70JxMGDXKdFT5/XobPP/cCAJSWivHxx15YtEhfYxa1sRz78/Pzw549e6pdHxAQ\nAMCeKc7Pz8e8efMQFhYGiUSCSZMmwWq1Ctv27dsXhw8fRn5+Pr7//nvMnTsXW7duxSeffALAdTlE\n5dtX5efnV+N1n3/+ebVOX76+vrU8UrvKz9/ixYuFjK2DVCqt9feGqus5aW4MhomIiKhF9O5tQlSU\nCUePyhAebkZkpMnldiqVBWPH3sCzz5ZDobBAJnMdDKpUNkgkNlgs9gDyrrusTR4IO0RERODGjRsw\nmUzCarxVHT58GOPHjxfKFvR6PYqKioRuBw4+Pj4YOnQohg4din79+iE5ORmlpaUICAgQglut9lbG\nvKioqEHdGByZ6D/++ANxcXENepwOHTt2RHBwMC5cuIAXXnihUfuoTCaTwWRyfbyB2p+T5sZgmIiI\niFrEnXdWIDv7Oq5ckUCttiAoyFjjtmKxDX5+NQdPAHDPPQZs3lyG997zRmSkGU8+qW/qIQsGDRqE\nqKgoJCUlYcGCBejatSsuXLiAL774AsnJyejWrRvCwsKwc+dODBw4EBaLBStWrIDFYnHaz7p16xAY\nGIj7778fNpsNO3bsQEhIiBD0+fn5oVu3bvj000+RlpaGkydPYt++fQ0KCrt3747hw4cjNTUVixYt\nQu/evVFcXIzdu3dj2LBhLksrXJk6dSoWLVqEzp0745FHHoFOp8O3334LhUKBsWPH1ns8gL2UIi8v\nD6NHj0aHDh0gk8kgkUjq9Zw0NwbDRERE1GICA41oqsX5JBIbYmO1GDy4HGJxzd0p6qty9rXqzyKR\nCB999BGWLVuG6dOno7S0FEFBQRg8eDA6dOgAAFi4cCFmzZqF4cOHw8/PDy+99BLKysqc7sPX1xdr\n167F+fPnIZFI0LdvX2zcuNFpm7feeguzZs1CTk4OoqKiMHLkSPzzn/+sdbxVrVq1CpmZmVi4cCFK\nSkqgVqvx0EMPNWhy2pgxY+Dt7Y21a9fijTfegFKpxH333YcpU6bUejtX43r99deRmpqKwYMHQ6/X\nIyUlBTNmzABQv+ekOYlOnz7dPOcTbiosLESvXr2a8y6omXhy43h3x2Pn3nj83JsnH7/Lly8LnRaI\nmktNrzPHohtVJ/jVpdZFN4iIiIiI2jMGw0RERETksRgMExEREZHHYjBMRERERB6LwTAREREReSwG\nw0RERETksRgMExEREZHHYjBMRERERB6LwTARERG1Sd7l5a09BPIADIaJiIioRcnrEeSKRCLI//lP\nSKssZ1zTtkSNxWCYiIiIWoxIJIKssBAim63W7WRXrkA5fz5kRUV17tNbo2FATI3GYJiIiIhajOzK\nFfhMnAj5pUu1bie9cAHiP/6A7OTJuve5fz9kxcVNNUTyMAyGiYiIqMVIf/sNknPnIL1wQbhMotc7\n/zMYIDt8GADglZ0NuU5XbRuRxQIAkF2/DsWKFZD+9tttjeu7775DVFQUxo8fj169eiE7Oxvx8fG4\n//77cfDgQQDAjRs3MGvWLDzwwAPo1asX/vznP+PMmTPCPgoKCjBu3DhERkYiLCwMsbGx2Lp1q9P9\nPPvss1i6dCleeeUV3HvvvRg4cCC++uqr2xo73R5paw+AiIiIPINIJBKCXPlXX6H8T3+CzWaD/No1\neH/wAWR5ecK2koICAID02DF0GDECNokEAGANCUH5woXQh4bar//tN0guXID84EHoBwyArY7yi9pc\nvnwZkydPRteuXTFv3jxs27YN+/fvx9q1azFo0CCMHj0aMpkMGzduhL+/P9atW4fExEQcPHLine truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f4760d324a8>"
|
||||
"<matplotlib.figure.Figure at 0x7f47ddd36160>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 14
|
||||
"prompt_number": 2
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -345,9 +345,9 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAGDCAYAAAAlC6awAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdUFNffBvBn6b03QRTFAgqIDRuCIPaCYknUGJJoYo29\nxagpJtHEJCZR/CVRE0uMrxUFWxRFkKiIKHYxVhAVERCU3t4/CBuRuuzCbHk+53BkZ2dnHobx7pe7\nd+6I4uPjS0BEREREpCLUhA5ARERERNSQWAATERERkUphAUxEREREKoUFMBERERGpFBbARERERKRS\nWAATERERkUphAUxERKRinj59iqlTp8LDwwNOTk4YP3680JEqtWfPHvTt2xdt27aFk5MTYmJihI5U\nZw8fPoSTkxOCg4OFjkIANIQOQFSTsLAwJCUlITAwsMH3HR0djZiYGEyfPr3B901E8uHGjRsICwvD\nO++8A0NDQ6HjyMTKlSsRGxuLadOmwczMDBYWFkJHquDOnTtYsmQJ+vTpg6lTp0JdXR3NmzcXOlY5\nkr5HiEQiiESiek5FtcECmOReWFgYzp07J0gBfO7cOQQFBbEAJlJhN27cQFBQEEaMGKE0BXB0dDT8\n/f0FaVdr69y5cygpKcGXX34pt8ddkveIxo0b49KlS9DQYOklD/hbICIiqoWSEuW5cWpaWhqMjIyE\njlGt1NRUAJDb4rcutLS0hI5A/+IYYJKpxMREzJgxAx4eHmjXrh0CAgJw7Nixcus4OTlh7dq15Zbt\n3bsXTk5OePToEYD/xko5OTlh3759ePTokfjx66+Pjo6Gk5MTDh06hKlTp6J9+/bw9PTEqlWrUFhY\nWG4/vr6++Oijj8otK3v9q2PLyvYTFBRU7rGTk1OF1xORcvL19YWTkxMWL14MAOjdu7e4HahszOyi\nRYvg6+uLtLQ0zJkzBx4eHujQoQPGjRuHvLw8AEB8fDw+/vhj9OvXD+7u7ujcuTMmTpyIuLi4ctsq\na5ciIiKwZMkSeHh4wNPTE19//TWKi4sr7Pvw4cMYMWIEOnbsCA8PD4wcORLbt28vt86aNWvE+UtK\nSrB27doqf56SkhJs3rwZgwYNgpubGzw9PfH5558jKyurwr7L2u+EhASsXr0aXl5eaNeuHYYMGYJr\n165JdtCBCu38q+3vq+102fGu7PWVvUfU9ljm5+cjKCgIAwYMgJubG3r27Im5c+fi/v37FTLW5j3i\n888/L/d8dWOADx8+jOHDh6Ndu3bo0qULZs2ahaSkpHLrlB3vy5cvY8aMGejQoQN8fHywYcOGao4q\nvY49wCQzGRkZGDt2LLKyshAYGAgzMzMEBwdjxowZ+OGHH9CvX79ab8vc3ByrVq0CAOzYsQN37twR\nvwkBQOvWrSu85osvvoCbmxvmz5+PCxcuYOPGjcjOzsYnn3wi8c9Stu+jR4/i2LFj4scA0KRJE4m3\nR0SKZ/HixcjJyUFMTAx27tyJxYsXw9TUFAAqHTMrEolQUlKCiRMnwtLSEjNmzEBubi6OHz+OgoIC\naGtrIyoqCmfPnsXgwYPRtGlTpKWlYefOnXj77bexc+dOODk5ldvmV199hbZt22LOnDk4ffo0fv/9\nd9ja2pYrWM+cOYPZs2ejffv2mDt3LgDg5s2bCA8Px5gxY8Tr9e3bFw4ODigpKcGCBQvQt29f9OnT\np9KfZ+nSpdizZw+GDh2KwMBAJCYm4o8//sA///yDLVu2VDqO9euvv0ZCQgLeeust6OvrIzY2Fk+f\nPkXbtm0lOu7Vtb+vjwGWZDxtbY5lUVERJk2ahDNnzqB///4YP348CgoKcPToUURGRsLBwaHGjK+/\nRwwfPhzt27dHWloaVqxYUWXmQ4cOYc6cOWjbti3mzZuH1NRUbN68GXFxcQgNDa3QE75w4UJ4eHhg\nwYIFOHz4ML799ls0b9680j8KqCIWwCQz27ZtQ0pKCoKCgtC7d28AwMiRI9GvXz+sXr1aogJYV1cX\nQ4YMAQD8/fffePz4sfhxVZo3b46ff/4ZADB27FgUFRVhx44dmDx5MqytrSX6Wcr2df/+fRw7dqzG\nfROR8vHz8wMAFBQUYOfOnfDz84OtrW2V65eUlODx48fw8fHBsmXLxMsnTpwo/t7f3x/vvfdeuSKo\nf//+8PPzw44dOyr8wd6qVSt8//33AIA333wTffv2xfHjx8sVbSdPngQArFu3TlygA6XF3Ktat24t\n7jxYsGABWrVqVWnbFhMTg927d2P27NmYNGlSudfPmzcPp06dgpeXV4XXPXnyBHv27BF/zD9u3LhK\ne1hrIkn7K8mwlNocy3379uHMmTOYOXMmpkyZIl4eGBiIlJSUOmV0dXWFq6srHj58iBUrVlS53g8/\n/ABra2ts27YNOjo6AAAXFxdMnz4d27dvxwcffFBufW9vbyxatAhA6Xnl6emJ48ePswCuJQ6BIJk5\ne/YsTExMxMUvUFrI9u/fH/fv30dycnKdt12bRm7w4MHlHg8dOhTFxcU4d+5cnfdLRCSpVwun11lY\nWIiL34KCAqSnp0NPTw+mpqZISEiosP7rHQdOTk54/PhxuWX6+voASnuCX6Wurl6n/EeOHIFIJEL/\n/v2RlpYm/irrya1qKrL33nuvwhhXNTX5KTNqcyyPHj0KXV1dTJgwocLrLS0t6y3bo0ePkJCQgAED\nBoiLX6B02I2xsTHOnj1b4TWv/jy6urpo1qwZnjx5Um8ZlQ17gElmkpOT0ahRowrLy3pMkpOTJe6J\nlcTr+7axsQEANghE1GCMjIyqLZRevnyJX3/9Ffv27UNKSkq5P+7Lxgm/6vVt6enpoaCgoNyysWPH\n4vDhw5gzZw6++eYbuLu7o0ePHvD396/TRVcPHjxASUlJpZ/aiUQipKenV/o6R0dHiffVkGpzLBMS\nEtC4ceMGv1itrIPo9U8YRCIRbGxsKn0fe/3n0dXVrfDzUNVYAJNceP2jOlmqqSGry0d0RESVqWnG\ngrlz5+L06dMIDAxEu3btYGBgAACYM2dOpZ901aYH1cLCAiEhITh9+jTOnTuHkydP4siRIwgJCcHW\nrVvr9HPo6emJL/B6nZWVVaXL5WFWiereS+SpN1oWlO3naWgsgElmrK2tER8fX2F52RWsZb2/Ghoa\nyM3NLbfO06dPq9xubS9yKJtB4vXHr/5FrampWWHf1Q3N4ITlRCRJO1DdcK3MzExERkZi6tSp+PDD\nD8XL8/PzkZGRIVVGTU1NeHt7w9vbG/Pnz8dHH32E4OBgxMfHV3rRcHWaNGmCqKgotGnTBsbGxlLl\nqk+VtefVvZfUhr29PWJiYpCXlwdtbe0a15fVe0TZ++PrMz4UFxfjyZMnEl9ISDXjnw8kM926dUNG\nRgbCwsLEy7Kzs3HkyBE0a9ZM/B/cxsYGly9fFq9TVFQkHnNWGX19faSnp9fYS3zgwIFyj0NDQ6Gt\nrY0OHTqIl9nY2ODq1avl1jt48GCV2ywbW/fqxQ9EpFrK2oHaFFfVFURlPXav99xt27ZNok+iXt/H\n8+fPK6xjZ2cHAHW66ULZ0Ieyi4pflZWVJXWxLivW1tZIT08vVzS+/j5Qk9ePZf/+/ZGTk4ONGzdW\nWDctLa3CMlm9R9ja2qJp06Y4fPgwcnJyxMtPnDiBjIwMdO3aVartU0XsASaZGTt2LLZv34758+cj\nMDAQpqam2L9/P549e4YlS5aI1/Px8cHWrVuxcOFCODs7iwvmqnpOOnTogD/++AMff/wx/Pz8oKWl\nBQcHhwpTzdy7dw+TJk2Cl5cXLl68iCNHjuCtt96Cubl5uX2vXLkSkydPRteuXXH27Nlqxwh37NgR\nALBkyRKMGDECOjo6sLGxQatWrep8nIhIsbRr1w4aGhpYsWIFAgMDYWBgABMTE7i5uVVYt7oeYAMD\nA3Tt2hUbNmxAQUEBbGxsEBcXh6ioKJiamtZ6RoPX1/v444+Rnp6O7t27w9raGvfv38e2bdvQtm3b\nOo3L7dKlC4YPH47ff/8dd+/eRffu3VFSUoJbt24hLCwMQUFB6Ny5s8TblbXevXtj7dq1mDJlCoYP\nH46HDx8iNjZWom28fiyHDRuGAwcO4KeffkJ8fDw8PDxQWFiIsLAw+Pn5VbhzXk3vEampqYiKigIA\n8djpCxcuiAtvJycncQ/9zJkzMWfOHIwbNw7+/v5IT0/H5s2b0ahRI4wdO7ZOPw9VjQUwyYyxsTG2\nbduGVatW4c8//0Rubi5atGiBH3/8EX379hWvN2fOHGRmZuLkyZP4+++/MXr0aNja2mLp0qWVbnfg\nwIG4efMm9u3bh5CQEBQXF2P69OkVbj25ZMkShIaGYtWqVTAwMMC7774rnhOzzPjx4/HkyROEhobi\n4sWLGDRoEMaOHVtuqp9Xubm5YdGiRdi6dStmz56NoqIiDB8+vNqpbIhIuVhbW2PlypVYt24dFixY\ngMLCQnh4eGDLli3l1hOJRDV+JP7tt99i5cqV2LFjB3Jzc9GhQwds2rQJU6dOrfDayrZV2T78/f2x\nc+dObN++HZmZmbCyssLw4cOluoX7ihUr4OLigt27d+P777+HtrY2mjZtisDAwEo7AOpjuFhNx9PZ\n2RkrVqzAunXr8NNPP6Fz587lpuGsKV9l21dTU8PPP/+MDRs2IDQ0FOHh4TAyMkKXLl3Qq1evCtuo\n6T3i9u3bWLhwYbl97ty5Ezt37oRIJMK0adPEBfDAgQOhpqaGX3/9Fd999x10dXXFQ1rKxopX9/NU\nt5wqEsXHx8vkz4Xz58/jrbfewvLlyzFq1ChZbJKoVqKjoxEYGIitW7fKRa8EkSJgm01EqkwmY4AL\nCwvx7bffwtHRkX99EBHJObbZRKTqZFIA//HHH/Dx8YGZmZksNkdERPWIbTYRqTqpC+CUlBLine truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f4768df6c18>"
|
||||
"<matplotlib.figure.Figure at 0x7f47ddd198d0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -361,7 +361,7 @@
|
||||
"\n",
|
||||
"It has perhaps occurred to you that this sampling process constitutes a solution to our problem. This is called a 'monte carlo' approach, and it used by some Kalman filter designs, such as the *Ensemble filter*. Sampling requires no specialized knowledge, 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",
|
||||
"\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 need $50$ points for 1 dimension, you need $50^2$ for two dimensions, $50^3$ for three dimensions, and so on. So while this approach does work, it is very computationally expensive. The Unscented Kalman filter uses a somewhat similar technique but reduces the amount of computation needed by a drastic amount. "
|
||||
"\"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 need $50$ points for 1 dimension, you need $50^2$ for two dimensions, $50^3$ for three dimensions, and so on. So while this approach does work, it is very computationally expensive. The Unscented Kalman filter uses a somewhat similar technique but reduces the amount of computation needed by a drastic amount, and also uses a deterministic method of choosing the points."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -394,7 +394,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAqwAAAFdCAYAAADG5D8RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xlc0+fhB/BPTpKQEM5wH6KIgKh4FkXxAtRW7dau670e\nW9d7XY+t27qr7bqtXdffuh472p3ttnZd23XtKmi1ijeeKJeAIsh9JOHIQY7v7w8r01qoIsk3x+f9\nevkCyZPkE4XwyTfP93kkdXV1AoiIiIiIfJRU7ABERERERGNhYSUiIiIin8bCSkREREQ+jYWViIiI\niHwaCysRERER+TQWViIiIiLyafKxLmxpafFWDiIiIiIKcsnJyZ/59TELKwBkZWVNeBgiIiIiorPV\n1NSMehmnBBARERGRT2NhJSIiIiKfxsJKRERERD6NhZWIiIiIfBoLKxERERH5NBZWIiIiIvJpLKxE\nRERE5NNYWImIiIjIp7GwEhEREZFPY2ElIiIiIp/GwkpEREREPo2FlYiIiIh8GgsrEREREfk0FlYi\nIiIi8mksrERERETk01hYiYiIiMinsbASERERkU9jYSUiIiIin8bCSkREREQ+jYWViIiIiHwaCysR\nERER+TQWViIiIiLyaSysREREROTTWFiJiIiIyKexsBIRERGRT2NhJSIiIiKfxsJKRERERD6NhZWI\niIiIfBoLKxERERH5NBZWIiIiIvJpLKxERERE5NNYWImIiIjIp7GwEhEREZFPY2ElIiIiIp/GwkpE\nREREPo2FlYiIiIh8GgsrEREREfk0FlYiIiIi8mksrERERETk01hYiYiIiMinsbASERERkU9jYSUi\nIiIin8bCSkREREQ+jYWViIiIiHwaCysRERER+TQWViIiIiLyaSysREREROTTWFiJiIiIyKfJxQ5A\nRERE3uV2u2G322G32+FyuSCRSCCTyT7zD5EvYGElIiIKQFarFSaTCf0DAxiy2GCx2TFktcFis8Hu\ncEIqV0IiV0AqlQECIAguCG43BPfpjxBOf65WhSA6XI+YSD30YWEICwuDWq0W++FRkGFhJSIi8nMu\nlwv9/f0wm83o7O1DR48RdqcAqVoLhUoLRYgKilA9QsKV0IYooVAoL/i27TYbhoYG0dM9CGdLL1zW\nIcglbkSFhyE2KgIJ8XEICwvz4KMjYmElIiLyS/39/Whr70Bbdy96TQOAUgW5Sgu1LgyRk5MRolJN\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f4768de2f28>"
|
||||
"<matplotlib.figure.Figure at 0x7f47fa1e0d68>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -406,6 +406,111 @@
|
||||
"source": [
|
||||
"Here on the left we show an ellipse depicting the $1\\sigma$ distribution of two variables. The arrows show how three randomly sampled points might be transformed by some arbitrary nonlinear function to a new distribution. The ellipse on the right is drawn semi-transparently to indicate that it is an *estimate* of the mean and variance of this collection of points - if we were to sample, say, a million points the shape of the points might be very far from an ellipse. \n",
|
||||
"\n",
|
||||
"Let's look at that. Let's run a bunch of points through a nonlinear function.\n",
|
||||
"\n",
|
||||
"###### Exercise: Plot 2D points\n",
|
||||
"\n",
|
||||
"Write a function to pass points through state transition:\n",
|
||||
"\n",
|
||||
"$$\\mathbf{Fx} = \\begin{bmatrix}1 & 1 \\\\ .1x &y\\end{bmatrix}\\begin{bmatrix}x\\\\y\\end{bmatrix}$$ \n",
|
||||
"\n",
|
||||
"for the mean $$\\mu = \\begin{bmatrix}0\\\\0\\end{bmatrix}$$ and the covariance\n",
|
||||
"$$\\Sigma=\\begin{bmatrix}32&15\\\\15&40\\end{bmatrix}$$\n",
|
||||
"\n",
|
||||
"Plot both the original points and the converted points. Plot the mean passed through the function vs the calculated value, and print the difference between the two."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"# your answer here"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 5
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"###### Solution\n",
|
||||
"\n",
|
||||
"Here is my answer."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from numpy.random import randn\n",
|
||||
"import numpy as np\n",
|
||||
"from numpy import sin, cos, tan,log\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"from numpy.random import multivariate_normal\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def f(x,y):\n",
|
||||
" return x+y, .1*x**2 +y*y\n",
|
||||
"\n",
|
||||
"mean = (0, 0)\n",
|
||||
"p = np.array([[32, 15],[15., 40.]])\n",
|
||||
"\n",
|
||||
"xs ,ys = multivariate_normal(mean=mean, cov=p, size=5000).T\n",
|
||||
"fxs, fys = [], []\n",
|
||||
"for x,y in zip(xs,ys):\n",
|
||||
" fx, fy = f(x,y)\n",
|
||||
" \n",
|
||||
" fxs.append(fx)\n",
|
||||
" fys.append(fy)\n",
|
||||
"\n",
|
||||
"# Compute mean\n",
|
||||
"mean_fx = f(*mean)\n",
|
||||
"\n",
|
||||
"computed_mean_x = np.average(fxs)\n",
|
||||
"computed_mean_y = np.average(fys)\n",
|
||||
"\n",
|
||||
"plt.subplot(121)\n",
|
||||
"plt.scatter (xs,ys, marker='.')\n",
|
||||
"plt.axis('equal')\n",
|
||||
"\n",
|
||||
"plt.subplot(122)\n",
|
||||
"plt.scatter(fxs, fys, marker='.')\n",
|
||||
"plt.scatter(mean_fx[0], mean_fx[1], marker='v', s=120,c='r')\n",
|
||||
"plt.scatter(computed_mean_x, computed_mean_y, marker='*',s=120,c='r')\n",
|
||||
"plt.ylim([-10,290])\n",
|
||||
"plt.xlim([-150,150])\n",
|
||||
"plt.show()\n",
|
||||
"print ('Difference in mean x={:.3f}, y={:.3f}'.format(\n",
|
||||
" computed_mean_x-mean_fx[0], computed_mean_y-mean_fx[1]))"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f47dd7c8fd0>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"output_type": "stream",
|
||||
"stream": "stdout",
|
||||
"text": [
|
||||
"Difference in mean x=-0.037, y=42.097\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 6
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So what would be fewest number of sampled points that we can use, and what kinds of constraints does this problem formulation put on the points? We will assume that we have no special knowledge about the nonlinear transform as we want to find a generalized algorithm. For reasons that come clear in the next section, we will call these points *sigma points*.\n",
|
||||
"\n",
|
||||
"Let's consider the simplest possible case, and see if it offers any insight. The simplest possible system is *identity* - the transformation does not alter the input. It should be clear that if our algorithm does not work for the identity transformation then the filter will never converge. In other words, if the input is 1 (for a one dimensional system), the output must also be 1. If the output was different, such as 1.1, then when we fed 1.1 into the transform at the next time step, we'd get out yet another number, maybe 1.23. The filter would run away (diverge). \n",
|
||||
@@ -433,11 +538,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAtIAAAF2CAYAAABDD3/PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlYlOXixvHvsIwwIC6EkAi4lEtSorhLuJVIZqf0WKmh\nHct+peWSLVbaonbydDTLtDqWppWWedrMrT3MFFxyyUJQ3BCDFFBkGEFgfn/o4cQRlxjlnRnuz3V1\nXczM+4z32ONwz8wzz2tKTU21IyIiIiIif4qH0QFERERERFyRirSIiIiISBWoSIuIiIiIVIGKtIiI\niIhIFahIi4iIiIhUgYq0iIiIiEgVqEiLiIiIiFSBw0U6KyuLhIQEoqKiGDBgALt37/5T4++++266\nd+9e4brk5GTi4uJo27Yto0ePpqCgwNGYIiIiIiKXlMNFevLkybRo0YKNGzcSHx/P+PHjL3rsqlWr\nsFqtmEym8utsNhtjx45lzJgxbNiwAZPJxMyZMx2NKSIiIiJySTlUpAsKCli/fj0jR47EbDYzfPhw\nMjMzSUtLu+BYq9XKm2++yf3334/d/t+TKyYnJxMQEEC/fv3w8fFhxIgRrFq1ypGYIiIiIiKXnENF\n+sCBA5jNZiwWC0OGDOHQoUOEh4ezd+/eC46dO3cud9xxB/7+/hWu37dvH02bNmXLli3cc889RERE\ncPz4cfLy8hyJKiIiIiJySTlUpG02G35+flitVtLT08nPz8fPzw+bzXbecenp6SQlJXHHHXdUep8W\ni4WjR4+Snp6O2WwGoLCw0JGoIiIiIiKXlJcjg319fbFarYSEhJCcnAycXrJhsVjOO27atGmMHz++\nwtro/7BYLBQWFhIXF0dcXBzHjx8vv/6PMjIyHIkuIiIiInLRwsLCzrrOoSIdERFBUVER2dnZBAcH\nU1xczMGDB2nSpMl5x+3cuZORI0dWuK5Vq1Zs2rSJiIgIlixZUn79nj17qFOnDvXq1Tvrflq1auVI\nfLcQGBjIxx9/fNbOJ1KzaV5IZTQvpDKaF1IZzYuKUlJSKr3eoaUd/v7+xMTEMG/ePIqKili4cCGh\noaE0b968/JiEhARmzJhRYdymTZvYtWsXu3bt4p133iE4OJiUlBT8/f3p3LkzJ06cYMWKFRQWFrJg\nwQJuuukmR2KKiIiIiFxyDm9/N2XKFNLS0ujYsSNr1qxh1qxZFW7PzMwkJyfnnOPtdnuFJR6+vr68\n8sorvPrqq3Tt2hWACRMmOBpTREREROSSMqWmptovfJjzycjI0NIOTn/0kpKSQoMGDYyOIk5E80Iq\no3khldG8kMpoXlSUkpJS6RppnSLcDegFhVRG80Iqo3khldG8kMpoXlyYirSIiIiISBWoSIuIiIiI\nVIGKtIiIiIhIFahIi4iIiIhUgYq0iIiIiEgVqEiLiIiIiFSBirSIiIiISBWoSIuIiIiIVIGKtIiI\niIhIFahIi4iIiIhUgYq0iIiIiEgVqEiLiIiIiFSBirSIiIiISBWoSIuIiIiIVIGKtIiIiIhIFahI\ni4iIiIhUgYq0iIiIiEgVqEiLiIiIiFSBirSIiIiISBWoSIuIiIiIVIGKtIiIiIhIFahIi4iIiIhU\ngYq0iIiIiEgVqEiLiIiIiFSBirSIiIiISBWoSIuIiIiIVIHDRTorK4uEhASioqIYMGAAu3fvvuCY\npKQk+vfvT3R0NF26dOHxxx/HarWW396yZUvatm1b/t+yZcscjSkiIiIickk5XKQnT55MixYt2Lhx\nI/Hx8YwfP/6CY5o1a8Zbb73Fli1b+Prrrzl69Cjz5s2rcMzy5cvZunUrW7duZdCgQY7GFBERERG5\npBwq0gUFBaxfv56RI0diNpsZPnw4mZmZpKWlnXdcUFAQwcHBAJSUlGC32/Hz86twjN1udySaiIiI\niMhl5VCRPnDgAGazGYvFwpAhQzh06BDh4eHs3bv3gmMPHz5MdHQ0nTp1IiAggJEjR1a4fejQocTE\nxPDEE09QUFDgSEwRERERkUvOy5HBNpsNPz8/rFYr6enp5Ofn4+fnh81mu+DYhg0bsmXLFjIyMnjo\noYf44IMPGDx4MABLly7l2muvJScnh4kTJzJt2jSmT59+1n0EBgY6Et8teHt7A/q7kIo0L6QymhdS\nGc0LqYzmxcVxqEj7+vpitVoJCQkhOTkZAKvVisViuej7CAsL47777mP+/PnlRbpNmzbA6SUg48aN\n495776107NSpU8t/jo2NpXv37lV9KCIiIiIiACQmJrJ27dryyz179qz0OIeKdEREBEVFRWRnZxMc\nHExxcTEHDx6kSZMmf+p+ysrKzrsm+ly3jRo1qsLlnJycP/XnuoP/vFKsiY9dzk3zQiqjeSGV0byQ\nytT0eREZGUlkZGT55ZSUlEqPc2iNtL+/PzExMcybN4+ioiIWLlxIaGgozZs3Lz8mISGBGTNmVBi3\ncuVKUlNTKSsr4/DhwyxYsIDY2FgA0tLS+PXXXyktLSUvL485c+bQq1cvR2KKiIiIiFxyDr0jDTBl\nyhQeffRROnbsSLNmzZg1a1aF2zMzM2nUqFGF644dO8aYMWP4/fff8ff3Jz4+vvzd5dzcXCZNmkRO\nTg4Wi4WePXsyceJER2OKiIiIiFxSptTUVJfcZy4jI4NWrVoZHcNwNf2jF6mc5oVURvNCKqN5IZXR\nvKgoJSWFsLCws67XKcJFRERERKpARVpEREREpApUpEVEREREqkBFWkRERESkClSkRURERESqQEVa\nRERERKQKVKRFRERERKpARVpEREREpAocPrOhiIg4v9xcM7t2lQDQoIGZ+vWLDU4kIuL6VKRFRNxY\nUZEH69ZZeOopPzIyPAEIC/Ph+eetxMQUUqtWmcEJRURcl5Z2iIi4sXXrLAwbVru8RANkZHgybFht\n1q2zGJhMRMT1qUiLiLip3FwzTz7pB5gqudXEU0/5kZtrru5YIiJuQ0s7RETcTElpGb/lWvlh4ykO\nncqEiONQ6xjUOgGlZiiqAyfrkFFYh7U/edCjizd1LGZMpsoKt4iInIuKtIiIG8jOK+SzpHQ++XEP\nO/fnUGa3n76h1fnHjX4beBvqWMzc0C6cgd2uplvrhnh56gNLEZELUZEWEXFRBbZiVm/ezyc/7uGH\nnYfLy7PJBCH1LATXDWD3jvoU5tWFk3WhKAA8i8Hn9DvUPnWPEdosl9/yTnC8sJiP1u3ho3V7aFDX\nl790acbAblcT2ThQ71SLiJyDirSIiIv5ed9R/rVqB6s37+dkcSkA3p4e9GkbzoBuV9MrKgxf8+mn\n92++8WfYsNqcvU7azrx3TtC7dwF2u5192fl8tj6dj37czb6sfN5cvZM3V+/k6oZ1uaN7c+7u07r8\nPkVE5DRTamqq3egQVZGRkUGrVhf4zLIGCAwMBCAnJ8fgJOJMNC/cU+6Jk0z/cBNLvtvFf1ZudGoR\nwm3druLmTk2o5+9z1pjKt78rPef2d3a7nW17j/Dxuj18lpROTv7J02OC/HlmaGf6tm+sd6jdjJ4v\npDKaFxWlpKQQFhZ21vV6e0FExMmVlJbx3jcp/PPfWzhmLcLL08Tf+rTmnrhIwoJqn3dsrVpl9O5d\nQNu2xfz+uy8ADRrYznlCFpPJRNtmDWjbrAFPD+3M9zsy+MeyzaQczOXel78mNjKUqcO7clXDupf8\ncYqIuBoVaRERJ5a86zcmLVrPrwdzAYiNDGXKsC5cHVrvT91P/frFXH316dKdk3NxZzX09vLgxnYR\n9GwTVl7k1+7MpPfEf3NPXCTjb2tHbYu2zxORmktFWkTECR2zFjFp4Y98sj4dgEZX+PPsXcYsrfDy\n9ODuPq25pUuz8qUl/1r1M5+s38OUYV3p36lpteYREXEWKtIiIk4m9VAuI176iv3Z+fh4ezKqfxtG\n9W9j+Jf96tf24cV7rueuXi2ZtGg9W3b/zv2zv2FbvyM8eWcHPD20ZZ6I1Cx61hMRcSJfbN5P/2eW\nsz87n9YRgXz74l+ZMDDa8BL9R9c1CeLTp29h6rAueHmaeGPlDob98wuOWYuMjiYiUq1UpEVEnEBZ\nmZ1ZH//EiFlfYT15ils6N+WzZ24hokGA0dEq5eFhYkRcJO9PvIn6tX34fsch+k3+lLRDeUZHExGp\nNirSIiIGK7AVc98rXzPjoy2YTPDknR147cFe+NZynnehz6XrNQ1ZPfVWWkcEsj87n5uf+YwvNu83\nOpaISLVQkRYRMdD+7HxueXY5qzfvJ8BiZtEjcYzuH+VSezU3CqrNZ8/cwi2dm2I9eYoRs75i1sc/\nUVbmkqcpEBG5aCrSIiIGSTmYS/9nPiP1UB5XNazLiil/oXdUuNGxqsS3lhevPdiLJ+7ogMkEMz7a\nwqNvrVWZFhG3piItImKA1EO53PHCSnJPnKT7taF8/txfaHala5/kxGQy8eAtUSycEIeP2ZMPEtOY\nuGCdyrSIuC0VaRGRarY7M4/bn19FTv5JelzXiAUP9yHAjU5sckPb8NNl2tuTxd/t4smFP2K3q0yL\niPtxuEhnZWWRkJBAVFQUAwYMYPfu3Rcck5SURP/+/YmOjqZLly48/vjjWK3W8tuTk5OJi4ujbdu2\njB49moKCAkdjiog4hT2Hj3H731dyNN/G9ZGhvDX+RnycaGu7S+X6yFDentCHWt6evPtNCpMWrVeZ\nFhG343CRnjx5Mi1atGDjxo3Ex8czfvz4C45p1qwZb731Flu2bOHrr7/m6NGjzJs3DwCbzcbYsWMZ\nM2YMGzZswGQyMXPmTEdjiogYbm/WcW5/fiW/H7PRrXVD3n64j1PtD32pxV7biPnjb8Ts5cHCr37l\nmfeSVKZFxK04VKQLCgpYv349I0eOxGw2M3z4cDIzM0lLSzvvuKCgIIKDgwEoKSnBbrfj5+Line truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f4768b325c0>"
|
||||
"<matplotlib.figure.Figure at 0x7f47dda213c8>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 5
|
||||
"prompt_number": 7
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -473,11 +578,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAqwAAAFdCAYAAADG5D8RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Vd7G2eCLeqFnEgiM+cgiSKVc3CWs910255x257ZM/uZ\n8+xz1f9h/49zs6dnxt7d0w7sdpYlWVbOEkmJEnMGAwACBJFDnQtKsqINkiC/Amq9l/Kj9oIbhVr1\n1RdUd+7ckUBEREREJFNq0QGIiIiIiH4NCysRERERyRoLKxERERHJGgsrEREREckaCysRERERyRoL\nKxERERHJmvbX/uH4+Ph65SAiIiIihaupqXnin/9qYQWA1tbWnIchIiIiInpQb2/vU/8ZpwQQERER\nkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGR\nrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGs\nsbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayx\nsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGw\nEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbAS\nERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIR\nERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhER\nEZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERER\nkayxsBIRERGRrLGwEhEREZGssbASERERkayxsBIRERGRrLGwEhEREZGssbASERERkaxpRQcgecpk\nMgiFQpifn8f8/DwSiQRSqRSSqTQAQKtRQ6vVQqvVwmazwW63w2q1QqvlV4qUIZPJIBgMYn5+HoFA\n4P41kkpnAPxyjej1+oeuEbWa4wSkDKlU6qFrJJVKPXSN6LSa+9eI3W6H3W5HSUkJVCqV4OQkR2wX\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f4762646550>"
|
||||
"<matplotlib.figure.Figure at 0x7f47d4278cc0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 6
|
||||
"prompt_number": 8
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -485,7 +590,54 @@
|
||||
"source": [
|
||||
"Note that while I chose the points to lie along the major and minor axis of the ellipse, nothing in the constraints above require me to do that; however, it is fairly typical to do this. Furthermore, in each case I show the points evenly spaced; again, the constraints above do not require that. However, the technique that we develop in the next section *does* do this. It is a reasonable choice, after all; if we want to accurately sample our input it makes sense to sample in a symmetric manner.\n",
|
||||
"\n",
|
||||
"There are many published ways for selecting the sigma points. For now I will stick with the original implementation by Julier and Uhlmann. This method defines a constant kappa ($\\kappa$) which controls how spread out the sigma points are. Their equations for the sigma points are"
|
||||
"There are many published ways for selecting the sigma points. For now I will stick with the original implementation by Julier and Uhlmann. This method defines a constant kappa ($\\kappa$) which controls how spread out the sigma points are. Before we work through the derivation, let's just look at some examples. I will use the class UnscentedKalmanFilter from FilterPy to generate the sigma points for us. It is convention to import UnscentedKalmanFilter as UKF - UKF is the standarized shorthand used in the literature for this filter.\n",
|
||||
"\n",
|
||||
"I will plot the sigma points on top of a covariance ellipse showing the first and second deviations, and size them based on the weights assigned to them."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from numpy import array\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"from filterpy.kalman import UnscentedKalmanFilter as UKF\n",
|
||||
"from filterpy.common import plot_covariance_ellipse\n",
|
||||
"\n",
|
||||
"x = array([0, 0])\n",
|
||||
"P = array([[4, 1],\n",
|
||||
" [1, 4]])\n",
|
||||
"\n",
|
||||
"sigmas_kp5 = UKF.sigma_points(x=x, P=P, kappa=.5)\n",
|
||||
"sigmas_k2 = UKF.sigma_points(x=x, P=P, kappa=2)\n",
|
||||
"W0 = UKF.weights(2, kappa=.5)\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",
|
||||
"\n",
|
||||
"plot_covariance_ellipse(x, P, facecolor='g', alpha=0.2, std=[1,2])"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAr0AAAF2CAYAAABj4yAyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3WuMJOd93/tv3avvPffZ2QsvG90cHlNSrAgwafJQEgg5\ndo4TQ8AxHDhyABkQrBdJHCSIAkRIrBwZQeLkRRjAcHQAAUoMBZEVB5Idh5GOQ1pWYFuRIskWTUuk\nyF3u7sxO90zfqrvudV40d0WKu+SS07vdXf37CNTszDS7n+ZWP/Xrp//1f4ynn366QERERESkxMx5\nD0BERERE5HZT6BURERGR0lPoFREREZHSU+gVERERkdJT6BURERGR0lPoFREREZHSU+gVERERkdI7\ncegNw5CPfexjvPvd7+Zd73oX//Sf/tNZjEtEREREZGbsk97BJz7xCS5evMhv//Zvs7GxwXe/+91Z\njEtEREREZGaMk+zIFoYh7373u/nc5z7H+fPnZzkuEREREZGZOVF5w3PPPYdhGHzxi1/kgQce4Cd+\n4if44he/OKuxiYiIiIjMxInKG0ajEUmS8MILL/B7v/d7fP3rX+fDH/4wjz/+OFtbW7Mao4iIiIjI\niZwo9Pq+T5Zl/K2/9bdwXZd3v/vd3HPPPXzjG9/gfe973/XbXbx48cQDFRERERF5LWfPnr3hz08U\nes+ePYthGLd027e97W0neaiFtLGxwec+9zkefvjheQ9FloCOF7lVOlbk9dDxIrdqFY6Vp5566qa/\nO1FNb6vV4l3vehef+tSnSNOUr371q3zve9/j/vvvP8ndioiIiIjM1Exaln30ox/lXe96Fzs7O/yL\nf/EvVM8rIiIiIgvlxKH3zJkzfPrTn57FWJZSGcs25PbR8SK3SseKvB46XuRWrfKxom2IT2iVDx55\n/XS8yK3SsSKvh44XuVWrfKwo9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjp\nKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp\n9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0\nioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSK\niIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqI\niIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiI\niEjpKfSKiIiISOkp9IqIiIhI6Sn0ioiIiEjpKfSKiIiISOnNLPR+9atf5a1vfSv/6T/9p1ndpYiI\niIjITMwk9KZpyr/8l/+S8+fPYxjGLO5SRERERGRmZhJ6//2///c88sgjrK+vz+LuRERWWpZlZFk2\n72GIiJSKfdI7ODw85HOf+xyf/exn+fKXvzyLMYmIrKQLF3y+9jWHL3xhOjX/5E82eOc7E86dC2f6\nOEVRUBSQv/i1oCDPCwqAAgwDbMvEtnTZh4iUx4lD7z//5/+cD3/4w7iu+6q329jYOOlDLRzHcYBy\nPjeZPR0vcjNFUfD7v5/ygQ9UGQy+HzT/6391aTZzPvvZMT/2Y/arlo/leUEYp0RJRpJlxElGnOak\naUacZmR58fKwS0FR5NdDb0E+/T1gGia2YWGaFrZlYJsm1osh2DKN64HYdSwqro3vvvrY5PbS3CK3\natWPlROF3v/1v/4XL7zwAn/lr/yV6z8riuKGt/34xz9+/c8PPfQQDz/88EkeWkSkNJ566pWB95rB\nwOQDH6jyP/7HmB/6IYc8LxhHCUGYMIkS4iQjSjKiNCXJYuIsIckT0jwhzdOX/JNxLd7CdDXXMAxM\nA3jpnzHIi4IsKyhyMDCxTAvbtDANaxqITQvLsHAsF9/28CyPijcNv1XfoeLaVD0HSyvFInKbPfHE\nEzz55JPXv3/kkUduetsThd4/+ZM/4X//7//NW9/61us/++M//mO++93v8tGPfvRlt/3FX/zFl33f\n7XZP8tAL4do7pTI8F7n9dLzIzfzP/9m4YeAFwMgYjGN+5/8bMMx6jMOEMAsJ05Aoi0nyadDNyXBs\nA8c2cSwD2zaxTQPXMahaBqZpYACm+dIV2RsvUrxUlmVkRUyeFWT59J84gSwrSNKcKMnJMnAtD9d0\n8S0P137xz46D71rUfIdG1aXinvjDRbkBzS1yq8p4rNx3333cd999179/6qmnbnrbE81AH/zgB/ng\nBz94/fuf+7mf46d+6qf4wAc+cJK7FRFZGaZp8oUveC9+V4CVgBlPv1oxWBE4E37r94bs3HdAlEY4\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f47d4245208>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 9
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"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 meaan (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."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -500,6 +652,8 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"**author's note:** needs rewrite, we already explained what kappa is\n",
|
||||
"\n",
|
||||
"So our desire is to have an algorithm for selecting sigma points based on some criteria. Maybe we know something about our nonlinear problem, and we know we want our sigma points to be very close together, or very far apart. Or through experimentation we decide that a certain choice of basis vectors from our hyperellipse are the best axis to choose our sigma points from. But we want this to be an algorithm - we don't want to have to hard code in a specific selection algorithm for each different problem. So we are going to want to be able to set some parameters to tell the algorithm how to automatically select the points and weights for us. That may seem a bit abstract, so let's just launch into it, and try to develop an intuitive understanding as we go.\n",
|
||||
"\n",
|
||||
"Assume a n-dimensional state variable $\\mathbf{x}$ with mean $\\mu$ and covariance $\\Sigma$. We want to choose $2n+1$ sigma points to approximate the Gaussian distribution of $\\mathbf{x}$.\n",
|
||||
@@ -543,11 +697,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAtIAAAF2CAYAAABDD3/PAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xdc1WX/x/HXYS9BRVw4cCSiGCKOcqFWklrdadqw0LIc\nd3an3s5s3mrLNHNkjjRblg0rs6X9FMyFham5QHEhuEDmYXPO7w/uKG5xcdQv4/18PHrE+S7ewOXh\nw/d8znWZYmJirIiIiIiIyFWxMzqAiIiIiEhFpEJaRERERKQMVEiLiIiIiJSBCmkRERERkTJQIS0i\nIiIiUgYqpEVEREREykCFtIiIiIhIGdhcSJ8+fZrw8HDatm3LgAEDOHTo0GXP2b59O3fffTchISHc\neuutTJ48GbPZXLw/KiqKsLAwgoODGT16NJmZmbbGFBERERG5pmwupJ9//nn8/f3ZsWMHffr0Ydy4\ncZc9p1mzZrz77rtER0fz888/k5SUxJIlSwDIzs5mzJgxPP3002zbtg2TycTs2bNtjSkiIiIick3Z\nVEhnZmaydetWhg8fjpOTE0OHDiUhIYHY2NhLnufj40OdOnUAKCgowGq14u7uDhTdjfb09KRfv364\nuLgwbNgwvv/+e1tiioiIiIhcczYV0sePH8fJyQk3NzcGDx7MyZMnadSoEUeOHLnsuYmJiYSEhNCp\nUyc8PT0ZMWIEAEePHqVp06ZER0fz+OOP07hxY9LS0khJSbElqoiIiIjINWVTIZ2dnY27uztms5m4\nuDjS09Nxd3cnOzv7sufWr1+f6Oho1q9fz7Fjx/jkk08AyMrKws3NjaSkJOLi4nBycireLiIiIiJS\nXjjYcrKrqytms5m6desSFRUFgNlsxs3N7Yqv0bBhQ0aMGMGyZct46KGHcHNzIysri7CwMMLCwkhL\nSwO44Jrx8fG2RBcRERERuWINGza8YJtNhXTjxo3Jzc3lzJkz1KlTh7y8PE6cOEGTJk2u6joWiwWr\n1QqAn59f8d1pgMOHD+Pl5UWNGjUuOC8gIMCW+JWCt7c3q1evJjQ01OgoUo5oXEhpNC6kNBoXUhqN\ni5IOHDhQ6nabWjs8PDzo2rUrS5YsITc3lxUrVuDr60uLFi2KjwkPD2fWrFklzvvuu++IiYnBYrGQ\nmJjI8uXL6d69OwC33HILGRkZrF27lqysLJYvX07fvn1tiSkiIiIics3ZPP3dtGnTiI2NpWPHjvz4\n44/MmTOnxP6EhASSk5NLbEtNTeXpp58mJCSEBx54gPbt2/Pkk08CRe0ic+fOZf78+XTu3BmA8ePH\n2xpTREREROSaMsXExFiNDlEW8fHxau2g6KWXAwcOULt2baOjSDmicSGl0biQ0mhcSGk0Lko6cOBA\nqT3SWiK8EtAfFFIajQspjcaFlEbjQkqjcXF5KqRFRERERMrAplk7RERERCqi/Px8UlJSMJlMRkcp\nl/5cCK+goMDgJNeX1WqlRo0aODo6lul8FdIiIiJSpeTn55OcnEzt2rWxs9OL81WZxWLh7NmzeHt7\nl6mY1ugRERGRKiUlJUVFtABgZ2dH7dq1i+/AX/X51ziPiIiISLlmMplUREsxOzu7Mrf4aBSJiIiI\niJSBCmkRERERkTJQIS0iIiIiUgYqpEVEREREykDT34mIiIhcpfz8fD777DPWrFlDTk4O1apVY8iQ\nIdxxxx2am7oKUSEtIiIi8jfx8fEsWbKE1NRUWrduzZAhQ3Bzcyven5mZycMPP8yuXbtKLFiyfft2\nevToweLFi7G3tzcierm1cuVKPvnkE+Li4jCZTLRu3ZpJkybRvn17o6PZRK0dIiIiIkBhYSFPPfUU\nd999N8uXL2f16tXMmDGDO+64g08++aT4uHHjxvHbb79dsOpfdnY269ev5/XXXy+xbfbs2dx9993c\ndttt3H333cyePZvs7Owy58zIyGDy5Mk0a9aMnJycMl/nRoqKiuL+++/nyy+/5JtvvsHHx4fBgwdz\n9OhRo6PZRHekRURERIBnnnmGb7/9tkSBbLVaOXbsGK+99hoNGjSgdevW7Nq166LXKCgoYMOGDUye\nPJmsrCweeughfv/99xLH7Ny5k4iICFauXEm1atWuOme1atW4/fbbOXfuHC4uLld9vhHmzp1b4vEr\nr7zCN998Q0REBE2aNDEole10R1pERESqvLS0NDZt2nTBXeY/JSUl8fbbbxMdHU1iYuIlr3X27FlO\nnz7NxIkTLyii/7Rz504mT55c5rwbN24kLCyszOdfS6tXr6ZFixYX/a80aWlpAHh5ed3IqNec7kiL\niIhIlff9998THx9/yWOOHj2KyWTCZDJhtVovepzJZCI7O5vdu3df8nq7du0iMzMTDw+Pq867efNm\nJk6cSFRUFLt372batGls376d+vXrM3fuXLy9vbFYLPz2228MHDiQHj16kJ6ezqeffsr27dt58MEH\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f47688a06a0>"
|
||||
"<matplotlib.figure.Figure at 0x7f47d424b710>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 7
|
||||
"prompt_number": 10
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -734,7 +888,7 @@
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 8
|
||||
"prompt_number": 11
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -804,7 +958,7 @@
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 9
|
||||
"prompt_number": 12
|
||||
},
|
||||
{
|
||||
"cell_type": "heading",
|
||||
@@ -818,9 +972,403 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We are now ready to consider implementing a Kalman filter using the approximations for the mean and covariances afforded by the unscented transform. "
|
||||
"We are now ready to consider implementing a Kalman filter using the approximations for the mean and covariances afforded by the unscented transform. \n",
|
||||
"\n",
|
||||
"Let's solve the 'bearing only' target tracking problem. Here the idea is that we have a ship or other platform tracking a moving target. Our sensor only provides the bearing to the target relative to the ship.\n",
|
||||
"\n",
|
||||
"This is a nonlinear problem because the conversion between a target position and the bearing is:\n",
|
||||
"\n",
|
||||
"$$\\theta = \\tan^{-1}\\frac{y_{ship} - y_{target}}{x_{ship} - x_{target}}$$\n",
|
||||
"\n",
|
||||
"If we were solving this problem using and EKF we would need to compute the Jacobian of this transform to linearize the filter. With the UKF we do not have to do this - we will see how this works as we work the example.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"### Define State\n",
|
||||
"\n",
|
||||
"First, lets define our filter state. Let's assume a constant velocity model for the target, so a reasonable state would be\n",
|
||||
"\n",
|
||||
"$$\\mathbf{x} = \\begin{bmatrix}x\\\\ \\dot{x} \\\\ y \\\\ \\dot{y}\\end{bmatrix}$$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"where $x$ and $y$ are the position of the target, and $\\dot{x}$ and $\\dot{y}$ are its velocity. \n",
|
||||
"\n",
|
||||
"### Define State Transition\n",
|
||||
"\n",
|
||||
"Now we need to tell the filter how to perform the state transition - how to predict the next position from the current position. In the linear Kalman filter this is the equation $\\mathbf{x}^- = \\mathbf{Fx}$ but the unscented Kalman filter is intended for nonlinear problems. We cannot implement nonlinear behavior using linear algebra, so instead of providing the filter with a matrix we need to provide the filter with a function that computes the transition.\n",
|
||||
"\n",
|
||||
"As it turns out our state transition is linear. We model the target movement using the standard Newtonian equation\n",
|
||||
"$$x_k = x_{k-1} + \\dot{x}\\Delta t$$\n",
|
||||
"\n",
|
||||
"However, the UKF code does not differentiate between linear and nonlinear versions, so we will write a function. The signature of the function required by `filterpy.UnscentedKalmanFilter` is\n",
|
||||
"\n",
|
||||
" def fx(x, dt):\n",
|
||||
" return x\n",
|
||||
" \n",
|
||||
"The filter implements the state as a one dimensional array, so our function can be implemented as"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"def fx(x,dt):\n",
|
||||
" # pos = pos + vel\n",
|
||||
" # vel = vel\n",
|
||||
" x[0] += x[1]\n",
|
||||
" x[2] += x[3]\n",
|
||||
" return x"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 13
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Define Measurement Function\n",
|
||||
"\n",
|
||||
"Now we define our measurement function. In the linear KF this is implemented with the $\\mathbf{H}$ matrix, but because the UKF is nonlinear we need to provide a function. We have already given the computation of the bearing from position as\n",
|
||||
"\n",
|
||||
"$$\\theta = \\tan^{-1}\\frac{y_{ship} - y_{target}}{x_{ship} - x_{target}}$$\n",
|
||||
"\n",
|
||||
"so all we have to do is compute that in a function. The signature of this function is required to be\n",
|
||||
"\n",
|
||||
" def hx(x):\n",
|
||||
" return measurement\n",
|
||||
" \n",
|
||||
"The filter state does not includes the ship's position, so we will assume a global variable `ship_pos` is defined that specifies the (x,y) coordinate for the ship."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"import math\n",
|
||||
"def hx(x):\n",
|
||||
" \"\"\" measurement function - convert position to bearing\"\"\"\n",
|
||||
" return math.atan2(ship_pos[1] - x[2], ship_pos[0] - x[0])"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 14
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"And those two functions are the crux of the problem. All that remains is defining the noise in the system, and running the filter.\n",
|
||||
"\n",
|
||||
"**Important Note**: There is a nonlinearity that we are not considering, the fact that angles are modular. Kalman filters operate by computing the differences between measurements. The difference between $359^\\circ$ and $1^\\circ$ is $2^\\circ$, but a subtraction of the two values, as implemented by the filter, yields a value of $358^\\circ$. This is exacerbated by the UKF which computes sums of weighted values in the unscented transform. For now we will place our sensors and targets in positions that avoid these nonlinear regions. Later in the chapter I will show you how to handle this problem."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Design Noise Parameters\n",
|
||||
"\n",
|
||||
"We have spent a lot of time designing the $\\mathbf{R}$, $\\mathbf{Q}$, and $\\mathbf{P}$ matrices in past chapters, and nothing changes for the UKF filter, so I will just choose some arbitrary values without much discussion. Let's assume the variance in the bearing measurement is $\\sigma=0.35$ radians."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Implement the Filter\n",
|
||||
"\n",
|
||||
"So let's implement a filter given the design above. I'll just present the code; it should look very similar to the linear KF to you. The main difference is how we construct the filter:\n",
|
||||
"\n",
|
||||
" f = UKF(dim_x=4, dim_z=1, dt=dt, fx=fx, hx=hx, kappa=0.)\n",
|
||||
" \n",
|
||||
"When you construct the filter you have to provide the state transition function, the measurement function, and the value for $\\kappa$ along with the usual dimension and time step values."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from filterpy.kalman import UnscentedKalmanFilter as UKF\n",
|
||||
"from filterpy.common import Q_discrete_white_noise\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def fx(x,dt):\n",
|
||||
" # pos = pos + vel\n",
|
||||
" # vel = vel\n",
|
||||
" x[0] += x[1]\n",
|
||||
" x[2] += x[3]\n",
|
||||
" return x\n",
|
||||
"\n",
|
||||
"def bearing(ship_pos, target_pos):\n",
|
||||
" return math.atan2(target_pos[1]- ship_pos[1], target_pos[0] - ship_pos[0])\n",
|
||||
"\n",
|
||||
"def hx(x):\n",
|
||||
" \"\"\" measurement function - convert position to bearing\"\"\"\n",
|
||||
" return math.atan2(x[2] - ship_pos[1], x[0] - ship_pos[0])\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"dt = 0.1\n",
|
||||
"ship_pos = [-40,20]\n",
|
||||
"target_pos = [0,0]\n",
|
||||
"\n",
|
||||
"std_noise = math.radians(1)\n",
|
||||
"\n",
|
||||
"f = UKF(4, 1, dt, fx=fx, hx=hx, kappa=0.)\n",
|
||||
"f.x = np.array([target_pos[0], 0., target_pos[1], 0.])\n",
|
||||
"Q = Q_discrete_white_noise(2, dt, .01)\n",
|
||||
"f.Q[0:2,0:2] = Q\n",
|
||||
"f.Q[2:4, 2:4] = Q\n",
|
||||
"\n",
|
||||
"f.R *= std_noise**2\n",
|
||||
"f.P *= 100\n",
|
||||
"\n",
|
||||
"N = 300\n",
|
||||
"xs = []\n",
|
||||
"for i in range(N):\n",
|
||||
" target_pos[0] += 1 + randn()*0.0001 # add some process noise\n",
|
||||
" angle = bearing(ship_pos, target_pos) + randn()*std_noise\n",
|
||||
"\n",
|
||||
" f.predict()\n",
|
||||
" f.update(angle)\n",
|
||||
" xs.append(f.x)\n",
|
||||
"\n",
|
||||
"xs = np.asarray(xs)\n",
|
||||
"plt.plot([i/10 for i in range(N)], xs[:,0])\n",
|
||||
"plt.xlabel('time')\n",
|
||||
"plt.ylabel('target X position')\n",
|
||||
"plt.show()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAt0AAAGJCAYAAABWwI+OAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVXX+x/HXZb9wERQUTFEQXBBE0cRKA/dSs0WzHMul\nmWlstGkm22Yax2ZGf07NVLNVM81U45I1LVqWIoYt4r6luKDIZXEFNNxAQLjc8/vDX/c3jktX5XK5\n8H4+Hj0e8D33nvO5fgPe99zvYsrNzTUQERERERGX8XJ3ASIiIiIiTZ1Ct4iIiIiIiyl0i4iIiIi4\nmEK3iIiIiIiLKXSLiIiIiLiYQreIiIiIiIspdIuIiIiIuFiDhu7q6mpmzZpFv3796Nu3L7/5zW8A\nqK2t5dlnn6V3794MGjSIFStWXPC8BQsW0L9/f1JSUnj55ZcbsmQRERERkevm05AXmzt3LocOHWL5\n8uWEhYWRn58PwLx587BarWRlZZGTk8PUqVNJTk4mMjKS7OxsXn31Vd555x0sFgsTJkwgPj6eESNG\nNGTpIiIiIiLXrMHudFdXV7N06VJmzpxJeHg4JpOJuLg4ADIyMpg4cSIWi4WUlBSSk5PJzMx0HBs+\nfDixsbFEREQwbtw40tPTG6psEREREZHr1mChu6ioCJPJxKpVq+jfvz+jRo1i1apVjmMxMTE8+eST\npKenExsbS2Fh4QXH5s+fzwsvvEBcXJzjmIiIiIiIJ2iw0F1RUUFtbS2HDx/myy+/ZNasWTz11FMc\nP36cqqoqAgMDycvL49ixYwQFBVFZWQngOHbo0CEOHDhwwTEREREREU/QYGO6AwICqKur46GHHsLP\nz49+/foRExNDdnY2ZrOZqqoqli5dCsCcOXMICgoCwGw2U1lZycyZMwHIzMwkMDDwktc4dOhQw7wY\nEREREWnWoqKirurxDRa6o6KiMJlMF7UbhkF0dDT5+fkkJCQAkJ+fz5AhQwCIjo6moKDA8Xir1Uqn\nTp0ue534+Ph6rlxcLSwsjCVLlpCWlubuUuQaqP88l/rOs6n/PJv6z3OFhYWxdu3aq35egw0vCQkJ\noW/fvsybNw+bzcaWLVsoLCykV69ejBgxgoULF1JeXs6mTZvYsWMHw4YNA2DEiBFkZmZitVopLS1l\n8eLFWrlERERERDxKgy8Z+Itf/IK+ffsSERHBH/7wB1q3bs2UKVMoKCggLS2NkJAQ5s6dS0REBABJ\nSUlMnz6dSZMmYbPZGD9+vEK3iIiIiHgUU25uruHuIurLoUOHNLzEA4WFhbF3717atGnj7lLkGqj/\nPJf6zrOp/zyb+s9zfTu85GrHdGsbeGkU9GbJs6n/PJf6zrOp/zyb+q95UegWEREREXExhW4RERER\nERdT6BYRERERcTGFbhERERERF1PoFhERERFxMYVuEREREREXU+gWEREREXExhW4RERERERdT6BYR\nERERcTGFbhERERERF1PoFhERERFxMYVuEREREREXU+gWEREREXExhW4RERERERdT6BYRERERcTGF\nbhERERERF1PoFhERERFxMYVuEREREREXU+gWEREREXExhW4RERERERdT6BYRERERcTGFbhERERER\nF1PoFhERERFxMYVuEREREREXU+gWEREREXExhW4RERERERdT6BYRERERcTGFbhERERERF1PoFhER\nERFxMYVuEREREREXU+gWEREREfkOh46XY6uzX/PzFbpFRERERK7gRHk1Y2Z/yveeT+dEedU1nUOh\nW0RERETkMux2g5/+7SuOlp2l6lwdlgC/azqPQreIiIiIyGW88ukOvsg+RKjFn9cfG4Kfr/c1ncen\nnusSEREREfE4hmGQe/gkX+08zObcEnYXlXGiopqqczYA/vrjQbQLt1zz+RW6RURERKTZqq6x8ebK\n3byflYf16KmLjgf4evPUuBsZ3Cvquq6j0C0iIiIizVLW7iM8+6+1FJacAaClxZ9hvTtyc3xb+nRu\nQ2TLIAL9fTCZTNd9LYVuEREREWl2lm0qYOpfPgegS7tQfvm9fqT1aI+vj2umPCp0i4iIiEizkl98\niif+kQXAo6N78sS9ffDzubYJks5S6BYRERGRZqPqnI0f/WkVFdW1jO7XiZ/f37deho98F4VuERER\nEWkWTpRX84M/fsa+wyeJbRvCiw/f2iCBGxS6RURERKQZ2HfoBD/4YyZFpWeIbBnEm48Pw2K+to1u\nroVCt4iIiIg0WYePl/PHj77m/aw87IZBYnQY8564jbatghq0DoVuEREREWlSbHV2Fq+18sGa/Wzc\nV4xhgLeXiYmD4/nVhH4EBfg2eE0K3SIiIiLSZKzbc5RZC9az7/BJAPx9vRmVEsPjY3rTKTLEbXU1\neOieOHEi2dnZeHufX5Zl+PDhvPDCC9TW1vLcc8+RkZFBSEgITz/9NCNGjHA8b8GCBbz++uvU1tYy\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f47d408a320>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 37
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"If we look at only the target's estimated position in x, the results look very good. After running for several seconds the filter appears to settle down and produce a reasonably linear output for the target's position. However, let's look at the 2D plot of position. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"plt.ylabel('target X position')\n",
|
||||
"plt.ylabel('target Y position')\n",
|
||||
"plt.plot(xs[:,0], xs[:,2])\n",
|
||||
"plt.show()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f47d4154da0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 38
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"As we can see the actual performance is abysmal. This is not an indictment of the UKF, but of the difficulty of the problem we are trying to solve. There are an infinite number of solutions for each measurement. For example, if our ship is at (0, 20), a bearing reading of 0 could reflect a target position of (0, 20) or (100, 20), or (1e300, 20). The Kalman filtering literature has many treatments of this problem; a common solution is to have the ship perform manuevers while tracking. This allows the filter to reduce the range of possibilities to something managable. This is rather outside the scope of this book so I will leave it to you to search the literature if you are interested in this specific problem.\n",
|
||||
"\n",
|
||||
"Instead, I will make the problem tractable by introducing a second sensor. In the Designing Nonlinear Filters chapter we solved the two sensor version of this problem by linearizing the problem while assuming a nominal position for the target track. Now we will solve this by using the UKF.\n",
|
||||
"\n",
|
||||
"The problem is as follows. Assume we have two sensors, each which provides a bearing only measurement to the target, as in the chart below."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"circle1=plt.Circle((-4,0),5,color='#004080',fill=False,linewidth=20, alpha=.7)\n",
|
||||
"circle2=plt.Circle((4,0),5,color='#E24A33', fill=False, linewidth=5, alpha=.7)\n",
|
||||
"\n",
|
||||
"fig = plt.gcf()\n",
|
||||
"ax = fig.gca()\n",
|
||||
"\n",
|
||||
"plt.axis('equal')\n",
|
||||
"plt.xlim((-10,10))\n",
|
||||
"plt.ylim((-10,10))\n",
|
||||
"\n",
|
||||
"plt.plot ([-4,0], [0,3], c='#004080')\n",
|
||||
"plt.plot ([4,0], [0,3], c='#E24A33')\n",
|
||||
"plt.text(-4, -.5, \"A\", fontsize=16, horizontalalignment='center')\n",
|
||||
"plt.text(4, -.5, \"B\", fontsize=16, horizontalalignment='center')\n",
|
||||
"#plt.scatter ([-4],[0], 'r')\n",
|
||||
"\n",
|
||||
"ax.add_artist(circle1)\n",
|
||||
"ax.add_artist(circle2)\n",
|
||||
"plt.show()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f47dd779f28>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 21
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We can compute the bearing between a sensor and the target as follows:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"def bearing(sensor, target_pos):\n",
|
||||
" return math.atan2(target_pos[1] - sensor[1], target_pos[0] - sensor[0])"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 79
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"So our filter will need to receive a vector of 2 measurements during each update, one for each sensor. We can implement that as:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"def measurement(A_pos, B_pos, pos):\n",
|
||||
" angle_a = bearing(A_pos, pos)\n",
|
||||
" angle_b = bearing(B_pos, pos)\n",
|
||||
" return [angle_a, angle_b]"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 80
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The design of the measurement function and state transition function can remain the same as nothing has changed that would affect them. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"from filterpy.kalman import UnscentedKalmanFilter as UKF\n",
|
||||
"from filterpy.common import Q_discrete_white_noise\n",
|
||||
"\n",
|
||||
"def bearing(sensor, target_pos):\n",
|
||||
" return math.atan2(target_pos[1] - sensor[1], target_pos[0] - sensor[0])\n",
|
||||
"\n",
|
||||
"def measurement(A_pos, B_pos, pos):\n",
|
||||
" angle_a = bearing(A_pos, pos)\n",
|
||||
" angle_b = bearing(B_pos, pos)\n",
|
||||
" return [angle_a, angle_b]\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def fx(x,dt):\n",
|
||||
" x[0] += x[1]\n",
|
||||
" x[2] += x[3]\n",
|
||||
" return x\n",
|
||||
"\n",
|
||||
"def hx(x):\n",
|
||||
" # measurement to A\n",
|
||||
" pos = (x[0], x[2])\n",
|
||||
" return measurement(sa_pos, sb_pos, pos)\n",
|
||||
"\n",
|
||||
"def normalize(a):\n",
|
||||
" if a > math.pi:\n",
|
||||
" a -= math.pi*2\n",
|
||||
"\n",
|
||||
" if a < -math.pi:\n",
|
||||
" a += math.pi*2\n",
|
||||
" return a\n",
|
||||
"\n",
|
||||
"sa_pos = [-40, 0]\n",
|
||||
"sb_pos = [40, 0]\n",
|
||||
"\n",
|
||||
"dt = .1\n",
|
||||
"target_pos = [40, 20]\n",
|
||||
"\n",
|
||||
"std_noise = math.radians(1.)\n",
|
||||
"\n",
|
||||
"f = UKF(dim_x=4, dim_z=2, dt=dt, hx=hx, fx=fx, kappa=2.)\n",
|
||||
"f.x = np.array([target_pos[0], 1., target_pos[1], 1.])\n",
|
||||
"\n",
|
||||
"Q = Q_discrete_white_noise(2, dt, 1.1)\n",
|
||||
"f.Q[0:2,0:2] = Q\n",
|
||||
"f.Q[2:4, 2:4] = Q\n",
|
||||
"\n",
|
||||
"f.R *= std_noise**2\n",
|
||||
"f.P *= 1000\n",
|
||||
"\n",
|
||||
"xs = []\n",
|
||||
"txs = []\n",
|
||||
"\n",
|
||||
"for i in range(300):\n",
|
||||
" target_pos[0] += 1 + randn()*0.0001\n",
|
||||
" target_pos[1] += 1 + randn()*0.0001\n",
|
||||
" txs.append(target_pos.copy())\n",
|
||||
" \n",
|
||||
" z = measurement(sa_pos, sb_pos, target_pos)\n",
|
||||
" z[0] += randn() * std_noise\n",
|
||||
" z[1] += randn() * std_noise\n",
|
||||
"\n",
|
||||
" f.predict()\n",
|
||||
" f.update(z)\n",
|
||||
" xs.append(f.x)\n",
|
||||
"\n",
|
||||
"xs = np.asarray(xs)\n",
|
||||
"txs = np.asarray(txs)\n",
|
||||
"\n",
|
||||
"plt.plot(xs[:,0], xs[:,2])\n",
|
||||
"plt.plot(txs[:,0], txs[:,1])\n",
|
||||
"plt.show()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAs4AAAF2CAYAAAB+nR6pAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VPW9//HXTNbJvkA2tmwsgRCJQADFhEXQiAuiVIqS\n0haLEm/1AvWq5afei5daf9WfrZe2dAVUrlYRQaDBgMoW9iUIuJCEAAECJED2deb8/kgTRAIEAjlZ\n3s+/yEzm5DPfB9JXTs98j+Wbb74xEBERERGRK7KaPYCIiIiISFugcBYRERERaQKFs4iIiIhIEyic\nRURERESaQOEsIiIiItIECmcRERERkSZQOIuIiIiINMFVw3n27NkMHz6cgQMHcv/997Nu3ToA3nrr\nLfr160d8fDzx8fGMHj36otctXryY22+/nYSEBN54442bM72IiIiISAtxvto3TJs2jXnz5uHq6srm\nzZuZPn0627dvB2DcuHG89tprl7wmMzOT+fPns2TJEry8vJg8eTIxMTEkJyff+HcgIiIiItICrnrG\nuU+fPri6umIYBjU1NXh6emKxWAAwjMZvOpiWlsbYsWOJiooiODiYiRMnsnr16hs7uYiIiIhIC7rq\nGWeAl19+maVLl+Lu7s6CBQuw2WxYLBY+//xzhgwZQmhoKE8//TQjR44EIDc3l8GDB7No0SLy8/MZ\nOHAgK1euvKlvRERERETkZmrShwNffvll9uzZwzPPPMMvfvELqqqqSE5OZu3atWRkZJCamsrMmTPJ\nzc0FoKKiAg8PD44dO8aRI0fw9PSkvLz8Zr4PEREREZGbqklnnAGcnZ159NFHeeedd9iyZQsjRoxo\neG7MmDEkJCSwceNGwsPDsdlslJeXM2fOHADS09Px8PC45JjHjh1r/jsQEREREWmCbt26Nev1TQ7n\nepe7rvm7wsPDycnJafg6KyuLyMjIRr83JibmWkeQGyAwMJCPPvqIpKQks0fpkLT+5tHam0vrby6t\nv3m09uYKDAxk06ZNzT7OFS/VKCgo4IMPPqC0tJTa2lree+89zp49y4ABA0hPT6e4uBiHw8EXX3zB\n9u3bGT58OADJycmkp6eTlZXFqVOnWLp0qXbUEBEREZE27YpnnK1WKytXruT111+npqaG6Ohofv/7\n3+Pn58eqVat4/vnnsdvthIeH8+abbxIREQFAXFwcqamppKSkUFtby6RJkxTOIiIiItKmXTGcAwIC\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x7f47d4127630>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 98
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
|
||||
Reference in new issue
Block a user