{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import sympy as sp\n", "%matplotlib inline\n", "sp.init_printing()" ] }, { "cell_type": "code", "execution_count": 348, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# formulation w/ neat latex / greek symbols\n", "\n", "f, h, s, ye, psie, w, xk, v, k, dt = sp.symbols(\"f, h, s, y_e, \\psi_e, \\omega, x_k, v, \\kappa, \\delta_t\", real=True)\n", "Cv, Tv, Cs, Ts, u_steering, u_acceleration = sp.symbols(\"C_v, T_v, C_s, T_s, u_\\delta, u_a\", real=True)\n", "mu_s, mu_g, mu_ax, mu_ay = sp.symbols(\"\\mu_\\delta \\mu_g, \\mu_{a_x}, \\mu_{a_y}\", real=True)\n", "c = sp.symbols(\"c\", function=True) # c(s) returns the curvature (1/radius) of the turn at track location s" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# source code friendly formulation\n", "\n", "f, h, s, ye, psie, w, xk, v, k, dt = sp.symbols(\"f, h, s, ye, psie, w, xk, v, k, dt\", real=True)\n", "Cv, Tv, Cs, Ts, u_steering, u_acceleration = sp.symbols(\"Cv, Tv, Cs, Ts, u_steering, u_acceleration\", real=True)\n", "mu_s, mu_g, mu_ax, mu_ay = sp.symbols(\"mu_s mu_g mu_ax, mu_ay\", real=True)\n", "c = sp.symbols(\"c\", function=True)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left ( f, \\quad h, \\quad ye, \\quad psie, \\quad w, \\quad xk, \\quad v, \\quad k, \\quad dt\\right )$$" ], "text/plain": [ "(f, h, ye, psie, w, xk, v, k, dt)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f, h, ye, psie, w, xk, v, k, dt" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nqfI/qBG9AZsHPSsAAAAASUVORK5CYII=\n", "text/latex": [ "$$\\left ( Cv, \\quad Tv, \\quad Cs, \\quad Ts, \\quad u_{steering}, \\quad u_{acceleration}\\right )$$" ], "text/plain": [ "(Cv, Tv, Cs, Ts, u_steering, u_acceleration)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Cv, Tv, Cs, Ts, u_steering, u_acceleration" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAM4AAAAWCAYAAACIcqOGAAAABHNCSVQICAgIfAhkiAAABDhJREFU\neJzt2lusXHMUx/GP3pxWD0EbVLQnpOq0cogiqgmnHBXqlrRFRVyCkijRhAcPjfPi8uChD6SEiPKg\nImhFItQlRKOuaVoRQpUg7uoSVdTlYe3J7Nln2jnTMzPN7LO/L7P32v/93+s3M///Wuv/3xQUFDSM\nI3BUxjYPW6q0fQOXNt2jxpM3PeRTUy2arXkszs4aR1Rp2IVF+DBjX4SfMrZunISvh+5fy8mbHvKp\nqRbN1vwHDsGFtRo+KUZZli9xd8a2GH9h3FC92wPkTQ/51FSLVmlehSmlk2zEuQhvi1GWZioOxSsZ\n+ylJ+20NdLAV5E0P+dRUi1ZqXo5lO7v4Ig6rYr8GO7Bvxv457myYa60jb3rIp6ZatFrzR9iHyojT\nKeqbL6rcMAfv49eUrQuT8SpGYXrj/WwaedNDPjXVotWa38JpVA6cGaqvTkAvPs7Y5uI/rMOJOG4Q\nD56GjjocbRa9GqOHfGqqxXDUDJtxbNZ4AZ6o0nhaypES3WK57/vk/HbsX+Ohc5J+qj2jlTRKD/nU\nVIvhqLnEDbiXCGUl9hYrEVl6RR65GSvxI75FHx7HfSJcbk3dc66olX7DaDyU3PMDjm+YjN2jV/16\nZmO+KDinYyKu076aRuE2kZaPFvsUNyb3zxZF9zF4V+T0Z+JmfCqfmkfiWpyAFSIlm4DnMTP1zD9V\n2cKZg+eqOLhKjOLB0omNyfHEKn3219FXM6hXz5H4QOgivtilmTb9Q3drSNSr6UHclBwfKP5cI0SR\nfVViPx9vJscrcXCmj/7dcbSBNEozLBD/1ceU92sWYnWmj1slutMRZ4uBXw6cKiLGYCmtcmwSI/aK\nzPUxdfTVDOrVcxceEdETevBApk07aerBxeKPUjp/Df+KjOPRxD4LTyfHl1fpJy+aYW3y2Yerk+Ne\nscCQ5iC8R2XY+Ux8GZ0pW7cYTNl18l2xPblvmSjM0rPzLOVotCfYHT1z8VJy3Cki0IbU9XbT1IfX\nlffqTsfLohbYrpyun6Gse79MH3nSDL/gLDFQfk9svQYOnJMlgyybrz2TdFpiMj5RWYDtii6R//4j\nwtwKsbNL5JELRf65p6hXD3yjXGwuwHrlmaodNW1VfhVlvKjd1uESUZsuFb9jj/IEkY44edNcYpKo\ndwj9k1ROkBPwd6mfvTIPOAAP47xBOpRlPJaIwTJOFJbLxepHuzJPpAWbRP7/rIGveLQTHbhHRJOx\nYucd3hGz+Eyx0TdWTIDb8JQovNuVXWku1eCHi7R8tZggx+CcVB93iJpvzc4ecplBvNA2TFkvVl4K\n8s1aXJ86n4r7B3PjlTi6GR61GbeI9/eIZeiNqr9RXtDezMBXIgObLZaxSy86d4gMo2LDd+ROOtqA\n75rjY1sxX6Sbk0XYXiIKyYJ8MUIMmimixl+Mn5NrO/BC8llQUFBQUFBQUFBQUJBL/ge+jTwSnCST\nWAAAAABJRU5ErkJggg==\n", "text/latex": [ "$$\\left ( \\mu_{s}, \\quad \\mu_{g}, \\quad \\mu_{ax}, \\quad \\mu_{ay}\\right )$$" ], "text/plain": [ "(μ_s, μ_g, μₐₓ, μ_ay)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mu_s, mu_g, mu_ax, mu_ay # steering and gyroscope bias" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{array}{ccccccccccccc}ye & psie & w & v & k & Cv & Tv & Cs & Ts & \\mu_{s} & \\mu_{g} & \\mu_{ax} & \\mu_{ay}\\end{array}\\right]$$" ], "text/plain": [ "[ye psie w v k Cv Tv Cs Ts μ_s μ_g μₐₓ μ_ay]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# removed s from state\n", "X = sp.Matrix([[ye, psie, w, v, k, Cv, Tv, Cs, Ts, mu_s, mu_g, mu_ax, mu_ay]])\n", "X" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}- dt v \\sin{\\left (psie \\right )} + ye\\\\dt \\left(\\frac{k v \\cos{\\left (psie \\right )}}{- k ye + 1} + w\\right) + psie\\\\dt \\left(v \\left(- \\mu_{s} + u_{steering}\\right) e^{Cs} - w\\right) e^{- Ts} + w\\\\dt \\left(u_{acceleration} e^{Cv} - v\\right) e^{- Tv} + v\\\\k\\\\Cv\\\\Tv\\\\Cs\\\\Ts\\\\\\mu_{s}\\\\\\mu_{g}\\\\\\mu_{ax}\\\\\\mu_{ay}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ -dt⋅v⋅sin(psie) + ye ⎤\n", "⎢ ⎥\n", "⎢ ⎛k⋅v⋅cos(psie) ⎞ ⎥\n", "⎢ dt⋅⎜───────────── + w⎟ + psie ⎥\n", "⎢ ⎝ -k⋅ye + 1 ⎠ ⎥\n", "⎢ ⎥\n", "⎢ ⎛ Cs ⎞ -Ts ⎥\n", "⎢dt⋅⎝v⋅(-μ_s + u_steering)⋅ℯ - w⎠⋅ℯ + w⎥\n", "⎢ ⎥\n", "⎢ ⎛ Cv ⎞ -Tv ⎥\n", "⎢ dt⋅⎝u_acceleration⋅ℯ - v⎠⋅ℯ + v ⎥\n", "⎢ ⎥\n", "⎢ k ⎥\n", "⎢ ⎥\n", "⎢ Cv ⎥\n", "⎢ ⎥\n", "⎢ Tv ⎥\n", "⎢ ⎥\n", "⎢ Cs ⎥\n", "⎢ ⎥\n", "⎢ Ts ⎥\n", "⎢ ⎥\n", "⎢ μ_s ⎥\n", "⎢ ⎥\n", "⎢ μ_g ⎥\n", "⎢ ⎥\n", "⎢ μₐₓ ⎥\n", "⎢ ⎥\n", "⎣ μ_ay ⎦" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# dynamic state variables f(x)\n", "\n", "eCv, eTv, eCs, eTs = sp.exp(Cv), sp.exp(Tv), sp.exp(Cs), sp.exp(Ts)\n", "fx = sp.Matrix([[\n", " ye - dt*v * sp.sin(psie),\n", " psie + dt*(w + v * k * sp.cos(psie) / (1 - k * ye)),\n", " w + dt*(v*eCs*(u_steering - mu_s) - w) / eTs,\n", " v + dt*(eCv * u_acceleration - v) / eTv,\n", " k, Cv, Tv, Cs, Ts, mu_s, mu_g, mu_ax, mu_ay\n", " ]])\n", "fx.T" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{array}{ccccccccccccc}1 & - dt v \\cos{\\left (psie \\right )} & 0 & - dt \\sin{\\left (psie \\right )} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\\\frac{dt k^{2} v \\cos{\\left (psie \\right )}}{\\left(k ye - 1\\right)^{2}} & \\frac{1}{k ye - 1} \\left(dt k v \\sin{\\left (psie \\right )} + k ye - 1\\right) & dt & - \\frac{dt k \\cos{\\left (psie \\right )}}{k ye - 1} & \\frac{dt v \\cos{\\left (psie \\right )}}{\\left(k ye - 1\\right)^{2}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & - dt e^{- Ts} + 1 & - dt \\left(\\mu_{s} - u_{steering}\\right) e^{Cs - Ts} & 0 & 0 & 0 & - dt v \\left(\\mu_{s} - u_{steering}\\right) e^{Cs - Ts} & dt \\left(v \\left(\\mu_{s} - u_{steering}\\right) e^{Cs} + w\\right) e^{- Ts} & - dt v e^{Cs - Ts} & 0 & 0 & 0\\\\0 & 0 & 0 & - dt e^{- Tv} + 1 & 0 & dt u_{acceleration} e^{Cv - Tv} & dt \\left(- u_{acceleration} e^{Cv} + v\\right) e^{- Tv} & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0\\\\0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\end{array}\\right]$$" ], "text/plain": [ "⎡ 1 -dt⋅v⋅cos(psie) 0 -dt⋅s\n", "⎢ \n", "⎢ 2 \n", "⎢dt⋅k ⋅v⋅cos(psie) dt⋅k⋅v⋅sin(psie) + k⋅ye - 1 -dt⋅k⋅c\n", "⎢───────────────── ─────────────────────────── dt ───────\n", "⎢ 2 k⋅ye - 1 k⋅y\n", "⎢ (k⋅ye - 1) \n", "⎢ \n", "⎢ -Ts \n", "⎢ 0 0 - dt⋅ℯ + 1 -dt⋅(μ_s - u_s\n", "⎢ \n", "⎢ \n", "⎢ 0 0 0 - dt⋅\n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎢ 0 0 0 \n", "⎢ \n", "⎣ 0 0 0 \n", "\n", "in(psie) 0 0 \n", " \n", " \n", "os(psie) dt⋅v⋅cos(psie) \n", "───────── ────────────── 0 \n", "e - 1 2 \n", " (k⋅ye - 1) \n", " \n", " Cs - Ts \n", "teering)⋅ℯ 0 0 \n", " \n", " -Tv Cv - Tv ⎛ \n", "ℯ + 1 0 dt⋅u_acceleration⋅ℯ dt⋅⎝- u_acceler\n", " \n", " 0 1 0 \n", " \n", " 0 0 1 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", "\n", " 0 0 0 \n", " \n", " \n", " \n", " 0 0 0 \n", " \n", " \n", " \n", " Cs - Ts ⎛ \n", " 0 -dt⋅v⋅(μ_s - u_steering)⋅ℯ dt⋅⎝v⋅(μ_s - u_steerin\n", " \n", " Cv ⎞ -Tv \n", "ation⋅ℯ + v⎠⋅ℯ 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 1 0 0 \n", " \n", " 0 1 0 \n", " \n", " 0 0 1 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", " \n", " 0 0 0 \n", "\n", " 0 0 0 0⎤\n", " ⎥\n", " ⎥\n", " ⎥\n", " 0 0 0 0⎥\n", " ⎥\n", " ⎥\n", " ⎥\n", " Cs ⎞ -Ts Cs - Ts ⎥\n", "g)⋅ℯ + w⎠⋅ℯ -dt⋅v⋅ℯ 0 0 0⎥\n", " ⎥\n", " ⎥\n", " 0 0 0 0⎥\n", " ⎥\n", " 0 0 0 0⎥\n", " ⎥\n", " 0 0 0 0⎥\n", " ⎥\n", " 0 0 0 0⎥\n", " ⎥\n", " 0 0 0 0⎥\n", " ⎥\n", " 0 0 0 0⎥\n", " ⎥\n", " 1 0 0 0⎥\n", " ⎥\n", " 0 1 0 0⎥\n", " ⎥\n", " 0 0 1 0⎥\n", " ⎥\n", " 0 0 0 1⎦" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Fx = sp.simplify(sp.Matrix([sp.diff(fx, Xj) for Xj in X]).T)\n", "Fx" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dt = Symbol('dt')\n", "v = Symbol('v')\n", "psie = Symbol('psie')\n", "k = Symbol('k')\n", "ye = Symbol('ye')\n", "Ts = Symbol('Ts')\n", "mu_s = Symbol('mu_s')\n", "u_steering = Symbol('u_steering')\n", "Cs = Symbol('Cs')\n", "w = Symbol('w')\n", "Tv = Symbol('Tv')\n", "u_acceleration = Symbol('u_acceleration')\n", "Cv = Symbol('Cv')\n", "e = ImmutableMatrix([[1, -dt*v*cos(psie), 0, -dt*sin(psie), 0, 0, 0, 0, 0, 0, 0, 0, 0], [dt*k**2*v*cos(psie)/(k*ye - 1)**2, (dt*k*v*sin(psie) + k*ye - 1)/(k*ye - 1), dt, -dt*k*cos(psie)/(k*ye - 1), dt*v*cos(psie)/(k*ye - 1)**2, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, -dt*exp(-Ts) + 1, -dt*(mu_s - u_steering)*exp(Cs - Ts), 0, 0, 0, -dt*v*(mu_s - u_steering)*exp(Cs - Ts), dt*(v*(mu_s - u_steering)*exp(Cs) + w)*exp(-Ts), -dt*v*exp(Cs - Ts), 0, 0, 0], [0, 0, 0, -dt*exp(-Tv) + 1, 0, dt*u_acceleration*exp(Cv - Tv), dt*(-u_acceleration*exp(Cv) + v)*exp(-Tv), 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])\n" ] } ], "source": [ "sp.print_python(Fx)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\frac{- x_{CG} \\tan{\\left (psie \\right )} + ye}{\\cos{\\left (psie \\right )}}\\\\\\tan{\\left (psie \\right )}\\\\- 2 k\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-x_CG⋅tan(psie) + ye⎤\n", "⎢────────────────────⎥\n", "⎢ cos(psie) ⎥\n", "⎢ ⎥\n", "⎢ tan(psie) ⎥\n", "⎢ ⎥\n", "⎣ -2⋅k ⎦" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# h\n", "x_cg = sp.symbols(\"x_CG\")\n", "hx = sp.Matrix([\n", " [(ye - x_cg*sp.tan(psie)) / sp.cos(psie),\n", " sp.tan(psie),\n", " -2*k\n", " ]]) # fitting x = a + by + cy^2\n", "hx.T" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "psie = Symbol('psie')\n", "x_CG = Symbol('x_CG')\n", "ye = Symbol('ye')\n", "e = ImmutableMatrix([[1/cos(psie), (x_CG - 2*x_CG/cos(psie)**2 + ye*tan(psie))/cos(psie), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, cos(psie)**(-2), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0]])\n" ] }, { "data": { "text/latex": [ "$$\\left[\\begin{array}{ccccccccccccc}\\frac{1}{\\cos{\\left (psie \\right )}} & \\frac{1}{\\cos{\\left (psie \\right )}} \\left(x_{CG} - \\frac{2 x_{CG}}{\\cos^{2}{\\left (psie \\right )}} + ye \\tan{\\left (psie \\right )}\\right) & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & \\frac{1}{\\cos^{2}{\\left (psie \\right )}} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & -2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\end{array}\\right]$$" ], "text/plain": [ "⎡ 2⋅x_CG \n", "⎢ x_CG - ────────── + ye⋅tan(psie) \n", "⎢ 2 \n", "⎢ 1 cos (psie) \n", "⎢───────── ──────────────────────────────── 0 0 0 0 0 0 0 0 0 0 0\n", "⎢cos(psie) cos(psie) \n", "⎢ \n", "⎢ 1 \n", "⎢ 0 ────────── 0 0 0 0 0 0 0 0 0 0 0\n", "⎢ 2 \n", "⎢ cos (psie) \n", "⎢ \n", "⎣ 0 0 0 0 -2 0 0 0 0 0 0 0 0\n", "\n", "⎤\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎥\n", "⎦" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# H\n", "Hx = sp.simplify(sp.Matrix([sp.diff(hx, Xj) for Xj in X]).T)\n", "sp.print_python(Hx.subs([(psie, \"psie\"), (ye, \"ye\")]))\n", "Hx" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{array}{ccccccccccccc}ye & psie & w & v & k & Cv & Tv & Cs & Ts & \\mu_{s} & \\mu_{g} & \\mu_{ax} & \\mu_{ay}\\end{array}\\right]$$" ], "text/plain": [ "[ye psie w v k Cv Tv Cs Ts μ_s μ_g μₐₓ μ_ay]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\mu_{g} + w\\\\\\mu_{ax} + v w\\\\\\mu_{ay} + \\left(- u_{acceleration} e^{Cv} + v\\right) e^{- Tv}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ μ_g + w ⎤\n", "⎢ ⎥\n", "⎢ μₐₓ + v⋅w ⎥\n", "⎢ ⎥\n", "⎢ ⎛ Cv ⎞ -Tv⎥\n", "⎣μ_ay + ⎝- u_acceleration⋅ℯ + v⎠⋅ℯ ⎦" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# measure gyro_z, accel_x, accel_y\n", "h_imu = sp.Matrix([[\n", " w + mu_g,\n", " v*w + mu_ax,\n", " -(sp.exp(Cv) * u_acceleration - v) / sp.exp(Tv) + mu_ay,\n", " ]])\n", "h_imu.T" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{array}{ccccccccccccc}0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\\\0 & 0 & v & w & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0\\\\0 & 0 & 0 & e^{- Tv} & 0 & - u_{acceleration} e^{Cv - Tv} & \\left(u_{acceleration} e^{Cv} - v\\right) e^{- Tv} & 0 & 0 & 0 & 0 & 0 & 1\\end{array}\\right]$$" ], "text/plain": [ "⎡0 0 1 0 0 0 0 0 \n", "⎢ \n", "⎢0 0 v w 0 0 0 0 \n", "⎢ \n", "⎢ -Tv Cv - Tv ⎛ Cv ⎞ -Tv \n", "⎣0 0 0 ℯ 0 -u_acceleration⋅ℯ ⎝u_acceleration⋅ℯ - v⎠⋅ℯ 0 \n", "\n", " 0 0 1 0 0⎤\n", " ⎥\n", " 0 0 0 1 0⎥\n", " ⎥\n", " ⎥\n", " 0 0 0 0 1⎦" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H_imu = sp.simplify(sp.Matrix([sp.diff(h_imu, Xj) for Xj in X]).T)\n", "H_imu" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "v = Symbol('v')\n", "w = Symbol('w')\n", "Tv = Symbol('Tv')\n", "u_acceleration = Symbol('u_acceleration')\n", "Cv = Symbol('Cv')\n", "e = ImmutableMatrix([[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, v, w, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, exp(-Tv), 0, -u_acceleration*exp(Cv - Tv), (u_acceleration*exp(Cv) - v)*exp(-Tv), 0, 0, 0, 0, 0, 1]])\n" ] } ], "source": [ "sp.print_python(H_imu)" ] }, { "cell_type": "code", "execution_count": 409, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "e = ImmutableMatrix([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]])\n" ] }, { "data": { "text/latex": [ "$$\\left[\\begin{array}{cccccccccccccc}1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\end{array}\\right]$$" ], "text/plain": [ "⎡1 0 0 0 0 0 0 0 0 0 0 0 0 0⎤\n", "⎢ ⎥\n", "⎣0 0 0 0 0 1 0 0 0 0 0 0 0 0⎦" ] }, "execution_count": 409, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h_s = sp.Matrix([[s, k]])\n", "H_s = sp.simplify(sp.Matrix([sp.diff(h_s, Xj) for Xj in X]).T)\n", "sp.print_python(H_s)\n", "H_s" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# so S is just P[0,0] + variance(s)\n", "# which means K is the left column of P (P H.T) divided by P[0,0] + variance(s)\n", "# so as our estimate of s is refined, everything else is affected too by the covariance in P." ] }, { "cell_type": "code", "execution_count": 332, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}1 & \\frac{dt v ye \\cos{\\left (psie \\right )}}{\\left(k ye - 1\\right)^{2}}\\\\\\frac{dt v ye \\cos{\\left (psie \\right )}}{\\left(k ye - 1\\right)^{2}} & \\frac{dt^{2} v^{2} ye^{2} \\cos^{2}{\\left (psie \\right )}}{\\left(k ye - 1\\right)^{4}} + \\frac{dt^{2} v^{2} \\cos^{2}{\\left (psie \\right )}}{\\left(k ye - 1\\right)^{4}} + 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ dt⋅v⋅ye⋅cos(psie) ⎤\n", "⎢ 1 ───────────────── ⎥\n", "⎢ 2 ⎥\n", "⎢ (k⋅ye - 1) ⎥\n", "⎢ ⎥\n", "⎢ 2 2 2 2 2 2 2 ⎥\n", "⎢dt⋅v⋅ye⋅cos(psie) dt ⋅v ⋅ye ⋅cos (psie) dt ⋅v ⋅cos (psie) ⎥\n", "⎢───────────────── ───────────────────── + ───────────────── + 1⎥\n", "⎢ 2 4 4 ⎥\n", "⎣ (k⋅ye - 1) (k⋅ye - 1) (k⋅ye - 1) ⎦" ] }, "execution_count": 332, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H_s * Fx.T * Fx * H_s.T" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 377, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left(- p_{x} - y_{e} e^{i \\psi_e} - \\frac{i}{\\kappa} \\left(e^{i \\kappa s} - 1\\right) e^{i \\psi_e}\\right)^{2}$$" ], "text/plain": [ " 2\n", "⎛ ⎛ ⅈ⋅\\kappa⋅s ⎞ ⅈ⋅\\psiₑ⎞ \n", "⎜ ⅈ⋅\\psiₑ ⅈ⋅⎝ℯ - 1⎠⋅ℯ ⎟ \n", "⎜-pₓ - yₑ⋅ℯ - ────────────────────────────⎟ \n", "⎝ \\kappa ⎠ " ] }, "execution_count": 377, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# regression on curve given pixels\n", "px, c = sp.symbols(\"p_x, c\", complex=True)\n", "p = (-ye*sp.exp(sp.I*psie) - sp.I/k * sp.exp(sp.I*psie) * (sp.exp(sp.I*k*s) - 1))\n", "(p - px)**2" ] }, { "cell_type": "code", "execution_count": 376, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}- \\frac{2}{\\kappa^{3}} \\left(\\kappa \\left(p_{x} + y_{e} e^{i \\psi_e}\\right) + i \\left(e^{i \\kappa s} - 1\\right) e^{i \\psi_e}\\right) \\left(\\kappa s e^{i \\left(\\kappa s + \\psi_e\\right)} + i \\left(e^{i \\kappa s} - 1\\right) e^{i \\psi_e}\\right)\\\\\\frac{2}{\\kappa^{2}} \\left(\\kappa \\left(p_{x} + y_{e} e^{i \\psi_e}\\right) + i \\left(e^{i \\kappa s} - 1\\right) e^{i \\psi_e}\\right) \\left(i \\kappa y_{e} - e^{i \\kappa s} + 1\\right) e^{i \\psi_e}\\\\\\frac{2}{\\kappa} \\left(\\kappa \\left(p_{x} + y_{e} e^{i \\psi_e}\\right) + i \\left(e^{i \\kappa s} - 1\\right) e^{i \\psi_e}\\right) e^{i \\psi_e}\\\\- \\frac{2}{\\kappa} \\left(\\kappa \\left(p_{x} + y_{e} e^{i \\psi_e}\\right) + i \\left(e^{i \\kappa s} - 1\\right) e^{i \\psi_e}\\right) e^{i \\left(\\kappa s + \\psi_e\\right)}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ ⎛ ⎛ ⅈ⋅\\psiₑ⎞ ⎛ ⅈ⋅\\kappa⋅s ⎞ ⅈ⋅\\psiₑ⎞ ⎛ ⅈ⋅(\\\n", "⎢-2⋅⎝\\kappa⋅⎝pₓ + yₑ⋅ℯ ⎠ + ⅈ⋅⎝ℯ - 1⎠⋅ℯ ⎠⋅⎝\\kappa⋅s⋅ℯ \n", "⎢─────────────────────────────────────────────────────────────────────────────\n", "⎢ 3 \n", "⎢ \\kappa \n", "⎢ \n", "⎢ ⎛ ⎛ ⅈ⋅\\psiₑ⎞ ⎛ ⅈ⋅\\kappa⋅s ⎞ ⅈ⋅\\psiₑ⎞ ⎛ \n", "⎢ 2⋅⎝\\kappa⋅⎝pₓ + yₑ⋅ℯ ⎠ + ⅈ⋅⎝ℯ - 1⎠⋅ℯ ⎠⋅⎝ⅈ⋅\\\n", "⎢ ─────────────────────────────────────────────────────────────────\n", "⎢ 2 \n", "⎢ \\kappa \n", "⎢ \n", "⎢ ⎛ ⎛ ⅈ⋅\\psiₑ⎞ ⎛ ⅈ⋅\\kappa⋅s \n", "⎢ 2⋅⎝\\kappa⋅⎝pₓ + yₑ⋅ℯ ⎠ + ⅈ⋅⎝ℯ - 1\n", "⎢ ─────────────────────────────────────────────────\n", "⎢ \\kappa \n", "⎢ \n", "⎢ ⎛ ⎛ ⅈ⋅\\psiₑ⎞ ⎛ ⅈ⋅\\kappa⋅s ⎞ ⅈ⋅\\\n", "⎢ -2⋅⎝\\kappa⋅⎝pₓ + yₑ⋅ℯ ⎠ + ⅈ⋅⎝ℯ - 1⎠⋅ℯ \n", "⎢ ────────────────────────────────────────────────────────\n", "⎣ \\kappa \n", "\n", "kappa⋅s + \\psiₑ) ⎛ ⅈ⋅\\kappa⋅s ⎞ ⅈ⋅\\psiₑ⎞ ⎤\n", " + ⅈ⋅⎝ℯ - 1⎠⋅ℯ ⎠ ⎥\n", "─────────────────────────────────────────────────⎥\n", " ⎥\n", " ⎥\n", " ⎥\n", " ⅈ⋅\\kappa⋅s ⎞ ⅈ⋅\\psiₑ ⎥\n", "kappa⋅yₑ - ℯ + 1⎠⋅ℯ ⎥\n", "──────────────────────────────────── ⎥\n", " ⎥\n", " ⎥\n", " ⎥\n", "⎞ ⅈ⋅\\psiₑ⎞ ⅈ⋅\\psiₑ ⎥\n", "⎠⋅ℯ ⎠⋅ℯ ⎥\n", "──────────────────── ⎥\n", " ⎥\n", " ⎥\n", "psiₑ⎞ ⅈ⋅(\\kappa⋅s + \\psiₑ) ⎥\n", " ⎠⋅ℯ ⎥\n", "──────────────────────────── ⎥\n", " ⎦" ] }, "execution_count": 376, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.simplify(sp.Matrix([sp.diff((p - px)**2, x) for x in [k, psie, ye, s]]))" ] }, { "cell_type": "code", "execution_count": 385, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$$\\left(- c + p_{x} + \\frac{e^{i \\theta_x}}{\\kappa}\\right)^{2}$$" ], "text/plain": [ " 2\n", "⎛ ⅈ⋅\\thetaₓ⎞ \n", "⎜ ℯ ⎟ \n", "⎜-c + pₓ + ──────────⎟ \n", "⎝ \\kappa ⎠ " ] }, "execution_count": 385, "metadata": {}, "output_type": "execute_result" } ], "source": [ "px, c = sp.symbols(\"p_x, c\", complex=True)\n", "thetax = sp.symbols('\\\\theta_x', real=True)\n", "\n", "(px - c + sp.exp(sp.I * thetax) / k)**2" ] }, { "cell_type": "code", "execution_count": 391, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}2 c - 2 p_{x} - \\frac{2}{\\kappa} e^{i \\theta_x}\\\\- 2 c + 2 p_{x} + \\frac{2}{\\kappa} e^{i \\theta_x}\\\\\\frac{2 i}{\\kappa} \\left(- c + p_{x} + \\frac{e^{i \\theta_x}}{\\kappa}\\right) e^{i \\theta_x}\\\\- \\frac{2}{\\kappa^{2}} \\left(- c + p_{x} + \\frac{e^{i \\theta_x}}{\\kappa}\\right) e^{i \\theta_x}\\end{matrix}\\right]$$" ], "text/plain": [ "⎡ ⅈ⋅\\thetaₓ ⎤\n", "⎢ 2⋅ℯ ⎥\n", "⎢ 2⋅c - 2⋅pₓ - ──────────── ⎥\n", "⎢ \\kappa ⎥\n", "⎢ ⎥\n", "⎢ ⅈ⋅\\thetaₓ ⎥\n", "⎢ 2⋅ℯ ⎥\n", "⎢ -2⋅c + 2⋅pₓ + ──────────── ⎥\n", "⎢ \\kappa ⎥\n", "⎢ ⎥\n", "⎢ ⎛ ⅈ⋅\\thetaₓ⎞ ⎥\n", "⎢ ⎜ ℯ ⎟ ⅈ⋅\\thetaₓ⎥\n", "⎢2⋅ⅈ⋅⎜-c + pₓ + ──────────⎟⋅ℯ ⎥\n", "⎢ ⎝ \\kappa ⎠ ⎥\n", "⎢─────────────────────────────────────⎥\n", "⎢ \\kappa ⎥\n", "⎢ ⎥\n", "⎢ ⎛ ⅈ⋅\\thetaₓ⎞ ⎥\n", "⎢ ⎜ ℯ ⎟ ⅈ⋅\\thetaₓ ⎥\n", "⎢-2⋅⎜-c + pₓ + ──────────⎟⋅ℯ ⎥\n", "⎢ ⎝ \\kappa ⎠ ⎥\n", "⎢─────────────────────────────────────⎥\n", "⎢ 2 ⎥\n", "⎣ \\kappa ⎦" ] }, "execution_count": 391, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(sp.Matrix([sp.diff((px - c + sp.exp(sp.I * thetax) / k)**2, x) for x in [c, px, thetax, k]]))" ] }, { "cell_type": "code", "execution_count": 421, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAE8AAAAuCAYAAABpnER5AAAABHNCSVQICAgIfAhkiAAAA5dJREFU\naIHt2luIVXUUx/GP42hNk00WWXQliyKdDMpu1jhaYoRYEUikBF0kKDNMMojCeioQe6weeqmIiu4Y\nFBGBMg9lOBQFE5RR9DBdCIIuRJnZw9qHOWz2ObPPaZ995uD+wub89zr7/P+/ffmv9d9rnVl6lz5s\nwkCyv6OLWnqOtTgtab+Oi8oW0Ff2gAVyFm5O2l+bupAVOTgC85L2ezi5bAGzyx6wQA7ib4zgX7zb\nXTm9xxC2d1vETGYBnsenGd9twpxkW1WmqF5iIx5L2dbjV/yMXzBctqhe4RVc2W0RvUgfvhLBbQ12\n4je9HexK42J8gFtxCvpxZjcF9RIPYRJ7cG2XtfQcu3EpVorAAIu7pqaHGBTRtB8nYSKx39M1RXXM\ndKe7FMfjNfyBy8RFfEsEjYqKw5BZde0L8GzK1oxPcFvRgioOE/I+Zc04VEAfFRUVNS7ECk3yhZ2o\nYSyQbxHbh814INm6xflYl2FfjHGcUZaQuXgBR+U4tszq13Q3ahsuz7BfYqrI1HHuxE05j91i6kR2\n4IaOKAqmu1EDeCdle0QE1BdxdFanRU7b2bhDvDrl4elkI9aYHxeoJc10Zco/8SVG62xjWIbv8HsH\ntSEyH8+18bsRPFiwljR5ypTX4KlWOi3yyRuVXaRpxpBINT1eoI4s/hKJhBGR4prMOGYfltftH2qw\ndYRXsTpla1b5otzqV54y5aQG/q3TjMmOmFmVL8qvfuW5UV9gYdK+AlcpKXc4gXMy7DOh8pX3Rn0k\nlidwb/L5ZGelBRM4N2Uro/I1iK14E9djA57A1W30tdfUxSOCzKP/U18uxlIDU07l6xZxkh/ixsS2\nCJ+10dd+U9MWbsdxjQ7ub2OARvyA+Snbapwn8n4/ij/jfJOzv81ifdaIvXgJu3AAZydtOFWk71tl\nPn5K2luT8Rfh/jb6aoltuC9l262cytcKvF23v1Mkdlthnhaf1iLXeXvENK0xKBzzuIhi3yf2lQWO\nWWMUnyftE3Cd1n3VUuF6clPktN2H08VS4ACWiNX8P2LKjuMuvFHgmDWWi9e7DcLvrsO3OFZE+mHh\nVlbhbhF506zFyx3QlpuN8icGimKO8FNZEbwWnB4Ws2KoQR8DImHQVebiGfEuWRbLRETP4hgxu3YJ\nF9UoAG0Rvrklii56HxRRcL2Yxp1miUhnnSii+P7U99tFBuVI4UoGRJaknmHx9L7fUaUVFRUVFRUV\nbfAfr4KiK/bGXpUAAAAASUVORK5CYII=\n", "text/latex": [ "$$- \\frac{k^{2}}{\\left(k^{2} - p_{x}^{2}\\right)^{\\frac{3}{2}}}$$" ], "text/plain": [ " 2 \n", " -k \n", "─────────────\n", " 3/2\n", "⎛ 2 2⎞ \n", "⎝k - pₓ ⎠ " ] }, "execution_count": 421, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sp.simplify(sp.diff(sp.sqrt(k**2 - px**2), px, px))" ] }, { "cell_type": "code", "execution_count": 426, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# -> -1/r. ok. confirmed." ] }, { "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.10" } }, "nbformat": 4, "nbformat_minor": 0 }