input_N =2;
state_N = 5;
horizon_N = 30;
Q = eye(state_N);
R = eye(input_N);
%% Constraints
u1_min = -8;
u1_max = 8;
u2_min = -10;
u2_max = 10;
M_1 = [1;-1];
M_2 = [1;-1];
m_1 = [u1_max;u1_min];
m_2 = [u2_max;u2_min];
%% YALMIP
x = sdpvar(state_N,N_horizon);
u = sdpvar(input_N,N_horizon);
con_mpc = [];
obj_mpc = 0;
for i = 1:N_horizon-1
x_theta(1) = u(2,i);
x_theta(2) = x(3,i);
x_theta(3) = u(1,i);
x_theta(4) = x(5,i);
x_theta(5) = u(1,i)*sin(x(1,i));
con_mpc =[con_mpc, x(:,i+1) == [sin(x_mpc(2,i));sin(u_mpc(2,i));sin(u_mpc(1,i));sin(x_mpc(5,i));cos(x_mpc(1,i))]];
con_mpc = [con_mpc, M_2*u(1,i) <= m_2 ];
con_mpc = [con_mpc, M_1*u(2,i) <= m_1 ];
obj_mpc = obj_mpc + x(:,i)'*Q*x(:,i) + u(:,i)'*R*u(:,i); % Cost function
end
% con_mpc = [con_mpc ,Ff*x_mpc(:,N_horizon) <= ff];
% obj_mpc = obj_mpc + x_mpc(:,N_horizon)'*Qf*x_mpc(:,N_horizon);
opt = sdpsettings;
opt.solver = 'quadprog';
opt.quadprog.TolCon = 1e-9;
innerController = optimizer(con_mpc, obj_mpc, opt, x(:,1), u(:,1));