Moved chapter 6 as part of reorg.

This commit is contained in:
Roger Labbe committed 2015-01-27 10:29:11 -08:00
1 parent 2a651f6c5b
commit c3ebd9f50c
5 files changed
+86 -84

No files matched your search

+492
View File
@@ -0,0 +1,492 @@
{
"metadata": {
"name": "",
"signature": "sha256:c82e943808236de492b791895b0610ea0864057ea274158ee910a721ed9ce67c"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"from __future__ import division, print_function\n",
"%matplotlib inline\n",
"import sys\n",
"sys.path.insert(0,'../code') # allow us to format the book\n",
"\n",
"# use same formatting as rest of book so that the plots are\n",
"# consistant with that look and feel.\n",
"import book_format\n",
"book_format.load_style('..')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<style>\n",
"@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
"@import url('http://fonts.googleapis.com/css?family=Vollkorn');\n",
"@import url('http://fonts.googleapis.com/css?family=Arimo');\n",
"\n",
" div.cell{\n",
" width: 850px;\n",
" margin-left: 0% !important;\n",
" margin-right: auto;\n",
" }\n",
" div.text_cell code {\n",
" background: transparent;\n",
" color: #000000;\n",
" font-weight: 600;\n",
" font-size: 11pt;\n",
" font-style: bold;\n",
" font-family: 'Source Code Pro', Consolas, monocco, monospace;\n",
" }\n",
" h1 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
"\t}\n",
"\t\n",
" div.input_area {\n",
" background: #F6F6F9;\n",
" border: 1px solid #586e75;\n",
" }\n",
"\n",
" .text_cell_render h1 {\n",
" font-weight: 200;\n",
" font-size: 30pt;\n",
" line-height: 100%;\n",
" color:#c76c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 1em;\n",
" display: block;\n",
" white-space: wrap;\n",
" } \n",
" h2 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h2 {\n",
" font-weight: 200;\n",
" font-size: 20pt;\n",
" font-style: italic;\n",
" line-height: 100%;\n",
" color:#c76c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 1.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" } \n",
" h3 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h3 {\n",
" font-weight: 300;\n",
" font-size: 18pt;\n",
" line-height: 100%;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 2em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" h4 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h4 {\n",
" font-weight: 300;\n",
" font-size: 16pt;\n",
" color:#d77c0c;\n",
" margin-bottom: 0.5em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" h5 {\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" }\n",
" .text_cell_render h5 {\n",
" font-weight: 300;\n",
" font-style: normal;\n",
" color: #1d3b84;\n",
" font-size: 16pt;\n",
" margin-bottom: 0em;\n",
" margin-top: 1.5em;\n",
" display: block;\n",
" white-space: nowrap;\n",
" }\n",
" div.text_cell_render{\n",
" font-family: 'Arimo',verdana,arial,sans-serif;\n",
" line-height: 135%;\n",
" font-size: 125%;\n",
" width:750px;\n",
" margin-left:auto;\n",
" margin-right:auto;\n",
" text-align:justify;\n",
" text-justify:inter-word;\n",
" }\n",
" div.output_subarea.output_text.output_pyout {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 50000px;\n",
" }\n",
" div.output_subarea.output_stream.output_stdout.output_text {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 50000px;\n",
" }\n",
" code{\n",
" font-size: 70%;\n",
" }\n",
" .rendered_html code{\n",
" background-color: transparent;\n",
" }\n",
" ul{\n",
" margin: 2em;\n",
" }\n",
" ul li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.5em; \n",
" }\n",
" ul li li{\n",
" padding-left: 0.2em; \n",
" margin-bottom: 0.2em; \n",
" margin-top: 0.2em; \n",
" }\n",
" ol{\n",
" margin: 2em;\n",
" }\n",
" ol li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.5em; \n",
" }\n",
" ul li{\n",
" padding-left: 0.5em; \n",
" margin-bottom: 0.5em; \n",
" margin-top: 0.2em; \n",
" }\n",
" a:link{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" a:visited{\n",
" font-weight: bold;\n",
" color: #1d3b84;\n",
" }\n",
" a:hover{\n",
" font-weight: bold;\n",
" color: #1d3b84;\n",
" }\n",
" a:focus{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" a:active{\n",
" font-weight: bold;\n",
" color:#447adb;\n",
" }\n",
" .rendered_html :link {\n",
" text-decoration: underline; \n",
" }\n",
" .rendered_html :hover {\n",
" text-decoration: none; \n",
" }\n",
" .rendered_html :visited {\n",
" text-decoration: none;\n",
" }\n",
" .rendered_html :focus {\n",
" text-decoration: none;\n",
" }\n",
" .rendered_html :active {\n",
" text-decoration: none;\n",
" }\n",
" .warning{\n",
" color: rgb( 240, 20, 20 )\n",
" } \n",
" hr {\n",
" color: #f3f3f3;\n",
" background-color: #f3f3f3;\n",
" height: 1px;\n",
" }\n",
" blockquote{\n",
" display:block;\n",
" background: #fcfcfc;\n",
" border-left: 5px solid #c76c0c;\n",
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
" width:680px;\n",
" padding: 10px 10px 10px 10px;\n",
" text-align:justify;\n",
" text-justify:inter-word;\n",
" }\n",
" blockquote p {\n",
" margin-bottom: 0;\n",
" line-height: 125%;\n",
" font-size: 100%;\n",
" }\n",
"</style>\n",
"<script>\n",
" MathJax.Hub.Config({\n",
" TeX: {\n",
" extensions: [\"AMSmath.js\"]\n",
" },\n",
" tex2jax: {\n",
" inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
" displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
" },\n",
" displayAlign: 'center', // Change this to 'center' to center equations.\n",
" \"HTML-CSS\": {\n",
" styles: {'.MathJax_Display': {\"margin\": 4}}\n",
" }\n",
" });\n",
"</script>\n"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"<IPython.core.display.HTML at 0x7effd802fa20>"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook creates the animations for the Multivariate Kalman Filter chapter. It is not really intended to be a readable part of the book, but of course you are free to look at the source code, and even modify it. However, if you are interested in running your own animations, I'll point you to the examples subdirectory of the book, which contains a number of python scripts that you can run and modify from an IDE or the command line. This module saves the animations to GIF files, which is quite slow and not very interactive. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import stats\n",
"import numpy as np\n",
"from matplotlib.patches import Ellipse\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import cm\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"\n",
"# this code lets me animate the 3d covariance. to be honest I do not find it\n",
"# very instructive or compelling so I am not using it for now.\n",
"def plot_3d_covariance(ax, mean, cov):\n",
" \"\"\" plots a 2x2 covariance matrix positioned at mean. mean will be plotted\n",
" in x and y, and the probability in the z axis.\n",
"\n",
" Parameters\n",
" ----------\n",
" mean : 2x1 tuple-like object\n",
" mean for x and y coordinates. For example (2.3, 7.5)\n",
"\n",
" cov : 2x2 nd.array\n",
" the covariance matrix\n",
"\n",
" \"\"\"\n",
"\n",
" # compute width and height of covariance ellipse so we can choose\n",
" # appropriate ranges for x and y\n",
" o,w,h = stats.covariance_ellipse(cov,3)\n",
" # rotate width and height to x,y axis\n",
" wx = abs(w*np.cos(o) + h*np.sin(o))*1.2\n",
" wy = abs(h*np.cos(o) - w*np.sin(o))*1.2\n",
"\n",
"\n",
" # ensure axis are of the same size so everything is plotted with the same\n",
" # scale\n",
" if wx > wy:\n",
" w = wx\n",
" else:\n",
" w = wy\n",
"\n",
" minx = mean[0] - w\n",
" maxx = mean[0] + w\n",
" miny = mean[1] - w\n",
" maxy = mean[1] + w\n",
" #print (minx, maxx, miny, maxy)\n",
" \n",
" minx = -9.57238091319 \n",
" maxx= 13.5723809132 \n",
" miny = -4.57238091319 \n",
" maxy = 18.5723809132\n",
"\n",
" xs = np.arange(minx, maxx, (maxx-minx)/40.)\n",
" ys = np.arange(miny, maxy, (maxy-miny)/40.)\n",
" xv, yv = np.meshgrid (xs, ys)\n",
"\n",
" zs = np.array([100.* stats.multivariate_gaussian(np.array([x,y]),mean,cov) \\\n",
" for x,y in zip(np.ravel(xv), np.ravel(yv))])\n",
" zv = zs.reshape(xv.shape)\n",
"\n",
" ax.plot_surface(xv, yv, zv, rstride=1, cstride=1, cmap=cm.autumn)\n",
"\n",
" ax.set_xlabel('X')\n",
" ax.set_ylabel('Y')\n",
" ax.set_zlim([0,10])\n",
" #ax.set_ylim([-5,20])\n",
" #ax.set_xlim([-10,10])\n",
"\n",
" ax.contour(xv, yv, zv, zdir='x', offset=minx-1, cmap=cm.autumn)\n",
" ax.contour(xv, yv, zv, zdir='y', offset=maxy, cmap=cm.BuGn)\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import mkf_internal\n",
"import matplotlib.pyplot as plt\n",
"from gif_animate import animate\n",
"import stats\n",
"def mkf_animate(frame):\n",
" global ax\n",
" plt.cla()\n",
" var = (31-frame) / 3\n",
" plot_3d_covariance(ax, (2,7), np.array([[var,0],[0,4.]]))\n",
" \n",
" \n",
"def ellipse_animate(frame):\n",
" \n",
" plt.cla()\n",
" cov = frame/15.\n",
" P = np.array([[2,cov],[cov,2]])\n",
" stats.plot_covariance_ellipse((2,7), cov=P, facecolor='g', alpha=0.2, \n",
" title='|2.0 {:.1f}|\\n|{:.1f} 2.0|'.format(cov, cov))\n",
"\n",
"fig = plt.figure()\n",
"#ax = fig.add_subplot(111, projection='3d')\n",
"animate('multivariate_ellipse.gif', ellipse_animate, 30, 125)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"<matplotlib.figure.Figure at 0x7effd7d90630>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nIiKqggFJRERUBQOSiOYFz9ZQo2FAEh1iskE1NDn+m1Ej4iAdIiKiKrgHSUREVAUDkoiIqAoGJNEh\nrr/+eojFYgwNDdW6lCVjzZo16OnpqXUZRPOKAUk0TfF4HLfffjsuvvhirFy5Ei0tLRCLxXjuuedm\ntb5UKoVrr70WK1euhFwuh0ajwWmnnYbHH398RuvxeDz4xS9+gbPOOgu9vb2Qy+XQ6XRYs2bNjKfh\nGuV2u/HVr34VFosFMpkMPT09uOKKK6acKJmDdKjRsNUc0TQdOHAAP/jBDyASiWCz2WA0GhEIBGYV\nDLFYDCeffDLef/99rFixAt/4xjeQz+fx5JNP4rzzzsONN9441rT8SO69915s3LgRTqcTa9asgdVq\nhcfjwdatW3HppZfiT3/6E37/+99Pu7b+/n6ceOKJGB4exrnnnotjjjkGb775Jn7+85/j2Wefxeuv\nvw6dTjfjbSZacgQimuC6664TRCKRMDg4OGF5NBoVXnrpJSEajQqCIAjr168XRCKR8Nxzz834NS6/\n/HJBJBIJ5513nlAqlcaWx+NxYdWqVYJEIhH++te/TmtdW7duFV555ZXDlnu9XsFutwsikUjYunXr\ntGtbu3atIBKJhF/84hcTll955ZWCSCQSvvnNbx72nFNPPVXo6emZ9msQLQU8xEo0TaOHQDUazZzX\ntXXrVohEItx0002QSCRjy1UqFTZs2IBKpYJf/vKX01rX5z73uQkN0keZzeaxKbNeeeWVaa1r//79\n2LZtG3p6enDZZZdNuO+GG26AQqHAb3/7W2QymWmtj2gpY0AS1cDo/JDVZscYXfbSSy/N+XVaWlom\n/H0kL7/8MoCRKa8O1d7ejpNOOgnpdBp/+ctf5lwbUb1jQBLVgMFgAICqs1/s378fADA4OIh8Pj/r\n1yiVSmODdD796U9P6zkffPABAOCoo46qen9fXx8AYO/evbOui2ipYEAS1cA555wDQRBw7bXXolwu\njy1PJBK45ZZbxm5PNWr0SK666iq8//77OPvss3HGGWdM6znxeBwAoFarq94/unwudREtFRzFSlQD\nN954I7Zt24atW7di1apVOP3005HP5/HUU09BKpVCrVYjkUhALJ7dd9jbbrsN99xzD4477jj813/9\n1zxXT9QcuAdJVAMmkwlvv/02vve97yGbzeI///M/8fjjj2Pt2rV47bXXUCqV0NLSMqvLKW655Rb8\n6Ec/wqpVq/Dyyy9PujdYzehjR/ckDzW6fD4GKhHVO+5BEtWITqfDXXfdhbvuumvC8v7+fqTTaRx/\n/PETRrhOx4YNG3Drrbdi9erVeP7552ccZMcccwyAf5yLPNToucfJzlESNRIGJFGdeeCBBwAAF198\n8Yyed+WVV+JnP/sZTjjhBDz77LPo6OiY8WufdtppAIBt27ZBEIQJTRCSySRef/11KJVK/PM///OM\n10201PAQK9EcCVPMGBcOh7F79+6xyzrGPyeVSh32+GeeeQYbN27EMcccg69//evTfv1vfetb+NnP\nfoZTTz0V27ZtO2I4ZrNZ7N69+7BRtL29vVi7di0OHDhw2HWY1113HTKZDL70pS9BLpdPqzaipYx7\nkEQzcNVVVyEUCgEAXnvtNQDAnXfeid/97ncAgJNPPhlf/epXxx5/77334sYbb8T69euxefPmseXp\ndBomkwlnnHEGli1bhpaWFuzYsQOvvPIKnE4nnnjiCUil0mnVdOONN+JXv/oV2tracPzxx2Pjxo2H\nPaanpwfr168fu/3mm2/ik5/8JJxOJw4cODDhsZs2bcKJJ56I7373u3jxxRfHWs298sorOProoyeM\nsiVqZAxIohl49NFHJ8zyIRKJ8OKLL44djhSLxRMCUiQSjf0ZTyaT4eKLL8b27dvx4osvAhjZe7v2\n2mvx/e9/f0aHRwcGBiASiVAsFnH77bdXfcyaNWsmBORoPdX6yPb29uKdd97Btddei2eeeQZPP/00\nLBYLvve97+G6666b0aAfoqVMJEx1fIioCV1//fW48cYbMTAwAIfDUetyloQ1a9ZgaGioauMDoqWK\n5yCJiIiqYEASERFVUbNzkJNdiExUa7lcDsBI2ze+T6enVCqhXC7z34vqzlzOmXMPkugQ1QbV0NT4\nb0aNqGaDdPhNk4iIFtpc9iDr4jKPRhg2vmPHDqxevbrWZcwLbkt94rbUJ25L/ZmvHTAeYiUiIqqC\nAUlERFQFA5KIiKgKBiQREVEVDEgiIqIqGJBERERVMCCJiIiqYEASERFVwYAkIiKqggFJRERUBQOS\niIioCgYkERFRFQxIIiKiKhiQREREVTAgiYiIqmBAEhERVcGAJCIiqoIBSUREVAUDkoiIqAoGJBER\nURUMSCIioioYkERERFUwIImIiKpgQBIREVXBgCQiIqqCAUlERFQFA5KIiKgKBiQREVEVDELine truncated
"text": [
"<matplotlib.figure.Figure at 0x7effd7d90898>"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src='multivariate_ellipse.gif'>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from matplotlib.patches import Ellipse\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import cm\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"from gif_animate import animate\n",
"import numpy.random as random\n",
"from DogSensor import DogSensor\n",
"import stats\n",
"from filterpy.common import Q_discrete_white_noise\n",
"from filterpy.kalman import KalmanFilter\n",
"\n",
"def dog_tracking_filter(R,Q=0,cov=1.):\n",
" dog_filter = KalmanFilter (dim_x=2, dim_z=1)\n",
" dog_filter.x = np.array([0, 0]) # initial state (location and velocity)\n",
" dog_filter.F = np.array([[1,1],\n",
" [0,1]]) # state transition matrix\n",
" dog_filter.H = np.array([[1,0]]) # Measurement function\n",
" dog_filter.R *= R # measurement uncertainty\n",
" dog_filter.P *= cov # covariance matrix \n",
" if np.isscalar(Q):\n",
" dog_filter.Q = Q_discrete_white_noise(2, var=Q)\n",
" else:\n",
" dog_filter.Q = Q\n",
" return dog_filter\n",
"\n",
"\n",
"R = 5\n",
"Q = .01\n",
"noise = 2.\n",
"P=20.\n",
"dog = DogSensor(velocity=1,noise_var=noise)\n",
"f = dog_tracking_filter(R=R, Q=Q, cov=P)\n",
"random.seed(200)\n",
"zs = []\n",
"xs = []\n",
"def animate_track(frame):\n",
" if frame > 30: return\n",
" \n",
" plt.gca().set_xlim(-100,100)\n",
" if frame == 0:\n",
" stats.plot_covariance_ellipse ((0, f.x[0]), cov=f.P, axis_equal=True, \n",
" facecolor='g', edgecolor=None, alpha=0.2)\n",
" xs.append (f.x[0])\n",
" \n",
" z = dog.sense()\n",
" zs.append(z)\n",
" f.update(z)\n",
" xs.append (f.x[0])\n",
" \n",
" stats.plot_covariance_ellipse ((frame+1, f.x[0]), cov=f.P, axis_equal=True, \n",
" facecolor='g', edgecolor=None, alpha=0.5,\n",
" xlim=(-5,30), ylim=(-5,30))\n",
" \n",
" plt.plot(zs, c='r', linestyle='dashed')\n",
" plt.plot(xs, c='b')\n",
" f.predict()\n",
"\n",
"animate('multivariate_track1.gif', animate_track, 37, 200, figsize=(10.5, 10.5))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAArYAAAKaCAYAAADLbRqhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmYHFWh/vFvVXX13j1bZrKQhIQlrLIEuARkuWzK4gpc\n5bIJIqigsinCRQiggiBylQu4IEQIIouiAj9BFCIQI1tkEwggJBCyzj7Ty3RXV9Xvj0p3z5BtksyW\nyfvhqadOT52qc6YND68np84xfN/3ERERERHZzJnD3QERERERkYGgYCsiIiIio4KCrYiIiIiMCgq2\nIiIiIjIqKNiKiIiIyKigYCsiIiIio4KCrYiIiIiMCv0KtjfffDO77747NTU11NTUsP/++/OnP/2p\nT50rrriCrbbaing8ziGHHMLrr78+KB0WEREREVmTfgXbSZMmcd111/Hiiy8yf/58Dj30UD7zmc/w\n8ssvA3Dttddyww03cNNNN/H888/T1NTEEUccQSaTGdTOi4iIiIiUGRu781hDQwM/+MEP+NKXvsSE\nCRP4xje+wSWXXAJAT08PTU1NXH/99Zx11lkD2mERERERkTXZ4Dm2rutyzz330NPTw0EHHcTChQtZ\nsWIFH/vYxyp1otEoBx10EPPmzRvQzoqIiIiIrE2ovxVfffVV9ttvPwqFArFYjPvuu48ddtihEl7H\njh3bp35TUxNLly5d7TmdnZ2b2GURERER2dLV1NSs9rN+B9sdd9yRV155hc7OTu6//35OOOEE5syZ\ns857DMPY8F6KiIiIiGyEfk9FsG2bbbbZhj333JOrr76aGTNmcPPNNzN+/HgAVqxY0af+ihUrGDdu\n3MD2VkRERERkLfo9YvthruvieR5Tp05l3LhxPPbYY+y1115A8PLY3Llzuf7669f5jDUNIa/PCy+8\nwN57771RfZb+0/c8+PQdDw19z0ND3/Pg03c8NDab77lYhHQapk+Hhx+G+vrh7lFFWxtssw10dkIo\nBM8/D3vs0bfOxn7P65vS2q9ge/HFF/OJT3yCiRMn0t3dzd13382TTz7Jo48+CsB5553H1VdfzY47\n7sj222/P9773PVKpFCeeeOIGd1hERERE1iMchp6egX/u738Pv/sd3H570MYGyuVg552DUGua8Pjj\nq4fawdSvYLtixQpOPvlkli9fTk1NDbvvvjuPPvooRxxxBAAXXXQR+Xyec845h/b2dmbMmMFjjz1G\n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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7effd05c44a8>"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src='multivariate_track1.gif'>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n"
]
}
],
"metadata": {}
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 KiB