From 0c4f93d3c5bfb08d1c60a144f54cf982ad6bdf01 Mon Sep 17 00:00:00 2001 From: Roger Labbe Date: Sun, 18 May 2014 23:03:38 -0700 Subject: [PATCH] Started work on EKF. Mostly code to generate nonlinear transfer functions plots. --- Extended_Kalman_Filters.ipynb | 382 ++++++++++++++++++++++++++++++++++ Unscented_Kalman_Filter.ipynb | 28 +++ exp/nonlinear_plots.py | 104 +++++++++ nonlinear_plots.py | 103 +++++++++ 4 files changed, 617 insertions(+) create mode 100644 Extended_Kalman_Filters.ipynb create mode 100644 Unscented_Kalman_Filter.ipynb create mode 100644 exp/nonlinear_plots.py create mode 100644 nonlinear_plots.py diff --git a/Extended_Kalman_Filters.ipynb b/Extended_Kalman_Filters.ipynb new file mode 100644 index 0000000..273c14b --- /dev/null +++ b/Extended_Kalman_Filters.ipynb @@ -0,0 +1,382 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:a543c963e2375474d406b99de024c80765b4fd311e4b9ef7f8df686b92a8e0ac" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Kalman and Bayesian Filters in Python

\n", + "
Table of Contents
" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "#format the book\n", + "%matplotlib inline\n", + "import book_format\n", + "book_format.load_style()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "html": [ + "\n", + "\n" + ], + "metadata": {}, + "output_type": "pyout", + "prompt_number": 1, + "text": [ + "" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Kalman filter that we have developed to this point is extremely good, but it is also limited. Its derivation is in the linear space, and hence it only works for linear problems. Let's be a bit more rigorous here. You can, and we have in this book, apply the Kalman filter to nonlinear problems. For example, in the g-h filter chapter we explored using a g-h filter in a problem with constant acceleration. It 'worked', in that it remained numerically stable and the filtered output did track the input, but there was always a lag. It is easy to prove that there will always be a lag when $\\mathbf{\\ddot{x}}>0$. The filter no longer produces an optimal result. If we make our time step arbitrarily small we can still handle many problems, but typically we are using Kalman filters with physical sensors and solving real-time problems. Either fast enough sensors do not exist, are prohibitively expensive, or the computation time required is excessive. It is not a workable solution.\n", + "\n", + "The early adopters of Kalman filters were the radar people, and this fact was not lost on them. Radar is inherently nonlinear. Radars measure the slant range to an object, and we are typically interested in the aircraft's position over the ground. We invoke Pythagoras and get the nonlinear equation:\n", + "$$x=\\sqrt{slant^2 - altitude^2}$$\n", + "\n", + "So shortly after the Kalman filter was enthusiastically taken up by the radar industry people began working on how to extend the Kalman filter into nonlinear problems. It is still an area of ongoing research, and in the Unscented Kalman filter chapter we will implement a powerful, recent result of that research. But in this chapter we will cover the most common form, the Extended Kalman filter, or EKF. Today, most real world \"Kalman filters\" are actually EKFs. The Kalman filter in your car's and phone's GPS is an EKF, for example. \n", + "\n", + "###The Problem with Nonlinearity\n", + "\n", + "You may not realize it, but the only math you really know how to do is linear math. Equations of the form \n", + "$$ A\\mathbf{x}=\\mathbf{b}$$.\n", + "\n", + "That may strike you as hyperbole. After all, in this book we have integrated a polynomial to get distance from velocity and time:\n", + " We know how to integrate a polynomial, for example, and so we are able to find the closed form equation for distance given velocity and time:\n", + "$$\\int{(vt+v_0)}\\,dt = \\frac{a}{2}t^2+v_0t+d_0$$\n", + "\n", + "That's nonlinear. But it is also a very special form. You spent a lot of time, probably at least a year, learning how to integrate various terms, and you still can not integrate some arbitrary equation - no one can. We don't know how. If you took freshman Physics you perhaps remember homework involving sliding frictionless blocks on a plane and other toy problems. At the end of the course you were almost entirely unequipped to solve real world problems because the real world is nonlinear, and you were taught linear, closed forms of equations. It made the math tractable, but mostly useless. \n", + "\n", + "The mathematics of the Kalman filter is beautiful in part due to the Gaussian equation being so special. It is nonlinear, but when we add and multipy it using linear algebra we get another Gaussian equation as a result. That is very rare. $\\sin{x}*\\sin{y}$ does not yield a $\\sin(\\cdot)$ as an output.\n", + "\n", + "### The Effect of Nonlinear Transfer Functions on Gaussians\n", + "\n", + "Unfortunately Gaussians are not closed under an arbitrary nonlinear function. Recall the equations of the Kalman filter - at each step of its evolution we do things like pass the covariances through our process function to get the new covariance at time $k$. Our process function was always linear, so the output was always another Gaussian. Let's look at that on a graph. I will take an arbitrary Gaussian and pass it through the function $f(x) = 2x + 1$ and plot the result. We know how to do this analytically, but lets do this with sampling. I will generate 500,000 points on the Gaussian curve, pass it through the function, and then plot the results. I will do it this way because the next example will be nonlinear, and we will have no way to compute this analytically." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from numpy.random import normal\n", + "\n", + "normals = normal(loc=0.0, scale=1, size=500000)\n", + "ys = 2*normals + 1\n", + "\n", + "plt.hist(ys,1000)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is an unsuprising result. The result of passing the Gaussian through $f(x)=2x+1$ is another Gaussian centered around 1. Let's look at the input, transfer function, and output at once." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from nonlinear_plots import plot_transfer_func\n", + "\n", + "def g(x):\n", + " return 2*x+1\n", + "\n", + "plot_transfer_func (normals, g, lims=(-10,10), num_bins=100)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The plot labelled 'input' is the histogram of the original data. This is passed through the transfer function $f(x)=2x+1$ which is displayed in the chart to the upper right. The red lines shows how one value, $x=0$ is passed through the function. Each value from input is passed through in the same way to the output function on the left. The output looks like a Gaussian, and is in fact a Gaussian. We can see that it is altered -the variance in the output is larger than the variance in the input, and the mean has been shifted from 0 to 1, which is what we would expect given the transfer function $f(x)=2x+1$ The $2x$ affects the variance, and the $+1$ shifts the mean.\n", + "\n", + "Now let's look at a nonlinear function and see how it affects the probability distribution." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from nonlinear_plots import plot_transfer_func\n", + "\n", + "def g(x):\n", + " return (np.cos(4*(x/2+0.7)))*np.sin(0.3*x)-0.9*x\n", + "\n", + "plot_transfer_func (normals, g, lims=(-4,4), num_bins=300)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nZmvdGB6XmnklO+5dXU2wapzIaJLfqcd31qi9QURE1N5wA6PjKa70x+kbGactPMKDd9Y5HUnyxEgi\nxW8vhvnxmlqnoxhP7Q0iIiJf0rErET6OxAmUePm7phqn40geKfS4GEvZ/NtbnXQNxjndFSWV1lzl\nrVLRKyIixnKyf7A7OsZ/nOyifSDOt/6qgpU1Jfg/fdKayX2NpmZTrswcP34ct8vigXULWRYo4uhH\nEc6GhugdTjiea77SkmUiIiLXSNs2x65EON4e4Z6VAdYsKnM6kuS5zcurAGgLj/D7S324LYsir4uf\nqO0hI+rpFRER9fR+qncowf+c/4RCr5sfrQxQ7tPckJjplbNXuRpLsDO4xOkoRphJT6+OZhEREeA3\nF8J0R8e4d3U1NaUFTscRuaH71tZypK2Pf/7fK/xs/SLqywtxa0WRG1JPr4iIGGsu+gcPnO5m31ud\ntIVHeOib9TMqeE3uazQ1m3JlZia5Ni+v4sE76ni9rZ9fn/+E/pFxI3KZSjO9IiKSd670j3KkrZ+R\n8RSblvrZsMTvdCSRW1LvL+Sn6xbyfu8w+97qZHVtCRuWlFPv9zkdzTjq6RURkbzp6X3+T50Ue91E\nRpP8YkMdJQVupyOJzKrzV4c5+edBeofHuaO+jPWLy6dWHcll6ukVEZG8937PEEc/ilBW6GZlTQnf\nbqx0OpJI1qyqLWFVbQmj4ykufTLC/ne6KfS48LotsOGn31iI152f3a35+alFRGReyKR/MJW2icaT\nnOqMcrw9wr63OvnXo+20/jnK/etqaV6/aNYKXpP7Gk3NplyZ+bK5irxubq8r4x/+eglbv17Nj1ZW\ns7TSx0unezhwupuzoRhp2yad4QV/U8drJjTTKyIixurp6bnu72zb5kp/nBMdg3hcMJ6ySaZtVteW\nsKisgNU1tVQWe+c8l9NMzaZcmZnNXNUlEzdnfnfZgqnX9h7r4HeX+ij0uHBZsG3tQsp9bjwu64Yz\nwaaO10yo6BUREWMVFhZO2z7eHuFsKEZZoYdEKk2R181dX/EzlrTpjo0R/ErFnCzb9NlcJjE1m3Jl\nJtu5dt3VMPVzW3iE/3qvFwCPyyIST1JV5MHv81BVUkBtaQH9I+MkUmljx2smVPSKiEjW2PbE7KvH\nZWFZFuOpNMm0jcuysID2SJzeoQTjqTSpNIynbWJjSXpiCSp8Ht4erCR8KoTbmihkF5YV8OCddRR5\nP38D2orq4jn+dCK5YXmgmOWB6cfPZLtQeGSc9oFRSgrc9A8laY35GTzTQ1mBmwK3xYJiL9UlBUTH\nkrgsi7ryAgIlZq5zraJXREQAeOnMzS9bxuLJ6654MJRI4bLAAsZSE32C46k0FT4PKRt8Hhfx5MS2\nzcSXamWRh3p/IZVFPtwua+rxqkVeF163i9ifDvHzO4Kz+ClnR0dHh9MRrsvUbMqVGadzuV0WlcVe\nKou90wrinj++yt+u2kTKhsHRJKHYGB/2j1BV7MVm4klxNlBe6CGeTGMBhZ7p7RI2E4/7nvxn9rPG\nkunPvWfS5Fusz7ywagafSUuWiYgIhw8fxufTup4iMj/F43G2bNlyw79R0SsiIiIiOU9LlomIiIhI\nzlPRKyIiIiI5T0WviIiIiOQ8Fb0iIiIikvO0ZJmIiEwZHR3lkUce4e677+aee+5xOg6xWIzdu3eT\nTCYB2Lp1K5s2bXI4FfT397N3715GRkbweDw88MADrFmzxulYAOzfv59jx45RXl7Onj17nI7DiRMn\neOWVVwBobm5m/fr1DieaYNo4gbn7lanH4aSZnrdU9IqIyJRDhw7R2NiIdZ31M+dacXExTz31FIWF\nhcRiMXbt2sXGjRtxuZy9UOl2u3nooYdoaGggHA7zxBNP8PzzzzuaadLGjRsJBoM899xzTkchmUxy\n8OBBdu/eTSKR4Omnnzam6DVpnCaZul+ZehxOmul5y4y0IiLiuFAoRDQapbGxEVNWs3S73VOPPR0e\nHsbr9TqcaILf76ehYeIxroFAgGQyOTUL5rQVK1ZQWlrqdAwA2traWLx4MeXl5QQCAQKBAO3t7U7H\nAswap0mm7lemHoeQ2XlLM70iIgLAwYMH2b59O2+++abTUaaJx+M8/vjjXL16lZ07dxozuzTp3Xff\npbGxEY9HX6mfNTg4SGVlJUeOHKG0tBS/308kEnE61rxg2n5l6nGYyXnLjJEUEZE5c/jwYd54441p\nr3m9XpqamggEAo7N8n5Rrg0bNnDfffexZ88eurq6eOaZZ1izZs2cPj3uRrkikQgHDhzg0UcfnbM8\nM8llms2bNwPQ2trqcJL5wcn96np8Pp+jx+EXOXXqFIsWLZrxeUtFr4hIntmyZcvnHtf58ssvc+LE\nCU6dOkU0GsXlclFZWUkwGHQ017Xq6+uprq6mq6uL2267zfFciUSCZ599lubmZmpqauYsz81ymaSi\nooKBgYGp7cmZX7k+p/erm3HqOPwily9fprW1dcbnLRW9IiLCtm3b2LZtGwCvvvoqRUVFc1rwXk9/\nfz9er5eysjIikQihUMiIQsC2bfbt20cwGGTt2rVOxzHWsmXL6OzsJBqNkkgk6OvrY+nSpU7HMpap\n+5Wpx2Gm5y0VvSIiYqxwOMwLL7wATBQEzc3NlJWVOZwKLl26RGtrK6FQiNdffx2Axx57jIqKCoeT\nwYsvvsjbb79NNBrl4YcfpqWlxbEVEzweD/fffz9PPvkkANu3b3ckxxcxaZwmmbpfmXocZsqyTblF\nV0REREQkS8y49U5EREREJItU9IqIiIhIzlPRKyIiIiI5T0WviIiIiOQ8Fb0iIiIikvNU9IqIiIhI\nzlPRKyIiIiI5T0WviIiIiOS8/wePXRQvdhKA0AAAAABJRU5ErkJggg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This result may be somewhat suprising to you. The transfer function looks \"fairly\" linear - it is pretty close to a straight line, but the probability distribution of the output is completely different from a " + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/Unscented_Kalman_Filter.ipynb b/Unscented_Kalman_Filter.ipynb new file mode 100644 index 0000000..44fbe89 --- /dev/null +++ b/Unscented_Kalman_Filter.ipynb @@ -0,0 +1,28 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:6f62f259e5289b9332939632d63f121b9911a52f22ec7c03038d30998a233885" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With small exceptions the only mathematics that we truly know how to do is linear algebra, solving\n", + "$$ A\\mathbf{x}=\\mathbf{b}$$\n", + "\n", + "All the nonlinear forms that you have dealt with have been very special. We know how to integrate a polynomial, for example, and so we are able to find the closed form equation for distance given velocity and time:\n", + "$$\\int{(vt+v_0)}\\,dt = \\frac{a}{2}t^2+v_0t+d_0$$\n", + "\n", + "But recall when you leaned that. You learned rules for integrating sums, a different rule for integrating variables raised to a constant power, and so on. And eventually you were handed large tables of integrals. Over the centuries different mathematicians discovered how to integrate differernt equations, and our knowledge of how to integrate was slowly built up. But if I was to give you an arbitrary equation - truly arbitrary, not a polynomial " + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/exp/nonlinear_plots.py b/exp/nonlinear_plots.py new file mode 100644 index 0000000..a81b788 --- /dev/null +++ b/exp/nonlinear_plots.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun May 18 11:09:23 2014 + +@author: rlabbe +""" + +from __future__ import division +import numpy as np +import matplotlib.pyplot as plt +from numpy.random import normal + + + +def plot_transfer_func(data, f, lims,num_bins=1000): + ys = f(data) + + #plot output + plt.subplot(2,2,1) + plt.hist(ys, num_bins, orientation='horizontal',histtype='step') + plt.ylim(lims) + plt.gca().xaxis.set_ticklabels([]) + + + + # plot transfer function + plt.subplot(2,2,2) + x = np.arange(lims[0], lims[1],0.1) + y = f(x) + plt.plot (x,y) + isct = f(0) + plt.plot([0,0,lims[0]],[lims[0],isct,isct],c='r') + plt.xlim(lims) + + + # plot input + plt.subplot(2,2,4) + plt.hist(data, num_bins, histtype='step') + plt.xlim(lims) + plt.gca().yaxis.set_ticklabels([]) + + + plt.show() + + +normals = normal(loc=0.0, scale=1, size=5000000) + +#rint h(normals).sort() + + +def f(x): + return 2*x + 1 + +def g(x): + return (cos(4*(x/2+0.7)))*sin(0.3*x)-0.9*x + return (cos(4*(x/3+0.7)))*sin(0.3*x)-0.9*x + #return -x+1.2*np.sin(0.7*x)+3 + return sin(5-.2*x) + +def h(x): return cos(.4*x)*x + +plot_transfer_func (normals, g, lims=(-4,4),num_bins=500) +del(normals) + +#plt.plot(g(np.arange(-10,10,0.1))) + +''' + + +ys = f(normals) + + +r = np.linspace (min(normals), max(normals), num_bins) + +h= np.histogram(ys, num_bins,density=True) +print h +print len(h[0]), len(h[1][0:-1]) + +#plot output +plt.subplot(2,2,1) +h = np.histogram(ys, num_bins,normed=True) + +p, = plt.plot(h[0],h[1][1:]) +plt.ylim((-10,10)) +plt.xlim((max(h[0]),0)) + + +# plot transfer function +plt.subplot(2,2,2) +x = np.arange(-10,10) +y = 1.2*x + 1 +plt.plot (x,y) +plt.plot([0,0],[-10,f(0)],c='r') +plt.ylim((-10,10)) + +# plot input +plt.subplot(2,2,4) +h = np.histogram(normals, num_bins,density=True) +plt.plot(h[1][1:],h[0]) +plt.xlim((-10,10)) + + +plt.show() +''' \ No newline at end of file diff --git a/nonlinear_plots.py b/nonlinear_plots.py new file mode 100644 index 0000000..68b1f2d --- /dev/null +++ b/nonlinear_plots.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun May 18 11:09:23 2014 + +@author: rlabbe +""" + +from __future__ import division +import numpy as np +import matplotlib.pyplot as plt +from numpy.random import normal + + + +def plot_transfer_func(data, f, lims,num_bins=1000): + ys = f(data) + + #plot output + plt.subplot(2,2,1) + plt.hist(ys, num_bins, orientation='horizontal',histtype='step') + plt.ylim(lims) + plt.gca().xaxis.set_ticklabels([]) + plt.title('output') + + # plot transfer function + plt.subplot(2,2,2) + x = np.arange(lims[0], lims[1],0.1) + y = f(x) + plt.plot (x,y) + isct = f(0) + plt.plot([0,0,lims[0]],[lims[0],isct,isct],c='r') + plt.xlim(lims) + plt.ylim(lims) + + # plot input + plt.subplot(2,2,4) + plt.hist(data, num_bins, histtype='step') + plt.xlim(lims) + plt.gca().yaxis.set_ticklabels([]) + plt.title('input') + + plt.show() + +''' +normals = normal(loc=0.0, scale=1, size=5000000) + +#rint h(normals).sort() + + +def f(x): + return 2*x + 1 + +def g(x): + return (cos(4*(x/2+0.7)))*sin(0.3*x)-0.9*x + return (cos(4*(x/3+0.7)))*sin(0.3*x)-0.9*x + #return -x+1.2*np.sin(0.7*x)+3 + return sin(5-.2*x) + +def h(x): return cos(.4*x)*x + +plot_transfer_func (normals, g, lims=(-4,4),num_bins=500) +del(normals) + +#plt.plot(g(np.arange(-10,10,0.1))) + +''' + +''' +ys = f(normals) + + +r = np.linspace (min(normals), max(normals), num_bins) + +h= np.histogram(ys, num_bins,density=True) +print h +print len(h[0]), len(h[1][0:-1]) + +#plot output +plt.subplot(2,2,1) +h = np.histogram(ys, num_bins,normed=True) + +p, = plt.plot(h[0],h[1][1:]) +plt.ylim((-10,10)) +plt.xlim((max(h[0]),0)) + + +# plot transfer function +plt.subplot(2,2,2) +x = np.arange(-10,10) +y = 1.2*x + 1 +plt.plot (x,y) +plt.plot([0,0],[-10,f(0)],c='r') +plt.ylim((-10,10)) + +# plot input +plt.subplot(2,2,4) +h = np.histogram(normals, num_bins,density=True) +plt.plot(h[1][1:],h[0]) +plt.xlim((-10,10)) + + +plt.show() +'''