{ "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": [ "from __future__ import division, print_function\n", "%matplotlib inline" ] }, { "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": "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vQSj0YiSkhJIkoTrr78epaWlQfcxmUx46qmncPXVV+P888/H1VdfjZKSEnz00Uf461//ivz8fOzYsWPqikdERFGFoYeIiIIqLy/Hjh07cPfdd+Oxxx7D8PAwzjnnHGzZsgUXX3yx8ry4uDi89dZb+MUvfoEXXngBjzzyCAwGA2pqavDLX/4Sa9eu9Wv3pz/9KXbt2oX9+/fjjTfeQEJCAkpLS/HQQw/hlltuQVxcXNh+6fV6vPLKK7jnnnuwc+dOWCwWCCGwdOnSkKEHAL7+9a/j73//Ox588EHs2rUL/f39yM/Px80334zNmzejsLDwzApGRERRSxJCCK07QURE0aO5uRnl5eVYv349nnnmGa27Q0REdMZ4TQ8REREREcW0SYWed955BzfeeCPmzp2L5ORkFBUV4etf/zo++uijgOfu378fF110EUwmE9LT07FmzRo0NjZOWceJiIiIiIgmYlKh59FHH0VzczNuv/12vPHGG/jVr34Fs9mMJUuW4J133lGed/ToUSxfvhwjIyPYuXMnnnrqKdTW1mLZsmURv+s2ERERERGRr0ld02M2m5Gbm+v3mNVqRWVlJRYsWIC3334bAHDNNddg9+7daGhoUFb3aWlpQVVVFe644w489NBDU/gWiIiIiIiIQpuShQxWrFiBkydP4tixY3A6nUhNTcUNN9yAxx57zO95F198MZqamlBbW+v3uCzLkGXZv2OSBEmSzrRrREREREQUQ4QQGBthdDoddLrQJ7Gd8ZLV/f392L9/P1asWAEAaGhowNDQEBYtWhTw3EWLFuGtt96C3W73u/mcLMsYHBw8064QEREREdEMlJycHDb0nPHqbRs3bsTg4CB++MMfAgC6u7sBAJmZmQHPzczMhBACvb29Z/qyREREREREE3JGMz2bN2/G888/j0ceeQSf+9zn/LaFOzWNp60REREREZFaTnumZ9u2bfjxj3+MBx54ALfddpvyeFZWFoDRGR9fPT09kCQJ6enpp/uyREREREREk3JaMz3btm3D1q1bsXXrVvzgBz/w21ZRUYHExEQcPHgwYL+DBw+isrLS73oeIPjMz3jn5amhp6cHsixDp9MFPV2Pph5rrg3WXRusu/pYc22w7tpg3dXHmqsj2HoA451JNunQc//992Pr1q249957cd999wU2aDDg8ssvxx//+Ef87Gc/Q0pKCgCg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tXr1aiQnJ3PZ9jOwbds2/PjHP8YDDzyA2267TXmcYz2yQtU9FI71M1NSUoKSkhIAwKpVqwAA3//+97F+/XqO9QgKV/dQK+JxrGuL1/SMsXDhQnz22WdwOp1+jx88eBAAl1BWkxACAP8VSi0VFRVITExUxrqvgwcPorKyEgkJCRr0bOYSQkCn42H6dGzbtg1bt27F1q1b8YMf/MBvG8d65ISrezgc61PnC1/4ApxOJxobGznWVeRb93A41rXDqo+xevVqWK1W/OEPf/B7/Nlnn0VhYSG++MUvatSzmaW3txevvfYazj77bB6QVWIwGHD55Zfjj3/8IywWi/J4a2srdu/ejTVr1mjYu5nn97//PWw2G5YsWaJ1V6ad+++/H1u3bsW9996L++67L2A7x3pkjFf3UDjWp9bu3buh0+kwe/ZsjnUV+dY9FI51bUnC+8/ppFi5ciU+/PBDPPTQQ6isrMSLL76IJ554As899xyuu+46rbsXc9atW4eSkhKce+65yM7ORl1dHR5++GE0NDTgzTffxEUXXaR1F2PCm2++icHBQVgsFtx44424+uqrcc011wBwT80nJSXh6NGj+PznP49zzjkH99xzj3ITu56eHt7E7jSNV/fOzk6sW7cO1157LSorKyFJEt577z388pe/REVFBf75z38iOTlZ43cxfTz88MO48847cckllwT94u39ssGxPrUmUveWlhaO9Sn0ne98B6mpqfjCF76AvLw8dHV14eWXX8bvfvc73HXXXfjZz34GgGN9qk2k7hzrUUqzOwRFMYvFIv7jP/5D5Ofni7i4OLFo0SLx4osvat2tmPWTn/xEnH322SItLU3o9XqRk5MjVq9eLf71r39p3bWYUlpaKgAE/dPU1KQ878MPPxQXXnihSEpKEqmpqeKKK64Q9fX12nV8mhuv7j09PWL16tWirKxMJCYmiri4OFFVVSU2bdok+vr6tO7+tHP++eeHrPfYv/I41qfOROrOsT61nnrqKbFs2TKRnZ0tDAaDSE9PF+eff7743//934DncqxPnYnUnWM9OnGmh4iIiIiIYhqv6SEiIiIiopjG0ENERERERDGNoYeIiIiIiGIaQw8REREREcU0hh4iIiIiIoppDD1ERERERBTTGHqIiIiIiCimMfQQEREREVFMY+ghIiIiIqKYxtBDREREREQxjaGHiIiIiIhiGkMPERERERHFNIYeIiIiIiKKaQw9REREREQU0xh6iIiIiIgopjH0EBERERFRTGPoISIiIiKimMbQQ0REREREMY2hh4iIiIiIYhpDDxERERERxTSGHiIiIiIiimkMPUREREREFNMYeoiIiIiIKKYx9BARkarKyspQVlam2us1NzdDkiRs2LBBtdckIqLowtBDREQz0oYNGyBJEpqbm7XuChERRZhB6w4QERFFUlFRET777DOkpaVp3RUiItIIQw8REcU0o9GIuXPnat0NIiLSEE9vIyIixQcffABJkrBmzZqQz6mqqkJ8fDx6enqUx3bt2oVVq1YhOzsb8fHxqKiowF133YW+vr4Jv7bdbsdPfvITLFy4EElJSUhNTcWyZcvw0ksvhdznX//6F77xjW+gqKgI8fHxKCgowMqVK7Fz507lOcGu6ZEkCc8++ywAoLy8HJIkQZIk5VqjJUuWQK/Xhzz1bfv27ZAkCQ8//PCE3x8REWmHMz1ERKQ477zzUF1djddeew3d3d3Iysry2/6Pf/wD9fX1uPLKK5GZmQkA+NGPfoT77rsPWVlZuPTSS5Gbm4tPP/0U27dvxxtvvIF//OMf455aNjIygpUrV2LPnj2YN28eNm7cCJvNhpdffhlr167Fxx9/jIceeshvnyeeeAK33HIL9Ho9vva1r6Gqqgpmsxn79u3Db37zG1xzzTUhX+++++7Dq6++igMHDuD2229Heno6ACg/b731Vqxfvx5PPPEEHnjgAb99hRB4/PHHER8fj/Xr10+ssEREpC1BRETk44EHHhAAxCOPPBKw7aabbhIAxJ///GchhBDvvPOOACC+/OUvi76+Pr/nPv300wKAuP322/0eLy0tFaWlpUFf87LLLhMOh0N5/NSpU6K4uFgAEHv27FEeP3z4sDAYDCIjI0McOnQooJ+tra3Kfzc1NQkAYv369X7PWb9+vQAgmpqaAva32+0iOztb5Ofn+/VHCCH+9re/CQBi3bp1AfsREVF04ultRETk5/rrr4dOp1NO//IaHh7G7373O+Tm5uKrX/0qAODXv/41AODxxx8PmM3ZsGEDzj77bLzwwgvjvuZTTz2lnC5mMIyehJCXl4fNmzcrz/F69NFH4XQ6sXnzZsyfPz+gveLi4gm+2+Di4+PxzW9+E6dOncKf//xnv207duwAANx8881n9BpERKQent5GRER+iouLsWLFCrz99ts4cuQI5s2bBwD485//jL6+Ptxxxx1KMPnggw9gNBr9rqHxNTIygs7OzqCnynlZLBY0NDRg1qxZqK6uDth+0UUXAQD279+vPLZ3714AUMJXJNx8883Yvn07duzYoVzjZDab8eqrr2LevHlYtmxZxF6biIimFkMPEREFWL9+Pd5++208++yzyrU03pkf3+tYuru74XQ6sW3btrDtWa3WkKGnv78fAJCfnx90e0FBgd/zACgLJBQVFU3k7ZyW2bNn4+KLL8auXbvQ1NSE8vJyPP300xgZGcFNN90UsdclIqKpx9PbiIgowJo1a5CSkoLnnnsOLpcLZrMZu3btQk1NDWpqapTnpaWlISMjA0KIsH9KS0tDvpb3tLhTp04F3d7e3u73PGB0wYGTJ0+e8XsN59Zbb4UQAk888YTyMzExEddff31EX5eIiKYWQw8REQVISkrCVVddhba2Nrz99tt4/vnn4XQ6A1YrW7JkCXp7e3H48OHTfq2UlBRUVFTg5MmTqKurC9i+e/duAMA555zj97qAe6ns06XX6wEALpcr5HMuvfRSlJaW4qmnnsKbb76JhoYGXHPNNcjIyDjt1yUiIvUx9BARUVDe+9r89re/xW9/+1sYDAZcd911fs+54447AADf/va30dbWFtDG4OCgcv1NODfeeCOEELjrrrv8QkhXVxfuv/9+5Tlet9xyCwwGA370ox/h6NGjAe2dOHFi3Nf0nm53/PjxkM/R6XS46aab0NHRgW9961sAuIABEdF0JAkhhNadICKi6COEQEVFBU6cOAGHw4HLL788YCUzAHjooYfw/e9/H4mJiVi1ahXKy8thtVrR0tKC9957D0uXLsVf/vIX5fneG4D63vhzZGQEF154Id5//33Mnz8fq1atUu7TYzabsWnTpqD36bn55pthNBqV+/R0dXVh3759SEtLU2aImpubUV5ejvXr1+OZZ55R9t+1axcuueQSVFZW4sorr4TJZEJ6ejpuu+02v9cxm80oLi7GyMgIFi1ahAMHDpxhZYmISG0MPUREFNLWrVuVRQp+//vf48orrwz6vPfffx+//vWv8f7776OrqwtpaWkoKirCihUrsG7dOpx77rnKc4OFHgCw2+34xS9+gRdeeAENDQ0wGAyoqanBxo0bsXbt2qCv+8EHH2D79u3Ys2cP+vr6kJ2d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fXl7ezu2b9+Oq666SmDv5p833ngDIyMj2LBhg+iuzDn//u//jkceeQQPP/wwvv3tb49bz7GeGpPlPhGO9eTavn07TCYTFi1axLFuoOjcJ8KxLpakRf6cTrpLLrkEH330Eb7//e9jyZIleO211/Dss8/i5Zdfxhe+8AXR3cs4119/PWpqanDWWWehuLgYzc3NeOKJJ9DS0oKtW7fioosuEt3FjLB161Z4PB4MDw/jlltuwTXXXIPPfe5zAEKH5rOysnDw4EGcffbZOPPMM/HAAw/oX2LX19fHL7Gbocly7+npwfXXX49rr70WS5YsgSRJ2LFjB370ox9h8eLF2LlzJ7KzswW/irnjiSeewD333IPLLrss7gfvyIcNjvXkmkrux44d41hPottuuw25ubk455xzUFZWhtOnT2PLli14/fXXce+99+IHP/gBAI71ZJtK7hzraUrYNwSlseHhYe1f/uVftPLycs1ms2lr1qzRXnvtNdHdyljf+973tLVr12p5eXma2WzWSkpKtM2bN2u7du0S3bWMUltbqwGI+6+1tVV/3EcffaRdeOGFWlZWlpabm6tdeeWV2pEjR8R1fI6bLPe+vj5t8+bN2sKFCzWn06nZbDZt6dKl2n333acNDAyI7v6cc955502Y99j/8jjWk2cquXOsJ9cvfvELbdOmTVpxcbFmsVi0/Px87bzzztNeeumlcY/lWE+eqeTOsZ6eeKSHiIiIiIgyGq/pISIiIiKijMaih4iIiIiIMhqLHiIiIiIiymgseoiIiIiIKKOx6CEiIiIioozGooeIiIiIiDIaix4iIiIiIspoLHqIiIiIiCijseghIiIiIqKMxqKHiIiIiIgyGoseIiIiIiLKaCx6iIiIiIgoo/1/Tn5STuP7fwYAAAAASUVORK5CYII=\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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }