{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "In this code example, we'll create a spline in 1D. In later examples, we'll create splines in 2D and 3D, and use them to control a quadrotor. But for now, we'll keep it simple and use flashlight to create a 1D spline.\n", "\n", "Note that we need to explicitly add the lib folder that contains flashlight to Python's system path for the duration of the Python session. This strategy enables us to import flashlight without needing to copy it into the Python distribution's site-packages folder. Modifying the Python system path in this way is not persistent. This installation-free design is intended to make flashlight easier to use in projects where developers don't have acces to the underlying Python distribution (e.g., on compute clusters, or on servers that undergraduates use)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n", "Initializing flashlight v0.0.1\n" ] } ], "source": [ "%pylab inline\n", "from pylab import *\n", "\n", "import path_utils\n", "path_utils.add_relative_to_current_source_file_path_to_sys_path(\"../../lib\")\n", "\n", "import flashlight.gradient_utils as gradient_utils\n", "import flashlight.spline_utils as spline_utils" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we need to specify the value of our 1D spline function at a few places. We will informally refer to the places where we specify the value of our function as _keyframes_. Then, we will compute a spline function that smoothly interpolates the keyframes we specify. In this example, `t` is the independent function parameter, and `p` is the value of the function. We specify an array of `t` values, and a corresponding array of `p` values. Note that the two arrays must have the same shape, and should each have one column for each spatial dimension. In this example, our keyframes are 1D, so our arrays of `t` and `p` values each have a single column." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "T = \n", "[[0]\n", " [1]\n", " [4]\n", " [5]]\n", "\n", "P = \n", "[[0]\n", " [9]\n", " [1]\n", " [4]]\n" ] } ], "source": [ "T = matrix([0,1,4,5]).T.A\n", "P = matrix([0,9,1,4]).T.A\n", "\n", "print \"T = \"; print T; print; print \"P = \"; print P" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to specifying keyframes, we also specify the degree of spline we want. In this example, we want `degree=7`. flashlight supports `degree=5,7,9`.\n", "\n", "We also specify what derivative (or mixture of derivatives) we want to minimize across our spline. We do this by specifying a `lamb` array. `lamb=[1,0,0,0,0]` would minimize the square of the 1st derivative across the spline, `lamb=[0,1,0,0,0]` would minimize the square of the 2nd derivative across the spline, and so on. The `lamb` array can also be used to specify tradeoffs between minimizing different derivaties. For example, `lamb=[0.5,0.5,0.0,0.0,0.0]` would trade off evenly between minimizing the square of the 1st and 2nd derivatives evenly.\n", "\n", "In our experience, minimizing the square of the 4th derivative (the 4th derivative is also known as the snap) of a 7th degree polynomial yields the smoothest and most reasonably bounded control signals for quadrotors. For more details on the underlying optimization problem being solved here, see [1].\n", "\n", "By default, the spline returned by `spline_utils.compute_minimum_variation_nonlocal_interpolating_b_spline_coefficients` will be C4 continuous.\n", "\n", "`spline_utils.compute_minimum_variation_nonlocal_interpolating_b_spline_coefficients` returns several objects that are used by flashlight internally to evaluate the spline. Understanding what these objects are isn't required to use flashlight correctly, but in case you're curious, `C` is an array that contains the polynomial coefficients for each segment of the spline in a normalized 0-to-1 parameter space. By default, `C` also contains the derivative values of the spline segments at the keyframe values, also in the normalized 0-to-1 parameter space, since these derivatives are solved for jointly with the polynomial coefficients.\n", "\n", "#### References\n", "\n", "[1] Niels Joubert, Mike Roberts, Anh Truong, Floraine Berthouzoz, Pat Hanrahan. An Interactive Tool for Designing Quadrotor Camera Shots. _ACM Transactions on Graphics 34(6) (SIGGRAPH Asia 2015)_." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "C, T, sd = \\\n", " spline_utils.compute_minimum_variation_nonlocal_interpolating_b_spline_coefficients(\n", " P, T, degree=7, lamb=[0,0,0,1,0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We solve for the polynomial coefficients in a normalized parameter space for numerical stability. But doing so makes evaluating the spline less straightforward. We provide the convenience function `spline_utils.evaluate_minimum_variation_nonlocal_interpolating_b_spline` for evaluating the splines computed with flashlight. `P_eval` contains the evaluated _p_ values. `T_eval` contains the evaluated `t` values." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "P_eval, T_eval, dT = \\\n", " spline_utils.evaluate_minimum_variation_nonlocal_interpolating_b_spline(\n", " C, T, sd, num_samples=500)\n", "\n", "t = T_eval[:,0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this point, we're ready to plot the spline. We see that our spline function does indeed interpolate our keyframes." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n9Gb4bhoqmgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "figsize(5,2);\n", "plot(t, P_eval[:,0]); scatter(T[:,0], P[:,0]);\n", "title(\"$p(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also verify that our spline is C4 continuous by plotting its derivatives. Note that we use `gradient_utils.gradients_scalar_wrt_scalar_smooth_boundaries` to compute the derivatives of our function. Our function is conceptually similar to `numpy.gradient`, except ours includes some extra logic to avoid numerical artifacts at the boundaries. This extra logic protects us from the pronounced boundary artifacts that can occur when computing high-order derivatives using finite differences. We see on these plots that our spline is indeed continuous up to the 4th derivative." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nf/4T0zuPPBJmzUodUT58/3301Bg2LL5UnDcZY4B9geerPmlm6wF/IAr33YEbzXS7qybNm8eI9SWX\npDn/7Nlw/fWwzjrw9dexLK9HDxXn0njnnJP94rw+VKDXw/PPx7rzk09OHYk0VSussAJ9+95Iq1Yd\nWXLJzWnVqiN9+97ICiuskDo0KY7rgdbA4MK2lDemDkhKa/nlY7/uL76APfaAzz5LHVG2zZgBnTpB\ns2Yxcr788qkjknJx9wnu/i6xLKiqvYl+HXPcfSLwLtCu3PHlxRFHwJgx8PLL5TunOzz5ZDRwfPzx\n+Ld7663a5lWkNiUv0M1sNzMbb2bvmNnZpT5fqcyZE4X5lVfqTp+k1aXLQUyaNJ4hQ25h0qTxdOly\nUOqQpEjcfS13b+Pumxe+uqWOSUpv8cWjyc2mm0YTpzFjUkeUTW+9Fc2jOnaEe++FxRZLHZFkxMrA\nR1UeTy08JzVYbLFoqnjmmVE4l9qbb8LOO8f5+vSBQYOyv05YJLWSFuhm1gy4AdgV2ADoYmbrlvKc\npTBjxgzOPXciSywxiwMOSB2NSIykb7XVVho5F6kQzZvHDeALLoAdd6y8LWMa6/77ozDv2RMuuihG\n0KXymNlgMxtd5WtM4b8Z6zueb4cfDl99FT0cSmXaNDjmmGiGue++sXvFHnuo14ZIXZS6x3M74F13\nnwRgZv2JqUjjS3zeorn//gc46qhzmTnzVVq23JH+/U/SiKWIiJTEoYdGE6d994VXX41GSi1apI4q\nndmzY+TtiSdiWuwmm6SOSErJ3XduwNumAr+p8niVwnM16tWr14/fN9XdLxZZBK66Co49Nka3W7cu\n3md//32MlPfpA0cdBRMmwNJLF+/zRfKk+u4XdVXSLu5mtj+wq7sfW3h8GNDO3U+uckxmO2rOmDGD\nNm3W5fvvJwDLA6Np1aojkyaN18ilSIXIWhd3ADPrDlwBLO/uNa5KznLulMabMQP++Mf47/33Q9u2\nqSMqv3ffjX3if/lL6NcvOvRKdqTKnWb2HHCGu79eeLw+cC+wNTG1fTCwVk0JUnnzp7p2hSWWiMZt\njTVvXmzj1qNHLNW57DJYY43Gf65IJalr3szELslZvZs5ceJEWrRoy/ffz+9CszEtWrRh4sSJKtBF\ncqqhdzPLxcxWAXYGJqWORdJZYYUYNb7uOth6a7jmGjjkkKYxPdQdbr89dk3p2RNOOKFp/H/LgpnZ\n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\nKn+WT7j7oMQx1eRk4F4zG0V01MzsNic1Ue5sOOXNolHeLB7lzTJQ3mwc5c6iUe4snorLneae9TX/\nIiIiIiIiIpUvEyPoIiIiIiIiIk2dCnQRERERERGRDFCBLiIiIiIiIpIBKtBFREREREREMkAFuoiI\niIiIiEgGqEAXERERERERyQAV6CIiIiIiIiIZoAJdREREREREJANUoEuumVlbM5tqZr9JHYuISF4o\nd4qI1I/yppSLCnTJu87AMsD01IGIiOSIcqeISP0ob0pZqECXvGsPvOLus1IHIiKSI8qdIiL1o7wp\nZaECXfKuPfBC6iBERHJGuVNEpH6UN6UsVKBL7pjZH8xsgJkNB34JdDSzp83s+NSxiYhklXKniEj9\nKG9KCubuqWMQaRAzOxa4FlhK041EROpGuVNEpH6UN6WcNIIuedYRGKFEKSJSL8qdIiL1o7wpZaMC\nXfKsA/B86iBERHKmA8qdIiL10QHlTSkTFeiSS2a2PrAiSpYiInWm3CkiUj/Km1JuKtAlr3YEZgMv\nAZjZUma2StqQREQyT7lTRKR+lDelrFSgS161B0a5+3eFx6cQyVNERGqn3CkiUj/Km1JWKtAlrxYB\nJgKY2ZbAd+4+PWlEIiLZp9wpIlI/yptSVtpmTXLJzDYG/g68DEx396sShyQiknnKnSIi9aO8KeWm\nAl1EREREREQkAzTFXURERERERCQDVKCLiIiIiIiIZIAKdBEREREREZEMUIEuIiIiIiIikgEq0EVE\n/r+9O4+Torr6P/45iCwqEJeIyKLgAIIIiooYEREEBSPozz1qNIkxBmMWE42ax6gxcY2P0UQT96gh\n4pInEY0LKGJE2cQFEEQ0QoAouKK4sZ3fH7dG22GW7pnqrqru7/v14sV0dXX1EWfO9Kl777kiIiIi\nIimgAl1EREREREQkBVSgi4iIiIiIiKSACnQRERERERGRFFCBLiIiIiIiIpICKtBFREREREREUkAF\nuoiIiIiIiEgKqEAXERERERERSQEV6CIiIiIiIiIpoAJdREREREREJAVUoIuIiIiIiIikgAp0ERER\nERERkRRQgS4iIiIiIiKSAirQRURERERERFJABbqIiIiIiIhICqhAFxEREREREUkBFeiSKDPbwsy+\nbWbHm9kNZqbvSRGRPJlZGzO7JOk4RESywMx+a2atzOz8pGMRqYuKIUnaEKC3u48D9gB2STYcEZFM\n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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dpdtN = gradient_utils.gradients_scalar_wrt_scalar_smooth_boundaries(\n", " P_eval[:,0], dT[0], max_gradient=5, poly_deg=5)\n", "\n", "figsize(14,6)\n", "\n", "subplot(231); plot(t, dpdtN[0,:]); scatter(T[:,0], P[:,0]); xlims=xlim();\n", "title(\"$p(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);\n", "\n", "subplot(232); plot(t, dpdtN[1,:]); xlim(xlims);\n", "title(\"$\\\\frac{d}{dt}p(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);\n", "\n", "subplot(233); plot(t, dpdtN[2,:]); xlim(xlims);\n", "title(\"$\\\\frac{d^2}{dt^2}p(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);\n", "\n", "subplot(234); plot(t, dpdtN[3,:]); xlim(xlims);\n", "title(\"$\\\\frac{d^3}{dt^3}p(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);\n", "\n", "subplot(235); plot(t, dpdtN[4,:]); xlim(xlims);\n", "title(\"$\\\\frac{d^4}{dt^4}p(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);\n", "\n", "subplot(236); plot(t, dpdtN[5,:]); xlim(xlims);\n", "title(\"$\\\\frac{d^5}{dt^5}p(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);\n", "\n", "gcf().tight_layout();" ] } ], "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.11" } }, "nbformat": 4, "nbformat_minor": 0 }