{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Table of Contents](http://nbviewer.ipython.org/github/rlabbe/Kalman-and-Bayesian-Filters-in-Python/blob/master/table_of_contents.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Designing Nonlinear Kalman Filters" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#format the book\n", "%matplotlib inline\n", "from __future__ import division, print_function\n", "import book_format\n", "book_format.load_style()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Author's note: I was initially planning to have a design nonlinear chapter that compares various approaches. This may or may not happen, but for now this chapter has no useful content and I suggest not reading it. **" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the Kalman filter reasonably tracks the ball. However, as already explained, this is a silly example; we can predict trajectories in a vacuum with arbitrary precision; using a Kalman filter in this example is a needless complication." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Kalman Filter with Air Drag" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I will dispense with the step 1, step 2, type approach and proceed in a more natural style that you would use in a non-toy engineering problem. We have already developed a Kalman filter that does excellently at tracking a ball in a vacuum, but that does not incorporate the effects of air drag into the model. We know that the process model is implemented with $\\textbf{F}$, so we will turn our attention to that immediately.\n", "\n", "Notionally, the computation that $\\textbf{F}$ computes is\n", "\n", "$$x' = Fx$$\n", "\n", "With no air drag, we had\n", "\n", "$$\n", "\\mathbf{F} = \\begin{bmatrix}\n", "1 & \\Delta t & 0 & 0 & 0 \\\\\n", "0 & 1 & 0 & 0 & 0 \\\\\n", "0 & 0 & 1 & \\Delta t & \\frac{1}{2}{\\Delta t}^2 \\\\\n", "0 & 0 & 0 & 1 & \\Delta t \\\\\n", "0 & 0 & 0 & 0 & 1\n", "\\end{bmatrix}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which corresponds to the equations\n", "\n", "$$ \n", "\\begin{aligned}\n", "x &= x + v_x \\Delta t \\\\\n", "v_x &= v_x \\\\\n", "\\\\\n", "y &= y + v_y \\Delta t + \\frac{a_y}{2} {\\Delta t}^2 \\\\\n", "v_y &= v_y + a_y \\Delta t \\\\\n", "a_y &= a_y\n", "\\end{aligned}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the section above we know that our new Euler equations must be\n", "\n", "$$ \n", "\\begin{aligned}\n", "x &= x + v_x \\Delta t \\\\\n", "v_x &= v_x \\\\\n", "\\\\\n", "y &= y + v_y \\Delta t + \\frac{a_y}{2} {\\Delta t}^2 \\\\\n", "v_y &= v_y + a_y \\Delta t \\\\\n", "a_y &= a_y\n", "\\end{aligned}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Realistic 2D Position Sensors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The position sensor in the last example are not very realistic. In general there is no 'raw' sensor that provides (x,y) coordinates. We have GPS, but GPS already uses a Kalman filter to create a filtered output; we should not be able to improve the signal by passing it through another Kalman filter unless we incorporate additional sensors to provide additional information. We will tackle that problem later. \n", "\n", "Consider the following set up. In an open field we put two transmitters at a known location, each transmitting a signal that we can detect. We process the signal and determine how far we are from that signal, with some noise. First, let's look at a visual depiction of that." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "circle1=plt.Circle((-4, 0), 5, color='#004080', \n", " fill=False, linewidth=20, alpha=.7)\n", "circle2=plt.Circle((4, 0), 5, color='#E24A33', \n", " fill=False, linewidth=5, alpha=.7)\n", "\n", "fig = plt.gcf()\n", "ax = fig.gca()\n", "\n", "plt.axis('equal')\n", "plt.xlim((-10, 10))\n", "plt.ylim((-10, 10))\n", "\n", "plt.plot ([-4, 0], [0, 3], c='#004080')\n", "plt.plot ([4, 0], [0, 3], c='#E24A33')\n", "plt.text(-4, -.5, \"A\", fontsize=16, horizontalalignment='center')\n", "plt.text(4, -.5, \"B\", fontsize=16, horizontalalignment='center')\n", "\n", "ax.add_artist(circle1)\n", "ax.add_artist(circle2)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here I have attempted to show transmitter A, drawn in red, at (-4,0) and a second one B, drawn in blue, at (4,0). The red and blue circles show the range from the transmitters to the robot, with the width illustrating the effect of the $1\\sigma$ angular error for each transmitter. Here I have given the blue transmitter more error than the red one. The most probable position for the robot is where the two circles intersect, which I have depicted with the red and blue lines. You will object that we have two intersections, not one, but we will see how we deal with that when we design the measurement function.\n", "\n", "This is a very common sensor set up. Aircraft still use this system to navigate, where it is called DME (Distance Measuring Equipment). Today GPS is a much more common navigation system, but I have worked on an aircraft where we integrated sensors like this into our filter along with the GPS, INS, altimeters, etc. We will tackle what is called *multi-sensor fusion* later; for now we will just address this simple configuration.\n", "\n", "The first step is to design our state variables. We will assume that the robot is traveling in a straight direction with constant velocity. This is unlikely to be true for a long period of time, but is acceptable for short periods of time. This does not differ from the previous problem - we will want to track the values for the robot's position and velocity. Hence,\n", "\n", "$$\\mathbf{x} = \n", "\\begin{bmatrix}x\\\\v_x\\\\y\\\\v_y\\end{bmatrix}$$\n", "\n", "The next step is to design the state transition function. This also will be the same as the previous problem, so without further ado,\n", "\n", "$$\n", "\\mathbf{x}' = \\begin{bmatrix}1& \\Delta t& 0& 0\\\\0& 1& 0& 0\\\\0& 0& 1& \\Delta t\\\\ 0& 0& 0& 1\\end{bmatrix}\\mathbf{x}$$\n", "\n", "The next step is to design the control inputs. We have none, so we set ${\\mathbf{B}}=0$.\n", "\n", "The next step is to design the measurement function $\\mathbf{z} = \\mathbf{Hx}$. We can model the measurement using the Pythagorean theorem.\n", "\n", "$$\n", "z_a = \\sqrt{(x-x_A)^2 + (y-y_A)^2} + v_a\\\\[1em]\n", "z_b = \\sqrt{(x-x_B])^2 + (y-y_B)^2} + v_b\n", "$$\n", "\n", "where $v_a$ and $v_b$ are white noise.\n", "\n", "We see an immediate problem. The Kalman filter is designed for linear equations, and this is obviously nonlinear. In the next chapters we will look at several ways to handle nonlinear problems in a robust way, but for now we will do something simpler. If we know the approximate position of the robot than we can linearize these equations around that point. I could develop the generalized mathematics for this technique now, but instead let me just present the worked example to give context to that development." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of computing $\\mathbf{H}$ we will compute the partial derivative of $\\mathbf{H}$ with respect to the robot's position $\\mathbf{x}$. You are probably familiar with the concept of partial derivative, but if not, it just means how $\\mathbf{H}$ changes with respect to the robot's position. It is computed as the partial derivative of $\\mathbf{H}$ as follows:\n", "\n", "$$\\frac{\\partial \\mathbf{h}}{\\partial \\mathbf{x}} = \n", "\\begin{bmatrix}\n", "\\frac{\\partial h_1}{\\partial x_1} & \\frac{\\partial h_1}{\\partial x_2} &\\dots \\\\\n", "\\frac{\\partial h_2}{\\partial x_1} & \\frac{\\partial h_2}{\\partial x_2} &\\dots \\\\\n", "\\vdots & \\vdots\n", "\\end{bmatrix}\n", "$$\n", "\n", "Let's work the first partial derivative. We want to find\n", "\n", "$$\\frac{\\partial }{\\partial x} \\sqrt{(x-x_A)^2 + (y-y_A)^2}\n", "$$\n", "\n", "Which we compute as\n", "\n", "$$\n", "\\begin{aligned}\n", "\\frac{\\partial h_1}{\\partial x} &= ((x-x_A)^2 + (y-y_A)^2))^\\frac{1}{2} \\\\\n", "&= \\frac{1}{2}\\times 2(x-x_a)\\times ((x-x_A)^2 + (y-y_A)^2))^{-\\frac{1}{2}} \\\\\n", "&= \\frac{x_r - x_A}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} \n", "\\end{aligned}\n", "$$\n", "\n", "We continue this computation for the partial derivatives of the two distance equations with respect to $x$, $y$, $dx$ and $dy$, yielding\n", "\n", "$$\\frac{\\partial\\mathbf{h}}{\\partial\\mathbf{x}}=\n", "\\begin{bmatrix}\n", "\\frac{x_r - x_A}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 & \n", "\\frac{y_r - y_A}{\\sqrt{(x_r-x_A)^2 + (y_r-y_A)^2}} & 0 \\\\\n", "\\frac{x_r - x_B}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 &\n", "\\frac{y_r - y_B}{\\sqrt{(x_r-x_B)^2 + (y_r-y_B)^2}} & 0 \\\\\n", "\\end{bmatrix}\n", "$$\n", "\n", "That is pretty painful, and these are very simple equations. Computing the Jacobian can be extremely difficult or even impossible for more complicated systems. However, there is an easy way to get Python to do the work for you by using the SymPy module [1]. SymPy is a Python library for symbolic mathematics. The full scope of its abilities are beyond this book, but it can perform algebra, integrate and differentiate equations, find solutions to differential equations, and much more. We will use it to compute our Jacobian!\n", "\n", "First, a simple example. We will import SymPy, initialize its pretty print functionality (which will print equations using LaTeX). We will then declare a symbol for NumPy to use." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAATBAMAAAC0B+rjAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAIokQdkQymVRmzbur3ZYT\n5QUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABhSURBVAgdY2BgYGAEYiBgQqFMILwwCKUAotgSChuB\nVAXjBC4BBu4JnAJMBxh8gdrYLzBcB1JcGxheMkgyyDUwLGGYyLCdgSGWQYG7AKitcqcaSDvjBBDJ\nwCkApqC2sYA4ADr+DeweQRu1AAAAAElFTkSuQmCC\n", "text/plain": [ "\\phi" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import sympy\n", "from sympy import init_printing\n", "init_printing(use_latex='png')\n", "\n", "phi, x = sympy.symbols('\\phi, x')\n", "phi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice how we use a latex expression for the symbol `phi`. This is not necessary, but if you do it will render as LaTeX when output. Now let's do some math. What is the derivative of $\\sqrt{\\phi}$?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAACkAAAAwBAMAAAB+l06WAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzRAiu5mrdu/dZjKJ\nRFRer8KoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABOklEQVQ4EWNggAMhOAuJYfIJiQNjqoRhE2Vg\nH76irBk/s2C+H3r0fyzgA328YQ+xGs2yXCCfGSxmGuINk2MWALJ4QDymBIbzF6DCrA+ADLAomwID\nRwNUVBNEq4MIjgkMbL9BDCCIAxG3QQTjJ7go0wSQwAEQAQSc0DTKs4CBgXtD8GOwIMP9AxAaZGwc\n8wJGAzB3CkSQoYqBgWUBlwFPAojP6sDAwAtyHNDYSqDDWMHGlwEFKgQYGNgLGBimAkUZgaoY+AIY\njJnV/wItBXJ+MVgx2D8AMrYyMBQzMH1hYFgD5IgzLGZwBdLMc86EAQ2KN2CYBOTdZDjAEgCkGYGB\nBxS1D+A6AORxR3mdBlIwwPaJUwHEZl4AImGA+89TMJPLACYCpiWEwBQ4HBES70GWAB2NEAGxoL6H\nCAIAAx9b8PUdS4gAAAAASUVORK5CYII=\n", "text/plain": [ " 1 \n", "───────\n", " ___\n", "2⋅╲╱ φ " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.diff('sqrt(phi)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can factor equations." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIsAAAAcBAMAAACjVFE3AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMmYiu80QdonvRN2Z\nVKvu110NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACmUlEQVQ4EZVUO4gTURS9k8lnkszqWNiIkJG1\nWMEihG0sZEO0XDCicRuRAV3ELqVi4bgiNiLW22y0tTBoIeIqg65aiEtAwWoxiBYW4mJhI7Kee+fz\n3mSywb0w95537sl5n3kToh2EtfZmB+ptpTfo27a9/2jsizSPqVbPyktZaixjNCN6meZ6WUVlmOXG\nMQUvYT8rmHC0xNBwkWjMYukANxBvJZucnwgcSVUPxKyQvmQtnSHa5cjY/C3FQrYCgVrilZaYhR7h\nS1Zpln/blnH0W7Y5rAQhMk94ROYmrHwmil3OKi6ss81lIcoDKReJKn7FCTXnw1Kc/+kBPSIq15mJ\n24wlSmxzSWDNk3KPaO/GxxDTJ6GQrjGxRvRACF5xKsSmIOs4FDZ8opWtrUiUtrlCdJsbe+yjsqhI\nhCI24am8ZtZwXn1Q3ZHVPPSohaY9aNApTQQoNrk2k8c5vTfdgjZTejU1h55D06JpusNiFWIz1Wfi\nHJ68m6tbQx6FkbbB3V7GzH2873foLz7jOMlKsTE2Ga7iuUoW2WLKDI1sam7ANtUANqfDfpw1G17N\nKmwKzah5s9N52umclZG8KawGm9rtmq75N9JERWwqyaZ+UYMwZxLpTeG7xxEXurl6PkgkAsQmPOKv\nIBZwevOaIm2DN4WjrfStlIblYmMHDHErcLv81ERpG9wsvn77D844/AMV9vc/X7DMHjOYi4yXreuM\n44ht1ldeuHKLq3W0GnE7XY/IsNxDMV3BcYptwvECUS4AnI7b6XpLhraPkuPZVNxXEN81f3/H8Pg6\nm+BiW6BxFyXz0SUqTDHEgP+2uhqpYD5awQ9QJUVnUNUBNbJrTRRvdVHjxsGZcWSWmwqynMaYTW0w\nCW5MapLtTWzvpPkP4lmKXRXJfWcAAAAASUVORK5CYII=\n", "text/plain": [ " ⎛ 2 ⎞\n", "(φ - 1)⋅⎝φ + 1⎠" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sympy.factor('phi**3 -phi**2 + phi - 1')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SymPy has a remarkable list of features, and as much as I enjoy exercising its features we cannot cover them all here. Instead, let's compute our Jacobian." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "⎡ x - xₐ y - yₐ ⎤\n", "⎢ ────────────────────────── 0 ────────────────────────── 0⎥\n", "⎢ _______________________ _______________________ ⎥\n", "⎢ ╱ 2 2 ╱ 2 2 ⎥\n", "⎢ ╲╱ (x - xₐ) + (y - yₐ) ╲╱ (x - xₐ) + (y - yₐ) ⎥\n", "⎢ ⎥\n", "⎢ x - x_b y - y_b ⎥\n", "⎢──────────────────────────── 0 ──────────────────────────── 0⎥\n", "⎢ _________________________ _________________________ ⎥\n", "⎢ ╱ 2 2 ╱ 2 2 ⎥\n", "⎣╲╱ (x - x_b) + (y - y_b) ╲╱ (x - x_b) + (y - y_b) ⎦" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sympy import symbols, Matrix\n", "phi = symbols('\\phi')\n", "phi\n", "\n", "x, y, xa, xb, ya, yb, dx, dy = symbols('x y x_a x_b y_a y_b dx dy')\n", "\n", "H = Matrix([[sympy.sqrt((x-xa)**2 + (y-ya)**2)], \n", " [sympy.sqrt((x-xb)**2 + (y-yb)**2)]])\n", "\n", "state = Matrix([x, dx, y, dy])\n", "H.jacobian(state)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a nutshell, the entry (0,0) contains the difference between the x coordinate of the robot and transmitter A's x coordinate divided by the distance between the robot and A. (2,0) contains the same, except for the y coordinates of the robot and transmitters. The bottom row contains the same computations, except for transmitter B. The 0 entries account for the velocity components of the state variables; naturally the range does not provide us with velocity.\n", "\n", "The values in this matrix change as the robot's position changes, so this is no longer a constant; we will have to recompute it for every time step of the filter.\n", "\n", "If you look at this you may realize that this is just a computation of x/dist and y/dist, so we can switch this to a trigonometic form with no loss of generality:\n", "\n", "$$\\frac{\\partial\\mathbf{h}}{\\partial\\mathbf{x}}=\n", "\\begin{bmatrix}\n", "-\\cos{\\theta_A} & 0 & -\\sin{\\theta_A} & 0 \\\\\n", "-\\cos{\\theta_B} & 0 & -\\sin{\\theta_B} & 0\n", "\\end{bmatrix}\n", "$$\n", "\n", "However, this raises a huge problem. We are no longer computing $\\mathbf{H}$, but $\\Delta\\mathbf{H}$, the change of $\\mathbf{H}$. If we passed this into our Kalman filter without altering the rest of the design the output would be nonsense. Recall, for example, that we multiply $\\mathbf{Hx}$ to generate the measurements that would result from the given estimate of $\\mathbf{x}$ But now that $\\mathbf{H}$ is linearized around our position it contains the *change* in the measurement function. \n", "\n", "We are forced, therefore, to use the *change* in $\\mathbf{x}$ for our state variables. So we have to go back and redesign our state variables. \n", "\n", ">Please note this is a completely normal occurrence in designing Kalman filters. The textbooks present examples like this as *fait accompli*, as if it is trivially obvious that the state variables needed to be velocities, not positions. Perhaps once you do enough of these problems it would be trivially obvious, but at that point why are you reading a textbook? I find myself reading through a presentation multiple times, trying to figure out why they made a choice, finally to realize that it is because of the consequences of something on the next page. My presentation is longer, but it reflects what actually happens when you design a filter. You make what seem reasonable design choices, and as you move forward you discover properties that require you to recast your earlier steps. As a result, I am going to somewhat abandon my **step 1**, **step 2**, etc., approach, since so many real problems are not quite that straightforward." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If our state variables contain the velocities of the robot and not the position then how do we track where the robot is? We can't. Kalman filters that are linearized in this fashion use what is called a *nominal trajectory* - i.e. you assume a position and track direction, and then apply the changes in velocity and acceleration to compute the changes in that trajectory. How could it be otherwise? Recall the graphic showing the intersection of the two range circles - there are two areas of intersection. Think of what this would look like if the two transmitters were very close to each other - the intersections would be two very long crescent shapes. This Kalman filter, as designed, has no way of knowing your true position from only distance measurements to the transmitters. Perhaps your mind is already leaping to ways of working around this problem. If so, stay engaged, as later sections and chapters will provide you with these techniques. Presenting the full solution all at once leads to more confusion than insight, in my opinion. \n", "\n", "So let's redesign our *state transition function*. We are assuming constant velocity and no acceleration, giving state equations of\n", "$$\n", "\\dot{x}' = \\dot{x} \\\\\n", "\\ddot{x}' = 0 \\\\\n", "\\dot{y}' = \\dot{y} \\\\\n", "\\dot{y}' = 0$$\n", "\n", "This gives us the the *state transition function* of\n", "\n", "$$\n", "\\mathbf{F} = \\begin{bmatrix}0 &1 & 0& 0\\\\0& 0& 0& 0\\\\0& 0& 0& 1\\\\ 0& 0& 0& 0\\end{bmatrix}$$\n", "\n", "A final complication comes from the measurements that we pass in. $\\mathbf{Hx}$ is now computing the *change* in the measurement from our nominal position, so the measurement that we pass in needs to be not the range to A and B, but the *change* in range from our measured range to our nominal position. \n", "\n", "There is a lot here to take in, so let's work through the code bit by bit. First we will define a function to compute $\\frac{\\partial\\mathbf{h}}{\\partial\\mathbf{x}}$ for each time step." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from math import sin, cos, atan2\n", "\n", "def H_of(pos, pos_A, pos_B):\n", " \"\"\" Given the position of our object at 'pos' in 2D, and two \n", " transmitters A and B at positions 'pos_A' and 'pos_B', return \n", " the partial derivative of H\n", " \"\"\"\n", "\n", " theta_a = atan2(pos_a[1] - pos[1], pos_a[0] - pos[0])\n", " theta_b = atan2(pos_b[1] - pos[1], pos_b[0] - pos[0])\n", "\n", " return np.array([[0, -cos(theta_a), 0, -sin(theta_a)],\n", " [0, -cos(theta_b), 0, -sin(theta_b)]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we need to create our simulated sensor. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from numpy.random import randn\n", "\n", "class DMESensor(object):\n", " def __init__(self, pos_a, pos_b, noise_factor=1.0):\n", " self.A = pos_a\n", " self.B = pos_b\n", " self.noise_factor = noise_factor\n", " \n", " def range_of(self, pos):\n", " \"\"\" returns tuple containing noisy range data to A and B\n", " given a position 'pos'\n", " \"\"\"\n", " \n", " ra = math.sqrt((self.A[0] - pos[0])**2 + (self.A[1] - pos[1])**2)\n", " rb = math.sqrt((self.B[0] - pos[0])**2 + (self.B[1] - pos[1])**2)\n", " \n", " return (ra + randn()*self.noise_factor, \n", " rb + randn()*self.noise_factor)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we are ready for the Kalman filter code. I will position the transmitters at x=-100 and 100, both with y=-20. This gives me enough space to get good triangulation from both as the robot moves. I will start the robot at (0,0) and move by (1,1) each time step. \n", "\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\ndqdOnVi3bp19u3fv3kRFRWGaJl/+alK9B0ydfT5ouzjDiAdh69dwb3MDw9CwEclNPdtFiNVqpW3b\ntjRp0oQ33ngDZ2fb7Vm8eDFxcXH06dOH0NBQdu/ezQcffMCaNWvYsmULHh4egK0nvEWLFmzdupWH\nHnqIhg0bcvz4cX799Vf27NlDaGjoRZ+ZkZFBly5d+P3331mwYAHNmjUr1O8sIiJSmPbv38+GDRu4\n9957Ads47JEjRzJgwAAA+vbtaw/MmVkmO/bDpj3w0fcQsyn3tdo0sg0ZqVZeAVsur1iHbcMwuHBN\nnvzeLmxZWVncfffdvPHGG7n2Dxw4kCeffDLXvo4dO9KsWTPmzp3LAw88AMDrr7/Opk2b+Pbbb+nc\nubO97fPPP3/Jz0tLS+Oee+5h/fr1LFq0iEaNGuXzNxIREXG8+Ph4wsPDAVvH1KBBg+jYsSMWi4Xo\n6Gg+++wzjpww2bQbNu6GzXtMNu2B7fsgK/vi64WVgbeHQOeWqCdbrqhYh+2S6LHHHrto37mea4CU\nlBQyMjKoUqUKpUqVYv369fawPXv2bGrXrp0raF/O6dOnufPOO9m5cyfLli2jbt26+fclREREiojE\nxERq1apFfHw8Pj4+VKpcg849HueT71PZecibzbud2LSnFkdPXflazk4wrDu82AdN5SdXrViH7X/3\nQuf3dmGzWCyXXKHz1KlTDB8+nNmzZ3PqVO6/DS6caH3Pnj1XPb/5k08+yZkzZ1i/fj116tS5rrpF\nRESKkg4dOjB58mQ8fCuyaY8fleveS9dhWzicEcmO/ZCdMxxWXd21KoRAvcpQtzL0bKMhI3LtinXY\nLmnOTTP0b926dWPlypU8/fTT1K9f376KY/fu3XNNz3gtv8q69957+eabbxg/fjwzZsy45OeKiIgU\nBzNnzcXqGkGGy81s3A1/HShLvfazSAsYfrbFF7A972t4eUCdirZQXbeyLWDXrgh+3grXcn0UtouQ\nS/Wsnzp1iiVLljBmzBhefPFF+/709HROnjyZq22lSpXYvHnzVX1Whw4duOuuu+jVqxdeXl58+umn\n11e8iIhIATNNk0PH4M+NyazZfJz4pAg27Ybtf2zHmr4Io9J7tnbuY8DTi8vF5Iqh50N13Uq2YB0R\nChaLgrXkP4VtB7lUL/Sl9jk5OQEXLzD09ttvXxTOu3TpwpgxY5g9ezZdunS5Yg3du3cnNTWVAQMG\n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\nV1/xxBNPOLEyuZmZM2eyc+dOsrKy7qjn1JeN183mUn3pOiIjI/npp58oLi5m/fr1jBkzhszMzFue\ncyc96dAr21rK3b01bdqUrl27cvToUWeXInUUEBAAcMMerflOXFdgYCAhISHq0UYqKSmJdevWkZGR\nQYcOHez71Zeu52ZzeSPqy8bL09OTsLAwevXqxfz584mLi2PZsmX2zFrXnnRo2NZS7u6tvLyc3Nxc\n/eHkwjp27EhAQECtHi0vLycrK0s96gaKiorIz89XjzZCM2bMsIezzp071/pOfelabjWXN6K+dB1V\nVVXYbLZ696RHcnJysgPrpEWLFsydO5egoCB8fHyYN28eWVlZrFq1Sku4u5hZs2bh7e2NzWbjyJEj\nTJ8+nePHj5Oamqq5bMRKS0s5dOgQBQUFfPjhh0RFReHn58elS5fw8/OjqqqKt99+m4iICKqqqpg5\ncyaFhYWkpaVhtVqdXb78wa3mskmTJsyZM4cWLVpw+fJlcnJymDx5MjabjaVLl2ouG5EXXniBjz76\niPXr1xMSEkJJSQklJSUYhoHVasUwDPWli7jdXJaWlqovXcSrr75qzzgnTpzgvffe4+OPP2bhwoWE\nh4fXrycd+cqUGsuXLzc7dOhgenl5mTExMeZ33313N36tNLAxY8aYQUFBptVqNYODg82RI0eaubm5\nzi5LbiMzM9M0DMM0DMO0WCz2nydOnGg/Jjk52QwMDDS9vb3N/v37mwcPHnRixXIzt5rLsrIy87HH\nHjP9/f1Nq9VqhoaGmhMnTjRPnjzp7LLlGtfOX83nzTffrHWc+rLxu91cqi9dx4QJE8zQ0FDTy8vL\n9Pf3NwcNGmRu3bq11jF17Ukt1y4iIiIi4iB3Zbl2EREREZF7kcK2iIiIiIiDKGyLiIiIiDiIwraI\niIiIiIMobIuIiIiIOIjCtoiIiIiIgyhsi4iIiIg4iMK2iIiIiIiDKGyLiIiIiDjI/wMAJ5nIfRa/\nVgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import math\n", "from filterpy.kalman import KalmanFilter\n", "import numpy as np\n", "import book_plots as bp\n", "\n", "pos_a = (100, -20)\n", "pos_b = (-100, -20)\n", "\n", "f1 = KalmanFilter(dim_x=4, dim_z=2)\n", "\n", "f1.F = np.array ([[0, 1, 0, 0],\n", " [0, 0, 0, 0],\n", " [0, 0, 0, 1],\n", " [0, 0, 0, 0]], dtype=float)\n", "\n", "f1.R *= 1.\n", "f1.Q *= .1\n", "\n", "f1.x = np.array([[1, 0, 1, 0]], dtype=float).T\n", "f1.P = np.eye(4) * 5.\n", "\n", "# initialize storage and other variables for the run\n", "count = 30\n", "xs, ys = [], []\n", "pxs, pys = [], []\n", "\n", "# create the simulated sensor\n", "d = DMESensor(pos_a, pos_b, noise_factor=3.)\n", "\n", "# pos will contain our nominal position since the filter does not\n", "# maintain position.\n", "pos = [0, 0]\n", "\n", "for i in range(count):\n", " # move (1,1) each step, so just use i\n", " pos = [i, i]\n", " \n", " # compute the difference in range between the nominal track\n", " # and measured ranges\n", " ra,rb = d.range_of(pos)\n", " rx,ry = d.range_of((pos[0] + f1.x[0, 0], pos[1] + f1.x[2, 0]))\n", " z = np.array([[ra - rx], [rb - ry]])\n", "\n", " # compute linearized H for this time step\n", " f1.H = H_of (pos, pos_a, pos_b)\n", "\n", " # store stuff so we can plot it later\n", " xs.append(f1.x[0, 0]+i)\n", " ys.append(f1.x[2, 0]+i)\n", " pxs.append(pos[0])\n", " pys.append(pos[1])\n", " \n", " # perform the Kalman filter steps\n", " f1.predict()\n", " f1.update(z)\n", "\n", "bp.plot_filter(xs, ys)\n", "bp.plot_track(pxs, pys)\n", "plt.legend(loc=2)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linearizing the Kalman Filter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have seen an example of linearizing the Kalman filter we are in a position to better understand the math. \n", "\n", "We start by assuming some function $\\mathbf f$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example: A falling Ball" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**author's note: ignore this section for now. **\n", "\n", "In the **Designing Kalman Filters** chapter I first considered tracking a ball in a vacuum, and then in the atmosphere. The Kalman filter performed very well for vacuum, but diverged from the ball's path in the atmosphere. Let us look at the output; to avoid littering this chapter with code from that chapter I have placed it all in the file `ekf_internal.py'." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import ekf_internal\n", "ekf_internal.plot_ball()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can artificially force the Kalman filter to track the ball by making $Q$ large. That would cause the filter to mistrust its prediction, and scale the kalman gain $K$ to strongly favor the measurments. However, this is not a valid approach. If the Kalman filter is correctly predicting the process we should not 'lie' to the filter by telling it there are process errors that do not exist. We may get away with that for some problems, in some conditions, but in general the Kalman filter's performance will be substandard.\n", "\n", "Recall from the **Designing Kalman Filters** chapter that the acceleration is\n", "\n", "$$a_x = (0.0039 + \\frac{0.0058}{1+\\exp{[(v-35)/5]}})*v*v_x \\\\\n", "a_y = (0.0039 + \\frac{0.0058}{1+\\exp{[(v-35)/5]}})*v*v_y- g\n", "$$\n", "\n", "These equations will be *very* unpleasant to work with while we develop this subject, so for now I will retreat to a simpler one dimensional problem using this simplified equation for acceleration that does not take the nonlinearity of the drag coefficient into account:\n", "\n", "\n", "$$\\begin{aligned}\n", "\\ddot{y} &= \\frac{0.0034ge^{-y/20000}\\dot{y}^2}{2\\beta} - g \\\\\n", "\\ddot{x} &= \\frac{0.0034ge^{-x/20000}\\dot{x}^2}{2\\beta}\n", "\\end{aligned}$$\n", "\n", "Here $\\beta$ is the ballistic coefficient, where a high number indicates a low drag." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is still nonlinear, so we need to linearize this equation at the current state point. If our state is position and velocity, we need an equation for some arbitrarily small change in $\\mathbf{x}$, like so:\n", "\n", "$$ \\begin{bmatrix}\\Delta \\dot{x} \\\\ \\Delta \\ddot{x} \\\\ \\Delta \\dot{y} \\\\ \\Delta \\ddot{y}\\end{bmatrix} = \n", "\\large\\begin{bmatrix}\n", "\\frac{\\partial \\dot{x}}{\\partial x} & \n", "\\frac{\\partial \\dot{x}}{\\partial \\dot{x}} & \n", "\\frac{\\partial \\dot{x}}{\\partial y} & \n", "\\frac{\\partial \\dot{x}}{\\partial \\dot{y}} \\\\ \n", "\\frac{\\partial \\ddot{x}}{\\partial x} & \n", "\\frac{\\partial \\ddot{x}}{\\partial \\dot{x}}& \n", "\\frac{\\partial \\ddot{x}}{\\partial y}& \n", "\\frac{\\partial \\dot{x}}{\\partial \\dot{y}}\\\\\n", "\\frac{\\partial \\dot{y}}{\\partial x} & \n", "\\frac{\\partial \\dot{y}}{\\partial \\dot{x}} & \n", "\\frac{\\partial \\dot{y}}{\\partial y} & \n", "\\frac{\\partial \\dot{y}}{\\partial \\dot{y}} \\\\ \n", "\\frac{\\partial \\ddot{y}}{\\partial x} & \n", "\\frac{\\partial \\ddot{y}}{\\partial \\dot{x}}& \n", "\\frac{\\partial \\ddot{y}}{\\partial y}& \n", "\\frac{\\partial \\dot{y}}{\\partial \\dot{y}}\n", "\\end{bmatrix}\\normalsize\n", "\\begin{bmatrix}\\Delta x \\\\ \\Delta \\dot{x} \\\\ \\Delta \\dot{y} \\\\ \\Delta \\ddot{y}\\end{bmatrix}$$\n", "\n", "The equations do not contain both an x and a y, so any partial derivative with both in it must be equal to zero. We also know that $\\large\\frac{\\partial \\dot{x}}{\\partial x}\\normalsize = 0$ and that $\\large\\frac{\\partial \\dot{x}}{\\partial \\dot{x}}\\normalsize = 1$, so our matrix ends up being\n", "\n", "$$\\mathbf{F} = \\begin{bmatrix}0&1&0&0 \\\\\n", "\\frac{0.0034e^{-x/22000}\\dot{x}^2g}{44000\\beta}&0&0&0\n", "\\end{bmatrix}$$\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\\begin{aligned}\\ddot{x} &= -\\frac{1}{2}C_d\\rho A \\dot{x}\\\\\n", "\\ddot{y} &= -\\frac{1}{2}C_d\\rho A \\dot{y}-g\\end{aligned}$$" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sympy.abc import *\n", "from sympy import *\n", "\n", "init_printing(pretty_print=True, use_latex='mathjax')\n", "\n", "x1 = (0.0034*g*exp(-x/22000)*((x)**2))/(2*b) - g\n", "\n", "x2 = (a*g*exp(-x/c)*(Derivative(x)**2))/(2*b) - g\n", "\n", "#pprint(x1)\n", "#pprint(Derivative(x)*Derivative(x,n=2))\n", "#pprint(diff(x2, x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** orphan text\n", "This approach has many issues. First, of course, is the fact that the linearization does not produce an exact answer. More importantly, we are not linearizing the actual path, but our filter's estimation of the path. We linearize the estimation because it is statistically likely to be correct; but of course it is not required to be. So if the filter's output is bad that will cause us to linearize an incorrect estimate, which will almost certainly lead to an even worse estimate. In these cases the filter will quickly diverge. This is where the 'black art' of Kalman filter comes in. We are trying to linearize an estimate, and there is no guarantee that the filter will be stable. A vast amount of the literature on Kalman filters is devoted to this problem. Another issue is that we need to linearize the system using analytic methods. It may be difficult or impossible to find an analytic solution to some problems. In other cases we may be able to find the linearization, but the computation is very expensive. **\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[1] http://sympy.org\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }