Adjusted to use upper case x for filter state.

This commit is contained in:
Roger Labbe committed 2014-11-08 20:59:53 -08:00
1 parent c28582aa71
commit 9262b2796f
12 files changed
+336 -531

No files matched your search

+1 -20
View File
@@ -275,7 +275,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we understand the histogram filter and Gaussians we are prepared to implement a 1D Kalman filter. We will do this exactly as we did the histogram filter - rather than going into the theory we will just develop the code step by step. But first, let's set the book style."
"Now that we understand the histogram filter and Gaussians we are prepared to implement a 1D Kalman filter. We will do this exactly as we did the histogram filter - rather than going into the theory we will just develop the code step by step."
]
},
{
@@ -2331,25 +2331,6 @@
"\n",
"If you understand this, you will be able to understand multidimensional Kalman filters and the various extensions that have been make on them. If you do not fully understand this, I strongly suggest rereading this chapter. Try implementing the filter from scratch, just by looking at the equations and reading the text. Change the constants. Maybe try to implement a different tracking problem, like tracking stock prices. Experimentation will build your intuition and understanding of how these marvelous filters work."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 33
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**author notes**:\n",
" clean up the code - same stuff duplicated over and over - write a 'clean implementation' at the end.\n",
" \n",
" "
]
}
],
"metadata": {}
+35 -250
View File
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:11378055d75c3ef8b1a2626c65ada84eefab1a411a1267ea328b2466f389e8e9"
"signature": "sha256:08cdb1e902d069b45293bbf627273884dedc0356c9048d8247276cd852dee4c4"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -21,236 +21,22 @@
"# 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()"
"book_format.load_style()\n",
"\n",
"\n",
"\n",
"def update(mu1, var1, mu2, var2):\n",
" mean = (var1*mu2 + var2*mu1) / (var1+var2)\n",
" variance = 1 / (1/var1 + 1/var2)\n",
" return (mean, variance)\n",
"\n",
"def predict(pos, variance, movement, movement_variance):\n",
" return (pos + movement, variance + movement_variance)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<style>\n",
"@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\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: 'Open sans',verdana,arial,sans-serif;\n",
" line-height: 135%;\n",
" font-size: 110%;\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: 300px;\n",
" }\n",
" div.output_subarea.output_stream.output_stdout.output_text {\n",
" overflow-x: auto;\n",
" overflow-y: scroll;\n",
" max-height: 300px;\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": 1,
"text": [
"<IPython.core.display.HTML at 0x7f829807fa58>"
]
}
],
"prompt_number": 1
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
@@ -316,8 +102,7 @@
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
"outputs": []
},
{
"cell_type": "code",
@@ -330,13 +115,6 @@
"import stats\n",
"from gif_animate import animate\n",
"\n",
"def update(mu1, var1, mu2, var2):\n",
" mean = (var1*mu2 + var2*mu1) / (var1+var2)\n",
" variance = 1 / (1/var1 + 1/var2)\n",
" return (mean, variance)\n",
"\n",
"def predict(pos, variance, movement, movement_variance):\n",
" return (pos + movement, variance + movement_variance)\n",
"\n",
"\n",
"sensor_error = 1.2**2\n",
@@ -389,17 +167,7 @@
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f82796e75c0>"
]
}
],
"prompt_number": 2
"outputs": []
},
{
"cell_type": "markdown",
@@ -412,6 +180,13 @@
"cell_type": "code",
"collapsed": false,
"input": [
"from __future__ import print_function, division\n",
"import matplotlib.pyplot as plt\n",
"import numpy.random as random\n",
"import math\n",
"import stats\n",
"from gif_animate import animate\n",
"\n",
"# assume dog is always moving 1m to the right\n",
"movement = 1\n",
"movement_error = .05\n",
@@ -450,7 +225,7 @@
" plt.subplot(212)\n",
" plt.cla()\n",
" stats.plot_gaussian(pos[0], pos[1], xlim=[0,N*1.2])\n",
" plt.ylim([0,1])\n",
" plt.ylim(0, 1)\n",
" plt.tight_layout()\n",
"\n",
"\n",
@@ -458,7 +233,17 @@
],
"language": "python",
"metadata": {},
"outputs": []
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x7f3d805b4d68>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 KiB

After

Width:  |  Height:  |  Size: 465 KiB