ulqr  0.1.0
riccati_solver.h
Go to the documentation of this file.
1 
13 #pragma once
14 
15 #include "knotpoint.h"
16 #include "lqr_data.h"
17 #include "riccati/constants.h"
18 
63 typedef struct {
64  // clang-format off
65  int nhorizon;
66  int nstates;
67  int ninputs;
68  int nvars;
71  double* data;
73  double t_solve_ms;
76  // clang-format on
78 
87 RiccatiSolver* ulqr_NewRiccatiSolver(int nstates, int ninputs, int nhorizon);
88 
97 
116 
117 int ulqr_GetNumVars(RiccatiSolver* solver);
118 
126 enum ulqr_ReturnCode ulqr_SetInitialState(RiccatiSolver* solver, double* x0);
127 
128 enum ulqr_ReturnCode ulqr_SetCost(RiccatiSolver* solver, const double* Q, const double* R,
129  const double* H, const double* q, const double* r, double c,
130  int k_start, int k_end);
131 
132 enum ulqr_ReturnCode ulqr_SetDynamics(RiccatiSolver* solver, const double* A, const double* B,
133  const double* f, int k_start, int k_end);
134 
135 /*************************
136  * Getters
137  *************************/
139  int k);
140 Matrix* ulqr_GetB(RiccatiSolver* solver, int k);
141 Matrix* ulqr_Getf(RiccatiSolver* solver, int k);
142 Matrix* ulqr_GetQ(RiccatiSolver* solver, int k);
143 Matrix* ulqr_GetR(RiccatiSolver* solver, int k);
145  int k);
146 Matrix* ulqr_Getq(RiccatiSolver* solver, int k);
147 Matrix* ulqr_Getr(RiccatiSolver* solver, int k);
148 double ulqr_Getc(RiccatiSolver* solver, int k);
149 
151  int k);
153  int k);
155  int k);
157  int k);
159  int k);
161  int k);
163  int k);
165  int k);
167  int k);
168 Matrix* ulqr_GetState(RiccatiSolver* solver, int k);
169 Matrix* ulqr_GetInput(RiccatiSolver* solver, int k);
170 Matrix* ulqr_GetDual(RiccatiSolver* solver, int k);
171 
172 /*************************
173  * Methods
174  *************************/
175 double ulqr_CalcCost(RiccatiSolver* solver);
176 
RiccatiSolver::data
double * data
pointer to the beginning of the single block of memory allocated by the solver
Definition: riccati_solver.h:71
ulqr_Getc
double ulqr_Getc(RiccatiSolver *solver, int k)
Get cost constant.
Definition: riccati_solver.c:227
ulqr_Getf
Matrix * ulqr_Getf(RiccatiSolver *solver, int k)
Get (n,) affine dynamice term.
Definition: riccati_solver.c:221
KnotPoint
Stores the state, control, and time information at a single timestep / knot point.
Definition: knotpoint.h:11
ulqr_SetInitialState
enum ulqr_ReturnCode ulqr_SetInitialState(RiccatiSolver *solver, double *x0)
Set the initial state.
Definition: riccati_solver.c:116
ulqr_GetR
Matrix * ulqr_GetR(RiccatiSolver *solver, int k)
Get control cost Hessian.
Definition: riccati_solver.c:223
ulqr_GetState
Matrix * ulqr_GetState(RiccatiSolver *solver, int k)
Get (n,) state vector.
Definition: riccati_solver.c:240
RiccatiSolver::nstates
int nstates
size of state vector (n)
Definition: riccati_solver.h:66
ulqr_GetA
Matrix * ulqr_GetA(RiccatiSolver *solver, int k)
Get (n,n) state transition matrix.
Definition: riccati_solver.c:219
ulqr_GetQx
Matrix * ulqr_GetQx(RiccatiSolver *solver, int k)
Get (n,) Action-value state gradient.
Definition: riccati_solver.c:237
RiccatiSolver
Solver that uses Riccati recursion to solve an LQR problem.
Definition: riccati_solver.h:63
ulqr_GetQu
Matrix * ulqr_GetQu(RiccatiSolver *solver, int k)
Get (m,) Action-value conrol gradient.
Definition: riccati_solver.c:238
RiccatiSolver::t_solve_ms
double t_solve_ms
Total solve time in milliseconds.
Definition: riccati_solver.h:73
ulqr_GetQ
Matrix * ulqr_GetQ(RiccatiSolver *solver, int k)
Get state cost Hessian.
Definition: riccati_solver.c:222
ulqr_GetB
Matrix * ulqr_GetB(RiccatiSolver *solver, int k)
Get (n,m) control input matrix.
Definition: riccati_solver.c:220
ulqr_NewRiccatiSolver
RiccatiSolver * ulqr_NewRiccatiSolver(int nstates, int ninputs, int nhorizon)
Initialize a new Riccati solver.
Definition: riccati_solver.c:20
ulqr_Getq
Matrix * ulqr_Getq(RiccatiSolver *solver, int k)
Get affine state cost.
Definition: riccati_solver.c:225
ulqr_PrintRiccatiSummary
int ulqr_PrintRiccatiSummary(RiccatiSolver *solver)
Prints a summary of the solve.
Definition: riccati_solver.c:129
RiccatiSolver::t_backward_pass_ms
double t_backward_pass_ms
Time spent in the backward pass in milliseconds.
Definition: riccati_solver.h:74
RiccatiSolver::Z
KnotPoint * Z
state and control trajectory
Definition: riccati_solver.h:69
RiccatiSolver::nvars
int nvars
total number of decision variables, including the dual variables
Definition: riccati_solver.h:68
Matrix
Represents a matrix of double-precision data.
Definition: matrix.h:71
ulqr_GetDual
Matrix * ulqr_GetDual(RiccatiSolver *solver, int k)
Get (n,) dual vector.
Definition: riccati_solver.c:248
RiccatiSolver::ninputs
int ninputs
number of control inputs (m)
Definition: riccati_solver.h:67
ulqr_GetQux
Matrix * ulqr_GetQux(RiccatiSolver *solver, int k)
Get (m,n) Action-value Hessian cross-term.
Definition: riccati_solver.c:236
ulqr_GetQuu
Matrix * ulqr_GetQuu(RiccatiSolver *solver, int k)
Get (m,m) Action-value control Hessian.
Definition: riccati_solver.c:235
RiccatiSolver::lqrdata
LQRData * lqrdata
LQR Problem data.
Definition: riccati_solver.h:70
ulqr_GetQxx
Matrix * ulqr_GetQxx(RiccatiSolver *solver, int k)
Get (n,n) Action-value state Hessian.
Definition: riccati_solver.c:234
RiccatiSolver::t_forward_pass_ms
double t_forward_pass_ms
Time spent in the forward pass in milliseconds.
Definition: riccati_solver.h:75
LQRData
Holds the data for a single time step of LQR.
Definition: lqr_data.h:56
ulqr_FreeRiccatiSolver
int ulqr_FreeRiccatiSolver(RiccatiSolver **solver)
Free the memory for a Riccati solver.
Definition: riccati_solver.c:103
RiccatiSolver::x0
Matrix x0
Initial state.
Definition: riccati_solver.h:72
ulqr_GetInput
Matrix * ulqr_GetInput(RiccatiSolver *solver, int k)
Get (m,) input vector.
Definition: riccati_solver.c:244
RiccatiSolver::nhorizon
int nhorizon
length of the time horizon
Definition: riccati_solver.h:65
ulqr_GetFeedbackGain
Matrix * ulqr_GetFeedbackGain(RiccatiSolver *solver, int k)
Get (m,n) feedback gain.
Definition: riccati_solver.c:229
lqr_data.h
LQRData type.
ulqr_GetCostToGoGradient
Matrix * ulqr_GetCostToGoGradient(RiccatiSolver *solver, int k)
Get (n,) Gradient of the cost-to-go.
Definition: riccati_solver.c:232
ulqr_GetCostToGoHessian
Matrix * ulqr_GetCostToGoHessian(RiccatiSolver *solver, int k)
Get (n,n) Hessian of the cost-to-go.
Definition: riccati_solver.c:231
ulqr_GetFeedforwardGain
Matrix * ulqr_GetFeedforwardGain(RiccatiSolver *solver, int k)
Get (m,) feedforward gain.
Definition: riccati_solver.c:230
ulqr_GetH
Matrix * ulqr_GetH(RiccatiSolver *solver, int k)
Get cost Hessian cross-term (m,n)
Definition: riccati_solver.c:224
ulqr_Getr
Matrix * ulqr_Getr(RiccatiSolver *solver, int k)
Get affine control cost.
Definition: riccati_solver.c:226