-
Notifications
You must be signed in to change notification settings - Fork 37
/
InvertedPendulum.m
91 lines (67 loc) · 2.33 KB
/
InvertedPendulum.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
%------------------------------------------%
% Inverted Pendulum
% "Autogenerating microsecond solvers for nonlinear MPC: A tutorial
% using ACADO integrators", Quirynen, 2015
% typical configuration: 1) N=80, Ts=Ts_st=0.025, no shifting 2) N=40,
% Ts=Ts_st=0.05, shifting
%------------------------------------------%
%% Dimensions
nx=4; % No. of differential states
nu=1; % No. of controls
nz=0; % No. of algebraic states
ny=5; % No. of outputs
nyN=4; % No. of outputs at the terminal point
np=0; % No. of model parameters
nc=0; % No. of general constraints
ncN=0; % No. of general constraints at the terminal point
nbx = 1; % No. of bounds on states
nbu = 1; % No. of bounds on controls
% state and control bounds
nbx_idx = 1; % indexs of states which are bounded
nbu_idx = 1; % indexs of controls which are bounded
%% create variables
import casadi.*
states = SX.sym('states',nx,1); % differential states
controls = SX.sym('controls',nu,1); % control input
alg = SX.sym('alg',nz,1); % algebraic states
params = SX.sym('paras',np,1); % parameters
refs = SX.sym('refs',ny,1); % references of the first N stages
refN = SX.sym('refs',nyN,1); % reference of the last stage
Q = SX.sym('Q',ny,1); % weighting matrix of the first N stages
QN = SX.sym('QN',nyN,1); % weighting matrix of the last stage
aux = SX.sym('aux',ny,1); % auxilary variable
auxN = SX.sym('auxN',nyN,1); % auxilary variable
%% Dynamics
M = 1;
m = 0.1;
l = 0.8;
g = 9.81;
p=states(1);
theta=states(2);
v=states(3);
omega=states(4);
u=controls(1);
a=-m*l*sin(theta)*omega^2+m*g*cos(theta)*sin(theta)+u;
b=-m*l*cos(theta)*sin(theta)*omega^2+u*cos(theta)+(M+m)*g*sin(theta);
c=M+m-m*(cos(theta))^2;
% explicit ODE RHS
x_dot=[v;omega;a/c;b/(l*c)];
% algebraic function
z_fun = [];
% implicit ODE: impl_f = 0
xdot = SX.sym('xdot',nx,1);
impl_f = xdot - x_dot;
%% Objectives and constraints
% inner objectives
h = [p;theta;v;omega;u];
hN = h(1:nyN);
% outer objectives
obji = 0.5*(h-refs)'*diag(Q)*(h-refs);
objN = 0.5*(hN-refN)'*diag(QN)*(hN-refN);
obji_GGN = 0.5*(aux-refs)'*(aux-refs);
objN_GGN = 0.5*(auxN-refN)'*(auxN-refN);
% general inequality constraints
general_con = [];
general_con_N = [];
%% NMPC discretizing time length [s]
Ts_st = 0.025; % shooting interval time