{
 "metadata": {
  "name": "",
  "signature": "sha256:33a7a44dc4488b0b4ba93e74480b2d2d6f2db305a040407e469194f4c08082cf"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "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": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Designing Nonlinear Kalman Filters"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#format the book\n",
      "%matplotlib inline\n",
      "from __future__ import division, print_function\n",
      "import matplotlib.pyplot as plt\n",
      "import sys\n",
      "sys.path.insert(0, '../code') # allow us to format the book\n",
      "import book_format\n",
      "book_format.load_style()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<style>\n",
        "@import url('http://fonts.googleapis.com/css?family=Source+Code+Pro');\n",
        "@import url('http://fonts.googleapis.com/css?family=Vollkorn');\n",
        "@import url('http://fonts.googleapis.com/css?family=Arimo');\n",
        "\n",
        "    div.cell{\n",
        "        width: 850px;\n",
        "        margin-left: 0% !important;\n",
        "        margin-right: auto;\n",
        "    }\n",
        "    div.text_cell code {\n",
        "        background: transparent;\n",
        "        color: #000000;\n",
        "        font-weight: 600;\n",
        "        font-size: 11pt;\n",
        "        font-style: bold;\n",
        "        font-family:  'Source Code Pro', Consolas, monocco, monospace;\n",
        "   }\n",
        "    h1 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "\t}\n",
        "\t\n",
        "    div.input_area {\n",
        "        background: #F6F6F9;\n",
        "        border: 1px solid #586e75;\n",
        "    }\n",
        "\n",
        "    .text_cell_render h1 {\n",
        "        font-weight: 200;\n",
        "        font-size: 30pt;\n",
        "        line-height: 100%;\n",
        "        color:#c76c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 1em;\n",
        "        display: block;\n",
        "        white-space: wrap;\n",
        "    } \n",
        "    h2 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h2 {\n",
        "        font-weight: 200;\n",
        "        font-size: 20pt;\n",
        "        font-style: italic;\n",
        "        line-height: 100%;\n",
        "        color:#c76c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 1.5em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    } \n",
        "    h3 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h3 {\n",
        "        font-weight: 300;\n",
        "        font-size: 18pt;\n",
        "        line-height: 100%;\n",
        "        color:#d77c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 2em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    }\n",
        "    h4 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h4 {\n",
        "        font-weight: 300;\n",
        "        font-size: 16pt;\n",
        "        color:#d77c0c;\n",
        "        margin-bottom: 0.5em;\n",
        "        margin-top: 0.5em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    }\n",
        "    h5 {\n",
        "        font-family: 'Open sans',verdana,arial,sans-serif;\n",
        "    }\n",
        "    .text_cell_render h5 {\n",
        "        font-weight: 300;\n",
        "        font-style: normal;\n",
        "        color: #1d3b84;\n",
        "        font-size: 16pt;\n",
        "        margin-bottom: 0em;\n",
        "        margin-top: 1.5em;\n",
        "        display: block;\n",
        "        white-space: nowrap;\n",
        "    }\n",
        "    div.text_cell_render{\n",
        "        font-family: 'Arimo',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: 50000px;\n",
        "    }\n",
        "    div.output_subarea.output_stream.output_stdout.output_text {\n",
        "        overflow-x: auto;\n",
        "        overflow-y: scroll;\n",
        "        max-height: 50000px;\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 0x7f30e36cb4e0>"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Introduction"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "blah blah"
     ]
    },
    {
     "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": "heading",
     "level": 3,
     "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": "heading",
     "level": 2,
     "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",
     "collapsed": false,
     "input": [
      "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()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x7f30c7268748>"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "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 sytem, 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 travelling 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}$$"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The next step is to design the state transistion 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",
      "\\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",
      "$$"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "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 Jabobian!\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",
     "collapsed": false,
     "input": [
      "import sympy\n",
      "from sympy import  init_printing\n",
      "#from sympy.interactive import printing\n",
      "init_printing(use_latex='mathjax')\n",
      "\n",
      "phi, x = sympy.symbols('\\phi, x')\n",
      "phi"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "latex": [
        "$$\\phi$$"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 3,
       "text": [
        "\\phi"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "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",
     "collapsed": false,
     "input": [
      "sympy.diff('sqrt(phi)')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "latex": [
        "$$\\frac{1}{2 \\sqrt{\\phi}}$$"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 4,
       "text": [
        "   1   \n",
        "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n",
        "    ___\n",
        "2\u22c5\u2572\u2571 \u03c6 "
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "We can factor equations."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "sympy.factor('phi**3 -phi**2 + phi - 1')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "latex": [
        "$$\\left(\\phi - 1\\right) \\left(\\phi^{2} + 1\\right)$$"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 5,
       "text": [
        "        \u239b 2    \u239e\n",
        "(\u03c6 - 1)\u22c5\u239d\u03c6  + 1\u23a0"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "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",
     "collapsed": false,
     "input": [
      "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)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "latex": [
        "$$\\left[\\begin{matrix}\\frac{x - x_{a}}{\\sqrt{\\left(x - x_{a}\\right)^{2} + \\left(y - y_{a}\\right)^{2}}} & 0 & \\frac{y - y_{a}}{\\sqrt{\\left(x - x_{a}\\right)^{2} + \\left(y - y_{a}\\right)^{2}}} & 0\\\\\\frac{x - x_{b}}{\\sqrt{\\left(x - x_{b}\\right)^{2} + \\left(y - y_{b}\\right)^{2}}} & 0 & \\frac{y - y_{b}}{\\sqrt{\\left(x - x_{b}\\right)^{2} + \\left(y - y_{b}\\right)^{2}}} & 0\\end{matrix}\\right]$$"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 6,
       "text": [
        "\u23a1           x - x\u2090                           y - y\u2090              \u23a4\n",
        "\u23a2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   0   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   0\u23a5\n",
        "\u23a2    _______________________          _______________________    \u23a5\n",
        "\u23a2   \u2571         2           2          \u2571         2           2     \u23a5\n",
        "\u23a2 \u2572\u2571  (x - x\u2090)  + (y - y\u2090)         \u2572\u2571  (x - x\u2090)  + (y - y\u2090)      \u23a5\n",
        "\u23a2                                                                \u23a5\n",
        "\u23a2          x - x_b                          y - y_b              \u23a5\n",
        "\u23a2\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500  0  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500  0\u23a5\n",
        "\u23a2   _________________________        _________________________   \u23a5\n",
        "\u23a2  \u2571          2            2        \u2571          2            2    \u23a5\n",
        "\u23a3\u2572\u2571  (x - x_b)  + (y - y_b)       \u2572\u2571  (x - x_b)  + (y - y_b)     \u23a6"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "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 coordintates 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 trigometic 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 occurance 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 cresent 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 nomimal 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",
     "collapsed": false,
     "input": [
      "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)]])"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 7
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we need to create our simulated sensor. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "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)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 8
    },
    {
     "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",
     "collapsed": false,
     "input": [
      "import math\n",
      "from filterpy.kalman import KalmanFilter\n",
      "import numpy as np\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",
      "\n",
      "plt.plot(xs, ys, 'r--', label='filter')\n",
      "plt.plot(pxs, pys, label='ideal')\n",
      "plt.legend(loc=2)\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x7f30c5fa8e10>"
       ]
      }
     ],
     "prompt_number": 9
    },
    {
     "cell_type": "heading",
     "level": 2,
     "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": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "References"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "[1] http://sympy.org\n"
     ]
    }
   ],
   "metadata": {}
  }
 ]
}