{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "In this code example, we'll compute the control forces required for a 3D quadrotor to follow a trajectory." ] }, { "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", "flashlight.quadrotor_3d: Constructing sympy symbols...\n", "flashlight.quadrotor_3d: Finished constructing sympy symbols (0.008 seconds).\n", "flashlight.quadrotor_3d: Loading sympy modules...\n", "flashlight.quadrotor_3d: Finished loading sympy modules (0.029 seconds).\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/mike/Code/GitHub/flashlight/code/lib/flashlight/transformations.py:1888: UserWarning: failed to import module _transformations\n", " warnings.warn(\"failed to import module %s\" % name)\n" ] } ], "source": [ "%pylab inline\n", "from pylab import *\n", "\n", "import control\n", "import mpl_toolkits.mplot3d\n", "import scipy.integrate\n", "\n", "import path_utils\n", "path_utils.add_relative_to_current_source_file_path_to_sys_path(\"../../lib\")\n", "\n", "import flashlight.curve_utils as curve_utils\n", "import flashlight.interpolate_utils as interpolate_utils\n", "import flashlight.ipython_display_utils as ipython_display_utils\n", "import flashlight.quadrotor_3d as quadrotor_3d\n", "import flashlight.spline_utils as spline_utils" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As in our previous examples, we begin by computing a 3D spline, and then re-timing the progress along the spline using an easing curve." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nE4t6gRAfAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "T_z = matrix([0,1,2,3]).T.A\n", "T_y = matrix([0,1,2,3]).T.A\n", "T_x = matrix([0,1,2,3]).T.A\n", "T = c_[T_z, T_y, T_x]\n", "P_z = matrix([0,0,1,4]).T.A\n", "P_y = matrix([0,3,1,4]).T.A\n", "P_x = matrix([0,3,7,10]).T.A\n", "P = c_[P_z, P_y, P_x]\n", "\n", "num_samples = 200\n", "\n", "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])\n", " \n", "P_eval, T_eval, dT = \\\n", " spline_utils.evaluate_minimum_variation_nonlocal_interpolating_b_spline(\n", " C, T, sd, num_samples=num_samples)\n", "\n", "T_s = matrix([0.0,1.2,1.8,3.0]).T.A\n", "P_s = matrix([0.0,0.3,0.7,1.0]).T.A\n", "\n", "C_s, T_s, sd_s = \\\n", " spline_utils.compute_minimum_variation_nonlocal_interpolating_b_spline_coefficients(\n", " P_s, T_s, degree=7, lamb=[0,0,0,1,0])\n", " \n", "P_s_eval, T_s_eval, dT_s = \\\n", " spline_utils.evaluate_minimum_variation_nonlocal_interpolating_b_spline(\n", " C_s, T_s, sd_s, num_samples=num_samples)\n", "\n", "t = linspace(0.0,10.0,num_samples)\n", "s_spline = P_s_eval\n", "\n", "P_eval_spline, t_spline, P_eval_cum_length, t_norm = curve_utils.reparameterize_curve(P_eval, s_spline)\n", "\n", "figsize(6,6);\n", "fig = plt.figure();\n", "ax = fig.add_subplot(111, projection=\"3d\");\n", "ax.scatter(P_eval_spline[:,2], P_eval_spline[:,0], P_eval_spline[:,1], c=t, s=50);\n", "title(\"$\\\\mathbf{p}(t)$\\n\", fontsize=20);\n", "ax.set_zlabel(\"$\\\\mathbf{p}_y$\", fontsize=20);\n", "xlabel(\"$\\\\mathbf{p}_x$\", fontsize=20); ylabel(\"$\\\\mathbf{p}_z$\", fontsize=20);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As in our previous examples, we compute a state space trajectory, and then a control trajectory. Note that computing a state space trajectory for a 3D quadrotor requires that we specify the yaw angle of the quadrotor along the trajectory. In this example, we set the yaw angle to always be 0 for simplicity. In general, the yaw angle can be specified so that a quadrotor is oriented towards a particular target. For more details on the control problem being solved here, see [1].\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": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t_begin = t[0]\n", "t_end = t[-1]\n", "num_timesteps = num_samples\n", "\n", "p = P_eval_spline\n", "psi = zeros_like(t)\n", "dt = (t_end-t_begin) / (num_timesteps-1)\n", "\n", "q_qdot_qdotdot = quadrotor_3d.compute_state_space_trajectory_and_derivatives(p, psi, dt)\n", "u = quadrotor_3d.compute_control_trajectory(q_qdot_qdotdot)\n", "\n", "figsize(5,2)\n", "plot(t, u[:,0]); plot(t, u[:,1]); plot(t, u[:,2]); plot(t, u[:,3]);\n", "title(\"$\\\\mathbf{u}(t)$\\n\", fontsize=20); xlabel(\"$t$\", fontsize=20);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can simulate our control trajectory exactly as in our previous examples. As in our previous examples, we notice some simulation drift. Again, because we compute control forces numerically (i.e., inexactly), and we perform numerical (i.e., inexact) integration in our simulation, and we don't apply any feedback control, a small amount of drift is expected. In later examples, we'll apply time-varying LQR feedback control to elimate simulation drift and recover from unexpected disturbances." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x_nominal, q_nominal, qdot_nominal, qdotdot_nominal = \\\n", " quadrotor_3d.pack_state_space_trajectory_and_derivatives(q_qdot_qdotdot)\n", " \n", "x_0 = x_nominal[0]\n", "\n", "def compute_x_dot(x_t, t):\n", "\n", " x_t = matrix(x_t).T\n", " u_t = u_interp_func(clip(t, t_begin, t_end))\n", " x_dot_t = quadrotor_3d.compute_x_dot(x_t, u_t).A1\n", " \n", " return x_dot_t\n", "\n", "num_timesteps_sim = 200\n", "t_sim = linspace(t_begin, t_end, num_timesteps_sim)\n", "u_interp_func = interpolate_utils.interp1d_vector_wrt_scalar(t, u, kind=\"cubic\")\n", "x_sim = scipy.integrate.odeint(compute_x_dot, x_0, t_sim)\n", "\n", "quadrotor_3d.draw(t_sim, x_sim, t_nominal=t, x_nominal=x_nominal)\n", "# quadrotor_3d.draw(t_sim, x_sim, t_nominal=t, x_nominal=x_nominal, savefig=True, out_dir=\"data/08\", out_file=\"00.mp4\")\n", "ipython_display_utils.get_inline_video(\"data/08/00.mp4\")" ] } ], "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 }