Overview
| Comment: | Changed timing - now works with inverted pendulum. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | origin/master | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
d896096f57e602c07fd774328061e5c5 |
| User & Date: | gawthrop@users.sourceforge.net on 2004-10-14 21:42:44.000 |
| Other Links: | branch diff | manifest | tags |
Context
|
2004-10-20
| ||
| 21:58:12 |
Updated for liuping's qp_hild.m Used on IP experiment check-in: efb6c42d89 user: gawthrop@users.sourceforge.net tags: origin/master, trunk | |
|
2004-10-14
| ||
| 21:42:44 | Changed timing - now works with inverted pendulum. check-in: d896096f57 user: gawthrop@users.sourceforge.net tags: origin/master, trunk | |
| 21:40:36 | Monor changes - preparing for Inverted pendulum work check-in: 6069fc9eef user: gawthrop@users.sourceforge.net tags: origin/master, trunk | |
Changes
Modified mttroot/mtt/lib/control/PPP/ppp_lin_run.m
from [e3761c925e]
to [2ee57392e6].
| ︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
## Control = 0: step test
## Control = 1: PPP open-loop
## Control = 2: PPP closed-loop
## w is the (constant) setpoint
## par_control and par_observer are structures containing parameters
## for the observer and controller
##Defaults
if nargin<1 # Default name to dir name
names = split(pwd,"/");
[n_name,m_name] = size(names);
Name = deblank(names(n_name,:));
endif
| > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
## Control = 0: step test
## Control = 1: PPP open-loop
## Control = 2: PPP closed-loop
## w is the (constant) setpoint
## par_control and par_observer are structures containing parameters
## for the observer and controller
disp("Special version");
##Defaults
if nargin<1 # Default name to dir name
names = split(pwd,"/");
[n_name,m_name] = size(names);
Name = deblank(names(n_name,:));
endif
|
| ︙ | ︙ | |||
123 124 125 126 127 128 129 |
p_c.A_u = ppp_aug(0,p_c.A_u);
endif
endif
else
error(sprintf("Method %s not recognised", p_c.Method));
endif
endif
| | | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
p_c.A_u = ppp_aug(0,p_c.A_u);
endif
endif
else
error(sprintf("Method %s not recognised", p_c.Method));
endif
endif
if !struct_contains(p_c,"tau") # Time horizon
if strcmp(p_c.Method,"lq")
p_c.tau = [0:0.1:1]*2;
elseif strcmp(p_c.Method,"original");
p_c.tau = [10:0.1:11];
else
error(sprintf("Method %s not recognised", p_c.Method));
|
| ︙ | ︙ | |||
159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
endif
## Initialise
x_est = p_o.x_0;
## Initialise simulation state
x = x_0;
if ControlType==0 # Step input
I = 1; # 1 large sample
p_c.delta_ol = p_c.T; # I
K_w = zeros(p_c.n_U,n_y);
K_w(1,1) = 1;
K_w(2,1) = -1;
| > | 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
endif
## Initialise
x_est = p_o.x_0;
## Initialise simulation state
x = x_0;
y_i = C*x_0
if ControlType==0 # Step input
I = 1; # 1 large sample
p_c.delta_ol = p_c.T; # I
K_w = zeros(p_c.n_U,n_y);
K_w(1,1) = 1;
K_w(2,1) = -1;
|
| ︙ | ︙ | |||
199 200 201 202 203 204 205 | ## Initial control U U = zeros(p_c.n_U,1) ; ## Short sample interval dt = p_c.delta_ol/p_c.N; | < | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
## Initial control U
U = zeros(p_c.n_U,1) ;
## Short sample interval
dt = p_c.delta_ol/p_c.N;
## Observer design
G = eye(n_x); # State noise gain
sigma_x = eye(n_x); # State noise variance
Sigma = p_o.sigma*eye(n_y) # Measurement noise variance
if strcmp(p_o.method, "intermittent")
Ad = expm(A*p_c.delta_ol); # Discrete-time transition matrix
|
| ︙ | ︙ | |||
262 263 264 265 266 267 268 269 |
tick = time;
i=0;
for j=1:p_c.Iterations
for k=1:I
tim=time; # Timing
i++;
if Simulate # Exact simulation
| > | < < < < < < < | 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 |
tick = time;
i=0;
for j=1:p_c.Iterations
for k=1:I
tim=time; # Timing
i++;
if Simulate # Exact simulation
X = x; # Current (simulated) state
else # The real thing
if strcmp(p_o.method, "remote")
[t_i,y_i,u_i,X] = ppp_put_get_X(U); # Remote-state interface
else
[t_i,y_i,u_i] = ppp_put_get(U); # Generic interface to real-time
endif
endif
|
| ︙ | ︙ | |||
295 296 297 298 299 300 301 |
Ui = A_ud'*Ui;
y_e = [y_e; y_new'];
e_e = [e_e; e_est'];
endfor
elseif strcmp(p_o.method, "remote")
## predict from remote state (with zero L)
if (ControlType==2) # Closed-loop
| | | | > | > > > > > > > > | | 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 |
Ui = A_ud'*Ui;
y_e = [y_e; y_new'];
e_e = [e_e; e_est'];
endfor
elseif strcmp(p_o.method, "remote")
## predict from remote state (with zero L)
if (ControlType==2) # Closed-loop
[x_est y_est y_new e_est] = ppp_int_obs \
(X,y_i,U,A,B,C,D,p_c.A_u,p_c.delta_ol,zeros(n_x,1));
## x_est = X; y_est=y_i; y_new=y_i; e_est=0;
else # Open-loop
[x_est y_est y_new e_est] = ppp_int_obs \
(x_est,y_i,U,A,B,C,D,p_c.A_u,p_c.delta_ol,zeros(n_x,1));
endif
endif
## Simulation (based on U_i)
if Simulate
t_sim = [1:p_c.N]*dt; # Simulation time points
[yi,ui,xsi] = ppp_ystar(A,B,C,D,x,p_c.A_u,U,t_sim); # Simulate
x = xsi(:,p_c.N); # NEXT state
ti = [(i-1)*p_c.N:i*p_c.N-1]*dt;
y_i = yi(1); # Current output
t_i = ti(1);
endif
##Control
if ( length(p_c.Tau_u)==0&&length(p_c.Tau_y)==0 )
U = K_w*w - K_x*x_est;
else
## Input constraints
[Gamma_u, gamma_u] = \
ppp_input_constraints(p_c.A_u,p_c.Tau_u,p_c.Min_u,p_c.Max_u);
|
| ︙ | ︙ | |||
326 327 328 329 330 331 332 333 334 335 336 337 338 339 |
Gamma = [Gamma_u; Gamma_y];
gamma = [gamma_u; gamma_y];
[u_qp,U,n_active] = ppp_qp \
(x_est,w,J_uu,J_ux,J_uw,Us0,Gamma,gamma,1e-6,1);
endif
## Save data
if Simulate
t = [t;ti'];
y = [y;yi'];
X_est = [X_est;x_est'];
y_c = [y_c;(C_c*xsi)'];
u = [u;ui'];
| > > > | 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
Gamma = [Gamma_u; Gamma_y];
gamma = [gamma_u; gamma_y];
[u_qp,U,n_active] = ppp_qp \
(x_est,w,J_uu,J_ux,J_uw,Us0,Gamma,gamma,1e-6,1);
endif
## Allow for the delay
##U = expm(p_c.delta_ol*p_c.A_u)*U;
## Save data
if Simulate
t = [t;ti'];
y = [y;yi'];
X_est = [X_est;x_est'];
y_c = [y_c;(C_c*xsi)'];
u = [u;ui'];
|
| ︙ | ︙ |