Symbology changes.

Working on finalizing the symbology used in this book. Added appendix
to document what other books in the field use for the Kalman filter
equations.
This commit is contained in:
Roger Labbe committed 2014-08-22 10:11:06 -07:00
1 parent 3a89d60d6c
commit d8df25fe7b
5 files changed
+447 -53

No files matched your search

+379
View File
@@ -0,0 +1,379 @@
{
"metadata": {
"name": "",
"signature": "sha256:a8b813a30b8d5fe32572b34d0caaf86174716f527fd81c8e83766fd8b0c6d59b"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"#format the book\n",
"%matplotlib inline\n",
"from __future__ import division, print_function\n",
"import matplotlib.pyplot as plt\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",
"\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": 3,
"text": [
"<IPython.core.display.HTML at 0x7fe174bfb350>"
]
}
],
"prompt_number": 3
},
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Appendix I : Symbology"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is just notes at this point. \n",
"\n",
"### State\n",
"\n",
"$x$ (Brookner, Zarchan, Brown)\n",
"\n",
"$\\underline{x}$ Gelb)\n",
"\n",
"### State at step n\n",
"\n",
"$x_n$ (Brookner)\n",
"\n",
"$x_k$ (Brown, Zarchan)\n",
"\n",
"$\\underline{x}_k$ (Gelb)\n",
"\n",
"\n",
"\n",
"### Prediction\n",
"\n",
"$x^-$\n",
"\n",
"$x_{n,n-1}$ (Brookner) \n",
"\n",
"$x_{k+1,k}$\n",
"\n",
"\n",
"## measurement\n",
"\n",
"\n",
"$x^*$\n",
"\n",
"\n",
"\n",
"Y_n (Brookner)\n",
"\n",
"##control transition Matrix\n",
"\n",
"$G$ (Zarchan)\n",
"\n",
"\n",
"Not used (Brookner)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Nomenclature\n",
"\n",
"\n",
"## Equations\n",
"### Brookner\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"X^*_{n+1,n} &= \\Phi X^*_{n,n} \\\\\n",
"X^*_{n,n} &= X^*_{n,n-1} +H_n(Y_n - MX^*_{n,n-1}) \\\\\n",
"H_n &= S^*_{n,n-1}M^T[R_n + MS^*_{n,n-1}M^T]^{-1} \\\\\n",
"S^*_{n,n-1} &= \\Phi S^*_{n-1,n-1}\\Phi^T + Q_n \\\\\n",
"S^*_{n-1,n-1} &= (I-H_{n-1}M)S^*_{n-1,n-2}\n",
"\\end{aligned}$$\n",
"\n",
"### Gelb\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\underline{\\hat{x}}_k(-) &= \\Phi_{k-1} \\underline{\\hat{x}}_{k-1}(+) \\\\\n",
"\\underline{\\hat{x}}_k(+) &= \\underline{\\hat{x}}_k(-) +K_k[Z_k - H_k\\underline{\\hat{x}}_k(-)] \\\\\n",
"K_k &= P_k(-)H_k^T[H_kP_k(-)H_k^T + R_k]^{-1}\\\\\n",
"P_k(+) &= \\Phi_{k-1} P_{k-1}(+)\\Phi_{k-1}^T + Q_{k-1} \\\\\n",
"P_k(-) &= (I-K_kH_k)P_k(-)\n",
"\\end{aligned}$$\n",
"\n",
"\n",
"### Brown\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\hat{x}^-_{k+1} &= \\phi_{k}\\hat{x}_{k} \\\\\n",
"\\hat{x}_k &= \\hat{x}^-_k +K_k[z_k - H_k\\hat{x}^-_k] \\\\\n",
"K_k &= P^-_kH_k^T[H_kP^-_kH_k^T + R_k]^{-1}\\\\\n",
"P^-_{k+1} &= \\phi_k P_k\\phi_k^T + Q_{k} \\\\\n",
"P_k &= (I-K_kH_k)P^-_k\n",
"\\end{aligned}$$\n",
"## \n",
"\n",
"### Zarchan\n",
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\hat{x}_{k} &= \\Phi_{k}\\hat{x}_{k-1} + G_ku_{k-1} + K_k[z_k - H\\Phi_{k}\\hat{x}_{k-1} - HG_ku_{k-1} ] \\\\\n",
"M_{k} &= \\Phi_k P_{k-1}\\phi_k^T + Q_{k} \\\\\n",
"K_k &= M_kH^T[HM_kH^T + R_k]^{-1}\\\\\n",
"P_k &= (I-K_kH)M_k\n",
"\\end{aligned}$$\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
+54 -40
View File
@@ -1,7 +1,7 @@
{
"metadata": {
"name": "",
"signature": "sha256:99942ebb1d4b6dc04d61b47c11a57a65226da104e0a39c0145852f6e09543967"
"signature": "sha256:2018504aed707108ce52dbe73eda7120be80a09fd1ca2e26123013828660bdc6"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -248,13 +248,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 40,
"prompt_number": 2,
"text": [
"<IPython.core.display.HTML at 0x4066f50>"
"<IPython.core.display.HTML at 0x7f93e1782790>"
]
}
],
"prompt_number": 40
"prompt_number": 2
},
{
"cell_type": "heading",
@@ -357,7 +357,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
"prompt_number": 3
},
{
"cell_type": "markdown",
@@ -380,7 +380,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
"prompt_number": 4
},
{
"cell_type": "markdown",
@@ -398,7 +398,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
"prompt_number": 5
},
{
"cell_type": "markdown",
@@ -416,7 +416,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
"prompt_number": 6
},
{
"cell_type": "markdown",
@@ -442,7 +442,7 @@
]
}
],
"prompt_number": 6
"prompt_number": 7
},
{
"cell_type": "markdown",
@@ -471,7 +471,7 @@
]
}
],
"prompt_number": 7
"prompt_number": 8
},
{
"cell_type": "markdown",
@@ -518,7 +518,7 @@
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"prompt_number": 9,
"text": [
"(-10, 20)"
]
@@ -528,11 +528,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x3e62250>"
"<matplotlib.figure.Figure at 0x7f93e17a9310>"
]
}
],
"prompt_number": 8
"prompt_number": 9
},
{
"cell_type": "markdown",
@@ -572,11 +572,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4074350>"
"<matplotlib.figure.Figure at 0x7f93e175db90>"
]
}
],
"prompt_number": 9
"prompt_number": 10
},
{
"cell_type": "markdown",
@@ -660,11 +660,11 @@
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAF/CAYAAABKRQ+VAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHBpJREFUeJzt3XuMnXWBPvDnzLTTewstWCi2Fkq3sGX4lYpEERdYSUVi\nGy6imLo1alekird4zUaMlz+8IMSYuGtXg6iwSJRgu1kJIhdFDcZWoGhb5Latl7ZTp6U3WqYz8/vD\nZbTS6Tsgc873hc8nIeGdczrnS/N0+nDmOWca69ev7w8AALzAtbX6AAAAUALFGAAAohgDAEASxRgA\nAJIoxgAAkEQxBgCAJMmIVh/gKd3d3dm9e3erjwEAwPNYR0dHpk6detDbiinGu3fvzvz581t9DHia\nlStXZuHCha0+BhyUfFIq2aRUq1evHvQ2UwqosGHDhlYfAQYln5RKNqkjxRgAAKIYQ6Vzzjmn1UeA\nQcknpZJN6kgxhgpz5sxp9RFgUPJJqWSTOlKMocLdd9/d6iPAoOSTUskmdaQYAwBAFGOodMYZZ7T6\nCDAo+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy\n+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRU\nskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkd\nKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYA\nABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDF\nGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZ\nyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy\n+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRU\nskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkdKcYAABDFGCrZyVEy+aRUskkd\n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\nve992blzZzo6OvLBD34wp59++rM7McAL1K9+1Z6LLx6f7u6/fB3u7m7ks58dk6uvHp3rrtuVs8/e\n79ljgGdpSBvjz372s3nf+96X0aNHP6sH+dOf/pStW7dmzpw5+cMf/pBLLrkkP/7xjw+4j40xwOAe\ne6wtCxZMyNatg3+jb9So/tx66450dnrHIIDB/N0b45e+9KW59tprM2XKlDT+6qmIRqORCy+8sPLX\nT5kyJVOmTEmSTJs2LT09Penp6cnIkSOH8vAAL3j33tt+yFKcJPv2NXLrrR3p7PRTSQGejSFtjFet\nWpVjjz02M2fOzLHHHjvwz8yZM5/xA/7kJz/J3LlzlWJqw06OVtu/P7nmmo4h3fdrXxuVzZttKWg9\nXzupoyE9Yzxt2rQcd9xxmTx58tOeMX4murq68vnPfz5f+cpXDnr7smXLMmPGjCTJpEmT0tnZOfAj\nJZ/6A+batWvXL7TrNWvWZ/v2UzMUjz/eyIYNf8xvf/tQMed3/cK8fkop53H9wr1es2ZNHn/88STJ\nhg0bsnTp0gxmSBvjK6+8ctDbhvLiuyTZt29f3vrWt2bZsmUDh/1rNsYAB9fXl7ztbeOyYkX1s8bH\nHdebW2/dkcmTm3AwgBr6uzfGQy2/g+nv78/HPvaxvO51rztoKQZgcG1tyZIl+4ZUjN/73r1KMcCz\nNOT3MT6Ym266aUj3W7VqVW699dbceOONOf/883P++eenq6vr73loaJq//bYgtMI//mNvTjll/yHv\nM3VqX17xikPfB5rF107qaEjPGA/mgQceGNK7Upx66ql54IEH/p6HAnhBO+qo/ixfvjuXXjo2q1c/\n/cXLxxzTm+uv35Xjj/dWbQDP1qDF+I477sjZZ5+dJLntttsOep/e3t7hORUUxPyHUsya1Zfrrtud\ntWvbc/31HXn00fYceWRf/uVf9uWkk3ozfboffUc5fO2kjgYtxjt37hz495/85Cc5+eSTm3IgAAY3\ndWp/pk7dn7PO2p+9e5NRo+In3QE8RwYtxosWLRr49/b29lx00UVPu8+vf/3r4TkVFOTuu+/2zAdF\nGj1aPimXbFJHQ3rx3Rve8IaDfnywt7oAAIC6OeT7GH/5y1/O5Zdf3pSDeB9jAACG26Hex/iQzxhv\n27ZtWA4EAAClqZxSdHd3H/IfeL7zXpyUTD4plWxSR4d8H+Oenp5cffXVh/wEn/70p5/TAwLine truncated
"text": [
"<matplotlib.figure.Figure at 0x40e7b90>"
"<matplotlib.figure.Figure at 0x7f93e11b4b10>"
]
}
],
"prompt_number": 10
"prompt_number": 11
},
{
"cell_type": "markdown",
@@ -687,11 +687,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4073990>"
"<matplotlib.figure.Figure at 0x7f93e12a12d0>"
]
}
],
"prompt_number": 11
"prompt_number": 12
},
{
"cell_type": "markdown",
@@ -714,11 +714,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x4073990>"
"<matplotlib.figure.Figure at 0x7f93e179b9d0>"
]
}
],
"prompt_number": 12
"prompt_number": 13
},
{
"cell_type": "markdown",
@@ -745,11 +745,11 @@
"output_type": "display_data",
"png": "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 truncated
"text": [
"<matplotlib.figure.Figure at 0x40e1990>"
"<matplotlib.figure.Figure at 0x7f93e08ee910>"
]
}
],
"prompt_number": 13
"prompt_number": 14
},
{
"cell_type": "markdown",
@@ -776,11 +776,25 @@
"\n",
"$$new\\_position = old\\_position + velocity*time$$ \n",
"\n",
"Next, we take the measurement from the sensor, and compare it to the prediction we just made. In a world with perfect sensors and perfect airplanes the prediction will always match the measured value. In the real world they will always be at least slightly different. We call the difference between the two the *residual*. Finally, we use something called the *Kalman gain* to update our estimate to be somewhere between the measured position and the predicted position. I will not describe how the gain is set, but suppose we had perfect confidence in our measurement - no error is possible. Then, clearly, we would set the gain so that 100% of the position came from the measurement, and 0% from the prediction. At the other extreme, if he have no confidence at all in the sensor (maybe it reported a hardware fault), we would set the gain so that 100% of the position came from the prediction, and 0% from the measurement. In normal cases, we will take a ratio of the two: maybe 53% of the measurement, and 47% of the prediction. The gain is updated on every cycle based on the variance of the variables (in a way yet to be explained). It should be clear that if the variance of the measurement is low, and the variance of the prediction is high we will favor the measurement, and vice versa. \n",
"Next, we take the measurement from the sensor, and compare it to the prediction we just made. In a world with perfect sensors and perfect airplanes the prediction will always match the measured value. In the real world they will always be at least slightly different. We call the difference between the two the *residual*. Finally, we use something called the *Kalman gain* to update our estimate to be somewhere between the measured position and the predicted position. I will not describe how the gain is set, but suppose we had perfect confidence in our measurement - no error is possible. Then, clearly, we would set the gain so that 100% of the position came from the measurement, and 0% from the prediction. At the other extreme, if he have no confidence at all in the sensor (maybe it reported a hardware fault), we would set the gain so that 100% of the position came from the prediction, and 0% from the measurement. In normal cases, we will take a ratio of the two: maybe 53% of the measurement, and 47% of the prediction. The gain is updated on every cycle based on the variance of the variables (in a way yet to be explained). It should be clear that if the variance of the measurement is low, and the variance of the prediction is high we will favor the measurement, and vice versa. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The chart shows a prior estimate of $\\hat{x}=2$ and a velocity $\\dot{x}=1$. \n",
"\n",
"The chart shows a prior estimate of $x=1$ and $\\dot{x}=1$ ($\\dot{x}$ is the shorthand for the derivative of x, which is velocity). Therefore we predict $\\hat{x}=2$. However, the new measurement $x^{'}=1.3$, giving a residual $r=0.7$. Finally, Kalman filter gain $k$ gives us a new estimate of $\\hat{x^{'}}=1.8$.\n",
"> We use the caret notation $\\hat{x}$ to denote an *estimate* - the output of the filter. We use the familar dot notation $\\dot{x}$ to denote the derivative of x.\n",
"\n",
"** CHECK SYMBOLOGY!!!!**"
"\n",
"Therefore we predict $x^-= 2+1 = 3$.\n",
"\n",
"> We use the notation $x^-$ to denote a *prediction*.\n",
"\n",
"However, the new measurement is $x^*=2.3$, giving a residual $r=0.7$. Finally, the Kalman filter gain $K$ gives us a new estimate of $\\hat{x}=2.8$.\n",
"\n",
"> We use the symbolology $x^*$ to denote a measurement. I will address symbology in more detail later. It is an unfortunate reality that nearly every text on Kalman filtering uses different symbology and variables - there is almost no agreement across texts. Be sure to read the introductory material very carefully to avoid being led astray.\n"
]
},
{
@@ -796,13 +810,13 @@
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAF9CAYAAAAKk97ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtYlGXi//HPAMIIggfETFE3y6RfKaLiCfGEeSrN7ayl\nq6bf0rU0rdS01E1X2ZXvt5ObZruVe5VmZW1WstmWKZalZaWlZicOmoiZioKcf38gs44wOMgNzDPz\nfl1XV87MM8/c8+GBubn5zDO2/fv3lwgAAADwEX51PQAAAACgNjEBBgAAgE9hAgwAAACfwgQYAAAA\nPoUJMAAAAHwKE2AAAAD4FCbAgAdYvHixoqKiFBUVpTFjxtT1cIz59NNPFRUVpUOHDjldv3fvXsfz\nreh2lFq/fr2ioqIqvC0qKkpvvvlmjT5+RkaGoqKitGPHjhp9nNrmrc8LgPuYAAPVdP5EpKCgQFOn\nTtXgwYOVmZnp1j6mT5+ulJQUjR8/XjabraaGasy5k9ey/6666qpyz7dz587atm2bmjdv7nT9lVde\nqW3btunVV1+94GMNGDBATz/9tNHxV9WAAQMczzMmJkY33HCDXnvttTod07Zt2zR06NCLvv/s2bMv\n+MtWixYttG3bNnXq1OmiH6c6KvoFoK4nrzX9i0deXp7+7//+T9dee606duyovn376v7779eJEyec\ntnvqqac0YMCAGhsH4O0C6noAgDcpLCzUjBkzdODAAa1evVqXXHKJW/cLCQlRSEiIgoODVVJijc+m\nmTt3roYNG+Z0XZMmTZwu16tXT+Hh4eXu6+/vr/DwcOXm5tboGE2aMGGC7rrrLp06dUqvv/665s2b\np9DQUA0ePLhOxlNRrqb5+fnVyuNYRdn3Zk1+jy5evFjbtm3TggULdPnll+vgwYPauHGjcnNz1bBh\nwxp7XMDXsAIMGFI2+f3uu+/KTX6XLl2qoUOHKjo6Wj179tTcuXOVnZ3t9r7Xr1+vG264QaNGjVLP\nnj316quvKiEhQf3799d3330nScrPz9ecOXM0cOBAdejQQX369FFiYqLy8/Md+3nqqac0ZswYrVix\nQr169VLPnj31xBNPXNTzDQ0NVXh4uNN/ZavXX375ZbUrDmWrrocOHdLTTz/t2Nf5q8HPPvusEhIS\nFB0drZEjR+qDDz4ot6+oqCitWbNG8+bNU9euXdWlSxctX768SuMJDg5WeHi42rRpoxkzZqhNmzZ6\n7733HLeXrUy+9957mjp1qmJiYtS9e3enleLXX39dQ4cOVceOHTVs2LByK+Dffvutbr75ZnXo0EG3\n3nqrUlNTy42jQ4cOjizeeOONCsf63Xff6e6771bXrl3VtWtXTZw4UWlpaZJKV37LVjF37Njh2NfY\nsWMd98/KynL6+n322WflHiM7O1uzZ89W9+7dFR0drQkTJujHH3903F5Wf9m8ebMGDx6szp076777\n7lNOTo6bibunbJX4tddeU+/evdWlSxc98sgjTsf98ePHde+996pTp05KSEjQ5s2bnfbhzvdO2V85\nJGnOnDmObM5dDc7Pz9df/vIX9enTRzExMbr99tu1a9euKj2ff//73xo3bpzi4+PVokULxcbG6tFH\nH3X8FeWpp55SVFSUli9frkOHDjnGkZCQ4LSfL774QnfccYeio6PVv3//cs9nzJgxmj59uu6//35F\nR0crISFB7777bpXGClgZE2DAgMLCQj3wwAPav39/hSu/Z86c0bx58/TOO+9o+fLl2rVrlxYsWFCl\nxzh48KDmz5+vHj16KDExUcuXL1fnzp21Zs0aSaXVi8DAQC1ZskT//ve/tXTpUm3YsKHchHHPnj06\nefKk1q5dq4kTJ+qZZ57R119/XeXnXNkq2DXXXKNt27bpqaeeqvJ+y7z++utKSUlR8+bNNWHCBG3b\ntk3btm3ThAkTHNv87//+r15++WU9+uijeuedd3THHXfovvvu0zfffFNuf6tWrVLz5s21bt06Pf/8\n87rssssuemySFBgYqMLCwnLXJyUlqXv37nrzzTf19NNPKyIiQpL0yiuvaOnSpbr33nu1ceNGTZs2\nTX/+85/1/vvvS/pvdaZFixb617/+pXHjxmn16tXlKjEfffSRUlJSJKnCuswvv/yiO+64Q/7+/nrh\nhRf0yiuvqH///jp8+LAkad68eUpJSdHQoUMVExPjyPXc46Rp06ZOFZWKHmfRokX6/PPPtXz5cr36\n6quy2WyaPHmyioqKnLZbt26dli9frieffFJbtmzRSy+95HbGVfHGG2/o73//u55++ml9+OGHeuaZ\nZxy3PfbYY/rhhx+0evVqLVu2TP/85z+d7uvO9862bdscuc+dO9eR27k1lDlz5iglJUVJSUl66623\n1KdPH02YMMHtKpRU+ovlJ5984vKvI3fddZe2bdum8ePHq3nz5o5xnPuL1r59+zR+/HjFxcVpw4YN\n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 truncated
"png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAF9CAYAAAAKk97ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtclGXi/vFrAGEUQRFRIw+lWfQtRVQ8IVpieSjN7bSp\naWr2K13LsoOautmmpa1+v1lZmbWVu6WZWa2VbLblAcvSytJSs0xACULzgHI+/P5AJkcYHOQG5pn5\nvF+vXjkzzzzPPRcPcHNzzYNtz549JQIAAAB8hF9dDwAAAACoTUyAAQAA4FOYAAMAAMCnMAEGAACA\nT2ECDAAAAJ/CBBgAAAA+hQkw4AHmzp2rqKgoRUVFadSoUXU9HGO++OILRUVFKS0tzen+Xbt2OV5v\nRY+j1OrVqxUVFVXhY1FRUXr33Xdr9PgHDhxQVFSUtm7dWqPHqW3e+roAuI8JMFBNZ05ECgoKNGnS\nJA0YMEAZGRlu7ePee+9VUlKSxo4dK5vNVlNDNeb0yWvZf5deemm519u5c2dt3rxZLVq0cLr/4osv\n1ubNm/XWW2+d9Vj9+vXTs88+a3T8VdWvXz/H64yJidF1112nVatW1emYNm/erEGDBp3z86dNm3bW\nH7YiIyO1efNmderU6ZyPUx0V/QBQ15PXmv7BIy8vT//3f/+nq666Sh07dlTfvn1133336dixY07b\nPfPMM+rXr1+NjQPwdgF1PQDAmxQWFmrKlCnau3evli1bpubNm7v1vODgYAUHB6tBgwYqKbHG36aZ\nMWOGBg8e7HRfkyZNnG7Xq1dP4eHh5Z7r7++v8PBw5eTk1OgYTRo3bpxuv/12nThxQm+//bZmzpyp\nkJAQDRgwoE7GU1Gupvn5+dXKcayi7HOzJj9H586dq82bN2v27Nlq166dDh48qLVr1yonJ0eNGjWq\nseMCvoYVYMCQssnvjz/+WG7yO2/ePA0aNEjR0dHq2bOnZsyYoaysLLf3vXr1al133XUaPny4evbs\nqbfeeksJCQm68sor9eOPP0qS8vPzNX36dPXv318dOnRQnz59NH/+fOXn5zv288wzz2jUqFF64YUX\n1KtXL/Xs2VOLFi06p9cbEhKi8PBwp//KVq+3b99e7YpD2aprWlqann32Wce+zlwNfvHFF5WQkKDo\n6GgNGzZMn3zySbl9RUVFafny5Zo5c6a6du2qLl26aPHixVUaT4MGDRQeHq42bdpoypQpatOmjT76\n6CPH42Urkx999JEmTZqkmJgYde/e3Wml+O2339agQYPUsWNHDR48uNwK+A8//KAbb7xRHTp00M03\n36zk5ORy4+jQoYMji3feeafCsf7444+688471bVrV3Xt2lXjx49XSkqKpNKV37JVzK1btzr2NXr0\naMfzMzMznT5+X375ZbljZGVladq0aerevbuio6M1btw47du3z/F4Wf1l/fr1GjBggDp37qx77rlH\n2dnZbibunrJV4lWrVql3797q0qWLZs2a5XTeHz16VHfffbc6deqkhIQErV+/3mkf7nzulP2WQ5Km\nT5/uyOb01eD8/Hw9+eST6tOnj2JiYnTLLbfom2++qdLr+c9//qMxY8YoPj5ekZGRio2N1V//+lfH\nb1GeeeYZRUVFafHixUpLS3OMIyEhwWk/X3/9tUaOHKno6GhdeeWV5V7PqFGjdO+99+q+++5TdHS0\nEhIS9OGHH1ZprICVMQEGDCgsLNQDDzygPXv2VLjym5ubq5kzZ+qDDz7Q4sWL9c0332j27NlVOsbB\ngwf1yCOPqEePHpo/f74WL16szp07a/ny5ZJKqxeBgYF64okn9J///Efz5s3TmjVryk0Yd+7cqePH\nj2vFihUaP368nn/+eX333XdVfs2VrYJdfvnl2rx5s5555pkq77fM22+/raSkJLVo0ULjxo3T5s2b\ntXnzZo0bN86xzf/+7//qjTfe0F//+ld98MEHGjlypO655x59//335fa3dOlStWjRQitXrtQrr7yi\nCy+88JzHJkmBgYEqLCwsd//ChQvVvXt3vfvuu3r22WcVEREhSXrzzTc1b9483X333Vq7dq0mT56s\nxx9/XB9//LGkP6ozkZGReu+99zRmzBgtW7asXCVmw4YNSkpKkqQK6zK//vqrRo4cKX9/f7366qt6\n8803deWVVyo9PV2SNHPmTCUlJWnQoEGKiYlx5Hr6edK0aVOnikpFx5kzZ46++uorLV68WG+99ZZs\nNpsmTJigoqIip+1WrlypxYsX6+mnn9bGjRv1+uuvu51xVbzzzjt6+eWX9eyzz+rTTz/V888/73js\nscce088//6xly5ZpwYIF+uc//+n0XHc+dzZv3uzIfcaMGY7cTq+hTJ8+XUlJSVq4cKH+/e9/q0+f\nPho3bpzbVSip9AfLzz//3OVvR26//XZt3rxZY8eOVYsWLRzjOP0Hrd27d2vs2LGKi4vTmjVrtGDB\nAm3cuFF///vfnfa1bt06tWvXTu+9955uuOEGPfjgg9q/f7/bYwWsjAkwYMDTTz+txMREtW/fvsLa\nw+zZsxUXF6eWLVuqc+fOGj58eLlVqLNp27atoqKiFBsbq3bt2ikqKkpdu3bVwYMHJZXWKB599FHF\nxsYqMjJSvXr10rXXXlvuOA0bNtSDDz6o1q1b6/bbb1fDhg21Y8eOKr/mRx55RDExMY7/pk6d6ngs\nICBA4eHhCg0NrfJ+y4SFhalp06by8/NzrL6Gh4erQYMGkqSTJ0/q1Vdf1bRp09S3b1+1bNlSN910\nk7p3715ht/jyyy/XpEmT1LZtW8cK7LkoKCjQihUrtHfvXvXq1avc4/369dOoUaPUpk0bxcbGqm/f\nvpKkxYsX66677tLgwYN1/vnna8CAARoyZIjefPNNSVJSUpJ+/fVX/fWvf1Xbtm01ePBgXXvtteV+\n0GjSpImaNm3qcnzLly+X3W7XU089pcsvv1zt2rXTyJEj1a1bN0mlH/+mTZsqKCjI8XE682Nls9kU\nHh6usLCwCo9x4sQJvf/++5o8ebK6du2qiy++WHPmzFFycrJjkljm/vvv10UXXaTevXurR48e53Su\nueOhhx7SJZdcop49e2r06NFasWKFJOn48eNKTEzUpEmT1LFjR8XExGjSpElOz3Xncyc8PNyR++m/\n/QgKCpIk7d+/Xx988IHmzp2r2NhYtWrVShMnTlSLFi3073//2+3X8cgjj+irr75Sz549NW7cOP3j\nH//Q4cOHHY+XfS40aNDAUVE582P10ksvqUePHpo4caJat26tLl26aOLEieU+L9q0aaNJkybpggsu\ncGy7cuVKt8cKWBkdYMCABg0aaPHixbrnnnv01ltv6aabbnJ6fN26dXr11VeVnJyskydPqqioqMLV\nw8qUfaO12+0KDAx03Jebm+vYZuXKlVq5cqXS0tKUk5OjgoICnXfeeU77adWqldOKXmhoqI4ePVql\nsUjS5MmTdfXVVztul01Ma8vPP/+s/Px8TZs2TdOnT3fcX1BQUOH2Xbp0qdbxXnjhBb388svKz8+X\n3W7XnXfeqT//+c9uHefw4cP67bff9PTTTzutKhYUFKhly5aSpOTkZDVu3NhpcnvJJZdUeZy7du1S\ndHS04xypCampqSoqKnJ6g9p5552nRo0aOaoWZU5faW/cuHGNXfHj4osvdvy7ffv2OnLkiE6cOKED\nBw6oqKjIKcuKcnXnc6cyP/zwgyQ5VUmk0lpEamqq2/uJj4/Xhg0b9Nlnn2nr1q1asWKFlixZomXL\nlrl9Pvzwww9KSUlRTEyM477i4mLl5+crMzPT8VuJ9u3bOz2vffv25T5+gLdiAgwYcOeddyohIUH/\n7//9Pz3++OPq1q2b2rRpI0n69ttvdd999+m+++5TXFycgoODtWbNGj399NNGjl22Qrh27Vo98cQT\nevjhh9WpUyfZ7XYtXbq03Iqcv7+/y31URXh4uFq1anVugzZo0aJFatu2rdN9ZT8snK66byAaPny4\nRo8e7ViBc6Wy48yYMUM9e/Z0ui8gwOyXYZvN5vbHszauOOLn5/yLxqqca5Vlc+Zjrl6LO6/R3c8d\ndyxfvlzBwcFO9515+2zsdrv69eunfv366f7779f111+vV155RfPmzXPr+TabTdddd53uuuuuco+d\n+UZVwFcxAQYMKPsm+5e//EXr16/Xgw8+qOXLl8vf319fffWVLr74Yt1+++2O7dPT0yv8xtygQQOn\nFd2q2LZtm+Lj451Wnw8ePOjRl1UrWzWu7GoQ9erVq3C1vG3btgoMDFRaWpqjZlCTGjVqdM4T/vDw\ncDVv3lwpKSm6+eabK9zmggsu0NGjR51W6Pbs2VPlj9+ll16q1atXKz8/v9JVYFe5uqNly5by8/PT\nrl27dNFFF0mS0tLSdOzYMbVu3brS51bl9ZT9MJGbmyu73S5JjjfRnfmDxp49exQdHS1J2rt3r8LC\nwtSwYUO1bNlS/v7+2rNnj9q1a+fY9nRV+dwJCAioMLeyN8j99ttv6tOnj9uv8WwCAgJ0/vnnl3vz\nYL169cr1rU8fy08//XTW87XsDbSn3+bSavAVdIABgwICAjR//nzt2rXL8avutm3bat++ffr000+V\nmpqq119/Xf/5z38qXAnr2LGjdu3apc2bNyszM1MnT550+9ht27bVV199pa1bt2r//v169tln9c03\n39TJZdXKJnJl1y49fPiwMjMzdeLECaftmjRpovPPP19vvPGG0tPTnbqOZS688EJ99tlnysjIUF5e\nnuObfsOGDTV69Gg99dRTeuedd5SSkqLt27dr0aJFWrt2bc2/yCq66667tGzZMi1btky//PKLdu7c\nqZdeesnxprD4+Hidf/75jjdsffjhh/rggw+c9pGdna3MzExlZmZKKu23ZmZm6vfff3dsM3Line truncated
"text": [
"<matplotlib.figure.Figure at 0x4073990>"
"<matplotlib.figure.Figure at 0x7f93e0339cd0>"
]
}
],
"prompt_number": 14
"prompt_number": 15
},
{
"cell_type": "heading",
@@ -821,7 +835,7 @@
"\n",
"> $$\n",
"\\begin{aligned}\n",
"\\hat{\\mathbf{x}}_{t|t-1} &= \\mathbf{\\Phi_t}\\hat{\\mathbf{x}}_{t-1} + \\mathbf{G u}_t\\;\\;\\;&(1) \\\\\n",
"\\hat{\\mathbf{x}}_{t|t-1} &= \\mathbf{\\Phi_t}\\hat{\\mathbf{x}}_{t-1} + \\mathbf{B u}_t\\;\\;\\;&(1) \\\\\n",
"\\mathbf{P}_{t|t-1} &= \\mathbf{\\Phi_tP}_{t-1}\\mathbf{\\Phi}^T_t + \\mathbf{Q}_t\\;\\;\\;&(2)\n",
"\\end{aligned}\n",
"$$\n",
@@ -865,7 +879,7 @@
"$$\n",
"\\begin{aligned}\n",
"\\text{Predict Step}\\\\\n",
"\\mathbf{x}' &= \\mathbf{F x} + \\mathbf{G u}\\;\\;\\;&(1) \\\\\n",
"\\mathbf{x}' &= \\mathbf{F x} + \\mathbf{B u}\\;\\;\\;&(1) \\\\\n",
"\\mathbf{P} &= \\mathbf{FP{F}}^T + \\mathbf{Q}\\;\\;\\;&(2) \\\\\n",
"\\\\\n",
"\\text{Update Step}\\\\\n",
@@ -890,7 +904,7 @@
"Look at the code below for the predict step (which we will present a bit later). \n",
"\n",
" def predict():\n",
" x = F*x + G*u # equation (1)\n",
" x = F*x + B*u # equation (1)\n",
" P = F*P*F.T + Q # equation (2)\n",
" \n",
"Notice how simple it really is. It really isn't much different from the predict step in the previous chapter, and it is a nearly exact transliteration of the equations above. As you become familiar with this notation you will find yourself able to read textbooks and paper and implement the equations without much difficulty. \n",
@@ -1018,11 +1032,11 @@
"\n",
"Suppose that instead of passively tracking our dog we were actively controlling a robot. At each time step we would send control signals to the robot based on our current position vs desired position. Kalman filter equations incorporate that knowledge into the filter equations, creating a predicted position based both on current velocity *and* control inputs to the drive motors. \n",
"\n",
"We will cover this use case later, but for now passive tracking applications we set those terms to 0. In step 2 there was the unexplained term $\\mathbf{Gu}$ in equation (1):\n",
"We will cover this use case later, but for now passive tracking applications we set those terms to 0. In step 2 there was the unexplained term $\\mathbf{Bu}$ in equation (1):\n",
"\n",
"$$\\mathbf{x}' = \\mathbf{Fx} + \\mathbf{Gu}$$.\n",
"$$\\mathbf{x}' = \\mathbf{Fx} + \\mathbf{Bu}$$.\n",
"\n",
"Here $\\mathbf{u}$ is the control input, and $\\mathbf{G}$ is its transfer function. For example, $\\mathbf{u}$ might be a voltage controlling how fast the wheel's motor turns, and multiplying by $\\mathbf{G}$ yields $\\begin{smallmatrix}x\\\\\\dot{x}\\end{smallmatrix}$. Since we do not need these terms we will set them both to zero and not concern ourselves with them for now.\n"
"Here $\\mathbf{u}$ is the control input, and $\\mathbf{B}$ is its transfer function. For example, $\\mathbf{u}$ might be a voltage controlling how fast the wheel's motor turns, and multiplying by $\\mathbf{B}$ yields $\\begin{smallmatrix}x\\\\\\dot{x}\\end{smallmatrix}$. Since we do not need these terms we will set them both to zero and not concern ourselves with them for now.\n"
]
},
{
@@ -1400,7 +1414,7 @@
" self.P = np.eye(dim_x) # uncertainty covariance\n",
" self.Q = np.eye(dim_x) # process uncertainty\n",
" self.u = 0 # control input vector\n",
" self.G = np.zeros((dim_x,1))\n",
" self.B = np.zeros((dim_x,1))\n",
" self.F = 0 # state transition matrix\n",
" self.H = 0 # Measurement function\n",
" self.R = np.eye(dim_z) # state uncertainty\n",
@@ -1421,7 +1435,7 @@
"\n",
"$$\n",
"\\begin{aligned}\n",
"\\mathbf{x}' &= \\mathbf{F x} + \\mathbf{G u} \\\\\n",
"\\mathbf{x}' &= \\mathbf{F x} + \\mathbf{B u} \\\\\n",
"\\mathbf{P} &= \\mathbf{FP{F}}^T + \\mathbf{Q} \n",
"\\end{aligned}\n",
"$$\n",
@@ -1429,7 +1443,7 @@
"The corresponding code is\n",
"\n",
" def predict(self): \n",
" self.x = self.F.dot(self.x) + self.G.dot(self.u)\n",
" self.x = self.F.dot(self.x) + self.B.dot(self.u)\n",
" self.P = self.F.dot(self.P).dot(self.F.T) + self.Q\n",
"\n",
"I haven't discussed the use of numpy much until now, but this method illustrates the power of that package. We use numpy's `array` class to store our data and perform the linear algebra for our filters. `array` implements matrix multication using the `.dot()` method; if you use `*` you will get element-wise multiplication. As a heavy user of linear algebra this design is somewhat distressing as I use matrix multiplation far more often than element-wise multiplaction. However, this design is due to historical developments in the library and we must live with it. The Python community has recognized this problem, and in Python 3.5 we will have the `@` operator to implement matrix multiplication. \n",
@@ -1570,7 +1584,7 @@
" self.P = np.eye(dim_x) # uncertainty covariance\n",
" self.Q = np.eye(dim_x) # process uncertainty\n",
" self.u = np.zeros((dim_x,1)) # motion vector\n",
" self.G = 0\n",
" self.B = 0\n",
" self.F = 0 # state transition matrix\n",
" self.H = 0 # Measurement function (maps state to measurements)\n",
" self.R = np.eye(dim_z) # state uncertainty\n",
@@ -1629,7 +1643,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
"prompt_number": 16
},
{
"cell_type": "heading",
+2 -1
View File
@@ -86,7 +86,8 @@ Contents
* [**Chapter N: Designing Nonlinear Kalman Filters**](http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/Designing_Nonlinear_Kalman_Filters.ipynb)
Building on the material in chapters 8 and 9 we walk through the design of several nonlinear filters.
*[**Appendix: Symbols and Notations**](http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/Appendix_Symbols_and_Notations.ipynb)
Math symbology used by this book and by the notable books in the literature.
Reading the book
+11 -11
View File
@@ -11,20 +11,20 @@ import stats
def show_residual_chart():
plt.xlim([0.9,2.5])
plt.ylim([0.5,2.5])
plt.ylim([1.5,3.5])
plt.scatter ([1,2,2],[1,2,1.3])
plt.scatter ([2],[1.8],marker='o')
plt.scatter ([1,2,2],[2,3,2.3])
plt.scatter ([2],[2.8],marker='o')
ax = plt.axes()
ax.annotate('', xy=(2,2), xytext=(1,1),
ax.annotate('', xy=(2,3), xytext=(1,2),
arrowprops=dict(arrowstyle='->', ec='b',shrinkA=3, shrinkB=4))
ax.annotate('prediction', xy=(2.04,2.), color='b')
ax.annotate('measurement', xy=(2.05, 1.28))
ax.annotate('prior measurement', xy=(1, 0.9))
ax.annotate('residual', xy=(2.04,1.6), color='r')
ax.annotate('new estimate', xy=(2,1.8),xytext=(2.1,1.8),
ax.annotate('prediction', xy=(2.04,3.), color='b')
ax.annotate('measurement', xy=(2.05, 2.28))
ax.annotate('prior estimate', xy=(1, 1.9))
ax.annotate('residual', xy=(2.04,2.6), color='r')
ax.annotate('new estimate', xy=(2,2.8),xytext=(2.1,2.8),
arrowprops=dict(arrowstyle='->', ec="k", shrinkA=3, shrinkB=4))
ax.annotate('', xy=(2,2), xytext=(2,1.3),
ax.annotate('', xy=(2,3), xytext=(2,2.3),
arrowprops=dict(arrowstyle="-",
ec="r",
shrinkA=5, shrinkB=5))
@@ -124,4 +124,4 @@ def show_x_with_unobserved():
if __name__ == "__main__":
show_x_with_unobserved()
show_residual_chart()
+1 -1
View File
@@ -122,7 +122,7 @@
" \n",
"\n",
"\n",
"[**Appendix: Symbols and Notations**](not implemented)\n",
"[**Appendix: Symbols and Notations**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Appendix_Symbols_and_Notations.ipynb)\n",
"\n",
"Symbols and notations used in this book. Comparison with notations used in the literature.\n",
"\n",