{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Kalman Filter for Bike Lean Angle Estimation\n", "\n", "You've seen this probably on MotoGP, where the camera mounted on the bike is exactly horizontal, even when the bike leans. This is not as easy at it seems." ] }, { "cell_type": "code", "execution_count": 725, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from IPython.display import YouTubeVideo" ] }, { "cell_type": "code", "execution_count": 726, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 726, "metadata": {}, "output_type": "execute_result" } ], "source": [ "YouTubeVideo('-p2ndhw-kfQ', width=720, height=390)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first try would be to use the gravitational force and just point the camera to the ground.\n", "\n", "Doesn't work on bikes, because they are leaning in exactly this angle, which is needed to compensate the gravitational force with the centrifugal force.\n", "\n", "![Bike Lean](https://upload.wikimedia.org/wikipedia/en/8/87/BikeLeanForces3.PNG)\n", "\n", "One has to use two different sensors:\n", "\n", "1. a rotationrate sensor for lean angle\n", "2. a acceleration sensor for gravitional force\n", "\n", "Both sensors have to be fused to estimate the lean angle. This is done with a Kalman Filter. We are using [Sympy](http://www.sympy.org/de/) do develop this filter." ] }, { "cell_type": "code", "execution_count": 727, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "from sympy import Symbol, symbols, Matrix, sin, cos, acos, pi\n", "from sympy.abc import phi, g, a\n", "from sympy import init_printing\n", "init_printing(use_latex=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The state vector to describe the state of the bike consists of two variables:\n", "\n", "$$\\vec x= \\left[ \\matrix{ \\phi \\\\ \\dot \\phi} \\right]$$\n", "\n", "which is the lean angle $\\phi$ (in radian) and the lean angle rate $\\dot \\phi$ (in radian per second)." ] }, { "cell_type": "code", "execution_count": 728, "metadata": { "collapsed": false }, "outputs": [], "source": [ "phis = symbols('phi')\n", "dphis = Symbol('\\dot \\phi')\n", "Ts = symbols('T')" ] }, { "cell_type": "code", "execution_count": 729, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\phi\\\\\\dot \\phi\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ φ ⎤\n", "⎢ ⎥\n", "⎣\\dot \\phi⎦" ] }, "execution_count": 729, "metadata": {}, "output_type": "execute_result" } ], "source": [ "state = Matrix([phis, dphis])\n", "state" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kalman Filter Prediction Step: System Dynamics\n", "\n", "But the state is driven by the lean angle rate $\\dot \\phi$ (in radian per second). So the Kalman Filter Equation for the Prediction Step is:\n", "\n", "$$\\vec x_{k+1} = A \\cdot \\vec x_{k}$$\n", "\n", "The dynamic matrix $A$ is simply:\n", "\n", "$$A = \\left[ \\matrix{ 1 & \\Delta T \\\\ 0 & 1 } \\right]$$\n", "\n", "with $\\Delta T$ as the time between two filtersteps (the sample time of the discrete Kalman Filter)." ] }, { "cell_type": "code", "execution_count": 730, "metadata": { "collapsed": true }, "outputs": [], "source": [ "Q = np.diag([0.1, 1.0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kalman Filter Update Step: Sensors\n", "\n", "We have two kind of sensors, which are usually available within a 6 Degrees of Freedom Inertial Measurement Unit (6DoF IMU):\n", "\n", "1. rotationrate sensor\n", "2. acceleration sensor\n", "\n", "The rotationrate sensor is measuring $\\dot \\phi$ directly, the acceleration sensor is measuring the gravitation, so not directly the lean angle $\\phi$. There is a mathematical link between the lean angle and the vertical acceleration $a$ measured by the acceleration sensor. It is the *cosine*. If the bike is upright, the acceleration $a$ is exactly $1g$, if it is $\\phi=90^\\circ$, it is $0g$.\n", "\n", "$$a = g \\cdot \\cos(90^\\circ - \\phi)$$\n", "\n", "so the measurement function $z(x)$ is\n", "\n", "$$\\phi = 90^\\circ - \\arccos \\left(\\frac{a}{g}\\right)$$" ] }, { "cell_type": "code", "execution_count": 731, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 731, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "a=np.linspace(-9.81, 9.81, 1000)\n", "plt.plot(a, 90-np.arccos(a/9.81)*180.0/np.pi)\n", "plt.xlabel('vertical Acceleration in m/s2')\n", "plt.ylabel('lean angle in Degree')\n", "plt.title('Lean angle as function of vertical acceleration (static!!!)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load some Measurements" ] }, { "cell_type": "code", "execution_count": 732, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 733, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 734, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = pd.read_csv('2016-09-12-Leaning2.csv', index_col='loggingTime', parse_dates=True)\n", "data = data[['accelerometerAccelerationX','gyroRotationY']].dropna()" ] }, { "cell_type": "code", "execution_count": 735, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dt = 1.0/50.0 # Hz" ] }, { "cell_type": "code", "execution_count": 736, "metadata": { "collapsed": false }, "outputs": [], "source": [ "t = data.index\n", "a_meas = data.accelerometerAccelerationX.values*-9.81 # in m/s2\n", "a_meas[a_meas>9.81] = 9.81\n", "a_meas[a_meas<-9.81] = -9.81\n", "dphi_meas = data.gyroRotationY.values # in rad/s" ] }, { "cell_type": "code", "execution_count": 737, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 737, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(np.pi/2-np.arccos(a_meas/9.81))\n", "plt.plot(dphi_meas)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kalman Filter\n", "\n", "![Kalman Filter Step](Kalman-Filter-Step.png)" ] }, { "cell_type": "code", "execution_count": 738, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.matrix([[0.0],\n", " [0.0]]) # Initial State\n", "A = np.matrix([[1.0, dt], [0.0, 1.0]])\n", "H = np.diag([1.0, 1.0])\n", "P = np.diag([100.0, 1.0])\n", "I = np.diag([1.0, 1.0])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 741, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x0=[]\n", "x1=[]\n", "P0=[]\n", "dstate=[]\n", "for filterstep in range(len(data)):\n", " \n", " # Time Update (Prediction)\n", " # ========================\n", " # Project the state ahead\n", " x = A*x\n", " \n", " # Project the error covariance ahead\n", " P = A*P*A.T + Q\n", " \n", " \n", " # Measurement Update (Correction)\n", " # ===============================\n", " # Compute the Kalman Gain\n", " \n", " # Measurement Noise is adaptive:\n", " # Assuming a pretty correct angle measurement, while the\n", " # bike is upright (vertical acceleration is nearly 1g),\n", " # and a pretty bad estimation while the bike is leaning.\n", " # So we make the R value adaptive to the lean angle\n", " # with low values while upright and high values for high\n", " # leaning angles.\n", " adaptivephi = np.abs(np.multiply(1000.0,float(x[0]))+0.001)\n", " R = np.diag([adaptivephi, 0.001])\n", "\n", "\n", " S = H*P*H.T + R\n", " K = (P*H.T) * np.linalg.pinv(S)\n", "\n", " \n", " # Update the estimate via z\n", " Z = np.matrix([[np.pi/2-np.arccos(a_meas[filterstep]/9.81)],\n", " [dphi_meas[filterstep]]])\n", "\n", " y = Z - (H*x) # Innovation or Residual\n", " x = x + (K*y)\n", " \n", " # Update the error covariance\n", " P = (I - (K*H))*P\n", "\n", "\n", "\n", " # Save states for Plotting\n", " x0.append(float(x[0]))\n", " x1.append(float(x[1]))\n", " P0.append(float(P[0,0]))" ] }, { "cell_type": "code", "execution_count": 742, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 742, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(t,np.multiply(x0,180.0/np.pi), label=r'$\\phi$')\n", "#plt.plot(t,x1, label=r'$\\dot \\phi$')\n", "#plt.plot(t, dphi_meas,label=r'$\\dot \\phi$ (ref)', alpha=0.5)\n", "plt.title('Estimated Lean Angle')\n", "plt.legend()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 0 }