Started writing the Designing Kalman Filter chapter. Did a robot, and DME.
This commit is contained in:
1 parent
4f344d4e11
commit
6dc9c02af0
10 files changed
+1958
-180
No files matched your search
File diff suppressed because it is too large.
Load diff
+7
-7
@@ -14,7 +14,7 @@ class KalmanFilter:
|
||||
|
||||
def __init__(self, dim):
|
||||
""" Create a Kalman filter of dimension 'dim'"""
|
||||
|
||||
|
||||
self.x = 0 # state
|
||||
self.P = np.matrix(np.eye(dim)) # uncertainty covariance
|
||||
self.Q = np.matrix(np.eye(dim)) # process uncertainty
|
||||
@@ -50,12 +50,12 @@ class KalmanFilter:
|
||||
if __name__ == "__main__":
|
||||
f = KalmanFilter (dim=2)
|
||||
|
||||
f.x = np.matrix([[2.],
|
||||
f.x = np.matrix([[2.],
|
||||
[0.]]) # initial state (location and velocity)
|
||||
|
||||
|
||||
f.F = np.matrix([[1.,1.],
|
||||
[0.,1.]]) # state transition matrix
|
||||
|
||||
|
||||
f.H = np.matrix([[1.,0.]]) # Measurement function
|
||||
f.P *= 1000. # covariance matrix
|
||||
f.R = 5 # state uncertainty
|
||||
@@ -66,15 +66,15 @@ if __name__ == "__main__":
|
||||
for t in range (100):
|
||||
# create measurement = t plus white noise
|
||||
z = t + random.randn()*20
|
||||
|
||||
|
||||
# perform kalman filtering
|
||||
f.measure (z)
|
||||
f.predict()
|
||||
|
||||
|
||||
# save data
|
||||
results.append (f.x[0,0])
|
||||
measurements.append(z)
|
||||
|
||||
|
||||
# plot data
|
||||
p1, = plt.plot(measurements,'r')
|
||||
p2, = plt.plot (results,'b')
|
||||
|
||||
@@ -0,0 +1,409 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:24778ca76d9e38addb56b65e91a3d5d7a56a744438822a06d40215bdd10b0da2"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
"worksheets": [
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<center><h1>Kalman and Bayesian Filters in Python</h1></center>\n",
|
||||
"<center><a href =\"http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/toc.ipynb\">Table of Contents</a></center>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"#format the book\n",
|
||||
"%matplotlib inline\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import book_format\n",
|
||||
"book_format.load_style()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"html": [
|
||||
"<style>\n",
|
||||
" div.cell{\n",
|
||||
" width: 850px;\n",
|
||||
" margin-left: 0% !important;\n",
|
||||
" margin-right: auto;\n",
|
||||
" }\n",
|
||||
" div.text_cell code {\n",
|
||||
" background: #F6F6F9;\n",
|
||||
" color: #0000FF;\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: 36pt;\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",
|
||||
" text-indent:1em;\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: 1.5em;\n",
|
||||
" margin-top: 0.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: 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: 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 0x17ee690>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 1
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"<h1 align=\"center\">Kalman Filter Math</h1>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This chapter is optional, especially the first time you go through this material. If you are a hobbiest you will be able to get quite far by just skipping this chapter and going on to learn the examples. However, to have any hope of reading the original Kalman filter or optimal estimation literature you will have to acquire some of the more formal mathematics. I will not endevour to teach linear algebra, statistics, or calculus here as each topic deserves a book on its own. \n",
|
||||
"\n",
|
||||
"blah blah blah"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"###Walking Through the Kalman Filter Equations\n",
|
||||
"I promised that you would not have to understand how to derive Kalman filter equations, and that is true. However, I do think it is worth walking through the equations one by one and becoming familiar with the variables. If this is your first time through the material feel free to skip ahead to the next section. However, you will eventually want to work through this material, so why not now? You will need to have passing familarity with these equations to read material written about the Kalman filter, as they all presuppose that you are familiar with the equations. I will reiterate them here for easy reference.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\begin{align}\n",
|
||||
"\\text{Predict Step}\\\\\n",
|
||||
"\\mathbf{x}' &= \\mathbf{F x} + \\mathbf{B u}\\tag{1} \\\\\n",
|
||||
"\\mathbf{P} &= \\mathbf{FP{F}}^T + \\mathbf{Q}\\tag{2} \\\\\n",
|
||||
"\\\\\n",
|
||||
"\\text{Update Step}\\\\\n",
|
||||
"\\mathbf{\\gamma} &= \\mathbf{z} - \\mathbf{H x}\\tag{3} \\\\\n",
|
||||
"\\mathbf{K}&= \\mathbf{PH}^T (\\mathbf{HPH}^T + \\mathbf{R})^{-1}\\tag{4} \\\\\n",
|
||||
"\\mathbf{x}&=\\mathbf{x}' +\\mathbf{K\\gamma}\\tag{5} \\\\\n",
|
||||
"\\mathbf{P}&= (\\mathbf{I}-\\mathbf{KH})\\mathbf{P}\\tag{6}\n",
|
||||
"\\end{align}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"I will start with the measurement step, as that is what we started with in the one dimensional Kalman filter case. Our first equation is\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\mathbf{\\gamma} = \\mathbf{z} - \\mathbf{H x}\\tag{3}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"On the right we have $\\mathbf{Hx}$. That should be recognizable as the measurement function. Multiplying $\\mathbf{H}$ with $\\mathbf{x}$ puts $\\mathbf{x}$ into *measurement space*; in other words, the same basis and units as the sensor's measurements. The variable $\\mathbf{z}$ is just the measurement; it is typical, but not universal to use $\\mathbf{z}$ to denote measurements in the literature ($\\mathbf{y}$ is also sometimes used). Do you remember this chart?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"import mkf_internal\n",
|
||||
"mkf_internal.show_residual_chart()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAF9CAYAAAAKk97ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VGWi//HvpHd6AE1oK0VdaugkIF1XcX+KDSwLLiw/\nVn+KLgosFhAX4S7ci9xVBHRB9op3LegVVuMVlCogrFSlawplQKUF05Pz+yNkliGZMCFPkjkzn/fr\nxQvmzMmZZ76cZJ48+c6Jw7IsSwAAAECACKrtAQAAAAA1iQkwAAAAAgoTYAAAAAQUJsAAAAAIKEyA\nAQAAEFCYAAMAACCgMAEGfMCECRMUFBSkoKAg9e/fv7aHY8zatWsVFBSkjIwMt+07d+50Pd/y7keJ\npUuXKiio/C/TQUFBWrZsWbU+flpamoKCgrR+/fpqfZya5q/PC4D3mAADVXT5RKSgoEB33nmn2rRp\no+PHj3t1jBdffFEnTpzQH/7wBzkcjuoaqjGXTl5L/wQHB5d5vn369JHT6VRCQoLb9vbt28vpdOqr\nr7664mO1aNFC06dPNzr+ymrRooXrecbExKhTp07661//Wqtjcjqduueee67640eNGnXFb7aaNWsm\np9OpXr16XfXjVEV53wDU9uS1ur/xyM3N1TPPPKPrrrtOkZGRSkxM1H333aczZ8647Tdt2jS1bNmy\n2sYB+DsmwIBBhYWFuu+++/TNN99o7dq1uuaaa7z6uJiYGDVu3FjR0dGyy++mefnll+V0Ol1/Tpw4\noaZNm7rtExoaqvj4+DKTmODgYMXHx6thw4ZXfBxf+IbA4XBo4sSJcjqd2rlzp371q19pzJgxev/9\n92ttTPHx8YqIiKjWxwgKClJ8fLxCQ0Or9XHsovRzszo/RydMmKDly5frlVde0YEDB/TWW2+pYcOG\n+vnnn6vtMYFAxAQYMKSwsFAjRozQ3r179cUXX7hNfv/whz/o+uuvV1RUlOLj4zVmzBidO3fO62Mv\nXbpUnTp1UnJysuLj4/X666+rVatWat68ufbu3StJys/P18MPP6xf/OIXioiIUEJCgiZOnKj8/HzX\ncaZNm6b+/ftr5syZaty4seLj4/Xcc89d1fOtU6eO4uPj3f6UTla3bNlS5YpD6aprenq6pk+f7jrW\nCy+84Lbf7Nmz1apVK0VFRalz585auXJlmWMFBQXptdde09ixY1W3bl3VqVNHM2bMqNR4YmJiFB8f\nr+uuu04zZ85U69attWLFCtf9pSuTK1as0J133qnY2Fg1aNDAbaV4yZIluv766xUZGakbbrhBb7zx\nhttj7NixQ927d1dERIR69uypQ4cOlRlHRESEK4s333yz3LHu3btXt912m+rWrau6devqlltu0ZEj\nRySVrPyWrmKuW7fOdawBAwa4Pt7pdLr9/61bt67MY5w7d06jRo1SgwYNFBUVpSFDhujAgQOu+0vr\nL//4xz/Upk0bxcXF6e677zY+kStdJf7rX/+qpk2bqk6dOvrd737ndt6fPn1aw4cPV3R0tFq1aqVV\nq1a5HcObz53Sn3JI0ujRo13ZXLoanJ+fr6effloJCQmKiYlR7969tXnz5ko9n3fffVdPPPGEhg4d\nqmbNmqlv3776y1/+4vopyrRp01yfB+np6a5xtGrVyu04X375pfr27auoqCg1b95cEydOVF5enuv+\nm266Sffee6/uu+8+RUVFqVWrVnrnnXcqNVbAzpgAAwYUFhbq/vvv1+7du8tMfiUpJydH8+fP17ff\nfqsPP/xQX375pcaPH1+px0hLS9Orr76qAQMGaOLEifrggw/Up08fLViwQFLJi294eLiWLFmigwcP\naunSpXrrrbc0bdo0t+Ns27ZNZ8+e1Zdffqmnn35aL774oldVhMtVtArWtWtXOZ3OKq2Q/vOf/9SJ\nEydck5HSleY//OEPrn3++Mc/6pVXXtFf/vIXffvtt3rkkUc0fPhwff3112WON2vWLCUkJGjr1q1a\nvXq12rRpc9Vjk6SwsDAVFBSU2T558mT1799fO3bs0AcffKAmTZpIkhYtWqQnn3xS06ZN0/79+zVj\nxgxNmDBBH374oaSS6swdd9yhZs2aadeuXXriiSc0f/78MivgmZmZOnHihKTyV8czMzOVkpKikJAQ\nrVmzRlu2bNGwYcN09OhRSdL8+fN14sQJ3XPPPerdu7cr10sn840bN3arqJT3OI899pg2btyoDz/8\nUF999ZWCgoJ0++23q6ioyG2/xYsX68MPP9R7772njz/+WK+88orXGVfG0qVL9b//+7/64IMPtHLl\nSr344ouu+/7f//t/2rdvn9auXau33npL//mf/+n2sd587pT+lENy/+nHpTWUUaNG6dNPP9Xy5cu1\nZ88e/epXv9LgwYN17Ngxr59H3bp1tWbNGmVnZ5d7/1NPPeX6PEhISHCNY9u2ba59du/erUGDBmnI\nkCHas2ePli9frk8++USTJk1yO9aKFSt0ww03aNeuXXr44Yd1//33l/tNF+CXLABV4nA4rGuvvdZy\nOBzWHXfc4dXHzJ8/34qLiyuz/fnnn7duuummMtuXLFli9ejRw7Isy3r11Vetnj17WpZlWQsWLLB+\n9atfeXycJ5980urQoYPb8a+55hqruLjYta1OnTrWX/7yF6/GXcrhcFgRERFWTEyM689DDz1UZr8v\nvvjCcjgcVnp6ernH+f777yu837Isq0WLFtb06dPLbM/KyrIiIiKsd99912370KFDrfHjx5cZ7/Dh\nw715ah7HMG3aNMuyLCs/P9967bXXLIfDYS1cuLDMc/nDH/5Q7jGuvfZa689//rPbtnHjxlm33HKL\nZVmWtXLlSisoKMhyOp2u+8eOHWs5HI5yj+dwOKw333yzzPYpU6ZY11xzjZWXl1fhc/rNb35T7rl2\nqdLntG7dOrft586ds0JCQqzly5e7tmVkZFgOh8P6+OOPLcv61//9vn37XPsMGzasUv8PS5YsKfP8\nLx9T6T5btmxx7TNr1iyrUaNGlmVZ1pkzZ6yQkBDr73//u+v+t956q9zndanLP3dKecr94MGDlsPh\nsLZt2+a2vV27dtbs2bO9eLYlUlNTrQYNGlhRUVHW4MGDrTlz5lgnT54ss9/zzz9vtWjRotxj3H//\n/datt97qtu3tt9+2oqKiXLf79etnXX/99WXG+tRTT3k9VsDOQmp7Ag74g5iYGH344YcaPny43njj\nDf32t791u/+DDz7Qf/zHf+jw4cPKyspSYWFhuauHFYmMjHT9Xdr9jIiIUE5OjmufxYsXa/HixUpP\nT1d2drby8/OVmJjodpxWrVq5rejVq1dPp0+frtRYJGnGjBm68847XbdjYmIqfYyq+Pbbb5WXl6ff\n/OY3Gj16tGv7pT/mvVRKSspVP5ZlWZo5c6bmzJmj3NxcRUVFacqUKfrd737n1eOcOnVKx48f13PP\nPef2hr78/HzXG5kOHTqkBg0aqHHjxq77O3ToUOmx7ty5Uz169FBYWFilP9Zb3333nYqKitSxY0fX\ntsTERNWvX1+HDx922/fSlfb69etX2xU/2rdv7/r3jTfeqB9//FFZWVn6/vvvVVRU5HZ/ebl687lT\nkR07dkhSmTcW5ubm6rvvvvP6OEOHDlVmZqZWr16t9evX67XXXtPMmTO1du1at+dQka+//lpHjhxR\nbGysa1tRUZHy8vLkdDpdP5X45S9/6fZxv/zlL8v8/wH+igkwYMCUKVN0++23a8qUKZowYYL69eun\n6667TpK0detW3XffffrTn/6kIUOGKCYmRsuXL7/q7u3lrItVhHfffVdPPvmk5s2bp549eyoyMlL/\n9m//pk8//dRt/5CQsp/21lW8qSc+Pr5M77A2vPfee2rbtq3bttJvFi5Vr169q34Mh8Oh8ePH67HH\nHnN1gT2p6HFefvllDRw40G1b6RvMTL3Zz+FweP3/WRNvMLz8DZCVOdcqevPd5feV91wsy/LqOXr7\nueONTZs2lflmMC4urlLHiIyM1LBhwzRs2DC99NJLSkpK0ty5c7V06VKvPt7hcOjBBx/UH//4xzL3\nNWrUyOPHXc3XAcCumAADBpS+yD733HNatWqVHnjgAW3atEnBwcHauHGj2rdvr4kTJ7r2z8zMLPeF\nOSYmxmP370rWr1+voUOHuq0+f//99z5xFQVPSicKFT1nT13b66+/XuHh4UpPT9ctt9xSbWMsVb9+\n/aue8MfHx+vaa6/VkSNHNHbs2HL3ad26tX766Se3Fbrdu3dX+v+vU6dOWrp0qfLy8hQeHu5xP0+5\neqNly5YKCgrSzp07dcMNN0iSMjIydPr0adc3fp5U5vnUr19fUkmHvvSbmgsXLrjdV2r37t3q0aOH\npJI3ATZs2FBxcXFq2bKlgoODtXv3bl1//fWufS9Vmc+d0NBQFRYWltneqVMnSdLx48d18803e/0c\nryQkJEQtWrRwPe9SYWFh5Y5Dkjp37qxvvvnmiufrnj173G7v3btXt99+e9UGDNgEb4IDDAoJCdGy\nZcu0c+dO14+627Vrp3379mnVqlX67rvv9Oqrr+r9998vd7Wle/fu2rlzpz777DM5nc4yL3oVadeu\nnTZu3Kj169fr0KFDeuGFF7R58+YrrupUx6rP6dOn5XQ6XdWKU6dOyel06vz58277NWzYUC1atNAr\nr7yio0eP6tSpU2WO1aZNG3322Wc6duyYcnNzXW+yio2N1eOPP66pU6fqzTff1JEjR7RlyxY999xz\nevfdd40+HxMZTZ06VS+//LLmz5+vgwcP6p///Kf+/Oc/u94UdvPNN6tFixZ69NFHtW/fPr3zzjv6\n7//+b7dj/Pzzz643PUnS2bNn5XQ69cMPP7j2GT9+vHJycjRixAj985//1IEDB/Tqq6+WuZLine truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2896ad0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 3
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The blue prediction line is the output of $\\mathbf{Hx}$, and the dot labelled \"measurement\" is $\\mathbf{z}$. Therefore, $\\gamma = \\mathbf{z} - \\mathbf{Hx}$ is how we compute the residual, drawn in red. So $\\gamma$ is the residual.\n",
|
||||
"\n",
|
||||
"The next line is the formidable:\n",
|
||||
"\n",
|
||||
"$$\\mathbf{K}= \\mathbf{PH}^T (\\mathbf{HPH}^T + \\mathbf{R})^{-1}$$\n",
|
||||
"\n",
|
||||
"Unfortunately it is a fair amount of linear algebra to derive this. The derivation can be quite elegant, and I urge you to look it up if you have the mathematical education to follow it. But $\\mathbf{K}$ is just the *Kalman gain* - the ratio of how much measurement vs prediction we should use to create the new estimate. $\\mathbf{R}$ is the *measurement noise*, and $\\mathbf{P}$ is our *uncertainty covariance matrix*.\n",
|
||||
"\n",
|
||||
"So let's work through this expression by expression. Start with $\\mathbf{HPH}^T$. The linear equation $\\mathbf{ABA}^T$ can be thought of as changing the basis of $\\mathbf{B}$ to $\\mathbf{A}$. So $\\mathbf{HPH}^T$ is taking the covariance $\\mathbf{P}$ and putting it in measurement ($\\mathbf{H}$) space. Then, once in measurement space, we can add the measurement noise $\\mathbf{R}$ to it. Hence, the expression for the uncertainty in the measurement is:\n",
|
||||
"\n",
|
||||
"$$(\\mathbf{HPH}^T + \\mathbf{R})^{-1}$$\n",
|
||||
"\n",
|
||||
"Taking the inverse is linear algebra's way of doing $\\frac{1}{x}$. So if you accept my admittedly hand wavely explanation it can be seen to be computing:\n",
|
||||
"\n",
|
||||
"$$ \n",
|
||||
"gain_{measurement\\,space} = \\frac{uncertainty_{prediction}}{uncertainty_{measurement}}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"In other words, the *Kalman gain* equation is doing nothing more than computing a ratio based on how much we trust the prediction vs the measurement. If we are confident in our measurements and unconfident in our predictions $\\mathbf{K}$ will favor the measurement, and vice versa. The equation is complicated because we are doing this in multiple dimensions via matrices, but the concept is simple - scale by a ratio.\n",
|
||||
"\n",
|
||||
"Without going into the derivation of $\\mathbf{K}$, I'll say that this equation is the result of finding a value of $\\mathbf{K}$ that optimizes the *mean-square estimation error*. It does this by finding the minimal values for $\\mathbf{P}$ along it's diagonal. Recall that the diagonal of $P$ is just the variance for each state variable. So, this equation for $\\mathbf{K}$ ensures that the Kalman filter output is optimal. To put this in concrete terms, for our dog tracking problem this means that the estimates for both position and velocity will be optimal - a value of $\\mathbf{K}$ that made the position extremely accurate but the velocity very inaccurate would be rejected in favor of a $\\mathbf{K}$ that made both position and velocity just somewhat accurate.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Our next line is:\n",
|
||||
" $$\\mathbf{x}=\\mathbf{x}' +\\mathbf{K\\gamma}$$\n",
|
||||
"\n",
|
||||
"This just multiplies the residual by the Kalman gain, and adds it to the state variable. In other words, this is the computation of our new estimate.\n",
|
||||
"\n",
|
||||
"Finally, we have:\n",
|
||||
"\n",
|
||||
"$$\\mathbf{P}=(\\mathbf{I}-\\mathbf{KH})\\mathbf{P}$$\n",
|
||||
"\n",
|
||||
"$I$ is the identity matrix, and is the way we represent $1$ in multiple dimensions. $H$ is our measurement function, and is a constant. So, simplified, this is simply $P = (1-cK)P$. $K$ is our ratio of how much prediction vs measurement we use. So, if $K$ is large then $(1-cK)$ is small, and P will be made smaller than it was. If $K$ is small, then $(1-cK)$ is large, and P will be made larger than it was. So we adjust the size of our uncertainty by some factor of the *Kalman gain*. I would like to draw your attention back to the g-h filter, which included this Python code:\n",
|
||||
"\n",
|
||||
" # update filter \n",
|
||||
" w = w * (1-scale_factor) + z * scale_factor\n",
|
||||
"\n",
|
||||
"This multidimensional Kalman filter equation is partially implementing this calculation for the variance instead of the state variable.\n",
|
||||
"\n",
|
||||
"Now we have the measurement steps. The first equation is\n",
|
||||
"\n",
|
||||
"$$\\mathbf{x}' = \\mathbf{Fx} + \\mathbf{Bu}$$\n",
|
||||
"\n",
|
||||
"This is just our state transition equation which we have already discussed. $\\mathbf{Fx}$ multiplies $\\mathbf{x}$ with the state transition matrix to compute the next state. $B$ and $u$ add in the contribution of the control input $\\mathbf{u}$, if any.\n",
|
||||
"\n",
|
||||
"The final equation is:\n",
|
||||
"$$\\mathbf{P} = \\mathbf{FPF}^T + \\mathbf{Q}$$\n",
|
||||
"\n",
|
||||
"$\\mathbf{FPF}^T$ is the way we put $\\mathbf{P}$ into the process space using linear algebra so that we can add in the process noise $\\mathbf{Q}$ to it."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 0
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 0
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": []
|
||||
}
|
||||
],
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:43bd1af62fa937637565cb5ed8f724e42183f9bc967ce8d075e88d0c3457d5d5"
|
||||
"signature": "sha256:be0a709066adb31921ff0f85de1570fb3fe218d1a139417a7dc26ef13ea519e2"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
@@ -37,6 +37,10 @@
|
||||
" margin-left: 0% !important;\n",
|
||||
" margin-right: auto;\n",
|
||||
" }\n",
|
||||
" div.text_cell code {\n",
|
||||
" background: #F6F6F9;\n",
|
||||
" color: #0000FF;\n",
|
||||
" }\n",
|
||||
" h1 {\n",
|
||||
" font-family: 'Open sans',verdana,arial,sans-serif;\n",
|
||||
"\t}\n",
|
||||
@@ -130,7 +134,7 @@
|
||||
" max-height: 300px;\n",
|
||||
" }\n",
|
||||
" code{\n",
|
||||
" font-size: 78%;\n",
|
||||
" font-size: 70%;\n",
|
||||
" }\n",
|
||||
" .rendered_html code{\n",
|
||||
" background-color: transparent;\n",
|
||||
@@ -240,7 +244,7 @@
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 1,
|
||||
"text": [
|
||||
"<IPython.core.display.HTML at 0x12956d0>"
|
||||
"<IPython.core.display.HTML at 0x2b4f7d0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -510,7 +514,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x29832d0>"
|
||||
"<matplotlib.figure.Figure at 0x423b3d0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -554,7 +558,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2591fd0>"
|
||||
"<matplotlib.figure.Figure at 0x40e6fd0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -607,7 +611,7 @@
|
||||
"\n",
|
||||
"This is the first contour that has values in the off-diagonal elements of $cov$, and this is the first contour plot with a slanted ellipse. This is not a coincidence. The two facts are telling use the same thing. A slanted ellipse tells us that the $x$ and $y$ values are somehow **correlated**. We denote that in the covariance matrix with values off the diagonal. What does this mean in physical terms? Think of trying to park your car in a parking spot. You can not pull up beside the spot and then move sideways into the space because most cars cannot go purely sideways. $x$ and $y$ are not independent. This is a consequence of the steering system in a car. When your tires are turned the car rotates around its rear axle while moving forward. Or think of a horse attached to a pivoting exercise bar in a corral. The horse can only walk in circles, he cannot vary $x$ and $y$ independently, which means he cannot walk straight forward to to the side. If $x$ changes, $y$ must also change in a defined way. \n",
|
||||
"\n",
|
||||
"So when we see this ellipse we know that $x$ and $y$ are correlated, and that the correlation is \"strong\". I will not prove it here, but a $45^\\circ$ angle denotes complete correlation between $x$ and $y$, whereas $0^\\circ$ and $90^\\circ$ denote no correlation at all. Those who are familiar with this math will be objecting quite strongly, as this is actually quite sloppy language that does not adress all of the mathematical issues. They are right, but for now this is a good first approximation to understanding these ellipses from a physical interpretation point of view. The size of the ellipse shows how much error we have in each axis, and the slant shows how strongly correlated the values are.\n",
|
||||
"So when we see this ellipse we know that $x$ and $y$ are correlated, and that the correlation is \"strong\". The size of the ellipse shows how much error we have in each axis, and the slant shows how strongly correlated the values are.\n",
|
||||
"\n",
|
||||
"A word about **correlation** and **independence**. If variables are **independent** they can vary separately. If you walk in an open field, you can move in the $x$ direction (east-west), the $y$ direction(north-south), or any combination thereof. Independent variables are always also **uncorrelated**. Except in special cases, the reverse does not hold true. Variables can be uncorrelated, but dependent. For example, consider the pair$(x,y)$ where $y=x^2$. Correlation is a linear measurement, so $x$ and $y$ are uncorrelated. However, they are obviously dependent on each other. \n",
|
||||
"\n",
|
||||
@@ -638,7 +642,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2b32490>"
|
||||
"<matplotlib.figure.Figure at 0x410e750>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -665,7 +669,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x29ef5d0>"
|
||||
"<matplotlib.figure.Figure at 0x40e01d0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -692,7 +696,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2cedd10>"
|
||||
"<matplotlib.figure.Figure at 0x40daa90>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -723,7 +727,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2b1d910>"
|
||||
"<matplotlib.figure.Figure at 0x43e1850>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -769,7 +773,7 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAF9CAYAAAAKk97ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VGWi//HvpHd6AE1oK0VdaugkIF1XcX+KDSwLLiw/\nVn+KLgosFhAX4S7ci9xVBHRB9op3LegVVuMVlCogrFSlawplQKUF05Pz+yNkliGZMCFPkjkzn/fr\nxQvmzMmZZ76cZJ48+c6Jw7IsSwAAAECACKrtAQAAAAA1iQkwAAAAAgoTYAAAAAQUJsAAAAAIKEyA\nAQAAEFCYAAMAACCgMAEGfMCECRMUFBSkoKAg9e/fv7aHY8zatWsVFBSkjIwMt+07d+50Pd/y7keJ\npUuXKiio/C/TQUFBWrZsWbU+flpamoKCgrR+/fpqfZya5q/PC4D3mAADVXT5RKSgoEB33nmn2rRp\no+PHj3t1jBdffFEnTpzQH/7wBzkcjuoaqjGXTl5L/wQHB5d5vn369JHT6VRCQoLb9vbt28vpdOqr\nr7664mO1aNFC06dPNzr+ymrRooXrecbExKhTp07661//Wqtjcjqduueee67640eNGnXFb7aaNWsm\np9OpXr16XfXjVEV53wDU9uS1ur/xyM3N1TPPPKPrrrtOkZGRSkxM1H333aczZ8647Tdt2jS1bNmy\n2sYB+DsmwIBBhYWFuu+++/TNN99o7dq1uuaaa7z6uJiYGDVu3FjR0dGyy++mefnll+V0Ol1/Tpw4\noaZNm7rtExoaqvj4+DKTmODgYMXHx6thw4ZXfBxf+IbA4XBo4sSJcjqd2rlzp371q19pzJgxev/9\n92ttTPHx8YqIiKjWxwgKClJ8fLxCQ0Or9XHsovRzszo/RydMmKDly5frlVde0YEDB/TWW2+pYcOG\n+vnnn6vtMYFAxAQYMKSwsFAjRozQ3r179cUXX7hNfv/whz/o+uuvV1RUlOLj4zVmzBidO3fO62Mv\nXbpUnTp1UnJysuLj4/X666+rVatWat68ufbu3StJys/P18MPP6xf/OIXioiIUEJCgiZOnKj8/HzX\ncaZNm6b+/ftr5syZaty4seLj4/Xcc89d1fOtU6eO4uPj3f6UTla3bNlS5YpD6aprenq6pk+f7jrW\nCy+84Lbf7Nmz1apVK0VFRalz585auXJlmWMFBQXptdde09ixY1W3bl3VqVNHM2bMqNR4YmJiFB8f\nr+uuu04zZ85U69attWLFCtf9pSuTK1as0J133qnY2Fg1aNDAbaV4yZIluv766xUZGakbbrhBb7zx\nhttj7NixQ927d1dERIR69uypQ4cOlRlHRESEK4s333yz3LHu3btXt912m+rWrau6devqlltu0ZEj\nRySVrPyWrmKuW7fOdawBAwa4Pt7pdLr9/61bt67MY5w7d06jRo1SgwYNFBUVpSFDhujAgQOu+0vr\nL//4xz/Upk0bxcXF6e677zY+kStdJf7rX/+qpk2bqk6dOvrd737ndt6fPn1aw4cPV3R0tFq1aqVV\nq1a5HcObz53Sn3JI0ujRo13ZXLoanJ+fr6effloJCQmKiYlR7969tXnz5ko9n3fffVdPPPGEhg4d\nqmbNmqlv3776y1/+4vopyrRp01yfB+np6a5xtGrVyu04X375pfr27auoqCg1b95cEydOVF5enuv+\nm266Sffee6/uu+8+RUVFqVWrVnrnnXcqNVbAzpgAAwYUFhbq/vvv1+7du8tMfiUpJydH8+fP17ff\nfqsPP/xQX375pcaPH1+px0hLS9Orr76qAQMGaOLEifrggw/Up08fLViwQFLJi294eLiWLFmigwcP\naunSpXrrrbc0bdo0t+Ns27ZNZ8+e1Zdffqmnn35aL774oldVhMtVtArWtWtXOZ3OKq2Q/vOf/9SJ\nEydck5HSleY//OEPrn3++Mc/6pVXXtFf/vIXffvtt3rkkUc0fPhwff3112WON2vWLCUkJGjr1q1a\nvXq12rRpc9Vjk6SwsDAVFBSU2T558mT1799fO3bs0AcffKAmTZpIkhYtWqQnn3xS06ZN0/79+zVj\nxgxNmDBBH374oaSS6swdd9yhZs2aadeuXXriiSc0f/78MivgmZmZOnHihKTyV8czMzOVkpKikJAQ\nrVmzRlu2bNGwYcN09OhRSdL8+fN14sQJ3XPPPerdu7cr10sn840bN3arqJT3OI899pg2btyoDz/8\nUF999ZWCgoJ0++23q6ioyG2/xYsX68MPP9R7772njz/+WK+88orXGVfG0qVL9b//+7/64IMPtHLl\nSr344ouu+/7f//t/2rdvn9auXau33npL//mf/+n2sd587pT+lENy/+nHpTWUUaNG6dNPP9Xy5cu1\nZ88e/epXv9LgwYN17Ngxr59H3bp1tWbNGmVnZ5d7/1NPPeX6PEhISHCNY9u2ba59du/erUGDBmnI\nkCHas2ePli9frk8++USTJk1yO9aKFSt0ww03aNeuXXr44Yd1//33l/tNF+CXLABV4nA4rGuvvdZy\nOBzWHXfc4dXHzJ8/34qLiyuz/fnnn7duuummMtuXLFli9ejRw7Isy3r11Vetnj17WpZlWQsWLLB+\n9atfeXycJ5980urQoYPb8a+55hqruLjYta1OnTrWX/7yF6/GXcrhcFgRERFWTEyM689DDz1UZr8v\nvvjCcjgcVnp6ernH+f777yu837Isq0WLFtb06dPLbM/KyrIiIiKsd99912370KFDrfHjx5cZ7/Dh\nw715ah7HMG3aNMuyLCs/P9967bXXLIfDYS1cuLDMc/nDH/5Q7jGuvfZa689//rPbtnHjxlm33HKL\nZVmWtXLlSisoKMhyOp2u+8eOHWs5HI5yj+dwOKw333yzzPYpU6ZY11xzjZWXl1fhc/rNb35T7rl2\nqdLntG7dOrft586ds0JCQqzly5e7tmVkZFgOh8P6+OOPLcv61//9vn37XPsMGzasUv8PS5YsKfP8\nLx9T6T5btmxx7TNr1iyrUaNGlmVZ1pkzZ6yQkBDr73//u+v+t956q9zndanLP3dKecr94MGDlsPh\nsLZt2+a2vV27dtbs2bO9eLYlUlNTrQYNGlhRUVHW4MGDrTlz5lgnT54ss9/zzz9vtWjRotxj3H//\n/datt97qtu3tt9+2oqKiXLf79etnXX/99WXG+tRTT3k9VsDOQmp7Ag74g5iYGH344YcaPny43njj\nDf32t791u/+DDz7Qf/zHf+jw4cPKyspSYWFhuauHFYmMjHT9Xdr9jIiIUE5OjmufxYsXa/HixUpP\nT1d2drby8/OVmJjodpxWrVq5rejVq1dPp0+frtRYJGnGjBm68847XbdjYmIqfYyq+Pbbb5WXl6ff\n/OY3Gj16tGv7pT/mvVRKSspVP5ZlWZo5c6bmzJmj3NxcRUVFacqUKfrd737n1eOcOnVKx48f13PP\nPef2hr78/HzXG5kOHTqkBg0aqHHjxq77O3ToUOmx7ty5Uz169FBYWFilP9Zb3333nYqKitSxY0fX\ntsTERNWvX1+HDx922/fSlfb69etX2xU/2rdv7/r3jTfeqB9//FFZWVn6/vvvVVRU5HZ/ebl687lT\nkR07dkhSmTcW5ubm6rvvvvP6OEOHDlVmZqZWr16t9evX67XXXtPMmTO1du1at+dQka+//lpHjhxR\nbGysa1tRUZHy8vLkdDpdP5X45S9/6fZxv/zlL8v8/wH+igkwYMCUKVN0++23a8qUKZowYYL69eun\n6667TpK0detW3XffffrTn/6kIUOGKCYmRsuXL7/q7u3lrItVhHfffVdPPvmk5s2bp549eyoyMlL/\n9m//pk8//dRt/5CQsp/21lW8qSc+Pr5M77A2vPfee2rbtq3bttJvFi5Vr169q34Mh8Oh8ePH67HH\nHnN1gT2p6HFefvllDRw40G1b6RvMTL3Zz+FweP3/WRNvMLz8DZCVOdcqevPd5feV91wsy/LqOXr7\nueONTZs2lflmMC4urlLHiIyM1LBhwzRs2DC99NJLSkpK0ty5c7V06VKvPt7hcOjBBx/UH//4xzL3\nNWrUyOPHXc3XAcCumAADBpS+yD733HNatWqVHnjgAW3atEnBwcHauHGj2rdvr4kTJ7r2z8zMLPeF\nOSYmxmP370rWr1+voUOHuq0+f//99z5xFQVPSicKFT1nT13b66+/XuHh4UpPT9ctt9xSbWMsVb9+\n/aue8MfHx+vaa6/VkSNHNHbs2HL3ad26tX766Se3Fbrdu3dX+v+vU6dOWrp0qfLy8hQeHu5xP0+5\neqNly5YKCgrSzp07dcMNN0iSMjIydPr0adc3fp5U5vnUr19fUkmHvvSbmgsXLrjdV2r37t3q0aOH\npJI3ATZs2FBxcXFq2bKlgoODtXv3bl1//fWufS9Vmc+d0NBQFRYWltneqVMnSdLx48d18803e/0c\nryQkJEQtWrRwPe9SYWFh5Y5Dkjp37qxvvvnmiufrnj173G7v3btXt99+e9UGDNgEb4IDDAoJCdGy\nZcu0c+dO14+627Vrp3379mnVqlX67rvv9Oqrr+r9998vd7Wle/fu2rlzpz777DM5nc4yL3oVadeu\nnTZu3Kj169fr0KFDeuGFF7R58+YrrupUx6rP6dOn5XQ6XdWKU6dOyel06vz58277NWzYUC1atNAr\nr7yio0eP6tSpU2WO1aZNG3322Wc6duyYcnNzXW+yio2N1eOPP66pU6fqzTff1JEjR7RlyxY999xz\nevfdd40+HxMZTZ06VS+//LLmz5+vgwcP6p///Kf+/Oc/u94UdvPNN6tFixZ69NFHtW/fPr3zzjv6\n7//+b7dj/Pzzz643PUnS2bNn5XQ69cMPP7j2GT9+vHJycjRixAj985//1IEDB/Tqq6+WuZLine truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2653bd0>"
|
||||
"<matplotlib.figure.Figure at 0x4581f90>"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -865,7 +869,7 @@
|
||||
"As I mentioned above, there is actually very little programming involved in creating a Kalman filter. We will just be defining several matrices and parameters that get passed into the Kalman filter algorithm code. Rather than try to explain each of the steps ahead of time, which can be a bit abstract and hard to follow, let's just do it for our by now well known dog tracking problem. Naturally this one example will not cover every use case of the Kalman filter, but we will learn by starting with a simple problem and then slowly start addressing more complicated situations.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"##### **Step 1:** Choose State Variables\n",
|
||||
"##### **Step 1:** Choose the State Variables\n",
|
||||
"\n",
|
||||
"*State variables* are the variables that the Kalman filter estimates. They include the *observed variables* - the data that is directly measured by a sensor, and the *unobserved variables*, which we can infer from the observed variables.\n",
|
||||
"\n",
|
||||
@@ -1009,7 +1013,7 @@
|
||||
"source": [
|
||||
"##### **Step 6**: Design the Process Noise Matrix\n",
|
||||
"\n",
|
||||
"What is *process noise*. Consider the motion of a thrown ball. In a vacuum and with constant gravitational force it moves in a parabola. However, if you throw the ball on the surface of the earth you will also need to model factors like rotation and air drag. However, even when you have done all of that there is usually things you cannot account for. For example, consider wind. On a windy day the ball's trajectory will differ from the computed trajectory, perhaps by a significant amount. Without wind sensors, we may have no way to model the wind. Wind can come from any direction, so it is likely to have a near Gaussian distribution. The Kalman filter models this as *process noise*, and calls it $\\mathbf{Q}$.\n",
|
||||
"What is *process noise*? Consider the motion of a thrown ball. In a vacuum and with constant gravitational force it moves in a parabola. However, if you throw the ball on the surface of the earth you will also need to model factors like rotation and air drag. However, even when you have done all of that there is usually things you cannot account for. For example, consider wind. On a windy day the ball's trajectory will differ from the computed trajectory, perhaps by a significant amount. Without wind sensors, we may have no way to model the wind. Wind can come from any direction, so it is likely to have a near Gaussian distribution. The Kalman filter models this as *process noise*, and calls it $\\mathbf{Q}$.\n",
|
||||
"\n",
|
||||
"Astute readers will realize that we can inspect the ball's path and extract wind as an unobserved state variable, but the point to grasp here is there will always be some unmodelled noise in our process, and the Kalman filter gives us a way to model it.\n",
|
||||
"\n",
|
||||
@@ -1018,6 +1022,17 @@
|
||||
"> Some books and papers use $\\mathbf{R}$ for measurement noise and $\\mathbf{Q}$ for the process noise. Others do the opposite, using $\\mathbf{Q}$ for measurement noise and $\\mathbf{R}$ for the process noise! Read carefully, and make sure you don't get confused."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### **Step 7**: Design Initial Conditions\n",
|
||||
"\n",
|
||||
"Finally, we need to specify the initial conditions for the state variables and their associated covariance matrix. If you have a rough idea of the values you can use that as your initial settings, or, you could always read the sensors for the first time, and calculate a initial value. The Kalman filter will converge and find the solution even if your initial conditions are far off, but the more accurate they are the faster and better the output will be. \n",
|
||||
"\n",
|
||||
"The covariance matrix ($\\small{\\mathbf{P}}$) is a $n{\\times}n$ matrix that specifies the variances and covariances of each state variable. This is a complicated topic, and I'd rather demostrate the matrix rather than talk about it abstractly here. For now, recognize that the Kalman filter will be calculating the covariance matrix at each step, just like the 1-D filter computed the variance of the mean at each step. So as with those examples we can make an initial guess and trust that $\\small{\\mathbf{P}}$ will converge to a smaller value as the filter progresses. I find this description somewhat unsatisfactory for several reasons, but until you've seen some examples it is hard to talk about in an understandable way."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -1122,27 +1137,27 @@
|
||||
" dog = DogSensor(velocity=1, noise=noise)\n",
|
||||
" dog_filter = dog_tracking_filter(R=R, Q=Q, cov=500.)\n",
|
||||
"\n",
|
||||
" ps = [None] * count\n",
|
||||
" pos = [None] * count\n",
|
||||
" zs = [None] * count\n",
|
||||
" cov = [None] * count\n",
|
||||
" \n",
|
||||
" for t in range (count):\n",
|
||||
" z = dog.sense() # get the next measurement\n",
|
||||
" \n",
|
||||
" pos[t] = f.x[0,0]\n",
|
||||
" cov[t] = f.P\n",
|
||||
" pos[t] = dog_filter.x[0,0]\n",
|
||||
" cov[t] = dog_filter.P\n",
|
||||
" zs[t] = z\n",
|
||||
" \n",
|
||||
" # perform the kalman filter steps\n",
|
||||
" dog_filter.update (z)\n",
|
||||
" dog_filter.predict()\n",
|
||||
" \n",
|
||||
" return (ps, zs, cov)"
|
||||
" return (pos, zs, cov)"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 29
|
||||
"prompt_number": 35
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1160,13 +1175,13 @@
|
||||
" \n",
|
||||
"We will want to plot the filtered position, the measurements, and the covariance, so we will need to store them in lists. The next three lines initialize empty lists of length *count* in a pythonic way.\n",
|
||||
"\n",
|
||||
" ps = [None] * count\n",
|
||||
" pos = [None] * count\n",
|
||||
" zs = [None] * count\n",
|
||||
" cov = [None] * count\n",
|
||||
" \n",
|
||||
"Finally we get to the filter. All we need to do is perform the update and predict steps of the Kalman filter for each measurement. The *KalmanFilter* class provides the two functions *update()* and *predict()* for this purpose. *update()* performs the measurement update step of the Kalman filter, and so it takes a variable containing the sensor measurement. \n",
|
||||
"\n",
|
||||
"So, absent the bookkeeping work of storing the filter's data, the for loop reads:\n",
|
||||
"Absent the bookkeeping work of storing the filter's data, the for loop reads:\n",
|
||||
"\n",
|
||||
" for t in range (count):\n",
|
||||
" z = dog.sense()\n",
|
||||
@@ -1184,7 +1199,7 @@
|
||||
"input": [
|
||||
"def plot_track(noise, count, R, Q=0, plot_P=True, title='Kalman Filter'):\n",
|
||||
" \n",
|
||||
" ps, zs, cov = filter_track(noise, count, R, Q)\n",
|
||||
" ps, zs, cov = filter_dog(noise, count, R, Q)\n",
|
||||
" \n",
|
||||
" p0, = plt.plot([0,count],[0,count],'g')\n",
|
||||
" p1, = plt.plot(range(1,count+1),zs,c='r', linestyle='dashed')\n",
|
||||
@@ -1210,7 +1225,7 @@
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 35
|
||||
"prompt_number": 36
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1231,21 +1246,21 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2c16850>"
|
||||
"<matplotlib.figure.Figure at 0x44c7a10>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x2c11f10>"
|
||||
"<matplotlib.figure.Figure at 0x43e1150>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 34
|
||||
"prompt_number": 37
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1260,115 +1275,6 @@
|
||||
"In the previous chapter we filtered very noisy signals with much simpler code than the code above. However, realize that right now we are working with a very simple example - an object moving through 1-D space and one sensor. That is about the limit of what we can compute with the code in the last chapter. In contrast, we can implement very complicated, multidimensional filter with this code merely by altering are assignments to the filter's variables. Perhaps we want to track 100 dimensions in financial models. Or we have an aircraft with a GPS, INS, TACAN, radar altimeter, baro altimeter, and airspeed indicator, and we want to integrate all those sensors into a model that predicts position, velocity, and accelerations in 3D (which requires 9 state variables). We can do that with the code in this chapter."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"###Walking Through the Math (Optional)\n",
|
||||
"I promised that you would not have to understand how to derive Kalman filter equations, and that is true. However, I do think it is worth walking through the equations one by one and becoming familiar with the variables. If this is your first time through the material feel free to skip ahead to the next section. However, you will eventually want to work through this material, so why not now? You will need to have passing familarity with these equations to read material written about the Kalman filter, as they all presuppose that you are familiar with the equations. I will reiterate them here for easy reference.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\begin{align}\n",
|
||||
"\\text{Predict Step}\\\\\n",
|
||||
"\\mathbf{x}' &= \\mathbf{F x} + \\mathbf{B u}\\tag{1} \\\\\n",
|
||||
"\\mathbf{P} &= \\mathbf{FP{F}}^T + \\mathbf{Q}\\tag{2} \\\\\n",
|
||||
"\\\\\n",
|
||||
"\\text{Update Step}\\\\\n",
|
||||
"\\mathbf{\\gamma} &= \\mathbf{z} - \\mathbf{H x}\\tag{3} \\\\\n",
|
||||
"\\mathbf{K}&= \\mathbf{PH}^T (\\mathbf{HPH}^T + \\mathbf{R})^{-1}\\tag{4} \\\\\n",
|
||||
"\\mathbf{x}&=\\mathbf{x}' +\\mathbf{K\\gamma}\\tag{5} \\\\\n",
|
||||
"\\mathbf{P}&= (\\mathbf{I}-\\mathbf{KH})\\mathbf{P}\\tag{6}\n",
|
||||
"\\end{align}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"I will start with the measurement step, as that is what we started with in the one dimensional Kalman filter case. Our first equation is\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"\\mathbf{\\gamma} = \\mathbf{z} - \\mathbf{H x}\\tag{3}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"On the right we have $\\mathbf{Hx}$. That should be recognizable as the measurement function. Multiplying $\\mathbf{H}$ with $\\mathbf{x}$ puts $\\mathbf{x}$ into *measurement space*; in other words, the same basis and units as the sensor's measurements. The variable $\\mathbf{z}$ is just the measurement; it is typical, but not universal to use $\\mathbf{z}$ to denote measurements in the literature ($\\mathbf{y}$ is also sometimes used). Do you remember this chart?"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [
|
||||
"show_residual_chart()"
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAF9CAYAAAAKk97ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8VGWi//HvpHd6AE1oK0VdaugkIF1XcX+KDSwLLiw/\nVn+KLgosFhAX4S7ci9xVBHRB9op3LegVVuMVlCogrFSlawplQKUF05Pz+yNkliGZMCFPkjkzn/fr\nxQvmzMmZZ76cZJ48+c6Jw7IsSwAAAECACKrtAQAAAAA1iQkwAAAAAgoTYAAAAAQUJsAAAAAIKEyA\nAQAAEFCYAAMAACCgMAEGfMCECRMUFBSkoKAg9e/fv7aHY8zatWsVFBSkjIwMt+07d+50Pd/y7keJ\npUuXKiio/C/TQUFBWrZsWbU+flpamoKCgrR+/fpqfZya5q/PC4D3mAADVXT5RKSgoEB33nmn2rRp\no+PHj3t1jBdffFEnTpzQH/7wBzkcjuoaqjGXTl5L/wQHB5d5vn369JHT6VRCQoLb9vbt28vpdOqr\nr7664mO1aNFC06dPNzr+ymrRooXrecbExKhTp07661//Wqtjcjqduueee67640eNGnXFb7aaNWsm\np9OpXr16XfXjVEV53wDU9uS1ur/xyM3N1TPPPKPrrrtOkZGRSkxM1H333aczZ8647Tdt2jS1bNmy\n2sYB+DsmwIBBhYWFuu+++/TNN99o7dq1uuaaa7z6uJiYGDVu3FjR0dGyy++mefnll+V0Ol1/Tpw4\noaZNm7rtExoaqvj4+DKTmODgYMXHx6thw4ZXfBxf+IbA4XBo4sSJcjqd2rlzp371q19pzJgxev/9\n92ttTPHx8YqIiKjWxwgKClJ8fLxCQ0Or9XHsovRzszo/RydMmKDly5frlVde0YEDB/TWW2+pYcOG\n+vnnn6vtMYFAxAQYMKSwsFAjRozQ3r179cUXX7hNfv/whz/o+uuvV1RUlOLj4zVmzBidO3fO62Mv\nXbpUnTp1UnJysuLj4/X666+rVatWat68ufbu3StJys/P18MPP6xf/OIXioiIUEJCgiZOnKj8/HzX\ncaZNm6b+/ftr5syZaty4seLj4/Xcc89d1fOtU6eO4uPj3f6UTla3bNlS5YpD6aprenq6pk+f7jrW\nCy+84Lbf7Nmz1apVK0VFRalz585auXJlmWMFBQXptdde09ixY1W3bl3VqVNHM2bMqNR4YmJiFB8f\nr+uuu04zZ85U69attWLFCtf9pSuTK1as0J133qnY2Fg1aNDAbaV4yZIluv766xUZGakbbrhBb7zx\nhttj7NixQ927d1dERIR69uypQ4cOlRlHRESEK4s333yz3LHu3btXt912m+rWrau6devqlltu0ZEj\nRySVrPyWrmKuW7fOdawBAwa4Pt7pdLr9/61bt67MY5w7d06jRo1SgwYNFBUVpSFDhujAgQOu+0vr\nL//4xz/Upk0bxcXF6e677zY+kStdJf7rX/+qpk2bqk6dOvrd737ndt6fPn1aw4cPV3R0tFq1aqVV\nq1a5HcObz53Sn3JI0ujRo13ZXLoanJ+fr6effloJCQmKiYlR7969tXnz5ko9n3fffVdPPPGEhg4d\nqmbNmqlv3776y1/+4vopyrRp01yfB+np6a5xtGrVyu04X375pfr27auoqCg1b95cEydOVF5enuv+\nm266Sffee6/uu+8+RUVFqVWrVnrnnXcqNVbAzpgAAwYUFhbq/vvv1+7du8tMfiUpJydH8+fP17ff\nfqsPP/xQX375pcaPH1+px0hLS9Orr76qAQMGaOLEifrggw/Up08fLViwQFLJi294eLiWLFmigwcP\naunSpXrrrbc0bdo0t+Ns27ZNZ8+e1Zdffqmnn35aL774oldVhMtVtArWtWtXOZ3OKq2Q/vOf/9SJ\nEydck5HSleY//OEPrn3++Mc/6pVXXtFf/vIXffvtt3rkkUc0fPhwff3112WON2vWLCUkJGjr1q1a\nvXq12rRpc9Vjk6SwsDAVFBSU2T558mT1799fO3bs0AcffKAmTZpIkhYtWqQnn3xS06ZN0/79+zVj\nxgxNmDBBH374oaSS6swdd9yhZs2aadeuXXriiSc0f/78MivgmZmZOnHihKTyV8czMzOVkpKikJAQ\nrVmzRlu2bNGwYcN09OhRSdL8+fN14sQJ3XPPPerdu7cr10sn840bN3arqJT3OI899pg2btyoDz/8\nUF999ZWCgoJ0++23q6ioyG2/xYsX68MPP9R7772njz/+WK+88orXGVfG0qVL9b//+7/64IMPtHLl\nSr344ouu+/7f//t/2rdvn9auXau33npL//mf/+n2sd587pT+lENy/+nHpTWUUaNG6dNPP9Xy5cu1\nZ88e/epXv9LgwYN17Ngxr59H3bp1tWbNGmVnZ5d7/1NPPeX6PEhISHCNY9u2ba59du/erUGDBmnI\nkCHas2ePli9frk8++USTJk1yO9aKFSt0ww03aNeuXXr44Yd1//33l/tNF+CXLABV4nA4rGuvvdZy\nOBzWHXfc4dXHzJ8/34qLiyuz/fnnn7duuummMtuXLFli9ejRw7Isy3r11Vetnj17WpZlWQsWLLB+\n9atfeXycJ5980urQoYPb8a+55hqruLjYta1OnTrWX/7yF6/GXcrhcFgRERFWTEyM689DDz1UZr8v\nvvjCcjgcVnp6ernH+f777yu837Isq0WLFtb06dPLbM/KyrIiIiKsd99912370KFDrfHjx5cZ7/Dh\nw715ah7HMG3aNMuyLCs/P9967bXXLIfDYS1cuLDMc/nDH/5Q7jGuvfZa689//rPbtnHjxlm33HKL\nZVmWtXLlSisoKMhyOp2u+8eOHWs5HI5yj+dwOKw333yzzPYpU6ZY11xzjZWXl1fhc/rNb35T7rl2\nqdLntG7dOrft586ds0JCQqzly5e7tmVkZFgOh8P6+OOPLcv61//9vn37XPsMGzasUv8PS5YsKfP8\nLx9T6T5btmxx7TNr1iyrUaNGlmVZ1pkzZ6yQkBDr73//u+v+t956q9zndanLP3dKecr94MGDlsPh\nsLZt2+a2vV27dtbs2bO9eLYlUlNTrQYNGlhRUVHW4MGDrTlz5lgnT54ss9/zzz9vtWjRotxj3H//\n/datt97qtu3tt9+2oqKiXLf79etnXX/99WXG+tRTT3k9VsDOQmp7Ag74g5iYGH344YcaPny43njj\nDf32t791u/+DDz7Qf/zHf+jw4cPKyspSYWFhuauHFYmMjHT9Xdr9jIiIUE5OjmufxYsXa/HixUpP\nT1d2drby8/OVmJjodpxWrVq5rejVq1dPp0+frtRYJGnGjBm68847XbdjYmIqfYyq+Pbbb5WXl6ff\n/OY3Gj16tGv7pT/mvVRKSspVP5ZlWZo5c6bmzJmj3NxcRUVFacqUKfrd737n1eOcOnVKx48f13PP\nPef2hr78/HzXG5kOHTqkBg0aqHHjxq77O3ToUOmx7ty5Uz169FBYWFilP9Zb3333nYqKitSxY0fX\ntsTERNWvX1+HDx922/fSlfb69etX2xU/2rdv7/r3jTfeqB9//FFZWVn6/vvvVVRU5HZ/ebl687lT\nkR07dkhSmTcW5ubm6rvvvvP6OEOHDlVmZqZWr16t9evX67XXXtPMmTO1du1at+dQka+//lpHjhxR\nbGysa1tRUZHy8vLkdDpdP5X45S9/6fZxv/zlL8v8/wH+igkwYMCUKVN0++23a8qUKZowYYL69eun\n6667TpK0detW3XffffrTn/6kIUOGKCYmRsuXL7/q7u3lrItVhHfffVdPPvmk5s2bp549eyoyMlL/\n9m//pk8//dRt/5CQsp/21lW8qSc+Pr5M77A2vPfee2rbtq3bttJvFi5Vr169q34Mh8Oh8ePH67HH\nHnN1gT2p6HFefvllDRw40G1b6RvMTL3Zz+FweP3/WRNvMLz8DZCVOdcqevPd5feV91wsy/LqOXr7\nueONTZs2lflmMC4urlLHiIyM1LBhwzRs2DC99NJLSkpK0ty5c7V06VKvPt7hcOjBBx/UH//4xzL3\nNWrUyOPHXc3XAcCumAADBpS+yD733HNatWqVHnjgAW3atEnBwcHauHGj2rdvr4kTJ7r2z8zMLPeF\nOSYmxmP370rWr1+voUOHuq0+f//99z5xFQVPSicKFT1nT13b66+/XuHh4UpPT9ctt9xSbWMsVb9+\n/aue8MfHx+vaa6/VkSNHNHbs2HL3ad26tX766Se3Fbrdu3dX+v+vU6dOWrp0qfLy8hQeHu5xP0+5\neqNly5YKCgrSzp07dcMNN0iSMjIydPr0adc3fp5U5vnUr19fUkmHvvSbmgsXLrjdV2r37t3q0aOH\npJI3ATZs2FBxcXFq2bKlgoODtXv3bl1//fWufS9Vmc+d0NBQFRYWltneqVMnSdLx48d18803e/0c\nryQkJEQtWrRwPe9SYWFh5Y5Dkjp37qxvvvnmiufrnj173G7v3btXt99+e9UGDNgEb4IDDAoJCdGy\nZcu0c+dO14+627Vrp3379mnVqlX67rvv9Oqrr+r9998vd7Wle/fu2rlzpz777DM5nc4yL3oVadeu\nnTZu3Kj169fr0KFDeuGFF7R58+YrrupUx6rP6dOn5XQ6XdWKU6dOyel06vz58277NWzYUC1atNAr\nr7yio0eP6tSpU2WO1aZNG3322Wc6duyYcnNzXW+yio2N1eOPP66pU6fqzTff1JEjR7RlyxY999xz\nevfdd40+HxMZTZ06VS+//LLmz5+vgwcP6p///Kf+/Oc/u94UdvPNN6tFixZ69NFHtW/fPr3zzjv6\n7//+b7dj/Pzzz643PUnS2bNn5XQ69cMPP7j2GT9+vHJycjRixAj985//1IEDB/Tqq6+WuZLine truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x455c150>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 23
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The blue prediction line is the output of $\\mathbf{Hx}$, and the dot labelled \"measurement\" is $\\mathbf{z}$. Therefore, $\\gamma = \\mathbf{z} - \\mathbf{Hx}$ is how we compute the residual, drawn in red. So $\\gamma$ is the residual.\n",
|
||||
"\n",
|
||||
"The next line is the formidable:\n",
|
||||
"\n",
|
||||
"$$\\mathbf{K}= \\mathbf{PH}^T (\\mathbf{HPH}^T + \\mathbf{R})^{-1}$$\n",
|
||||
"\n",
|
||||
"Unfortunately it is a fair amount of linear algebra to derive this. The derivation can be quite elegant, and I urge you to look it up if you have the mathematical education to follow it. But $\\mathbf{K}$ is just the *Kalman gain* - the ratio of how much measurement vs prediction we should use to create the new estimate. $\\mathbf{R}$ is the *measurement noise*, and $\\mathbf{P}$ is our *uncertainty covariance matrix*.\n",
|
||||
"\n",
|
||||
"So let's work through this expression by expression. Start with $\\mathbf{HPH}^T$. The linear equation $\\mathbf{ABA}^T$ can be thought of as changing the basis of $\\mathbf{B}$ to $\\mathbf{A}$. So $\\mathbf{HPH}^T$ is taking the covariance $\\mathbf{P}$ and putting it in measurement ($\\mathbf{H}$) space. Then, once in measurement space, we can add the measurement noise $\\mathbf{R}$ to it. Hence, the expression for the uncertainty in the measurement is:\n",
|
||||
"\n",
|
||||
"$$(\\mathbf{HPH}^T + \\mathbf{R})^{-1}$$\n",
|
||||
"\n",
|
||||
"Taking the inverse is linear algebra's way of doing $\\frac{1}{x}$. So if you accept my admittedly hand wavely explanation it can be seen to be computing:\n",
|
||||
"\n",
|
||||
"$$ \n",
|
||||
"gain_{measurement\\,space} = \\frac{uncertainty_{prediction}}{uncertainty_{measurement}}\n",
|
||||
"$$\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"In other words, the *Kalman gain* equation is doing nothing more than computing a ratio based on how much we trust the prediction vs the measurement. If we are confident in our measurements and unconfident in our predictions $\\mathbf{K}$ will favor the measurement, and vice versa. The equation is complicated because we are doing this in multiple dimensions via matrices, but the concept is simple - scale by a ratio.\n",
|
||||
"\n",
|
||||
"Without going into the derivation of $\\mathbf{K}$, I'll say that this equation is the result of finding a value of $\\mathbf{K}$ that optimizes the *mean-square estimation error*. It does this by finding the minimal values for $\\mathbf{P}$ along it's diagonal. Recall that the diagonal of $P$ is just the variance for each state variable. So, this equation for $\\mathbf{K}$ ensures that the Kalman filter output is optimal. To put this in concrete terms, for our dog tracking problem this means that the estimates for both position and velocity will be optimal - a value of $\\mathbf{K}$ that made the position extremely accurate but the velocity very inaccurate would be rejected in favor of a $\\mathbf{K}$ that made both position and velocity just somewhat accurate.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"Our next line is:\n",
|
||||
" $$\\mathbf{x}=\\mathbf{x}' +\\mathbf{K\\gamma}$$\n",
|
||||
"\n",
|
||||
"This just multiplies the residual by the Kalman gain, and adds it to the state variable. In other words, this is the computation of our new estimate.\n",
|
||||
"\n",
|
||||
"Finally, we have:\n",
|
||||
"\n",
|
||||
"$$\\mathbf{P}=(\\mathbf{I}-\\mathbf{KH})\\mathbf{P}$$\n",
|
||||
"\n",
|
||||
"$I$ is the identity matrix, and is the way we represent $1$ in multiple dimensions. $H$ is our measurement function, and is a constant. So, simplified, this is simply $P = (1-cK)P$. $K$ is our ratio of how much prediction vs measurement we use. So, if $K$ is large then $(1-cK)$ is small, and P will be made smaller than it was. If $K$ is small, then $(1-cK)$ is large, and P will be made larger than it was. So we adjust the size of our uncertainty by some factor of the *Kalman gain*. I would like to draw your attention back to the g-h filter, which included this Python code:\n",
|
||||
"\n",
|
||||
" # update filter \n",
|
||||
" w = w * (1-scale_factor) + z * scale_factor\n",
|
||||
"\n",
|
||||
"This multidimensional Kalman filter equation is partially implementing this calculation for the variance instead of the state variable.\n",
|
||||
"\n",
|
||||
"Now we have the measurement steps. The first equation is\n",
|
||||
"\n",
|
||||
"$$\\mathbf{x}' = \\mathbf{Fx} + \\mathbf{Bu}$$\n",
|
||||
"\n",
|
||||
"This is just our state transition equation which we have already discussed. $\\mathbf{Fx}$ multiplies $\\mathbf{x}$ with the state transition matrix to compute the next state. $B$ and $u$ add in the contribution of the control input $\\mathbf{u}$, if any.\n",
|
||||
"\n",
|
||||
"The final equation is:\n",
|
||||
"$$\\mathbf{P} = \\mathbf{FPF}^T + \\mathbf{Q}$$\n",
|
||||
"\n",
|
||||
"$\\mathbf{FPF}^T$ is the way we put $\\mathbf{P}$ into the process space using linear algebra so that we can add in the process noise $\\mathbf{Q}$ to it."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -1475,8 +1381,7 @@
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"prompt_number": 36
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1503,21 +1408,21 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x4551310>"
|
||||
"<matplotlib.figure.Figure at 0x44365d0>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x4337190>"
|
||||
"<matplotlib.figure.Figure at 0x4442650>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 24
|
||||
"prompt_number": 38
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1544,17 +1449,7 @@
|
||||
],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x4334810>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 25
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1621,11 +1516,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x435fc50>"
|
||||
"<matplotlib.figure.Figure at 0x45a1990>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 26
|
||||
"prompt_number": 39
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1650,17 +1545,17 @@
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x492bc50>"
|
||||
"<matplotlib.figure.Figure at 0x43e1b90>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 27
|
||||
"prompt_number": 40
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here the ellipse is slanted, signifying that $x$ and $\\dot{x}$ are correlated (and, of course, not independent - all correlated variables are dependent). You may or may not have noticed that the off diagonal elements were set to the same value, 2.4. This was not an accident. Let's look at the equation for the covariance for the case where the number of dimensions is two.\n",
|
||||
"Here the ellipse is slanted, signifying that $x$ and $\\dot{x}$ are correlated (and, of course, dependent - all correlated variables are dependent). You may or may not have noticed that the off diagonal elements were set to the same value, 2.4. This was not an accident. Let's look at the equation for the covariance for the case where the number of dimensions is two.\n",
|
||||
"\n",
|
||||
"$$\n",
|
||||
"P = \\begin{pmatrix}\n",
|
||||
@@ -1703,7 +1598,7 @@
|
||||
" cov = []\n",
|
||||
" for t in range (count):\n",
|
||||
" z = dog.sense()\n",
|
||||
" f.measure (z)\n",
|
||||
" f.update (z)\n",
|
||||
" ps.append (f.x[0,0])\n",
|
||||
" cov.append(f.P)\n",
|
||||
" zs.append(z)\n",
|
||||
@@ -1716,8 +1611,8 @@
|
||||
" plt.title(title)\n",
|
||||
"\n",
|
||||
" for i,p in enumerate(cov):\n",
|
||||
" e = stats.sigma_ellipse (p, i+1, ps[i])\n",
|
||||
" stats.plot_sigma_ellipse(e, axis_equal=False)\n",
|
||||
" e = stats.sigma_ellipse (cov=p, x=i+1, y=ps[i])\n",
|
||||
" stats.plot_sigma_ellipse(ellipse=e)\n",
|
||||
" if i == len(cov)-1:\n",
|
||||
" s = ('$\\sigma^2_{pos} = %.2f$' % p[0,0])\n",
|
||||
" plt.text (30,1,s,fontsize=18)\n",
|
||||
@@ -1739,21 +1634,21 @@
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAAroAAAF9CAYAAADr+MuIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcjXX/x/HXdfbZGYx9DEOWsS9ZGrJXSoWQJREhWiik\nqB+hcEfFLUsqFImQm5KtzU6UZSy3fZgxdmY9c7br98e5DWP2hWvm+DwfD4+Hs1zX+c57jjOf+fpc\n36+iqqqKEEIIIYQQHkan9QCEEEIIIYS4F6TQFUIIIYQQHkkKXSGEEEII4ZGk0BVCCCGEEB5JCl0h\nhBBCCOGRpNAVQgghhBAeSQpdIYQQQgjhkaTQFUKIPNDpdCl/AgMDadasGatWrdJ8LLf+bNiwQZOx\nCCFEQSCFrhBC5NFnn31GTEwMW7dupVatWnTt2pXdu3drMpaVK1cSExOT8qdVq1aajEMIIQoCKXSF\nECKPAgICCAoKokaNGnz88ce4XC62b9+uyViKFi1KUFBQyh+j0ajJOIQQoiCQQlcIIfLo1k7qdrud\nr776Cp1OR5MmTbJ1bGRkJL6+vvj5+aX7Z9u2bTkaS58+fShRogRNmjRhyZIlOf5ahBDCkyjqrU9o\nIYQQOabT6TCbzRgMBpKSkqhatSpz5syhefPm2Tre6XRy9uzZDB8vU6YMFoslW+eaPHkyrVq1wmw2\ns3r1aiZMmMD8+fPp27dvto4XQghPI4WuEELkgU6nY+rUqXTq1In9+/fTr18/JkyYwOuvv6710Bgw\nYAC7du3i4MGDWg9FCCE0Ia0LQgiRR0FBQYSGhtK5c2cmTJjAe++9x7Vr17J1bH63Ltypfv36nD59\nOtfHCyFEYWfQegBCCOFJBg0axMSJE/nss88YP358ls8vW7YsBw4cyPDxMmXK5Hoshw8fplKlSrk+\nXgghCjspdIUQIh+ZzWYGDhzIrFmzePvtt/H29s70+Xq9Pl+K0dWrVxMVFUV4eDje3t788ssvzJ8/\nn9mzZ+f53EIIUVhJ64IQQuSzoUOHEhcXx/z58+/ba1osFmbPns0jjzxC3bp1+eqrr5g3bx79+vW7\nb2MQQoiCJtOL0a5evcrjjz+O3W5HVVXGjBlDt27dWLZsGWPHjkVRFKZNm8ZTTz11P8cshBBCCCFE\nljItdB0OBzabDW9vb65evUr16tWJioqiatWq7Nq1C6vVSqtWrThx4sT9HLMQQgghhBBZyrR1wWAw\npPSX3bhxA7PZzK5duwgLC6NEiRKUL1+e8uXLs3///vsyWCGEEEIIIbIry4vR4uPjadq0KSdPnmTx\n4sXExMRQunRp5s6dS2BgIKVKleLChQvUqVPnfoxXCCGEEEKIbMnyYjRfX18OHjzIvn37GDlyJFar\nFXAvodO1a1cAFEW5t6MUQgghhBAih7K9vFi1atWoUKECFSpU4MKFCyn335rhvduqVavw9/fPn1EK\nIYQQQgiRiTZt2qS5L9NCNzo6GrPZTLFixYiJieHYsWNUrVqViIgILl++jNVq5fz589SuXTvNsf7+\n/tSvXz//Rn+frVmzho4dO2o9jAeSZK8tyV9bkr92JHttSf7aKuz579u3L937My10IyMjGThwIACq\nqjJt2jSCgoKYPHkyjzzyCACffvppPg+1YIiMjNR6CA8syV5bkr+2JH/tSPbakvy15an5Z1roNmnS\nJN2tKbt160a3bt3u2aCEEEIIIYTIK9kZLQNt27bVeggPLMleW5K/tiR/7Uj22pL8teWp+We6YURe\nbN68uVD36AohhBBCiMJh3759Ob8Y7V5QVZVLly7hdDrv90vnyM2bNwkICNB6GIWOXq8nKCgoT0vO\nbd26lfDw8HwclcgJyV9bkr92JHttSf7a8tT873uhe+nSJfz8/FJ2XCuoypQpo/UQCqXExEQuXbpE\nyZIltR6KEEIIIR5w9711ITo6WopIDyffYyGEEELcTxm1LsjFaEIIIYQQwiNJoSsKnK1bt2o9hAea\n5K8tyV87kr22JH9teWr+UugWUM2bN6d8+fIUK1YMl8ul9XCEEEIIIQodKXTzSbFixThz5ky+nW/L\nli1s3749385XmHjiVZ+FieSvLclfO5K9tiR/bXlq/lLo5oNb1/Pl93V99+g6QSGEEEKIB4IUuneY\nMWMG9evXp1y5cjRs2JAff/wx5bFt27bRtm1bQkJCaNy4ccpsa9euXalQoQIALVq0IDg4mDFjxgDu\nfaPvbD3YunUrNWvWzNbrPcg8tU+osJD8tSX5a0ey15bkry1Pzf++r6NbkBUpUoTly5cTGhrKhg0b\nePHFF2nRogVxcXH07NmTefPm0b59e06ePMnVq1cBWL58OeBuXdiyZQshISF5fr3AwMB78eUJIYQQ\nQjxQpNC9Q58+fVL+3r59ewICAjh27Bg7duygdevWPPbYYwBUrlyZypUr35PX++9//0uTJk3yfO7C\n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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x4561a50>"
|
||||
"<matplotlib.figure.Figure at 0x4453d10>"
|
||||
]
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "display_data",
|
||||
"png": "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 truncated
|
||||
"png": "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 truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x491aed0>"
|
||||
"<matplotlib.figure.Figure at 0x4ab3c10>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 28
|
||||
"prompt_number": 46
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
@@ -1799,11 +1694,11 @@
|
||||
"output_type": "display_data",
|
||||
"png": "iVBORw0KGgoAAAANSUhEUgAAA3wAAAF9CAYAAABf12quAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8FHX++PHXzJb0hEAgJEASSoBAkFBCrwIqAqJy2PXs\nIEE9LOgdeHqKeP7UU/A4xK9nBU5B6SoqSIQgIBA6SK+B0EJJ353y+2PIQoRQk+wmeT8fj3nMzNZP\n3ruEvOf9KYppmiZCCCGEEEIIISod1dsNEEIIIYQQQghRNiThE0IIIYQQQohKShI+IYQQQgghhKik\nJOETQgghhBBCiEpKEj4hhBBCCCGEqKQk4RNCCCGEEEKISkoSPiGEEEIIIYSopCThE0KIEqiq6tmq\nV69Op06dmDlzptfbUrT9+OOPxR7z8ccf07BhQwICAmjfvj0rV64sdn92djYPPfQQ1apVo1q1ajzy\nyCPk5eWV548hhBBCiHImCZ8QQlzEuHHjyMzMJC0tjRYtWjB48GB+++03r7RlxowZZGZmeraePXt6\n7luwYAGPPfYYTz/9NGvWrKFp06b07duXEydOeB7zxBNP8Msvv/Ddd9/x7bffsmDBAlJSUrzxowgh\nhBCinEjCJ4QQFxEWFkatWrVo1qwZb7/9NoZh8Ouvv3qlLeHh4dSqVcuzORwOz30TJkygT58+PPXU\nUzRt2pRJkyZRUFDAlClTAMjKyuKrr75i7NixdOrUic6dOzNmzBimTJnCqVOnvPLzCCGEEKLsScIn\nhBAXYZomAG63m48//hhVVenQocNlPXffvn0EBwcTEhJywW3p0qVX1JYHHniAmjVr0qFDB6ZOnVrs\nvlWrVtG1a1fPub+/P+3bt/dUI9PT09F1vdhjunfvjqZppKenX1E7hBBCCFFx2L3dACGE8GVDhw5l\n+PDh5Ofn06RJExYtWnTZCV+dOnVYv359ifdHR0dfdjvGjh1Lz5498fPzY/bs2TzwwAO4XC4efPBB\nAI4cOUJERASzZs3i4Ycf5qeffiIiIoIjR4547geoUaMGgwcPZv/+/aSmpha7TwghhBCVjyR8Qghx\nEa+99hq33XYb69at46GHHmLNmjXFqmQXY7PZaNCgQam048UXX/QcJyUlsX//ft555x1PwlckNDSU\n2NhYAgMDAVAU5bzXio6ORlWlg4cQQghRFUjCJ4QQF1GrVi0aNmxIw4YNOXDgAC+99BL33Xcf1atX\nv+Rz9+3bR7NmzS6YdAHMnz+fzp07X1W7WrduzZdfflmsnceOHWPIkCGsWbMGgKNHj1KvXj3P/QDH\njx9n3Lhxnvade58QQgghKh+5xCuEEJdpyJAh+Pn5eRKmSynq0rlu3boLbm3atLnqtmzevLlY9TA5\nOZnFixd7zvPz81mxYgXt2rUDoFWrVthstmKPSU1NxW6307p166tuhxBCCCF8m1T4hBDiMvn5+fH4\n448zYcIEXnjhBU+3yZKUVpfO2bNnk5GRQZcuXQgMDGT+/Pl89NFHTJw40fOYYcOGceONNzJ+/Hh6\n9+7Nm2++SWBgIPfccw9gjd276667+Nvf/kZMTAymaXqqlWFhYdfcRiGEEEL4JqnwCSHEFUhJSSE7\nO5uPPvqo3N7T39+fiRMn0rlzZ5KSkvj444/58MMPeeihhzyP6d27Nx999BHjxo2jdevW/P7773z/\n/feEh4d7HjNx4kR69OhBv3796N+/P7179+bf//53uf0cQgghhCh/ilk057gQQgghhBBCiEpFKnxC\nCCGEEEIIUUlJwieEEEIIIYQQlZQkfEIIIYQQQghRSUnCJ4QQQgghhBCVVJkty7Bo0SIMwyirlxdC\nCCGEEAIAh8NBt27dvN0MIXxSmSV8hmHIYr5eNHfuXAYMGODtZlRJEnvvkvh7l8TfeyT23iXx9670\n9HRvN0EInyVdOiupffv2ebsJVZbE3rsk/t4l8fceib13SfyFEL5KEj4hhBBCCCGEqKQk4aukevfu\n7e0mVFkSe++S+HuXxN97JPbeJfEXQvgqSfgqqSZNmni7CVWWxN67JP7eJfH3Hom9d0n8hRC+qswm\nbbmYnJwcTp06haIo3nj7KuHUqVOEhYWV+/vabDZq1apVpT/btLQ0unTp4u1mVFkSf++S+HuPxN67\nJP5CCF9V7gnf8ePHAYiOjq7SSUFZi46O9sr75uXlceTIESIjI73y/kIIIYQQQoizFNM0zbJ44YUL\nF15wWYaDBw96LRkR5UM+YyGEEEKUp/T0dHr16uXtZgjhk2QMnxBCCCGEEEJUUpLwCVHK0tLSvN2E\nKk3i710Sf++R2HuXxF8I4ask4fNhXbt2pV69etSoUQPDMLzdHCGEEEIIIUQFIwlfKapRowZ79uwp\ntddbsmQJv/76a6m9nigfMkubd0n8vUvi7z0Se++S+AshfJUkfKWkaO6b0p4Dp4zm1BFCCCGEEEJU\nAZLw/cH48eNp3bo1devWpW3btsyaNctz39KlS+nduzdxcXG0b9/eU30bPHgwsbGxAHTr1o2YmBhG\njRoFwL59+4p1yUxLSyMxMfGy3k9UTDKOw7sk/t4l8fceib13SfyFEL7KKwuv+7Jq1aoxffp0GjZs\nyI8//sif//xnunXrRnZ2Nvfccw8ffvghN9xwAzt37vSsKTh9+nTA6tK5ZMkS4uLirvn9qlevXhY/\nnhBCiErEMCA3F3JzFTIzA9i+XcXlUigsBJcLXC6lhL11XDQ8/NxlcYuOL7RXFPDzMwkIMPHzA39/\nE3//otuK7/39rWOHo/ziIYQQ4nyS8P3BAw884Dm+4YYbCAsLY+vWrSxbtozrr7+eG2+8EYBGjRrR\nqFGjMnm/bdu20aFDh2t+beEdMo7DuyT+3iXxv3wuF2RlKWRlKZw8qXqOs7MVcnL+uOE5zs09e3te\nHgQEQFCQiZ9fT/z8rATLz888b+90gtNZtLeOVRXOHTnwx1EERedFe8OAggKFwkIrqczPL74vLFTI\nz7f2BQVn2xcWZlKtmkG1aibh4eaZc/PMuUFYmEn16iZRUQbR0QYhIcWT0IpAvvtCCF/lkwlf9fHX\nXt3Keirrqp731VdfMWHCBDIyMjAMg+zsbNxuNwcPHqRevXrX3K7LfT8hhBAVh2FYyduRIwqHD6sc\nPXo2gTtxQiErSz2T2BXdplJQAOHhVgJUvbrhOQ4NNQkONqlZ06B+fZPgYAgONi+4BQWBzebtn75k\npgk5OXDypMrJk9bPf+KE4jk+dUohI8PuicuhQyoHD6ooCp7k7+zeJDraOq5fXyc01Ns/nRBCVAw+\nmfBdbbJ2rfbv389f/vIX5syZQ3JyMgANGzbENE3q1KnDunXrLvp85QKXI/38/ADQNA2n00l2dvZl\nvV8Rx5m+MLquo6oy5LIiSEtLkyu9XiTx967KFv+8PDhyROXwYSuRKzouvlc5dkwhONikVi2T2rUN\nIiJMatSwkrj4eIPq1bUziZ21hYeXfhXLF2OvKBASAiEhBpd7zdQ0ITsbDh60kr+iJHDTJhs//WQn\nI0Nl924boaEmjRrpxMcbZ/Y6jRsb1K1r4I3/Ln0x/kIIAT6a8HlLbm4uiqIQERGBpmlMnDiRU6dO\noSgKgwYN4t1332X+/Pn06dOHvXv3cvToUdq3b+95fmRkJJs3by42hi8iIoLQ0FBWr15Nx44dmTNn\nziXf71y1atUiNDSUpUuX0qNHj7IOgRBCVBkFBZCRoXq2AweK7zMyVNxuqFXLIDLSJDLSoFYta9+q\nlUZkpHnmPoOaNa0xbeLaKQqEhkJoqEHTphdeg9Yw4OBBhe3bbezYYWP7dpUff3SwfbuNEycUGjTQ\nSUjQad1ap3VrjRYtdAICyvkHEUIIHyEJ3zmaNm1KSkoKvXv3xmaz8fDDD3u6ccbExDBlyhT+8Y9/\nMGTIEGrXrs17771X7PmjR49m5MiRPP/889x9992MHj0am83Gq6++yuOPP05MTAytW7f2VAIv9n5F\nbDYbb731FkOHDiUvL49JkybRt2/f8gmIuCpyhde7JP7e5SvxN004fFhh377iCdy5yd3p0wpRUVZF\nqE4da2vZUuPmm63boqOtsWYVZSyZr8S+PKgq1K1rUreuRs+eWrH7cnJg504bGzfaSE+389VXTrZt\ns9G4sU6bNponCWzcuHQrgVUp/kKIikUxy2iht4ULF9K6devzbj948CDR0dFl8ZbCR8hnLIQoD/n5\nsHevyt69NvbsUdm9W2XvXpU9e2zs26cSHGxSr17xhK7ouG5dqyonPeWrhvx82LDBxurVdtLT7aSn\n2zh2TKVLFze9ernp1UsjNvbC1URRMaSnp9OrVy9vN0MInyQVPiFKmYzj8C6Jv3eVZvxNE44cUdiz\nx0rqziZ01nlWlkK9egaxsdYkHrGxBl27atSvrxMTYxAcXCrNqDDku1+ygABo106nXTsdKATg2DGF\nX36xs3ChgzffDKBaNZPrr7cSwM6dtSvuAirxF0L4Kkn4hBBCeFVentUFb/t2lR07bOzYUbS34XSa\nxMUZxMVZSV2nThr33GMQF6cTFWX69AyVwrdFRJgMGuRm0CA3hmFVABcudPDuu/48/LCdTp3cDB7s\n4uab3TL+TwhRoUmXTlHq5DMWQvyRYcCBA+o5yZzqmXDj+HGFuLizMy02amTQsKE1+2J4eJn8FyXE\nRZ0+DT/84OR//3Oybp2NW25xc9ddhbRrp1eYMZ1VjXTpFKJkUuETQghRatxu2LlT5fffbWzZYmPr\nViu5273bRrVq1jT6jRpZyV2fPm7i4w3q1TOkUid8SmgoDB7sYvBgFwcOKEyf7sdTTwVhGHDnnS7u\nvbeQqCi5GCGEqBgk4ROilMk4Du+S+JcPXYc9e1S2bLF5krvff7excyfUrQsJCTpNm+r07+Line truncated
|
||||
"text": [
|
||||
"<matplotlib.figure.Figure at 0x43c0650>"
|
||||
"<matplotlib.figure.Figure at 0x45089d0>"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 29
|
||||
"prompt_number": 43
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
|
||||
+7
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:241f0a3c311e0e6a1249928d59085691f69464061378e912134697ff059f8eee"
|
||||
"signature": "sha256:809258e67f36bb99b0ddfd9562b077d11998a453ceb95462f31fbf4d78be5292"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
@@ -43,6 +43,12 @@
|
||||
"\n",
|
||||
"\n",
|
||||
"Here is some text.\n",
|
||||
"\n",
|
||||
" def this_is_code():\n",
|
||||
" pass\n",
|
||||
" </code>\n",
|
||||
" \n",
|
||||
" \n",
|
||||
"*italic*\n",
|
||||
"**bold**\n",
|
||||
"\n",
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Fri Oct 18 18:02:07 2013
|
||||
|
||||
@author: rlabbe
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import scipy.linalg as linalg
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy.random as random
|
||||
|
||||
class KalmanFilter:
|
||||
|
||||
def __init__(self, dim):
|
||||
""" Create a Kalman filter of dimension 'dim'"""
|
||||
|
||||
self.x = 0 # state
|
||||
self.P = np.matrix(np.eye(dim)) # uncertainty covariance
|
||||
self.Q = np.matrix(np.eye(dim)) # process uncertainty
|
||||
self.u = np.matrix(np.zeros((dim,1))) # motion vector
|
||||
self.B = 0
|
||||
self.F = 0 # state transition matrix
|
||||
self.H = 0 # Measurement function (maps state to measurements)
|
||||
self.R = np.matrix(np.eye(1)) # state uncertainty
|
||||
self.I = np.matrix(np.eye(dim))
|
||||
|
||||
|
||||
def update(self, Z):
|
||||
"""
|
||||
Add a new measurement to the kalman filter.
|
||||
"""
|
||||
|
||||
# measurement update
|
||||
y = Z - (self.H * self.x) # error (residual) between measurement and prediction
|
||||
S = (self.H * self.P * self.H.T) + self.R # project system uncertainty into measurment space + measurement noise(R)
|
||||
|
||||
|
||||
K = self.P * self.H.T * linalg.inv(S) # map system uncertainty into kalman gain
|
||||
|
||||
self.x = self.x + (K*y) # predict new x with residual scaled by the kalman gain
|
||||
self.P = (self.I - (K*self.H))*self.P # and compute the new covariance
|
||||
|
||||
def predict(self):
|
||||
# prediction
|
||||
self.x = (self.F*self.x) + self.u
|
||||
self.P = self.F * self.P * self.F.T + self.Q
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
f = KalmanFilter (dim=2)
|
||||
|
||||
f.x = np.matrix([[2.],
|
||||
[0.]]) # initial state (location and velocity)
|
||||
|
||||
f.F = np.matrix([[1.,1.],
|
||||
[0.,1.]]) # state transition matrix
|
||||
|
||||
f.H = np.matrix([[1.,0.]]) # Measurement function
|
||||
f.P *= 1000. # covariance matrix
|
||||
f.R = 5 # state uncertainty
|
||||
f.Q *= 0.0001 # process uncertainty
|
||||
|
||||
measurements = []
|
||||
results = []
|
||||
for t in range (100):
|
||||
# create measurement = t plus white noise
|
||||
z = t + random.randn()*20
|
||||
|
||||
# perform kalman filtering
|
||||
f.measure (z)
|
||||
f.predict()
|
||||
|
||||
# save data
|
||||
results.append (f.x[0,0])
|
||||
measurements.append(z)
|
||||
|
||||
# plot data
|
||||
p1, = plt.plot(measurements,'r')
|
||||
p2, = plt.plot (results,'b')
|
||||
p3, = plt.plot ([0,100],[0,100], 'g') # perfect result
|
||||
plt.legend([p1,p2, p3], ["noisy measurement", "KF output", "ideal"], 4)
|
||||
|
||||
|
||||
plt.show()
|
||||
@@ -0,0 +1,118 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Sat May 24 19:14:06 2014
|
||||
|
||||
@author: rlabbe
|
||||
"""
|
||||
from __future__ import division, print_function
|
||||
from KalmanFilter import KalmanFilter
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy.random as random
|
||||
import math
|
||||
|
||||
|
||||
class DMESensor(object):
|
||||
def __init__(self, pos_a, pos_b, noise_factor=1.0):
|
||||
self.A = pos_a
|
||||
self.B = pos_b
|
||||
self.noise_factor = noise_factor
|
||||
|
||||
def range_of (self, pos):
|
||||
""" returns tuple containing noisy range data to A and B
|
||||
given a position 'pos'
|
||||
"""
|
||||
|
||||
ra = math.sqrt((self.A[0] - pos[0])**2 + (self.A[1] - pos[1])**2)
|
||||
rb = math.sqrt((self.B[0] - pos[0])**2 + (self.B[1] - pos[1])**2)
|
||||
|
||||
return (ra + random.randn()*self.noise_factor,
|
||||
rb + random.randn()*self.noise_factor)
|
||||
|
||||
|
||||
def dist(a,b):
|
||||
return math.sqrt ((a[0]-b[0])**2 + (a[1]-b[1])**2)
|
||||
|
||||
def H_of (pos, pos_A, pos_B):
|
||||
from math import sin, cos, atan2
|
||||
|
||||
theta_a = atan2(pos_a[1]-pos[1], pos_a[0] - pos[0])
|
||||
theta_b = atan2(pos_b[1]-pos[1], pos_b[0] - pos[0])
|
||||
|
||||
return np.mat([[-cos(theta_a), 0, -sin(theta_a), 0],
|
||||
[-cos(theta_b), 0, -sin(theta_b), 0]])
|
||||
|
||||
# equivalently we can do this...
|
||||
#dist_a = dist(pos, pos_A)
|
||||
#dist_b = dist(pos, pos_B)
|
||||
|
||||
#return np.mat([[(pos[0]-pos_A[0])/dist_a, 0, (pos[1]-pos_A[1])/dist_a,0],
|
||||
# [(pos[0]-pos_B[0])/dist_b, 0, (pos[1]-pos_B[1])/dist_b,0]])
|
||||
|
||||
|
||||
|
||||
|
||||
pos_a = (100,-20)
|
||||
pos_b = (-100, -20)
|
||||
|
||||
f1 = KalmanFilter(dim=4)
|
||||
dt = 1.0 # time step
|
||||
'''
|
||||
f1.F = np.mat ([[1, dt, 0, 0],
|
||||
[0, 1, 0, 0],
|
||||
[0, 0, 1, dt],
|
||||
[0, 0, 0, 1]])
|
||||
|
||||
'''
|
||||
f1.F = np.mat ([[0, 1, 0, 0],
|
||||
[0, 0, 0, 0],
|
||||
[0, 0, 0, 1],
|
||||
[0, 0, 0, 0]])
|
||||
|
||||
f1.B = 0.
|
||||
|
||||
f1.R = np.eye(2) * 1.
|
||||
f1.Q = np.eye(4) * .1
|
||||
|
||||
f1.x = np.mat([1,0,1,0]).T
|
||||
f1.P = np.eye(4) * 5.
|
||||
|
||||
# initialize storage and other variables for the run
|
||||
count = 30
|
||||
xs, ys = [],[]
|
||||
pxs, pys = [],[]
|
||||
|
||||
d = DMESensor (pos_a, pos_b, noise_factor=1.)
|
||||
|
||||
pos = [0,0]
|
||||
for i in range(count):
|
||||
pos = (i,i)
|
||||
ra,rb = d.range_of(pos)
|
||||
rx,ry = d.range_of((i+f1.x[0,0], i+f1.x[2,0]))
|
||||
|
||||
print ('range =', ra,rb)
|
||||
|
||||
z = np.mat([[ra-rx],[rb-ry]])
|
||||
print('z =', z)
|
||||
|
||||
f1.H = H_of (pos, pos_a, pos_b)
|
||||
print('H =', f1.H)
|
||||
|
||||
##f1.update (z)
|
||||
|
||||
print (f1.x)
|
||||
xs.append (f1.x[0,0]+i)
|
||||
ys.append (f1.x[2,0]+i)
|
||||
pxs.append (pos[0])
|
||||
pys.append(pos[1])
|
||||
f1.predict ()
|
||||
print (f1.H * f1.x)
|
||||
print (z)
|
||||
print (f1.x)
|
||||
f1.update(z)
|
||||
print(f1.x)
|
||||
|
||||
p1, = plt.plot (xs, ys, 'r--')
|
||||
p2, = plt.plot (pxs, pys)
|
||||
plt.legend([p1,p2], ['filter', 'ideal'], 2)
|
||||
plt.show()
|
||||
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Sat May 24 14:42:55 2014
|
||||
|
||||
@author: rlabbe
|
||||
"""
|
||||
|
||||
from KalmanFilter import KalmanFilter
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy.random as random
|
||||
|
||||
f = KalmanFilter (dim=4)
|
||||
|
||||
dt = 1
|
||||
f.F = np.mat ([[1, dt, 0, 0],
|
||||
[0, 1, 0, 0],
|
||||
[0, 0, 1, dt],
|
||||
[0, 0, 0, 1]])
|
||||
|
||||
f.H = np.mat ([[1, 0, 0, 0],
|
||||
[0, 0, 1, 0]])
|
||||
|
||||
|
||||
|
||||
f.Q *= 4.
|
||||
f.R = np.mat([[50,0],
|
||||
[0, 50]])
|
||||
|
||||
f.x = np.mat([0,0,0,0]).T
|
||||
f.P *= 100.
|
||||
|
||||
|
||||
xs = []
|
||||
ys = []
|
||||
count = 200
|
||||
for i in range(count):
|
||||
z = np.mat([[i+random.randn()*1],[i+random.randn()*1]])
|
||||
f.predict ()
|
||||
f.update (z)
|
||||
xs.append (f.x[0,0])
|
||||
ys.append (f.x[2,0])
|
||||
|
||||
|
||||
plt.plot (xs, ys)
|
||||
plt.show()
|
||||
|
||||
+5
-1
@@ -4,6 +4,10 @@
|
||||
margin-left: 0% !important;
|
||||
margin-right: auto;
|
||||
}
|
||||
div.text_cell code {
|
||||
background: #F6F6F9;
|
||||
color: #0000FF;
|
||||
}
|
||||
h1 {
|
||||
font-family: 'Open sans',verdana,arial,sans-serif;
|
||||
}
|
||||
@@ -97,7 +101,7 @@
|
||||
max-height: 300px;
|
||||
}
|
||||
code{
|
||||
font-size: 78%;
|
||||
font-size: 70%;
|
||||
}
|
||||
.rendered_html code{
|
||||
background-color: transparent;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "",
|
||||
"signature": "sha256:678b375145397879498e1b8402d482aab5aed416480ab2c5c20431cd539c86b9"
|
||||
"signature": "sha256:4c4932e71490dba5f12600c755687afb0d5cc008f65b6151423877e812adbbdb"
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
@@ -59,7 +59,7 @@
|
||||
"We extend the Kalman filter developed in the previous chapter to the full, generalized filter. \n",
|
||||
"\n",
|
||||
"\n",
|
||||
"[**Chapter 6: Kalman Filter Math**](not implemented)\n",
|
||||
"[**Chapter 6: Kalman Filter Math**](http://nbviewer.ipython.org/urls/raw.github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python/master/Kalman_Filter_Math.ipynb)\n",
|
||||
"\n",
|
||||
"We gotten about as far as we can without forming a strong mathematical foundation. This chapter is optional, especially the first time, but if you intend to write robust, numerically stable filters, or to read the literature, you will need to know this.\n",
|
||||
" \n",
|
||||
|
||||
Reference in new issue
Block a user