{
 "metadata": {
  "name": "",
  "signature": "sha256:08cdb1e902d069b45293bbf627273884dedc0356c9048d8247276cd852dee4c4"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "\n",
      "from __future__ import division, print_function\n",
      "%matplotlib inline\n",
      "import sys\n",
      "sys.path.insert(0,'../code') # allow us to format the book\n",
      "\n",
      "# use same formatting as rest of book so that the plots are\n",
      "# consistant with that look and feel.\n",
      "import book_format\n",
      "book_format.load_style()\n",
      "\n",
      "\n",
      "\n",
      "def update(mu1, var1, mu2, var2):\n",
      "    mean = (var1*mu2 + var2*mu1) / (var1+var2)\n",
      "    variance = 1 / (1/var1 + 1/var2)\n",
      "    return (mean, variance)\n",
      "\n",
      "def predict(pos, variance, movement, movement_variance):\n",
      "    return (pos + movement, variance + movement_variance)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This notebook creates the animations for the Kalman Filter chapter. It is not really intended to be a readable part of the book, but of course you are free to look at the source code, and even modify it. However, if you are interested in running your own animations, I'll point you to the examples subdirectory of the book, which contains a number of python scripts that you can run and modify from an IDE or the command line. This module saves the animations to GIF files, which is quite slow and not very interactive. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def plot_3d_covariance(ax, mean, cov):\n",
      "    \"\"\" plots a 2x2 covariance matrix positioned at mean. mean will be plotted\n",
      "    in x and y, and the probability in the z axis.\n",
      "\n",
      "    Parameters\n",
      "    ----------\n",
      "    mean :  2x1 tuple-like object\n",
      "        mean for x and y coordinates. For example (2.3, 7.5)\n",
      "\n",
      "    cov : 2x2 nd.array\n",
      "       the covariance matrix\n",
      "\n",
      "    \"\"\"\n",
      "\n",
      "    # compute width and height of covariance ellipse so we can choose\n",
      "    # appropriate ranges for x and y\n",
      "    o,w,h = stats.covariance_ellipse(cov,3)\n",
      "    # rotate width and height to x,y axis\n",
      "    wx = abs(w*np.cos(o) + h*np.sin(o))*1.2\n",
      "    wy = abs(h*np.cos(o) - w*np.sin(o))*1.2\n",
      "\n",
      "\n",
      "    # ensure axis are of the same size so everything is plotted with the same\n",
      "    # scale\n",
      "    if wx > wy:\n",
      "        w = wx\n",
      "    else:\n",
      "        w = wy\n",
      "\n",
      "    minx = mean[0] - w\n",
      "    maxx = mean[0] + w\n",
      "    miny = mean[1] - w\n",
      "    maxy = mean[1] + w\n",
      "\n",
      "    xs = np.arange(minx, maxx, (maxx-minx)/40.)\n",
      "    ys = np.arange(miny, maxy, (maxy-miny)/40.)\n",
      "    xv, yv = np.meshgrid (xs, ys)\n",
      "\n",
      "    zs = np.array([100.* stats.multivariate_gaussian(np.array([x,y]),mean,cov) \\\n",
      "                   for x,y in zip(np.ravel(xv), np.ravel(yv))])\n",
      "    zv = zs.reshape(xv.shape)\n",
      "\n",
      "    ax = plt.figure().add_subplot(111, projection='3d')\n",
      "    ax.plot_surface(xv, yv, zv, rstride=1, cstride=1, cmap=cm.autumn)\n",
      "\n",
      "    ax.set_xlabel('X')\n",
      "    ax.set_ylabel('Y')\n",
      "\n",
      "    ax.contour(xv, yv, zv, zdir='x', offset=minx-1, cmap=cm.autumn)\n",
      "    ax.contour(xv, yv, zv, zdir='y', offset=maxy, cmap=cm.BuGn)\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from __future__ import print_function, division\n",
      "import matplotlib.pyplot as plt\n",
      "import numpy.random as random\n",
      "import math\n",
      "import stats\n",
      "from gif_animate import animate\n",
      "\n",
      "\n",
      "\n",
      "sensor_error = 1.2**2\n",
      "movement_error = .2\n",
      "movement = 0\n",
      "voltage = (25,20) #who knows what the first value is?\n",
      "\n",
      "volts = [14.44, 18.74, 17.21, 15.98, 16.76, 14.8, 16.01, 16.90, 15.41, 17.31,\n",
      "        16.39, 17.96]\n",
      "ps = [voltage[0]]\n",
      "\n",
      "\n",
      "i = 0\n",
      "pred = 0\n",
      "def volt_animate(frame):\n",
      "    global i, ps, voltage, Z, x, pred\n",
      "    \n",
      "    step = frame % 4\n",
      "    plt.subplot(211)\n",
      "    plt.ylim([14,26])\n",
      "\n",
      "    if step == 0:\n",
      "        prev = voltage[0]\n",
      "        voltage = predict(voltage[0], voltage[1], movement, movement_error)\n",
      "        pred = voltage[0]\n",
      "        plt.plot ([i, i+1], [prev, pred], c='g') \n",
      "        \n",
      "    elif step == 1:\n",
      "        Z = volts[i]\n",
      "        i += 1\n",
      "        \n",
      "        plt.scatter(i, Z, marker='+', s=64, color='r')\n",
      "\n",
      "    elif step == 2:\n",
      "        plt.plot ([i,i], [pred, Z], c='r', alpha=0.3)\n",
      "\n",
      "    else:\n",
      "        voltage = update(voltage[0], voltage[1], Z, sensor_error)\n",
      "        ps.append(voltage[0])\n",
      "        plt.plot(ps, c='b')\n",
      "        \n",
      "    plt.subplot(212)\n",
      "    plt.cla()\n",
      "    stats.plot_gaussian(voltage[0], voltage[1], xlim=[0,32])\n",
      "    plt.ylim([0,1])\n",
      "    plt.tight_layout()\n",
      "        \n",
      "N=12\n",
      "animate('volt_animate.gif', volt_animate, N*3, 350)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<img src='volt_animate.gif'>"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from __future__ import print_function, division\n",
      "import matplotlib.pyplot as plt\n",
      "import numpy.random as random\n",
      "import math\n",
      "import stats\n",
      "from gif_animate import animate\n",
      "\n",
      "# assume dog is always moving 1m to the right\n",
      "movement = 1\n",
      "movement_error = .05\n",
      "sensor_error = 4.5\n",
      "pos = (0, 100)   # gaussian N(0,100)\n",
      "\n",
      "# this is the recorded output of a run of the dog sensor with an initial\n",
      "# seed of 200\n",
      "ZS = [-2.07, 6.05, 4.51, 3.47, 5.76, 5.93, 6.53, 9.01, 7.53, 11.68, \n",
      "      11.15, 14.76, 13.45, 16.15, 19.05, 14.87, 20.90, 15.75, \n",
      "      17.16, 20.50]\n",
      "zs = []\n",
      "ps = []\n",
      "\n",
      "N=20\n",
      "\n",
      "def dog_animate(frame):\n",
      "    global pos, zs, ps,  N, ZS\n",
      "    pos = predict(pos[0], pos[1], movement, movement_error)    \n",
      "    Z = ZS[frame]\n",
      "    zs.append(Z)\n",
      "    \n",
      "    pos = update(pos[0], pos[1], Z, sensor_error)\n",
      "    ps.append(pos[0])\n",
      "\n",
      "\n",
      "    plt.subplot(211)\n",
      "    plt.plot(zs,c='r', linestyle='dashed')\n",
      "\n",
      "    plt.xlim([0,N*1.2])\n",
      "    plt.ylim([0,N*1.2])\n",
      "\n",
      "    if len(ps) > 1:\n",
      "        plt.plot(ps, c='#8EBA42')\n",
      "        \n",
      "    plt.subplot(212)\n",
      "    plt.cla()\n",
      "    stats.plot_gaussian(pos[0], pos[1], xlim=[0,N*1.2])\n",
      "    plt.ylim(0, 1)\n",
      "    plt.tight_layout()\n",
      "\n",
      "\n",
      "animate('dog_track.gif', dog_animate, N, 200)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x7f3d805b4d68>"
       ]
      }
     ],
     "prompt_number": 9
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<img src='dog_track.gif'>"
     ]
    }
   ],
   "metadata": {}
  }
 ]
}