{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Table of Contents](./table_of_contents.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# H Infinity filter" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "from __future__ import division, print_function" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#format the book\n", "import book_format\n", "book_format.set_style()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I am still mulling over how to write this chapter. In the meantime, Professor Dan Simon at Cleveland State University has an accessible introduction here:\n", "\n", "http://academic.csuohio.edu/simond/courses/eec641/hinfinity.pdf\n", "\n", "In one sentence the $H_\\infty$ (H infinity) filter is like a Kalman filter, but it is robust in the face of non-Gaussian, non-predictable inputs.\n", "\n", "\n", "My FilterPy library contains an H-Infinity filter. I've pasted some test code below which implements the filter designed by Simon in the article above. Hope it helps." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAz0AAAGDCAYAAAABN35ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xl0G9W9B/DvaPEq77sdb/GSkM2E0ja0ySMEGmiAloSlJBxIymvLEs7j0UKgLQlJKbS0oa8t5xUCPJY+toa20D6WplACJ7SkDQRCFhLvdhI7lndLlmVLmvv+kDSWrMV2Ys3I8vdzTo5Bo7m6+ul6om/uzB1JCCFAREREREQUo3Rad4CIiIiIiCiSGHqIiIiIiCimMfQQEREREVFMY+ghIiIiIqKYxtBDREREREQxjaGHiIiIiIhiGkMPERERERHFNIYeIiIiIiKKaQw9REREREQU0xh6iIgoai1fvhySJE1qn2eeeQaSJOGZZ56JTKeIiGjaYeghIqJp5d1334UkSdi6davWXSEiomnCoHUHiIiIQvntb38Lm802qX1Wr16NJUuWoKCgIEK9IiKi6Yahh4iIolZJScmk90lLS0NaWloEekNERNMVT28jIiI/zc3NkCQJGzZswNGjR3HFFVcgMzMTycnJWLp0Kf76178G7GO32/GTn/wECxcuRFJSElJTU7Fs2TK89NJLQV/jlVdewQUXXID8/HzEx8cjPz8fS5cuxX//93/7PW/sNT0bNmzABRdcAADYtm0bJElS/rz77rsAwl/T8+GHH2LNmjXIzc1FfHw8SktLccstt6CtrS3guRs2bIAkSWhubsaOHTuwcOFCJCQkIC8vD9/+9rfR19c30ZISEZHGONNDRERBNTU14bzzzsOCBQtw0003ob29Hb/73e/w1a9+FS+88AK+8Y1vAABGRkawcuVK7NmzB/PmzcPGjRths9nw8ssvY+3atfj444/x0EMPKe0++uijuPXWW5Gfn4+vfe1ryM7OhtlsxqeffopnnnkGGzduDNmnK664AgDw7LPP4vzzz8fy5cuVbWVlZWHfz5/+9CdcffXVkCQJV111FUpKSvDhhx/isccew5/+9Ce8//77mD17dsB+mzZtwq5du3D55Zdj5cqV2L17N5588knU1tbivffem0RFiYhIM4KIiMhHU1OTACAAiDvvvNNv2759+4TBYBDp6emiv79fCCHEAw88IACIyy67TDgcDuW5p06dEsXFxQKA2LNnj/L44sWLRVxcnOjo6Ah47c7OTr//P//888XYv6p2794tAIj77rsvaP+ffvppAUA8/fTTymMWi0VkZmYKvV4v/v73v/s9/8EHHxQAxEUXXeT3+Pr16wUAUVJSIlpaWpTHHQ6HWLZsmQAg9u7dG7QPREQUXXh6GxERBZWWloYtW7b4PXbuuefiuuuuQ19fH1555RUAwFNPPQVJkvDwww/DYBg9gSAvLw+bN29WnuMlSRIMBgOMRmPAa2ZnZ0fireDVV19FT08Prr32WnzpS1/y23bnnXeitLQUb7/9NlpaWgL23bJli9+1RQaDAd/85jcBAPv27YtIf4mIaGox9BARUVDnnHMOUlJSAh73nlL28ccfw2KxoKGhAUVFRaiurg547kUXXQQA2L9/v/LYddddB5vNhvnz5+O73/0uXn31VXR2dkbmTXh8/PHHAKBcD+TLaDTi/PPP93uer3PPPTfgseLiYgBAb2/vVHaTiIgihKGHiIiCysvLC/p4fn4+AKC/vx/9/f1+j43lXTba+zwA+O53v4tnn30WJSUl+NWvfoXVq1cjLy8PF154oV84mkqn00+vYCvBeWe0XC7XVHWRiIgiiKGHiIiC6ujoCPr4qVOnAPgvDe19bKz29nblub5uuOEG7N27F93d3Xj99dfx7//+73j33XexcuXKiMz6nG4/iYgoNjD0EBFRUPv374fFYgl43Ls09OLFi5GSkoKKigqcPHkSdXV1Ac/dvXs3APepcsGkp6dj1apVeOKJJ7BhwwZ0d3djz549Yful1+sBTG6WZfHixX599+V0OvH++++H7ScREU1vDD1ERBRUf38/fvSjH/k99uGHH+L5559HWloaVq9eDQC48cYbIYTAXXfd5RdEurq6cP/99yvP8frLX/4Cp9MZ8HpmsxkAkJCQELZfWVlZAIDjx49P+L147zX04osvYu/evX7bfvnLX6KxsREXXXTRad0MlYiIoh/v00NEREH927/9G5588kn885//xJe//GXlPj2yLGPHjh1ITU0F4F797M0338Sf/vQn1NTUYNWqVcp9esxmMzZt2oSlS5cq7V577bVISEjA0qVLUVZWBiEE9uzZg3379uGcc85RFj8IZc6cOSgqKsJLL70Eo9GIkpISSJKE66+/HqWlpUH3MZlMeOqpp3D11Vfj/PPPx9VXX42SkhJ89NFH+Otf/4r8/Hzs2LFj6opHRERRhaGHiIiCKi8vx44dO3D33Xfjsccew/DwMM455xxs2bIFF198sfK8uLg4vPXWW/jFL36BF154AY888ggMBgNqamrwy1/+EmvXrvVr96c//Sl27dqF/fv344033kBCQgJKS0vx0EMP4ZZbbkFcXFzYfun1erzyyiu45557sHPnTlgsFgghsHTp0pChBwC+/vWv4+9//zsefPBB7Nq1C/39/cjPz8fNN9+MzZs3o7Cw8MwKRkREUUsSQgitO0FERNGjubkZ5eXlWL9+PZ555hmtu0NERHTGeE0PERERERHFtEmFnnfeeQc33ngj5s6di+TkZBQVFeHrX/86Pvroo4Dn7t+/HxdddBFMJhPS09OxZs0aNDY2TlnHiYiIiIiIJmJSoefRRx9Fc3Mzbr/9drzxxhv41a9+BbPZjCVLluCdd95Rnnf06FEsX74cIyMj2LlzJ5566inU1tZi2bJlEb/rNhERERERka9JXdNjNpuRm5vr95jVakVlZSUWLFiAt99+GwBwzTXXYPfu3WhoaFBW92lpaUFVVRXuuOMOPPTQQ1P4FoiIiIiIiEKbkoUMVqxYgZMnT+LYsWNwOp1ITU3FDTfcgMcee8zveRdffDGamppQW1vr97gsy5Bl2b9jkgRJks60a0REREREFEOEEBgbYXQ6HXS60CexnfGS1f39/di/fz9WrFgBAGhoaMDQ0BAWLVoU8NxFixbhrbfegt1u97v5nCzLGBwcPNOuEBERERHRDJScnBw29Jzx6m0bN27E4OAgfvjDHwIAuru7AQCZmZkBz83MzIQQAr29vWf6skRERERERBNyRjM9mzdvxvPPP49HHnkEn/vc5/y2hTs1jaetERERERGRWk57pmfbtm348Y9/jAceeAC33Xab8nhWVhaA0RkfXz09PZAkCenp6af7skRERERERJNyWjM927Ztw9atW7F161b84Ac/8NtWUVGBxMREHDx4MGC/gwcPorKy0u96HiD4zM945+WpoaenB7IsQ6fTBT1dj6Yea64N1l0brLv6WHNtsO7aYN3Vx5qrI9h6AOOdSTbp0HP//fdj69atuPfee3HfffcFNmgw4PLLL8cf//hH/OxnP0NKSgoA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jLV69WokJydz2fYzsG3bNvz4xz/GAw88gNtuu015nGM9skLVPRSO9TNTUlKCkpISAMCqVasAAN///vexfv16jvUIClf3UCvicaxri9f0jLFw4UJ89tlncDqdfo8fPHgQAJdQVpMQAgD/FUotFRUVSExMVMa6r4MHD6KyshIJCQka9GzmEkJAp+Nh+nRs27YNW7duxdatW/GDH/zAbxvHeuSEq3s4HOtT5wtf+AKcTicaGxs51lXkW/dwONa1w6qPsXr1alitVvzhD3/we/zZZ59FYWEhvvjFL2rUs5mlt7cXr732Gs4++2wekFViMBhw+eWX449//CMsFovyeGtrK3bv3o01a9Zo2LuZ5/e//z1sNhuWLFmidVemnfvvvx9bt27Fvffei/vuuy9gO8d6ZIxX91A41qfW7t27odPpMHv2bI51FfnWPRSOdW1JwvvP6aRYuXIlPvzwQzz00EOorKzEiy++iCeeeALPPfccrrvuOq27F3PWrVuHkpISnHvuucjOzkZdXR0efvhhNDQ04M0338RFF12kdRdjwptvvonBwUFYLBbceOONuPrqq3HNNdcAcE/NJyUl4ejRo/j85z+Pc845B/fcc49yE7uenh7exO40jVf3zs5OrFu3Dtdeey0qKyshSRLee+89/PKXv0RFRQX++c9/Ijk5WeN3MX08/PDDuPPOO3HJJZcE/eLt/bLBsT61JlL3lpYWjvUp9J3vfAepqan4whe+gLy8PHR1deHll1/G7373O9x111342c9+BoBjfapNpO4c61FKszsERTGLxSL+4z/+Q+Tn54u4uDixaNEi8eKLL2rdrZj1k5/8RJx99tkiLS1N6PV6kZOTI1avXi3+9a9/ad21mFJaWioABP3T1NSkPO/DDz8UF154oUhKShKpqaniiiuuEPX19dp1fJobr+49PT1i9erVoqysTCQmJoq4uDhRVVUlNm3aJPr6+rTu/rRz/vnnh6z32L/yONanzkTqzrE+tZ566imxbNkykZ2dLQwGg0hPTxfnn3+++N///d+A53KsT52J1J1jPTpxpoeIiIiIiGIar+khIiIiIqKYxtBDREREREQxjaGHiIiIiIhiGkMPERERERHFNIYeIiIiIiKKaQw9REREREQU0xh6iIiIiIgopjH0EBERERFRTGPoISIiIiKimMbQQ0REREREMY2hh4iIiIiIYhpDDxERERERxTSGHiIiIiIiimkMPUREREREFNMYeoiIiIiIKKYx9BARERERUUxj6CEiIiIiopjG0ENERERERDGNoYeIiIiIiGIaQw8REREREcU0hh4iIiIiIoppDD1ERERERBTTGHqIiIiIiCimMfQQEZGqysrKUFZWptrrNTc3Q5IkbNiwQbXXJCKi6MLQQ0REM9KGDRsgSRKam5u17goREUWYQesOEBERRVJRURE+++wzpKWlad0VIiLSCEMPERHFNKPRiLlz52rdDSIi0hBPbyMiIsUHH3wASZKwZs2akM+pqqpCfHw8enp6lMd27dqFVatWITs7G/Hx8aioqMBdd92Fvr6+Cb+23W7HT37yEyxcuBBJSUlITU3FsmXL8NJLL4Xc51//+he+8Y1voKioCPHx8SgoKMDKlSuxc+dO5TnBrumRJAnPPvssAKC8vBySJEGSJOVaoyVLlkCv14c89W379u2QJAkPP/zwhN8fERFphzM9RESkOO+881BdXY3XXnsN3d3dyMrK8tv+j3/8A/X19bjyyiuRmZkJAPjRj36E++67D1lZWbj00kuRm5uLTz/9FNu3b8cbb7yBf/zjH+OeWjYyMoKVK1diz549mDdvHjZu3AibzYaXX34Za9euxccff4yHHnrIb58nnngCt9xyC/R6Pb72ta+hqqoKZrMZ+/btw29+8xtcc801IV/vvvvuw6uvvooDBw7g9ttvR3p6OgAoP2+99VasX78eTzzxBB544AG/fYUQePzxxxEfH4/169dPrLBERKQtQURE5OOBBx4QAMQjjzwSsO2mm24SAMSf//xnIYQQ77zzjgAgvvzlL4u+vj6/5z799NMCgLj99tv9Hi8tLRWlpaVBX/Oyyy4TDodDefzUqVOiuLhYABB79uxRHj98+LAwGAwiIyNDHDp0KKCfra2tyn83NTUJAGL9+vV+z1m/fr0AIJqamgL2t9vtIjs7W+Tn5/v1Rwgh/va3vwkAYt26dQH7ERFRdOLpbURE5Of666+HTqdTTv/yGh4exu9+9zvk5ubiq1/9KgDg17/+NQDg8ccfD5jN2bBhA84++2y88MIL477mU089pZwuZjCMnoSQl5eHzZs3K8/xevTRR+F0OrF582bMnz8/oL3i4uIJvtvg4uPj8c1vfhOnTp3Cn//8Z79tO3bsAADcfPPNZ/QaRESkHp7e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mLkYzF0M5m48Zp6+eKQngd2t3fig3Q0JwG2fWCy6O/NCf38/+vr60N/fL7or8wpzF4O5G4+Zi8HcxWDuxmPm6YtFTwK/PhCaFeIfqp2oK84W3BsiIiIiIpoJTlk9gT5PAOsf+wOCioY3bz8HH6srEdaX+cTv90PTNEiSBLvdLro78wZzF4O5G4+Zi8HcxWDuxmPmxphJ7cCiJ4HmU8N492A3bj+Pp7YREREREaWDmdQOnMgggaVlOVhaliO6G0RERERENAu8poeIiIiIiDJaWhzpiXeGnaqqAnoSK/qwWU4Oj/gYgZmLwdzFYO7GY+ZiMHcxmLvxmLkx4tUJk12xkxbX9MiyDI/HI7obREREREQ0B2VnZ8Nimfh4Dk9vIyIiIiKijMaih4iIiIiIMhqLHiIiIiIiymhpcU2PqqrjLkiSJAmSJAnqERERERERpSNN08ZNXGAymdL/y0mJiIiIiIhShae3ERERERFRRmPRE4fb7cbXv/51VFRUwOFwYO3atfjlL38pulsZ67333tNPZxz774MPPhDdvYwwPDyM++67D5dccglKSkogSRIeeeSRuI/929/+hosuuggulwv5+fm46qqrcPToUWM7nCGmmvtNN90Ud/wvX77c+E7Pce+++y5uueUWLF++HNnZ2aisrMQVV1yBv/71r+Mey7GePFPNnWM9eXbv3o3LL78cNTU1cDqdKCwsxMaNG/Hyyy+PeyzHevJMNXeO9fSTFl9Omm6uuuoqfPjhh3j88cdxxhln4NVXX8V1110HVVVx/fXXi+5exnrsscdwwQUXxCyrr68X1JvM0tvbi5/97GdoaGjAlVdeieeeey7u4w4ePIjzzz8fa9euxa9+9Sv4fD7827/9GzZt2oTdu3ejpKTE4J7PbVPNHQCcTifefffdcctoep566in09vbia1/7GlauXImenh488cQT2LBhA7Zt24ZPfvKTADjWk22quQMc68kyMDCA6upqXHfddaisrITH48Err7yCG264AW1tbXj44YcBcKwn21RzBzjW045GMX77299qALRXX301ZvnFF1+sVVRUaLIsC+pZ5tq+fbsGQNuyZYvormQsVVU1VVU1TdO0np4eDYD27W9/e9zjrrnmGq24uFgbHBzUl7W1tWlWq1W77777jOpuxphq7jfeeKOWnZ1tcO8y06lTp8YtGx4e1srKyrQLL7xQX8axnlxTzZ1jPfXWr1+vVVdX6/c51o0xNneO9fTD09vGeOutt+ByuXDNNdfELL/55pvR2dmJnTt3CuoZ0cxNZTZEWZbxzjvv4Oqrr0Zubq6+vLa2FhdccAHeeuutVHcz43AWSuOVlpaOW+ZyubBy5Up0dHQA4FhPhankTsYoLi7Wv5WeY9040blTemLRM0ZjYyNWrFgxbuCuWbNGX0+pcdddd8FisSA3NxeXXnop3n//fdFdmldaWlrg9Xr1sR5tzZo1OHLkCHw+n4CezQ9erxfl5eUwm82oqqrC3Xffjb6+PtHdygiDg4P429/+hlWrVgHgWDfK2NwjONaTS1VVyLKMnp4e/Nd//Re2bduG+++/HwDHeiolyj2CYz29sCQdo7e3F4sWLRq3vLCwUF9PyZWXl4evfe1rOP/881FUVIQjR47ghz/8Ic4//3z89re/xaWXXiq6i/NCZGxHxnq0wsJCaJqG/v5+LFiwwOiuZbyGhgY0NDTo17Dt2LED//Ef/4E//vGP+PDDD+FyuQT3cG6766674PF48M1vfhMAx7pRxuYOcKynwp133olnnnkGAGCz2fDkk0/i9ttvB8CxnkqJcgc41tMRi544Ep2OwlNVkm/dunVYt26dfn/Tpk3YvHkzVq9ejfvuu49Fj8E4/o33jW98I+b+xRdfjHXr1uGf/umf8Oyzz45bT1P3rW99C6+88gp+8pOf4GMf+1jMOo711Jkod4715HvooYdw6623oru7G2+//TbuvvtueDwe3HPPPfpjONaTb7LcOdbTD4ueMYqKiuIezYkcjoz31xJKvvz8fHzmM5/B008/Da/Xy9lODFBUVAQg/tHMvr4+SJKE/Px8o7s1b23evBnZ2dmctn0WHn30UXznO9/Bd7/7Xdx99936co711Joo94lwrM9OTU0NampqAACf/vSnAQAPPvggbrzxRo71FEqU+0Qz4nGsi8VresZYvXo1Dhw4AFmWY5bv27cPAKdQNpKmaQD4VyijLF68GE6nUx/r0fbt24clS5bA4XAI6Nn8pWkaTCbupmfi0UcfxSOPPIJHHnkEDz30UMw6jvXUSZR7IhzryXPOOedAlmUcPXqUY91A0bknwrEuDlMfY/PmzXC73XjzzTdjlr/44ouoqKjA+vXrBfVsfunv78c777yDtWvXcodsEIvFgs9+9rP49a9/jeHhYX15e3s7tm/fjquuukpg7+afN954AyMjI9iwYYPorsw5//7v/45HHnkEDz/8ML797W+PW8+xnhqT5T4RjvXk2r59O0wmExYtWsSxbqDo3CfCsS6WpEX+nE66Sy65BB999BG+//3vY8mSJXjttdfw7LPP4uWXX8YXvvAF0d3LONdffz1qampw1llnobi4GM3NzXjiiSfQ0tKCrVu34qKLLhLdxYywdetWeDweDA8P45ZbbsE111yDz33ucwBCh+azsrJw8OBBnH322TjzzDPxwAMP6F9i19fXxy+xm6HJcu/p6cH111+Pa6+9FkuWLIEkSdixYwd+9KMfYfHixdi5cyeys7MFv4q544knnsA999yDyy67LO4H78iHDY715JpK7seOHeNYT6LbbrsNubm5OOecc1BWVobTp09jy5YteP3113HvvffiBz/4AQCO9WSbSu4c62lK2DcEpbHh4WHtX/7lX7Ty8nLNZrNpa9as0V577TXR3cpY3/ve97S1a9dqeXl5mtls1kpKSrTNmzdru3btEt21jFJbW6sBiPuvtbVVf9xHH32kXXjhhVpWVpaWm5urXXnlldqRI0fEdXyOmyz3vr4+bfPmzdrChQs1p9Op2Ww2benSpdp9992nDQwMiO7+nHPeeedNmPfY//I41pNnKrlzrCfXL37xC23Tpk1acXGxZrFYtPz8fO28887TXnrppXGP5VhPnqnkzrGennikh4iIiIiIMhqv6SEiIiIioozGooeIiIiIiDIaix4iIiIiIspoLHqIiIiIiCijseghIiIiIqKMxqKHiIiIiIgyGoseIiIiIiLKaCx6iIiIiIgoo7HoISIiIiKijMaih4iIiIiIMhqLHiIiIiIiymgseoiIiIiIKKP9f05+Uk7j+38GAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from __future__ import (absolute_import, division, print_function,\n", " unicode_literals)\n", "\n", "from numpy import array\n", "import matplotlib.pyplot as plt\n", "\n", "from filterpy.hinfinity import HInfinityFilter\n", "\n", "dt = 0.1\n", "f = HInfinityFilter(2, 1, dim_u=1, gamma=.01)\n", "\n", "f.F = array([[1., dt],\n", " [0., 1.]])\n", "\n", "f.H = array([[0., 1.]])\n", "f.G = array([[dt**2 / 2, dt]]).T\n", "\n", "f.P = 0.01\n", "f.W = array([[0.0003, 0.005],\n", " [0.0050, 0.100]])/ 1000 #process noise\n", "\n", "f.V = 0.01\n", "f.Q = 0.01\n", "u = 1. #acceleration of 1 f/sec**2\n", "\n", "xs = []\n", "vs = []\n", "\n", "for i in range(1,40):\n", " f.update (5)\n", " #print(f.x.T)\n", " xs.append(f.x[0,0])\n", " vs.append(f.x[1,0])\n", " f.predict(u=u)\n", "\n", "plt.subplot(211)\n", "plt.plot(xs)\n", "plt.title('position')\n", "plt.subplot(212)\n", "plt.plot(vs) \n", "plt.title('velocity');" ] } ], "metadata": { "anaconda-cloud": {}, "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.6.5" } }, "nbformat": 4, "nbformat_minor": 1 }