{
 "metadata": {
  "name": ""
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Uk\u00e1zka pou\u017eit\u00ed n\u00e1stroje IPython na manipulaci se senzorov\u00fdmi daty\n",
      "=======\n",
      "\n",
      "P\u0159\u00edklad vyu\u017e\u00edv\u00e1 modulovou stavebnici MLAB a jej\u00ed knihovnu [pymlab](https://github.com/MLAB-project/MLAB-I2c-modules). Sn\u00edma\u010d je k po\u010d\u00edta\u010di p\u0159ipojen\u00fd p\u0159es rozhradn\u00ed USB a data jsou vy\u010d\u00edt\u00e1na p\u0159es [I\u00b2C](http://wiki.mlab.cz/doku.php?id=cs:i2c)\n",
      "\n",
      "Pou\u017eit\u00fd sn\u00edma\u010d [HMC5883L](http://www.magneticsensors.com/three-axis-digital-compass.php) m\u00e1 n\u00e1sleduj\u00edc\u00ed katalogov\u00e9 parametry: \n",
      "\n",
      "*  M\u011b\u0159\u00edc\u00ed rozsah +/- 800 uT\n",
      "*  Rozli\u0161en\u00ed typicky 5 uT\n",
      "*  \u010cetnost m\u011b\u0159en\u00ed 75 Hz\n",
      "\n",
      "Zprovozn\u011bn\u00ed demo k\u00f3du\n",
      "---------------------\n",
      "\n",
      "Nejd\u0159\u00edve zjist\u00edme zda m\u00e1me p\u0159\u00edstup pro z\u00e1pis a \u010dten\u00ed do syst\u00e9mov\u00e9ho za\u0159\u00edzen\u00ed. A jak\u00e9 \u010d\u00edslo m\u00e1 I\u00b2C sb\u011brnice na  kterou m\u00e1me p\u0159ipojen\u00e1 \u010didla. \n"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "!i2cdetect -l"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "i2c-0\ti2c       \ti915 gmbus ssc                  \tI2C adapter\r\n",
        "i2c-1\ti2c       \ti915 gmbus vga                  \tI2C adapter\r\n",
        "i2c-2\ti2c       \ti915 gmbus panel                \tI2C adapter\r\n",
        "i2c-3\ti2c       \ti915 gmbus dpc                  \tI2C adapter\r\n",
        "i2c-4\ti2c       \ti915 gmbus dpb                  \tI2C adapter\r\n",
        "i2c-5\ti2c       \ti915 gmbus dpd                  \tI2C adapter\r\n",
        "i2c-6\ti2c       \tDPDDC-B                         \tI2C adapter\r\n",
        "i2c-7\ti2c       \ti2c-tiny-usb at bus 001 device 006\tI2C adapter\r\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Proto\u017ee pro p\u0159ipojen\u00ed \u010didel k po\u010d\u00edta\u010di pou\u017e\u00edv\u00e1me adapt\u00e9r i2c-tiny-usb. Vid\u00edme, \u017ee sb\u011brnice m\u00e1 aktu\u00e1ln\u011b ozna\u010den\u00ed nap\u0159\u00edklad i2c-8. \n",
      "\n",
      "V p\u0159\u00edpad\u011b, \u017ee v\u00fd\u0161e uveden\u00fd p\u0159\u00edklad vr\u00e1t\u00ed chybu, nebo pojmenov\u00e1n\u00ed \"unknown\" tak nem\u00e1me p\u0159\u00edstup k syst\u00e9mov\u00fdm rozhran\u00edm. Ten z\u00edsk\u00e1me vytvo\u0159en\u00edm souboru s n\u00e1sleduj\u00edc\u00edm obsahem ve slo\u017ece:  /etc/udev/rules.d/i2c-devices.rules"
     ]
    },
    {
     "cell_type": "raw",
     "metadata": {},
     "source": [
      "KERNEL==\"i2c-[0-9]*\", GROUP=\"i2c\""
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Toto ozna\u010den\u00ed budeme je\u0161t\u011b d\u00e1le pot\u0159ebovat, proto si jej ulo\u017e\u00edme da prom\u011bnn\u00e9. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "port = 7"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Budeme pokra\u010dovat na\u010dten\u00edm pot\u0159ebn\u00fdch modul\u016f pro zach\u00e1zen\u00ed s I\u00b2C sn\u00edma\u010di."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import time\n",
      "import datetime\n",
      "import sys\n",
      "\n",
      "from pymlab import config\n",
      "import matplotlib.pyplot as plt\n",
      "import numpy as np"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Nyn\u00ed si nadefinujeme strukturu p\u0159ipojen\u00ed jednotliv\u00fdch \u010didel na I\u00b2C sb\u011brnici."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "cfg = config.Config(\n",
      "    i2c = {\n",
      "        \"port\": port,\n",
      "    },\n",
      "    bus = [\n",
      "        {\n",
      "            \"type\": \"i2chub\",\n",
      "            \"address\": 0x72,\n",
      "            \n",
      "            \"children\": [\n",
      "                {\"name\": \"mag\", \"type\": \"mag01\", \"gauss\": 0.88, \"channel\": 1, },   \n",
      "            ],\n",
      "        },\n",
      "    ],\n",
      ")"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Tuto strukturu inicializujeme, aby jsme dos\u00e1hli definovan\u00e9 konfigurace \u010didel."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "cfg.initialize()\n",
      "mag_sensor = cfg.get_device(\"mag\")\n",
      "time.sleep(0.5)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stderr",
       "text": [
        "WARNING:pymlab.sensors.iic:HID device does not exist, we will try SMBus directly...\n"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Nyn\u00ed u\u017e m\u016f\u017eeme p\u0159\u00edmo komunikovat se za\u0159\u00edzen\u00edm pojmenovan\u00fdm jako mag_sensor. A vy\u010d\u00edst z n\u011bj sadu dat."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import sys\n",
      "import time\n",
      "from IPython.display import clear_output\n",
      "\n",
      "MEASUREMENTS = 500\n",
      "#x = np.zeros(MEASUREMENTS)\n",
      "#y = np.zeros(MEASUREMENTS)\n",
      "#z = np.zeros(MEASUREMENTS)\n",
      "list_meas = []\n",
      "\n",
      "for n in range(MEASUREMENTS):\n",
      "#    mag_sensor.route()  #V p\u0159\u00edpad\u011b v\u00edce \u010didel je pot\u0159eba ke ka\u017ed\u00e9mu p\u0159ed jeho pou\u017eit\u00edm nechat vyroutovat cesutu na sb\u011brnici.\n",
      "    clear_output()\n",
      "    (x, y, z) = mag_sensor.axes()\n",
      "    list_meas.append([x, y, z])\n",
      "    print (n, list_meas[n])\n",
      "    sys.stdout.flush()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "(499, [-111.69, -413.90999999999997, -388.36])\n"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "V\u00fdstupn\u00ed jsou v jednotk\u00e1ch miliGauss a m\u011b\u0159\u00edc\u00ed rozsah je nastaven\u00fd na 0.88 Gauss. Viz konfigurace \u010didel naho\u0159e.\n",
      "Nam\u011b\u0159en\u00e9 hodnoty n\u00e1sledn\u011b ulo\u017e\u00edme do souboru. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "np.savez(\"calibration_data_3Dset\", data=list_meas)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 141
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Zpracov\u00e1n\u00ed dat\n",
      "-----------\n",
      "\n",
      "V dal\u0161\u00ed \u010d\u00e1sti budeme pracovat s daty v ulo\u017een\u00e9m souboru, kter\u00fd na\u010dteme do pol\u00ed x, y, z. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "data = np.load('./calibration_data_3Dset.npz')\n",
      "list_meas = data['data']"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 142
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Nam\u011b\u0159en\u00e9 hodnoty vykresl\u00edme do 3D grafu."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from mpl_toolkits.mplot3d.axes3d import Axes3D\n",
      "#%pylab qt\n",
      "%pylab inline\n",
      "fig = plt.figure()\n",
      "ax = Axes3D(fig)\n",
      "#plt.subplot(121)\n",
      "p = ax.scatter((list_meas)[1],(list_meas)[5],(list_meas)[3])\n",
      "#p = ax.plot3D(list_meas)\n",
      "#plt.subplot(122)\n",
      "#p = ax.scatter(x, y, z)\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Populating the interactive namespace from numpy and matplotlib\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsfXm8HUWZ9tNnP3dLwmaA+GEgGNkCARJiQsIAEkQ2WYKi\niWYEHNEZQFYNERVZFEcCg0TZFAbQYRhDQD7RsEYQEiQgYQn7Fww6gIbc7Zx7lj6nvz+ub6dO3eq9\nuvss9fx++UFubndVb/XUuzzvqxmGYUBBQUFBQaFDkIh7AgoKCgoKClFCEZ+CgoKCQkdBEZ+CgoKC\nQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdB\nEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+C\ngoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKC\nQkdBEZ+CgoKCQkdBEZ+CgoKCQkchFfcEFBTCRL1eh67rKJVKSKVSSCaTSCaTSCQS0DQNmqbFPUUF\nBYWIoYhPoS1Rr9dRKpUAAIZhoFaroV6vwzAM878sESpCVFDoHCjiU2gr1Ot1VKtV1Ot1DA0Noaen\nxySyZDIJAOa/JxIJ1Ot11Gq1MechIkylUkgkEooQFRTaCIr4FFoehmHAMAyT0ABA0zQYhgFd11Eu\nl1Gr1UwCo983DAOapiGRSIw5HxFipVIxf06/qwhRQaG1oRmGYcQ9CQUFP7AiPACoVCooFApIJBLI\n5/Pm71LMj37fMAyTwNg/IjJjCZOFIkQFhdaCIj6FloOIwFjCGxkZMd2Y3d3dSCaTqFar5u9Uq1XU\najXkcjnzXPyfIIRIZJzNZpFIJMxYoiJEBYXmgHJ1KrQMeMJjCaRcLqNUKiGRSKC7uxupVAqDg4OO\nBEOxP4r/8WPRH7Iq7QiRXKaGYaBUKkHTNNTrdZTL5TFjKkJUUIgPivgUmh6UlUmZmSLCSyaT6O7u\nRjqdHnMs/ZeOofifHYISIjumVQxRRIh8hil7PgUFBTlQxKfQtKDkFF3XAaCB8EqlkqnN6+npQSo1\n9lVmrSdZlpQdIRIxk/u1WCwCwBjrkEiNPx4AarWaeb38mGz8MJlMKutQQcEnFPEpNB2IRHRdR7FY\n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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x7f3f8205d590>"
       ]
      }
     ],
     "prompt_number": 143
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Pro lep\u0161\u00ed zobrazen\u00ed jednotliv\u00fdch zkreslen\u00ed vykresl\u00edme i 2D pr\u016fm\u011bt dat."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.plot(x, z,'.')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 144,
       "text": [
        "[<matplotlib.lines.Line2D at 0x7f3f820aa790>]"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD6CAYAAABamQdMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAD+ZJREFUeJzt3W9o1XUbx/HP8c/mrOZWZpSmQjEtRy69hbY5PSuzlRpi\niQpGTedt9MBME8xJzkhNQUnRQo/0QGgZJKKphWkdp6mF4B9M8w9kZEm52cY6atvadT8IR1N33Jk7\ns3Pd7xeM1o6/L9+Lr735+cPTCZiZCQDgSrtbvQEAQOsj7gDgEHEHAIeIOwA4RNwBwCHiDgAOdYjX\nwllZWTp8+HC8lgcAd/r3769Dhw61ylpxu3M/fPiwzMzl17x58275HpiP+ZjP31dr3hDzWAYAHCLu\nAOAQcW+BYDB4q7cQV8yX2JgPkhQws7j8v2UCgYDitDQAuNSa3eTOHQAcIu4A4BBxBwCHiDsAOETc\nAcAh4g4ADhF3AHCIuAOAQ8QdABwi7gDgEHEHAIeIOwA4FPWTmGpqalRUVKTTp0+rY8eOWrFihcxM\n06ZNU/v27ZWcnKx169apW7dubbVfAEAzRI17KBRS586dtXfvXp08eVLjx49Xly5dtHLlSj3yyCNa\ns2aNFi9erKVLl7bVfgEAzRA17seOHVNBQYEkKSMjQ7/88os+++wz3XPPPZKk2tpapaSkxH+XAICY\nRH3mnpWVpS1btkiS9u/fr/Pnz6u+vl6StHfvXq1atUqvvfZa/HcJAIhJ1Dv3SZMm6fjx48rLy1Nu\nbq4yMjKUnp6ujz/+WAsXLtS2bdt01113NXl9SUlJw/fBYJBPUAGAfwiHwwqHw3FZO+onMe3bt08V\nFRUaOXKkDhw4oFmzZmny5Mlas2aNNm3apPT09KYX5pOYACAmrdnNqHG/cOGCxo0bp0gkopSUFL3/\n/vvKzs5Wr1691KVLF0nS0KFDG92hx2OTAPD/oM3iflMLE3cAiAmfoQoAiIq4A4BDxB0AHCLuAOAQ\ncQcAh4g7ADhE3AHAIeIOAA4RdwBwiLgDgEPEHQAcIu4A4BBxBwCHiDsAOETcAcAh4g4ADhF3AHCI\nuAOAQ8QdABwi7gDgEHEHAIeIOwA4RNwBwCHiDgAOEXcAcIi4A4BDxB0AHCLuAOAQcQcAh4g7ADhE\n3AHAIeIOAA4RdwBwiLgDgEPEHQAcIu4A4BBxBwCHOkR7saamRkVFRTp9+rQ6duyoFStW6LbbbtNL\nL72kdu3aKTMzU6tWrVIgEGir/QIAmiHqnXsoFFLnzp21d+9ehUIhFRYWaubMmVq4cKHKyspkZtq0\naVNb7RUA0ExR437s2DEVFBRIkjIyMvTzzz/ryy+/1JAhQyRJTz/9tHbs2BH/XQIAYhI17llZWdqy\nZYskaf/+/Tp//rwuXrzY8Prtt9+uqqqq+O4QABCzqM/cJ02apOPHjysvL0+5ubnq06ePysvLG16v\nrq5WWlpak9eXlJQ0fB8MBhUMBm96wwDgRTgcVjgcjsvaATOzpl7ct2+fKioqNHLkSB04cECzZs1S\namqqZsyYoaFDh+rll1/WE088obFjx167cCCgKEsDAK7Smt2MGvcLFy5o3LhxikQi6tSpk0KhkOrr\n6zVlyhTV1NTo4YcfVigUuu7fliHuABCbNov7TS1M3AEgJq3ZTd7EBAAOEXcAcIi4A4BDxB0AHCLu\nAOAQcQcAh4g7ADhE3AHAIeIOAA4RdwBwiLgDgEPEHQAcIu4A4BBxBwCHiDsAOETcAcAh4g4ADhF3\nAHCIuAOAQ8QdABwi7gDgEHEHAIeIOwA4RNwBwCHiDgAOEXcAcIi4A4BDxB0AHCLuAOAQcQcAh4g7\nADhE3AHAIeIOxOC//5WCQemZZ6TKylu9G6BpxB2IwcmT0q5d0mef/R164N+KuAMx6Nz573/+5z/S\nmjW3di9ANAEzs7gsHAgoTksDt0xl5d937GvWSGlpt3o38KY1uxk17vX19SoqKtLJkyfVrl07hUIh\nmZmKiooUCASUkZGhtWvXKhAIxHWTAPD/oDW72SHai9u3b1ckEtGePXu0Y8cOzZkzR0lJSZo7d64K\nCgo0ceJEbd26VSNHjmyVzQAAWkfUZ+4pKSmqqqqSmamqqkpJSUlKSUlRRUWFzEzV1dVKSkpqq70C\nAJop6mOZuro6DRs2TOfOnVNFRYU+/fRTJScna/jw4br77ruVlpamcDis5OTkaxfmsQwAxKTNHsss\nWbJEubm5WrBggc6ePav8/HzV19dr9+7deuihh/Tee+9p5syZWrly5XWvLykpafg+GAwqGAy2yqYB\nwINwOKxwOByXtaPGPRKJKDU1VZKUnp6uuro6Xbx4UXfccYck6d5779XevXubvP6fcQcANHb1Te/8\n+fNbbe2oj2UqKytVWFio8vJy1dbWavr06eratavmzp2rTp06KTk5WaFQSD179rx2YR7LAEBM2uyv\nQt7UwsQdAGLSmt3kHaoA4BBxBwCHiDsAOETcAcAh4g4ADhF3AHCIuAOAQ8QdABwi7gDgEHEHAIeI\nOwA4RNwBwCHiDgAOEXcAcIi4A4BDxB0AHCLuAOAQcQcAh4g7ADhE3AHAIeIOAA4RdwBwiLgDgEPE\nHQAcIu4A4BBxBwCHiDsAOETcAcAh4g4ADhF3AHCIuAOAQ8QdABwi7gDgEHEHAIeIOwA4RNwBwCHi\nDgAOdYj2Yn19vYqKinTy5Em1a9dOoVBI6enpmjJliiorK2VmWrdunXr37t1G2wUANEfUuG/fvl2R\nSER79uzRjh07NGfOHKWmpuqFF17Q888/r3A4rKNHjxJ3APiXifpYJiUlRVVVVTIzVVVVKSkpSV9/\n/bV++uknPfnkk/rwww/1+OOPt9VeAQDNFDXuubm5unz5svr27aupU6dq2rRpOnPmjO6880598cUX\n6tmzpxYvXtxWewUANFPUxzJLlixRbm6uFixYoLNnzyo/P19du3bVs88+K0kaNWqUiouLm7y+pKSk\n4ftgMKhgMNgqmwYAD8LhsMLhcFzWjhr3SCSi1NRUSVJ6errq6uqUnZ2trVu3auLEidq1a5cyMzOb\nvP6fcQcANHb1Te/8+fNbbe2AmVlTL1ZWVqqwsFDl5eWqra3V9OnTlZOTo6KiIkUiEaWlpam0tFRd\nunS5duFAQFGWBgBcpTW7GTXuN7UwcQeAmLRmN3kTEwA4RNwBwCHiDgAOEXcAcIi4A4BDxB0AHCLu\nAOAQcQcAh4g7ADhE3AHAIeIOAA4RdwBwiLgDgEPEHQAcIu4A4BBxBwCHiDsAOETcAcAh4g4ADhF3\nAHCIuAOAQ8QdABwi7gDgEHEHAIeIOwA4RNwBwCHiDgAOEXcAcIi4A4BDxB0AHCLuAOAQcQcAh4g7\nADhE3AHAIeIOAA4RdwBwiLgDgENR415fX69JkyZp8ODBGjJkiE6cONHwWmlpqXJycuK+QQBA7KLG\nffv27YpEItqzZ4/efPNNFRcXS5IOHjyoDz74oE02CACIXdS4p6SkqKqqSmamqqoqJSUlqaKiQsXF\nxXr33XdlZm21TwBADDpEezE3N1eXL19W3759VVFRoc2bN2vy5MlatmyZOnXqdMPFS0pKGr4PBoMK\nBoM3u18AcCMcDiscDsdl7YBFuf1euHChIpGIFixYoLNnz6pnz5564IEH1KNHD12+fFnHjh1riP01\nCwcC3NkDQAxas5tR79wjkYhSU1MlSenp6erVq5eOHDmilJQU/fjjjxo/fvx1ww4AuLWixn3WrFkq\nLCxUXl6eamtrtWjRIqWkpEiSzEyBQKBNNgkAiE3UxzI3tTCPZQAgJq3ZTd7EBAAOEXcAcIi4A4BD\nxB0AHCLuAOAQcQcAh4g7ADhE3AHAIeIOAA4RdwBwiLgDgEPEHQAcIu4A4BBxBwCHiHsLxOtjsf4t\nmC+xMR8k4t4i3n9zMV9iYz5IxB0AXCLuAOBQ3D5mLysrS4cPH47H0gDgUv/+/XXo0KFWWStucQcA\n3Do8lgEAh4g7ADjU4rhXVVVp1KhRCgaDysnJ0f79+yVJGzdu1IMPPqj8/Hzl5+errKys0XWXLl3S\nc889pyFDhmjEiBEqLy+/uQnipKn5rli4cKEmTJhwzXVmpu7duzfMP2fOnLbackxaOl+in9/u3bv1\n2GOPKTs7W7Nnz77mukQ/vxvNlwjn19RsO3fuVE5OjoYOHaqxY8fq0qVLja5L9LO70Xwxn5210Lx5\n82z58uVmZnbixAkbMGCAmZkVFxfbhg0bmrxu6dKlNn/+fDMzW79+vb366qst3UJcNTWfmdm2bdss\nNzfXJkyYcM11p06dslGjRrXZPluqpfMl+vkNHDjQzpw5Y2Zm+fn5dvDgwUbXJfr53Wi+RDi/pmbr\n06eP/fbbb2Zm9sYbb9iKFSsaXZfoZ3ej+WI9uxbHvbKy0i5dumRmZkePHrXc3FwzMysoKLARI0ZY\nXl6ezZw50+rq6hpdN2bMGPvmm28a1ujXr19LtxBXTc136tQpGz16tO3YscPGjx9/zXXr16+3AQMG\nWH5+vj3zzDN24sSJNt13c7V0vkQ/vyu/H6urq23AgAF2+vTpRtcl+vndaL5EOL+mZjt37lzDr3n9\n9dctFAo1ui7Rz+5G88V6ds2K+9q1ay0zM7PR14EDBxo29Oijj1pZWZmZmS1btsx++OEHMzObOnWq\nrVy5stFaw4YNs++//97MzP766y/r0aNHc7YQV82dr7q62oYPH26//vqrffXVV9eNX1lZmX3yySdm\nZrZnzx4bNGhQm85yPa05XyKf3xX79u2z3r1724gRIxr+I7sikc/vimjz/dvOL9bZzMw2bNhggwYN\nsj///LPRzz2cnVnT88V6di2+czczO3LkiPXr188+//zzhp9VVlY2fL9t2zabPHlyo2vGjBlj3377\nbcOvzczMvJktxNXV823YsMH69+9vwWDQsrKyrFu3brZ48eJG11y8eNFqamoa/r179+5tuudYtGS+\nRD6/q82dO9fmzZvX6GeJfH5Xu958iXJ+Tc22bNkyGzx4sFVUVFxzjYezizZfrGfX4rh/99131qdP\nHzty5EjDz+rr661Xr1529uxZMzObMWOGvf/++42uW7p0qZWUlJiZ2UcffWSvvPJKS7cQV9eb75/C\n4fB172xnz55tS5YsMTOzQ4cOWXZ2dlz32VItnS+Rz6++vt4GDx5sv//+u5mZvfPOO/bWW281ui6R\nz6858yXC+TX1e/Ptt9+2MWPGXPOnkSsS+ezMbjxfrGfX4jcxjR49WkeOHFGvXr0kSWlpadq4caN2\n7typ4uJiderUSZmZmVq+fLnat2+vp556Slu3blVtba1efPFFnTt3TsnJySotLVW3bt1asoW4amq+\nK3bt2qXVq1ertLRUkhrmi0Qimjhxov744w916NBBq1atUkZGxi2ZIZqWzpfo57d582YtWrRIycnJ\nuu+++7R27Vp17tzZzfndaL5EOL/rzbZ69Wrdf//9GjhwoJKTkyVJ48eP19SpU12cXXPmi/XseIcq\nADjEm5gAwCHiDgAOEXcAcIi4A4BDxB0AHCLuAOAQcQcAh4g7ADj0P+4RIHXcWDIzAAAAAElFTkSu\nQmCC\n",
       "text": [
        "<matplotlib.figure.Figure at 0x7f3f81d6bad0>"
       ]
      }
     ],
     "prompt_number": 144
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Z grafu je vid\u011bt, \u017ee se uplat\u0148uj\u00ed oba zn\u00e1m\u00e9 deforma\u010dn\u00ed jevy - soft-iron a hard-iron. Pokus\u00edme se je proto kompenzovat. Nejd\u0159\u00edve zkus\u00edme odstranit Hard-iron efekty zp\u016fsobuj\u00edc\u00ed offsety."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "xoffset = (min(x) + max(x))/2\n",
      "print xoffset"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "ename": "TypeError",
       "evalue": "'float' object is not iterable",
       "output_type": "pyerr",
       "traceback": [
        "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
        "\u001b[0;32m<ipython-input-145-8671977becc2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mxoffset\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mxoffset\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
        "\u001b[0;31mTypeError\u001b[0m: 'float' object is not iterable"
       ]
      }
     ],
     "prompt_number": 145
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "zoffset = (min(z) + max(z))/2\n",
      "print zoffset"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.plot(x-xoffset, z-zoffset,'.')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "D\u00e1le pot\u0159ebujeme kompenzovat soft-iron efekty. K tomu mus\u00edme pracovat s nam\u011b\u0159en\u00fdmi daty, jako s elipsou a naj\u00edt jej\u00ed hlavn\u00ed a vedlej\u0161\u00ed poloosu. Postup je trochu komplikovan\u011bj\u0161\u00ed, proto adoptujeme k\u00f3d z [PaparazziUAV](http://wiki.paparazziuav.org/wiki/ImuCalibration). Ten pomoc\u00ed fitov\u00e1n\u00ed elipsoindu najde korek\u010dn\u00ed parametry citlivosti pro jednotliv\u00e9 osy.  Zanedb\u00e1v\u00e1 ale p\u0159\u00edpadnou rotaci elipsoidu popsanou v \u010dl\u00e1nku [Compensating for Tilt, Hard-Iron, and Soft-Iron Effects](http://www.sensorsmag.com/sensors/motion-velocity-displacement/compensating-tilt-hard-iron-and-soft-iron-effects-6475)"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import scipy\n",
      "from scipy import optimize\n",
      "\n",
      "import calibration_utils\n",
      "\n",
      "sensor_ref = 1.\n",
      "sensor_res = 0.73\n",
      "noise_window = 10\n",
      "noise_threshold = 1000"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 146
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Uprav\u00edme strukuturu pole m\u011b\u0159en\u00fdch hodnot do sn\u00e1ze indexovateln\u00e9ho form\u00e1tu."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "measurements = np.array(list_meas)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 147
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Spo\u010d\u00edt\u00e1me medi\u00e1n magnitudy zm\u011b\u0159en\u00fdch vektor\u016f. A nastav\u00edme podle n\u011bj rozhodovac\u00ed \u00farove\u0148 pro filtraci a ofiltrujeme nam\u011b\u0159en\u00e1 kalibra\u010dn\u00ed data. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "meas_median=scipy.median(scipy.array([scipy.linalg.norm(v) for v in measurements]))\n",
      "noise_threshold = meas_median * 0.8\n",
      "print noise_threshold\n",
      "flt_meas, flt_idx = calibration_utils.filter_meas(measurements, noise_window, noise_threshold)\n",
      "print(\"remaining \"+str(len(flt_meas))+\" after filtering\")"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": "*"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "flt_meas = measurements"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": "*"
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Spo\u010d\u00edt\u00e1me odhad elipsoidu z nam\u011b\u0159en\u00fdch minim\u00e1ln\u00edch a maxim\u00e1ln\u00edch hodnot."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "    p0 = calibration_utils.get_min_max_guess(flt_meas, sensor_ref)\n",
      "    cp0, np0 = calibration_utils.scale_measurements(flt_meas, p0)\n",
      "    print(\"initial guess : avg \"+str(np0.mean())+\" std \"+str(np0.std()))\n",
      "\n",
      "    def err_func(p, meas, y):\n",
      "        cp, np = calibration_utils.scale_measurements(meas, p)\n",
      "        err = y*scipy.ones(len(meas)) - np\n",
      "        return err"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "initial guess : avg 0.999920050427 std 0.0671243703038\n"
       ]
      }
     ],
     "prompt_number": 150
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Optimalizujeme odhad fitov\u00e1n\u00edm elipsoidu."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "    p1, cov, info, msg, success = optimize.leastsq(err_func, p0[:], args=(flt_meas, sensor_ref), full_output=1)\n",
      "    if not success in [1, 2, 3, 4]:\n",
      "        print(\"Optimization error: \", msg)\n",
      "        print(\"Please try to provide a clean logfile.\")\n",
      "        sys.exit(1)\n",
      "\n",
      "    cp1, np1 = calibration_utils.scale_measurements(flt_meas, p1)\n",
      "    print(\"optimized guess : avg \"+str(np1.mean())+\" std \"+str(np1.std()))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "optimized guess : avg 0.999137645687 std 0.0293532050592\n"
       ]
      }
     ],
     "prompt_number": 151
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Vykresl\u00edme v\u00fdsledek filtrace a fitov\u00e1n\u00ed. "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%pylab qt\n",
      "calibration_utils.plot_results(False, measurements, flt_idx, flt_meas, cp0, np0, cp1, np1, sensor_ref)\n",
      "calibration_utils.plot_mag_3d(flt_meas, cp1, p1)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Populating the interactive namespace from numpy and matplotlib\n"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stderr",
       "text": [
        "WARNING: pylab import has clobbered these variables: ['cov', 'info']\n",
        "`%pylab --no-import-all` prevents importing * from pylab and numpy\n"
       ]
      }
     ],
     "prompt_number": 152
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Nyn\u00ed m\u016f\u017eeme z\u00edskan\u00e9 scale faktory a offsety pou\u017e\u00edt na kompenzaci libovoln\u00e9ho m\u011b\u0159en\u00ed a n\u00e1sledn\u011b vypo\u010d\u00edtat polohov\u00e9 \u00fahly platformy ve sf\u00e9rick\u00fdch sou\u0159adnic\u00edch."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "for n in range(MEASUREMENTS):\n",
      "    m = mag_sensor.axes()\n",
      "    sm = (m - p1[0:3])*p1[3:6]\n",
      "    r = norm(sm)\n",
      "    theta = np.arccos(sm[2]/r)\n",
      "    phi = np.arctan2(sm[1],sm[0])\n",
      "    clear_output()\n",
      "    print (r,(theta*180)/pi,(phi*180)/pi)\n",
      "    sys.stdout.flush()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": "*"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 92,
       "text": [
        "583.14932841582277"
       ]
      }
     ],
     "prompt_number": 92
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}