summaryrefslogtreecommitdiffstats
path: root/templates/MPC.m
diff options
context:
space:
mode:
authorYanzhenXiangRobotics <xyz000327@gmail.com>2023-05-10 23:30:01 +0200
committerYanzhenXiangRobotics <xyz000327@gmail.com>2023-05-10 23:30:01 +0200
commit3d6ef58ff1edee6d882a8d9cbe97625ff26afe6e (patch)
tree070832993dd8b63ee2aa70ee6f611d4d139f1d65 /templates/MPC.m
parentRevert mistakenly pushed to master (diff)
downloadmpc_pe-3d6ef58ff1edee6d882a8d9cbe97625ff26afe6e.tar.gz
mpc_pe-3d6ef58ff1edee6d882a8d9cbe97625ff26afe6e.zip
Revert to handout
Diffstat (limited to '')
-rw-r--r--templates/MPC.m89
1 files changed, 9 insertions, 80 deletions
diff --git a/templates/MPC.m b/templates/MPC.m
index b2d411d..3e9d2f1 100644
--- a/templates/MPC.m
+++ b/templates/MPC.m
@@ -6,44 +6,6 @@
% Please see the LICENSE file that has been included as part of this package.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% classdef MPC
-% properties
-% yalmip_optimizer
-% end
-%
-% methods
-% function obj = MPC(Q,R,N,params)
-% nu = params.model.nu;
-% nx = params.model.nx;
-%
-% % define optimization variables
-% U = sdpvar(repmat(nu,1,N),ones(1,N),'full');
-% X0 = sdpvar(nx,1,'full');
-%
-% % YOUR CODE HERE
-%
-% opts = sdpsettings('verbose',1,'solver','quadprog');
-% obj.yalmip_optimizer = optimizer(constraints,objective,opts,X0,{U{1} objective});
-% end
-%
-% function [u, ctrl_info] = eval(obj,x)
-% %% evaluate control action by solving MPC problem, e.g.
-% tic;
-% [optimizer_out,errorcode] = obj.yalmip_optimizer(x);
-% solvetime = toc;
-%
-% [u, objective] = optimizer_out{:};
-%
-% feasible = true;
-% if (errorcode ~= 0)
-% feasible = false;
-% end
-%
-% ctrl_info = struct('ctrl_feas',feasible,'objective',objective,'solvetime',solvetime);
-% end
-% end
-% end
-
classdef MPC
properties
yalmip_optimizer
@@ -53,64 +15,31 @@ classdef MPC
function obj = MPC(Q,R,N,params)
nu = params.model.nu;
nx = params.model.nx;
- % YOUR CODE HERE
+
% define optimization variables
- A=params.model.A;
- B=params.model.B;
U = sdpvar(repmat(nu,1,N),ones(1,N),'full');
- X = sdpvar(repmat(nx,1,N+1),ones(1,N+1),'full');
-
- [K,P,~] = dlqr(A,B,Q,R);
-
- % define constraints
-% s_max=params.constraints.MaxAbsPositionXZ;
-% y_max=params.constraints.MaxAbsPositionY;
-% u_max = params.constraints.MaxAbsThrust;
- H_x = params.constraints.StateMatrix;
- h_x = params.constraints.StateRHS;
- H_u = params.constraints.InputMatrix;
- h_u = params.constraints.InputRHS;
X0 = sdpvar(nx,1,'full');
- objective = 0;
- constraints = X{1} == X0;
- for k = 1:N
- constraints = [ ...
- constraints, ...
- X{k+1} == A*X{k} + B*U{k} , ...
- H_x * X{k} <= h_x, ...
- H_u * U{k} <= h_u ...
- ];
- objective = objective + X{k}'*Q*X{k} + U{k}'*R*U{k};
- end
- objective=objective+X{N+1}'*P*X{N+1};
- % terminal constraint
-% constraints = [ ...
-% constraints, ...
-% X{N+1} == zeros(nx,1)
-% ];
+ % YOUR CODE HERE
+
opts = sdpsettings('verbose',1,'solver','quadprog');
obj.yalmip_optimizer = optimizer(constraints,objective,opts,X0,{U{1} objective});
end
function [u, ctrl_info] = eval(obj,x)
- % evaluate control action by solving MPC problem
+ %% evaluate control action by solving MPC problem, e.g.
tic;
- [optimizer_out,errorcode,~] = obj.yalmip_optimizer{x};
+ [optimizer_out,errorcode] = obj.yalmip_optimizer(x);
solvetime = toc;
+
+ [u, objective] = optimizer_out{:};
- % extract optimal control action and objective function value
- u = optimizer_out{1};
- objective = optimizer_out{2};
-
- % check feasibility of optimization problem
- feasible = ~isnan(objective) && ~isinf(objective);
+ feasible = true;
if (errorcode ~= 0)
feasible = false;
end
- % create control info struct
ctrl_info = struct('ctrl_feas',feasible,'objective',objective,'solvetime',solvetime);
end
end
-end
+end \ No newline at end of file