Trajectory optimization
The objective of this library is to model and solve optimal control problems (OCPs) of the form
\begin{align} \min_{x,u}~& \int_0^T \ell(x, u)\, dt + \ell_\mathrm{f}(x(T)) \\ \subjectto & \dot x (t) = f(x(t), u(t)) \\ & g(x(t), u(t)) = 0 \\ & h(x(t), u(t)) \leq 0 \end{align}
Transcription
A transcription translates the continuous-time OCP to a discrete-time, finite-dimensional nonlinear program. Aligator allows us to consider transcriptions with implicit discrete dynamics: \begin{aligned} \min_{\bmx,\bmu}~& J(\bmx, \bmu) = \sum_{i=0}^{N-1} \ell_i(x_i, u_i) + \ell_N(x_N) \\ \subjectto & f(x_i, u_i, x_{i+1}) = 0 \\ & g(x_i, u_i) = 0 \\ & h(x_i, u_i) \leq 0 \end{aligned}
In aligator, trajectory optimization problems are described using the class TrajOptProblemTpl. Each TrajOptProblemTpl is described by a succession of stages (StageModelTpl) which encompass the set of constraints and the cost function (class CostAbstractTpl) for this stage.
Additionally, a TrajOptProblemTpl must provide an initial condition \( x_0
= \bar{x} \), a terminal cost $$ \ell_{\mathrm{f}}(x_N) $$ on the terminal state \(x_N \); optionally, a terminal constraint \(g(x_N) = 0, h(x_N) \leq 0 \) on this state may be added.
Stage models
A stage model (StageModelTpl) describes a node in the discrete-time optimal control problem: it consists in a running cost function, and a vector of constraints (StageConstraintTpl), the first of which must describe system dynamics (through a DynamicsModelTpl).
Example
Define and solve an LQR (Python API):
7"""Formulating and solving a linear quadratic regulator with Aligator."""
9import matplotlib.pyplot
as plt
14from aligator
import constraints, dynamics, manifolds
15from aligator.utils.plotting
import plot_convergence
19 term_cstr: bool =
False
23args = Args().parse_args()
34space = manifolds.VectorSpace(nx)
35x0 = space.neutral() + (0.2, 0.3, -0.1)
49N = 1e-5 * np.eye(nx, nu)
58rcost0 = aligator.QuadraticCost(Q, R, N)
59term_cost = aligator.QuadraticCost(Qf, R)
60dynmodel = dynamics.LinearDiscreteDynamics(A, B, c)
61stage = aligator.StageModel(rcost0, dynmodel)
63 u_min = -0.18 * np.ones(nu)
64 u_max = +0.18 * np.ones(nu)
65 ctrl_fn = aligator.ControlErrorResidual(nx, np.zeros(nu))
66 stage.addConstraint(ctrl_fn, constraints.BoxConstraint(u_min, u_max))
71problem = aligator.TrajOptProblem(x0, nu, space, term_cost)
73for i
in range(nsteps):
74 problem.addStage(stage)
76xtar2 = 0.1 * np.ones(nx)
78 term_fun = aligator.StateErrorResidual(space, nu, xtar2)
79 problem.addTerminalConstraint(term_fun, constraints.EqualityConstraintSet())
82mu_init = 1e-1
if args.bounds
else 1e-4
83verbose = aligator.VerboseLevel.VERBOSE
85solver = aligator.SolverProxDDP(tol, mu_init, verbose=verbose)
87his_cb = aligator.HistoryCallback(solver)
88solver.registerCallback(
"his", his_cb)
89print(
"Registered callbacks:", solver.getCallbackNames().tolist())
91solver.rollout_type = aligator.ROLLOUT_LINEAR
96prob_data = aligator.TrajOptData(problem)
97problem.evaluate(xs_i, us_i, prob_data)
100solver.run(problem, xs_i, us_i)
106fig1: plt.Figure = plt.gcf()
107fig1.set_figwidth(6.4)
108fig1.set_figheight(3.6)
110lstyle = {
"lw": 0.9,
"marker":
".",
"markersize": 5}
111trange = np.arange(nsteps + 1)
112plt.plot(res.xs, ls=
"-", **lstyle)
122 label=
r"$x_\mathrm{tar}$",
133plt.title(
"State trajectory $x(t)$")
134plt.xlabel(
"Time $i$")
135plt.legend(frameon=
False)
138plt.plot(res.us, **lstyle)
141 np.concatenate([u_min, u_max]),
149plt.xlabel(
"Time $i$")
150plt.title(
"Controls $u(t)$")
151plt.legend(frameon=
False, loc=
"lower right")
155fig2: plt.Figure = plt.figure(figsize=(6.4, 3.6))
156ax: plt.Axes = fig2.add_subplot()
166plot_convergence(his_cb, ax, res, show_al_iters=
True)
167ax.set_title(
"Convergence (constrained LQR)")
169fig_dicts = {
"traj": fig1,
"conv": fig2}
171for name, _fig
in fig_dicts.items():
173 _fig.savefig(f
"assets/{TAG}_{name}.pdf")
math_types< Scalar >::VectorOfVectors rollout(const std::vector< xyz::polymorphic< DynamicsModelTpl< Scalar > > > &dyn_models, const typename math_types< Scalar >::VectorXs &x0, const typename math_types< Scalar >::VectorOfVectors &us, typename math_types< Scalar >::VectorOfVectors &xout)
Perform a rollout of the supplied dynamical models.