.. flashlight documentation master file, created by
sphinx-quickstart on Tue Sep 27 16:33:20 2016.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
.. toctree::
:maxdepth: 2
Welcome to Flashlight
=====================
Flashlight is a lightweight Python library for analyzing and solving quadrotor control problems.
Flashlight enables you to easily solve for minimum snap trajectories that go through a sequence of waypoints, compute the required control forces along trajectories, execute the trajectories in a physics simulator, and visualize the simulation results.
Flashlight also makes it easy to simulate external disturbances, and to recover from those disturbances using time-varying LQR feedback control.
Flashlight includes physical models for 2D quadrotors, 3D quadrotors, and 3D quadrotor cameras.
.. raw:: html
The following code snippet shows how easy it is to start analyzing quadrotor trajectories using Flashlight.
In this code snippet, we generate the control forces required for a 2D quadrotor to follow a simple trajectory, and simulate the results::
from pylab import *; import scipy.integrate
import flashlight.interpolate_utils as interpolate_utils
import flashlight.quadrotor_2d as quadrotor_2d
# Define a simple position trajectory in 2D.
num_samples = 200
t_begin = 0
t_end = pi
dt = (t_end - t_begin) / (num_samples - 1)
t = linspace(t_begin, t_end, num_samples)
p = c_[ sin(2*t) + t, t**2 ]
# Compute the corresponding state space trajectory and control trajectories for a 2D quadrotor.
q_qdot_qdotdot = quadrotor_2d.compute_state_space_trajectory_and_derivatives(p, dt)
u = quadrotor_2d.compute_control_trajectory(q_qdot_qdotdot)
# Define a function that interpolates the control trajectory in between time samples.
u_interp_func = interpolate_utils.interp1d_vector_wrt_scalar(t, u, kind="cubic")
# Define a simulation loop.
def compute_x_dot(x_t, t):
# Get the current control vector.
u_t = u_interp_func(clip(t, t_begin, t_end))
# Compute the state derivative from the current state and current control vectors.
x_dot_t = quadrotor_2d.compute_x_dot(x_t, u_t).A1
return x_dot_t
# Simulate.
x_nominal, _, _, _ = quadrotor_2d.pack_state_space_trajectory_and_derivatives(q_qdot_qdotdot)
x_0 = x_nominal[0]
x_sim = scipy.integrate.odeint(compute_x_dot, x_0, t)
# Plot the results.
quadrotor_2d.draw(t, x_sim, t_nominal=t, x_nominal=x_nominal, inline=True)
This code example produces the following animation, which shows our 2D quadrotor correctly following the intended trajectory:
.. raw:: html
Flashlight is designed and implemented by `Mike Roberts `_.
Installing Flashlight
=====================
The steps for installing Flashlight are as follows.
1. Install all of Flashlight's dependencies. The core functionality in Flashlight depends on the following Python libraries:
* `IPython `_
* `NumPy `_
* `matplotlib `_
* `scikit-learn `_
* `SciPy `_
* `SymPy `_
Many of the example notebooks, and some of the debug rendering functions in Flashlight, depend on the following Python libraries:
* `Mayavi `_
* `OpenCV `_ (specifically the ``cv2`` Python module)
* `The Python Control Systems Library `_
* `Slycot `_
* `VTK `_ (specifically the ``vtk`` Python module)
Each of these dependencies comes pre-installed with `Enthought Canopy `_, or can be installed very easily using the using the Enthought Canopy package manager, or `pip `_. The only dependency that is slightly more involved to install is Slycot, but this is still easy to install, by downloading the source from GitHub and running ``sudo python setup.py install`` from the top-level GitHub folder.
2. Download the Flashlight source code from our `GitHub repository `_.
3. In any folder you'd like to use Flashlight, copy our ``path/to/flashlight/code/utils/path_utils.py`` file into that folder.
4. Include the following code snippet in your Python code before importing Flashlight::
import path_utils
path_utils.add_relative_to_current_source_file_path_to_sys_path("relative_or_absolute_path/to/flashlight/code/lib")
5. Verify that you can ``import flashlight`` from your Python code. This import statement should print ``Initializing flashlight v0.0.1`` to the console.
After completing these steps, you're ready to start using Flashlight.
Examples
========
These example notebooks describe how to use Flashlight to analyze and solve a variety of quadrotor control problems:
* `Creating minimum snap splines in 1D `_
* `Creating minimum snap splines in 2D and 3D `_
* `Re-timing the progress along a parametric curve `_
* `Computing the control forces required for a 2D quadrotor to follow a trajectory `_
* `Applying LQR feedback control to stabilize a 2D quadrotor at a point `_
* `Applying time-varying LQR feedback control to stabilize a 2D quadrotor along a trajectory `_
* `Applying LQR feedback control in 2D, handling angular wrapping correctly `_
* `Computing the control forces required for a 3D quadrotor to follow a trajectory `_
* `Applying LQR feedback control to stabilize a 3D quadrotor at a point `_
* `Applying time-varying LQR feedback control to stabilize a 3D quadrotor along a trajectory `_
* `Applying LQR feedback control in 3D, handling angular wrapping correctly `_
* `Computing the control forces required for a 3D quadrotor camera to follow a look-from look-at trajectory `_
Reproducible Research
=====================
As part of the Flashlight source code, we include notebooks that reproduce the experimental results from our research papers.
| `An Interactive Tool for Designing Quadrotor Camera Shots `_
| Niels Joubert, Mike Roberts, Anh Truong, Floraine Berthouzoz, Pat Hanrahan
| *ACM Transactions on Graphics 34(6) (SIGGRAPH Asia 2015)*
* `Evaluating different interpolation methods `_
* `Evaluating different spline degrees and derivatives `_
Projects using Flashlight
=========================
Flashlight is being used in the following projects:
.. raw:: html
| `Generating Dynamically Feasible Trajectories for Quadrotor Cameras `_
| Mike Roberts, Pat Hanrahan
| *ACM Transactions on Graphics 35(4) (SIGGRAPH 2016)*
.. raw:: html
| `An Interactive Tool for Designing Quadrotor Camera Shots `_
| Niels Joubert, Mike Roberts, Anh Truong, Floraine Berthouzoz, Pat Hanrahan
| *ACM Transactions on Graphics 34(6) (SIGGRAPH Asia 2015)*
Citing Flashlight
=================
If you use Flashlight for published work, we encourage you to cite it as follows::
@misc{flashlight:2016,
author = {Mike Roberts},
title = {Flashlight: A Python Library for Analyzing and Solving Quadrotor Control Problems},
year = {2016},
howpublished = {\url{http://mikeroberts3000.github.io/flashlight}}
}
Additionally, if you use any of the functionality in ``curve_utils``, ``quadrotor_3d``, ``quadrotor_camera_3d``, or ``spline_utils`` for published work, we encourage you to cite the following paper::
@article{joubert:2015,
author = {Niels Joubert AND Mike Roberts AND Anh Truong AND Floraine Berthouzoz AND Pat Hanrahan},
title = {An Interactive Tool for Designing Quadrotor Camera Shots},
journal = {ACM Transactions on Graphics (SIGGRAPH Asia 2015)},
volume = {34},
number = {6},
year = {2015}
}