Model Predictive Control
commonroad_control.control.model_predictive_control.model_predictive_control
ModelPredictiveControl
Bases: ControllerInterface
Model predictive controller (MPC). This class mostly serves as a wrapper for a given optimal control problem (OCP) solver and provides methods for computing an initial guess, e.g., by shifting the solution from the previous time step or linear interpolation between the initial state and a desired final state.
Source code in commonroad_control/control/model_predictive_control/model_predictive_control.py
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | |
horizon
property
Returns:
| Type | Description |
|---|---|
int
|
discrete prediction horizon of the OCP |
__init__(ocp_solver)
Initialize controller.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
ocp_solver
|
OptimalControlSolverInterface
|
OCP solver - OptimalControlSolver |
required |
Source code in commonroad_control/control/model_predictive_control/model_predictive_control.py
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | |
_initial_guess_linear_interpolation(x0, xf, t_0)
Computes an initial guess by linearly interpolating between the initial state x0 and the final reference state xf. The control inputs are set to zero.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x0
|
StateInterface
|
initial state - StateInterface |
required |
xf
|
StateInterface
|
desired final state - StateInterface |
required |
Returns:
| Type | Description |
|---|---|
Tuple[TrajectoryInterface, TrajectoryInterface]
|
initial guess for the state and control inputs - TrajectoryInterface, TrajectoryInterface |
Source code in commonroad_control/control/model_predictive_control/model_predictive_control.py
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | |
_initial_guess_shift_solution(u_ref)
Computes an initial guess by shifting the solution from the previous time step and appending the last control input from the reference trajectory. The initial guess for the state at the end of the prediction horizon is obtained by simulating the system using the reference input.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
u_ref
|
TrajectoryInterface
|
input reference trajectory - TrajectoryInterface |
required |
Returns:
| Type | Description |
|---|---|
Tuple[TrajectoryInterface, TrajectoryInterface]
|
initial guess for the state and control inputs |
Source code in commonroad_control/control/model_predictive_control/model_predictive_control.py
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | |
clear_initial_guess()
Delete stored initial guess.
Source code in commonroad_control/control/model_predictive_control/model_predictive_control.py
173 174 175 176 177 178 | |
compute_control_input(x0, x_ref, u_ref, x_init=None, u_init=None)
Computes the control input by solving an optimal control problem.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x0
|
StateInterface
|
initial state of the vehicle - StateInterface |
required |
x_ref
|
TrajectoryInterface
|
state reference trajectory - TrajectoryInterface |
required |
u_ref
|
TrajectoryInterface
|
input reference trajectory - TrajectoryInterface |
required |
x_init
|
TrajectoryInterface
|
(optional) initial guess for the state trajectory -TrajectoryInterface |
None
|
u_init
|
TrajectoryInterface
|
(optional) initial state for the input trajectory - TrajectoryInterface |
None
|
Returns:
| Type | Description |
|---|---|
InputInterface
|
optimal control input - InputInterface |
Source code in commonroad_control/control/model_predictive_control/model_predictive_control.py
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | |
commonroad_control.control.model_predictive_control.optimal_control.optimal_control
OCPSolverParameters
dataclass
Bases: ABC
Algorithm parameters for the optimal control problem solver.
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control.py
17 18 19 20 21 22 23 | |
OptimalControlSolverInterface
Bases: ABC
Base cass for solving optimal control problems (OCPs). We consider OCPs of the form:
minimize sum_{k=0}^horizon l_k(x(k),u(k)) + V_f(x(horizon))
such that
x(0) = x_init
for k ={0,...,horizon-1}: x(k+1) = f(x(k),u(k),0)
u_lb <= u(k) <= u_ub
for k={0,...,horizon}: x_lb <= x(k) <= x_ub
a_comb(k) <= 1
where the stage cost function is l_k(x(k),u(k)) = (x(k) - x_ref(k))^T cost_xx (x(k) - x_ref(k)) + (u(k) - u_ref(k))^T cost_uu (u(k) - u_ref(k)) and the terminal cost function is V_f(x(horizon)) = (x(horizon) - x_ref(horizon))^T cost_final (x(horizon) - x_ref(horizon)) and a_comb(k) returns the normalized combined acceleration at each time step.
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control.py
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | |
__init__(vehicle_model, sidt_factory, horizon, delta_t, ocp_parameters)
Initialize OCP solver
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
vehicle_model
|
VehicleModelInterface
|
vehicle model for predicting future states - VehicleModelInterface |
required |
sidt_factory
|
StateInputDisturbanceTrajectoryFactoryInterface
|
factory for creating States and Inputs from the optimal solution - StateInputDisturbanceTrajectoryFactoryInterface |
required |
horizon
|
int
|
(discrete) prediction horizon/number of time steps - int |
required |
delta_t
|
float
|
sampling time - float |
required |
ocp_parameters
|
OCPSolverParameters
|
algorithm parameters |
required |
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control.py
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | |
reset_ocp_parameters(new_ocp_parameters)
Updates parameters of the algorithm for solving the OCP, e.g., if one wishes to change the number of iterations.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
new_ocp_parameters
|
OCPSolverParameters
|
updated algorithm parameters - OCPSolverParameters |
required |
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control.py
93 94 95 96 97 98 | |
solve(x0, x_ref, u_ref, x_init, u_init)
abstractmethod
Solves an instance of the optimal control problem given an initial state, a reference trajectory to be tacked and an initial guess for the state and control inputs.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x0
|
StateInterface
|
initial state of the vehicle - StateInterface |
required |
x_ref
|
TrajectoryInterface
|
state reference trajectory - TrajectoryInterface |
required |
u_ref
|
TrajectoryInterface
|
input reference trajectory - TrajectoryInterface |
required |
x_init
|
TrajectoryInterface
|
(optional) initial guess for the state trajectory -TrajectoryInterface |
required |
u_init
|
TrajectoryInterface
|
(optional) initial state for the input trajectory - TrajectoryInterface |
required |
Returns:
| Type | Description |
|---|---|
Tuple[TrajectoryInterface, TrajectoryInterface, List[Tuple[array, array]]]
|
optimal state and input trajectory (TrajectoryInterface) and solution history |
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control.py
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | |
commonroad_control.control.model_predictive_control.optimal_control.optimal_control_scvx
OptimalControlSCvx
Bases: OptimalControlSolverInterface
Successive convexification algorithm for solving non-convex optimal control problems (OCP) based on [1] T. P. Reynolds et al. "A Real-Time Algorithm for Non-Convex Powered Descent Guidance", AIAA Scitech Forum, 2020
We consider OCPs of the form:
minimize sum_{k=0}^horizon l_k(x(k),u(k)) + V_f(x(horizon))
such that
x(0) = x_init
for k ={0,...,horizon-1}: x(k+1) = f(x(k),u(k),0)
u_lb <= u(k) <= u_ub
for k={0,...,horizon}: x_lb <= x(k) <= x_ub
a_comb(k) <= 1
where the stage cost function is l_k(x(k),u(k)) = (x(k) - x_ref(k))^T cost_xx (x(k) - x_ref(k)) + (u(k) - u_ref(k))^T cost_uu (u(k) - u_ref(k)) and the terminal cost function is V_f(x(horizon)) = (x(horizon) - x_ref(horizon))^T cost_final (x(horizon) - x_ref(horizon)) and a_comb(k) returns the normalized combined acceleration at each time step.
The algorithm successively convexifies this problem around the solution from the previous time step and solves these convex programming approximations until convergence.
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control_scvx.py
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 | |
__init__(vehicle_model, sidt_factory, horizon, delta_t, cost_xx, cost_uu, cost_final, ocp_parameters=SCvxParameters)
Initialize OCP solver
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
vehicle_model
|
VehicleModelInterface
|
vehicle model for predicting future states - VehicleModelInterface |
required |
sidt_factory
|
StateInputDisturbanceTrajectoryFactoryInterface
|
factory for creating States and Inputs from the optimal solution - StateInputDisturbanceTrajectoryFactoryInterface |
required |
horizon
|
int
|
(discrete) prediction horizon/number of time steps - int |
required |
delta_t
|
float
|
sampling time - float |
required |
cost_xx
|
ndarray
|
stage cost weighting matrix for the states, symmetric positive-semidefinite matrix - np.array |
required |
cost_uu
|
ndarray
|
stage cost weighting matrix for the inputs, symmetric positive-semidefinite matrix - np.array |
required |
cost_final
|
ndarray
|
terminal cost weighting matrix, symmetric positive-semidefinite matrix - np.array |
required |
ocp_parameters
|
SCvxParameters
|
algorithm parameters |
SCvxParameters
|
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control_scvx.py
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | |
_compute_defect(x, u)
Computes the defect, which is the error in the predicted state trajectory, at each time step.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x
|
ndarray
|
predicted state trajectory - np.ndarray |
required |
u
|
ndarray
|
candidate control input trajectory - np.ndarray |
required |
Returns:
| Type | Description |
|---|---|
ndarray
|
array storing the defect at each time step - np.ndarray |
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control_scvx.py
374 375 376 377 378 379 380 381 382 383 384 | |
_setup_solver()
Creates a parameterized convex programming approximation of the OCP using CVXPY.
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control_scvx.py
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 | |
solve(x0, x_ref, u_ref, x_init, u_init)
Solves an instance of the optimal control problem given an initial state, a reference trajectory to be tracked and an initial guess for the state and control inputs.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x0
|
StateInterface
|
initial state of the vehicle - StateInterface |
required |
x_ref
|
TrajectoryInterface
|
state reference trajectory - TrajectoryInterface |
required |
u_ref
|
TrajectoryInterface
|
input reference trajectory - TrajectoryInterface |
required |
x_init
|
TrajectoryInterface
|
(optional) initial guess for the state trajectory -TrajectoryInterface |
required |
u_init
|
TrajectoryInterface
|
(optional) initial state for the input trajectory - TrajectoryInterface |
required |
Returns:
| Type | Description |
|---|---|
Tuple[TrajectoryInterface, TrajectoryInterface, List[Tuple[array, array]]]
|
optimal state and input trajectory (TrajectoryInterface) and solution history |
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control_scvx.py
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 | |
SCvxParameters
dataclass
Bases: OCPSolverParameters
Parameters for the Successive Convexification algorithm.
Source code in commonroad_control/control/model_predictive_control/optimal_control/optimal_control_scvx.py
25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |