Simplify parameter fungsi formationControlBuilder dengan struck yang disimpan ke file agar supaya dapat diakses disemua fungsi

algo_init implemented and add geogebra file for ilustration.
master
a2nr 2021-03-02 08:24:32 +07:00
parent b17e689911
commit acf4e14e37
9 changed files with 1363908 additions and 40 deletions

1
SOURCE/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/algo_info.m

View File

@ -1,29 +1,38 @@
clear -all
graphics_toolkit('gnuplot')
omni = omni = omnidirectional(0.94, 0.96, 0.01, 2.2, 1.5,0.099,0.1,1.5,0.025,30,0.035,19,0.00011,1.69,0.0059,0.0059,0.9,9.1,6,'./');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% config nang kene
conRobot = [1 2 1;
3 2 1;
3 1 1;
];
length_d = 3;
dRobot = [ 1;
1;
1;
];
corRobot = [1.5; 1.7;0;
2; 2.5;0;
2.5; 2.8;0;
algo = 0;
d = [[]];
ang = [];
save_state = [];
save algo_info.m algo;
save algo_info.m "-append" d ang save_state;
bParam = struct();
bParam.model = omnidirectional(0.94, 0.96, 0.01, 2.2, 1.5,0.099,0.1,1.5,0.025,30,0.035,19,0.00011,1.69,0.0059,0.0059,0.9,9.1,6,'./');
bParam.edgeL = [1 2 1;
3 2 1;
3 1 1;
];
bParam.dScale = 3;
bParam.kp1 = 100;
bParam.kp2 = 100;
bParam.ki1 = 0;
bParam.ki2 = 0;
bParam.nNodeVref = 1;
corRobot = [0; 0;0;
-1; -2;0;
-3; -3;0;
]; % xy xy xy
robStateLen = size(omni.origin.A,1);
robStateLen = size(bParam.model.origin.A,1);
B = [
1 0; 0 1;
0 0; 0 0;
0 0; 0 0;
];
kp = 1;
ki = 0;
% fvref = fncSpeedRef('ysin',50,2,robStateLen);
% fvref = fncSpeedRef('xsin',50,2,robStateLen);
% fvref = fncSpeedRef('cw',-300,1,robStateLen);
@ -31,30 +40,31 @@ ki = 0;
fvref = fncSpeedRef('s',0,0,robStateLen);
h = .01;
tspan = 1:h:10;
% sys = formationControl2ndBuilder(conRobot,robStateLen,kp,kp,ki,ki,length_d,1);
% sys = formationControl1stBuilder(conRobot,robStateLen,kp,kp,ki,ki,length_d,1);
% sys = formationControl2ndModelBuilder(conRobot,omni.origin,kp,kp,ki,ki,length_d,1);
sys = formationControl1stModelBuilder(conRobot,omni.origin,kp,kp,ki,ki,length_d,1);
% sys = formationControl2ndBuilder(bParam);
% sys = formationControl1stBuilder(bParam);
sys = formationControl2ndModelBuilder(bParam);
% sys = formationControl1stModelBuilder(bParam);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% config nang nduwur
_zero = zeros(size(sys.R(corRobot,sys.K),1),1);
sInit = [corRobot; _zero;];
s1stInit = [corRobot; zeros(size(corRobot)); zeros(size(dRobot))];
s1stInit = [corRobot; zeros(size(corRobot)); zeros(size(sys.d))];
s2ndInit = [corRobot;zeros(length(corRobot),1); zeros(length(corRobot),1); _zero;];
s2ndModelInit = [corRobot; zeros(length(corRobot),1); zeros(length(corRobot),1); _zero; zeros(length(corRobot),1);];
% state_init = s2ndInit;
% state_init = sInit;
% state_init = s2ndModelInit;
state_init = s1stInit;
state_init = s2ndModelInit;
% state_init = s1stInit;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% start solving
printf("Mulai memecakan masalah \n\n");
startExe = tic;
% continue
dydt = @(t, y) sys.ss(y,fvref(t));
dydt = @(t, y) algo_init(sys,y,fvref(t));
[t,y] = ode45(dydt, tspan, state_init);
% discrate taylor methode
@ -121,13 +131,13 @@ function plot_con (pltRb, yOut, conIn,xm,ym, time)
endfor
endfunction
plot_con(plot_rb, y', conRobot, xrb, yrb, 1);
% plot_con(plot_rb, y', conRobot, xrb, yrb, round(length(tspan)/2));
plot_con(plot_rb, y', conRobot, xrb, yrb, length(tspan));
plot_con(plot_rb, y', bParam.edgeL, xrb, yrb, 1);
% plot_con(plot_rb, y', bParam.edgeL, xrb, yrb, round(length(tspan)/2));
plot_con(plot_rb, y', bParam.edgeL, xrb, yrb, length(tspan));
str_tmp = "legend(";
for i = 1:numNodes(edgeL2adjL(conRobot))-1;
for i = 1:numNodes(edgeL2adjL(bParam.edgeL))-1;
str_tmp =strcat(str_tmp,sprintf("\"R%i \", ",i));
endfor
str_tmp =strcat(str_tmp,sprintf("\"R%i \" )",++i));

100
SOURCE/algo_init.m Normal file
View File

@ -0,0 +1,100 @@
function state = algo_init(obj, st, vRef)
algo_info = load("algo_info.m");
algo = algo_info.algo;
d = algo_info.d;
ang = algo_info.ang;
save_state = algo_info.save_state;
fDeggreCosine = @(a,b,c) acosd(((a^2)+(b^2)-(c^2)) ...
/(2*a*b));
switch(algo);
case 0;
d(1,1) = norm((obj.K*st(1:obj.nodeStateLength))(1:3));
d(2,1) = norm((obj.K*st(1:obj.nodeStateLength))(4:6));
algo = 1;
state = st;
al_state = [st(1:3)' st(obj.nodeStateLength+1:obj.nodeStateLength+3)']';
case 1;
set_point = [2 0 0 0 0 0]';
state = obj.Av2(st,[1 0 0])*st + obj.B(st)*obj.d + obj.Kb*vRef;
al_state = [st(1:3)' st(obj.nodeStateLength+1:obj.nodeStateLength+3)']';
if norm(al_state - set_point) < .1
d(1,2) = norm((obj.K*st(1:obj.nodeStateLength))(1:3)); ... from sensor
d(2,2) = norm((obj.K*st(1:obj.nodeStateLength))(4:6));
ang(1) = 180 - fDeggreCosine(al_state(1),d(1,2),d(1,1));
ang(2) = 180 - fDeggreCosine(al_state(1),d(2,2),d(2,1));
save_state = al_state;
printf("<algo_init>Estimate stage 1 \n");
cal_al_state = [d(1,2)*cosd(ang(1))+al_state(1);
d(1,2)*sind(ang(1))+al_state(2);
0 ;
d(2,2)*cosd(ang(2))+al_state(1);
d(2,2)*sind(ang(2))+al_state(2);
0]
algo=2;
else
al_state = obj.param.model.A * al_state ...
+ obj.param.model.B ...
* arrayfun(obj.param.model.limit_motor, ...
(obj.param.model.Nst * set_point ...
- obj.param.model.Kst*al_state ));
state(1:3) = al_state(1:3);
state(obj.nodeStateLength+1:obj.nodeStateLength+3) = al_state(4:6);
endif
case 2;
set_point = [1 1 0 0 0 0]';
state = obj.Av2(st,[1 0 0])*st + obj.B(st)*obj.d + obj.Kb*vRef;
al_state = [st(1:3)' st(obj.nodeStateLength+1:obj.nodeStateLength+3)']';
if norm(al_state - set_point) < .1
printf("<algo_init>Estimate stage 2 \n");
cal_al_state = [al_state(1:3);
d(1,2)*cosd(ang(1))+save_state(1);
d(1,2)*sind(ang(1))+save_state(2);
0 ;
d(2,2)*cosd(ang(2))+save_state(1);
d(2,2)*sind(ang(2))+save_state(2);
0];
d(1,3) = norm((obj.K*st(1:obj.nodeStateLength))(1:3)); ... from sensor
d(2,3) = norm((obj.K*st(1:obj.nodeStateLength))(4:6));
_d(1) = norm((obj.K*cal_al_state(1:obj.nodeStateLength))(1:3));
_d(2) = norm((obj.K*cal_al_state(1:obj.nodeStateLength))(4:6));
printf("<algo_init> validating...\n");
for i = 1:length(ang)
if sum( (abs(_d(i) - d(i,3))) < .1 )
printf("<algo_init> %i pass\n",i);
else
printf("<algo_init> inverte on %i\n",i);
ang(i) = 180 + fDeggreCosine(save_state(1),d(i,2),d(i,1));
endif
endfor
cal_al_state = [al_state(1:3);
d(1,2)*cosd(ang(1))+save_state(1);
d(1,2)*sind(ang(1))+save_state(2);
0 ;
d(2,2)*cosd(ang(2))+save_state(1);
d(2,2)*sind(ang(2))+save_state(2);
0]
if norm(cal_al_state - st(1:9)) < .1
printf("<algo_init> done\n");
algo=3;
else
printf("<algo_init> fail\n");
algo=9;
endif
else
al_state = obj.param.model.A * al_state ...
+ obj.param.model.B ...
* arrayfun(obj.param.model.limit_motor, ...
(obj.param.model.Nst * set_point ...
- obj.param.model.Kst*al_state ));
state(1:3) = al_state(1:3);
state(obj.nodeStateLength+1:obj.nodeStateLength+3) = al_state(4:6);
endif
case 3;
state = obj.A(st)*st + obj.B(st)*obj.d + obj.Kb*vRef;
case 9;
state = obj.Av2(st,[0 0 0])*st + obj.B(st)*obj.d + obj.Kb*vRef;;
endswitch;
save "algo_info.m" ang save_state algo d;
endfunction

View File

@ -1,5 +1,13 @@
function obj = formationControl2ndBuilder(edgeL,robStateLen,kp1,kp2,ki1,ki2,dScale,nNodeVref)
function obj = formationControl2ndBuilder(param)
addpath("./networks-toolbox");
edgeL = param.edgeL;
model = param.model.origin;
kp1 = param.kp1;
kp2 = param.kp2;
ki1 = param.ki1;
ki2 = param.ki2;
dScale = param.dScale;
nNodeVref = param.nNodeVref;
obj = struct();
[obj.R, obj.K, obj.d] = rigidityMatrixFnc(edgeL,robStateLen);
obj.m = length(obj.d);

View File

@ -1,5 +1,13 @@
function obj = formationControl1stModelBuilder(edgeL,model,kp1,kp2,ki1,ki2,dScale,nNodeVref)
function obj = formationControl1stModelBuilder(param)
addpath("./networks-toolbox");
edgeL = param.edgeL;
model = param.model.origin;
kp1 = param.kp1;
kp2 = param.kp2;
ki1 = param.ki1;
ki2 = param.ki2;
dScale = param.dScale;
nNodeVref = param.nNodeVref;
obj = struct();
robStateLen = size(model.A,1)
[obj.R, obj.K, obj.d] = rigidityMatrixFnc(edgeL,robStateLen);
@ -13,7 +21,7 @@ function obj = formationControl1stModelBuilder(edgeL,model,kp1,kp2,ki1,ki2,dScal
% pilih robot mana yang ingin dijalankan dengan mengganti 0 menjadi 1
% r 1 2 3 r 1 2 3
% v v v v v v
obj.A = kron([zeros(obj.n) zeros(obj.n);zeros(obj.n) diag([1 1 1])],model.A) + kron([zeros(obj.n) diag([1 1 1]);zeros(obj.n) zeros(obj.n)],eye(obj.n));
obj.A = kron([zeros(obj.n) zeros(obj.n);zeros(obj.n) diag([1 0 0])],model.A) + kron([zeros(obj.n) diag([1 0 0]);zeros(obj.n) zeros(obj.n)],eye(obj.n));
obj.B = kron([zeros(obj.n); eye(obj.n)],model.B);
obj.Ksgn = kron([zeros(obj.n) zeros(obj.n);zeros(obj.n) eye(obj.n)],model.K);
obj.controller = @(set_point,st) arrayfun(model.limit_motor,_nst * set_point + _kst * st(1:(2 * obj.nodeStateLength)));

View File

@ -1,5 +1,13 @@
function obj = formationControl2ndBuilder(edgeL,robStateLen,kp1,kp2,ki1,ki2,dScale,nNodeVref)
function obj = formationControl2ndBuilder(param)
addpath("./networks-toolbox");
edgeL = param.edgeL;
model = param.model.origin;
kp1 = param.kp1;
kp2 = param.kp2;
ki1 = param.ki1;
ki2 = param.ki2;
dScale = param.dScale;
nNodeVref = param.nNodeVref;
obj = struct();
[obj.R, obj.K, obj.d] = rigidityMatrixFnc(edgeL,robStateLen);
obj.m = length(obj.d);

View File

@ -1,7 +1,16 @@
function obj = formationControl2ndModelBuilder(edgeL,model,kp1,kp2,ki1,ki2,dScale,nNodeVref)
function obj = formationControl2ndModelBuilder(param)
addpath("./networks-toolbox");
edgeL = param.edgeL;
model = param.model.origin;
kp1 = param.kp1;
kp2 = param.kp2;
ki1 = param.ki1;
ki2 = param.ki2;
dScale = param.dScale;
nNodeVref = param.nNodeVref;
% pkg load parallel
obj = struct();
obj.param = param;
robStateLen = size(model.syscl.A,1)
[obj.R, obj.K, obj.d] = rigidityMatrixFnc(edgeL,robStateLen);
obj.m = length(obj.d);
@ -10,14 +19,48 @@ function obj = formationControl2ndModelBuilder(edgeL,model,kp1,kp2,ki1,ki2,dScal
obj.stateLength = 4 * obj.nodeStateLength + obj.m;
% build matrix sistem
obj.A1 = @(st) [zeros(obj.nodeStateLength), zeros(obj.nodeStateLength), zeros(obj.nodeStateLength),zeros(obj.nodeStateLength,obj.m), eye(obj.nodeStateLength)];
obj.A2 = @(st) [-kp2*obj.R(st(1:(obj.nodeStateLength)),obj.K)'*obj.R(st(1:(obj.nodeStateLength)),obj.K), -kp1*eye(obj.nodeStateLength), -eye(obj.nodeStateLength), -obj.R(st(1:(obj.nodeStateLength)),obj.K)',zeros(obj.nodeStateLength)];
obj.A3 = @(st) [zeros(obj.nodeStateLength), ki1*eye(obj.nodeStateLength), zeros(obj.nodeStateLength), zeros(obj.nodeStateLength,obj.m), zeros(obj.nodeStateLength)];
obj.A4 = @(st) [ki2*obj.R(st(1:(obj.nodeStateLength)),obj.K), zeros(obj.m,obj.nodeStateLength), zeros(obj.m,obj.nodeStateLength), zeros(obj.m), zeros(obj.m,obj.nodeStateLength)];
obj.A1 = @(st) [zeros(obj.nodeStateLength), ...
zeros(obj.nodeStateLength), ...
zeros(obj.nodeStateLength), ...
zeros(obj.nodeStateLength,obj.m), ...
eye(obj.nodeStateLength) ...
];
obj.A2 = @(st) [-kp2*obj.R(st(1:(obj.nodeStateLength)), ...
obj.K)'*obj.R(st(1:(obj.nodeStateLength)), ...
obj.K), -kp1*eye(obj.nodeStateLength), ...
-eye(obj.nodeStateLength), ...
-obj.R(st(1:(obj.nodeStateLength)),obj.K)', ...
zeros(obj.nodeStateLength) ...
];
obj.A3 = @(st) [zeros(obj.nodeStateLength), ...
ki1*eye(obj.nodeStateLength), ...
zeros(obj.nodeStateLength), ...
zeros(obj.nodeStateLength,obj.m), ...
zeros(obj.nodeStateLength) ...
];
obj.A4 = @(st) [ki2*obj.R(st(1:(obj.nodeStateLength)), ...
obj.K), zeros(obj.m,obj.nodeStateLength), ...
zeros(obj.m,obj.nodeStateLength), ...
zeros(obj.m), ...
zeros(obj.m,obj.nodeStateLength) ...
];
obj.MOsgn =@(st) diag([model.sgn(st(1)) model.sgn(st(2)) model.sgn(st(3))]);
obj.MOdist = @(st) [obj.MOsgn(st(31:33)) zeros(robStateLen) zeros(robStateLen); zeros(robStateLen) obj.MOsgn(st(34:36)) zeros(robStateLen); zeros(robStateLen) zeros(robStateLen) obj.MOsgn(st(37:39))];
obj.MO = @(st) [zeros(obj.nodeStateLength), kron(eye(robStateLen),model.syscl.B) , zeros(obj.nodeStateLength), zeros(obj.nodeStateLength,obj.m), kron(eye(robStateLen),model.syscl.A)+obj.MOdist(st)];
obj.MOdist = @(st) [obj.MOsgn(st(31:33)) zeros(robStateLen) zeros(robStateLen); ...
zeros(robStateLen) obj.MOsgn(st(34:36)) zeros(robStateLen); ...
zeros(robStateLen) zeros(robStateLen) obj.MOsgn(st(37:39)) ...
];
obj.MO = @(st) [zeros(obj.nodeStateLength), ...
kron(diag([1 1 1]),model.syscl.B), ...
zeros(obj.nodeStateLength), zeros(obj.nodeStateLength,obj.m), ...
kron(eye(robStateLen),model.syscl.A)+obj.MOdist(st) ...
];
obj.MOv2 = @(st,select) [zeros(obj.nodeStateLength), ...
kron(diag(select),model.syscl.B), ...
zeros(obj.nodeStateLength), zeros(obj.nodeStateLength,obj.m), ...
kron(eye(robStateLen),model.syscl.A)+obj.MOdist(st) ...
];
obj.A = @(st) [obj.A1(st); obj.A2(st); obj.A3(st); obj.A4(st); obj.MO(st)];
obj.Av2 = @(st,select) [obj.A1(st); obj.A2(st); obj.A3(st); obj.A4(st); obj.MOv2(st,select)];
obj.sizeA = size(obj.A(ones(obj.stateLength,1)));
% build matrix input
@ -30,7 +73,7 @@ function obj = formationControl2ndModelBuilder(edgeL,model,kp1,kp2,ki1,ki2,dScal
obj.Kb = [kron(obj.Kb,eye(robStateLen)); zeros(obj.m,robStateLen); zeros(obj.nodeStateLength,robStateLen)];
obj.d = obj.d*dScale;
obj.dss = @(st,h,vRef) (eye(obj.sizeA) + (obj.A(st)*h))*st + obj.B(st)*h*obj.d + obj.Kb*h*vRef;
obj.ss = @(st,vRef) obj.A(st)*st + obj.B(st)*obj.d + obj.Kb*vRef;
obj.ss= @(st,vRef) obj.A(st)*st + obj.B(st)*obj.d + obj.Kb*vRef;
printf("============== Formation Control ============ \n");
printf(" state model : %i \n", obj.nodeStateLength);

Binary file not shown.

1363690
SOURCE/param.m Normal file

File diff suppressed because it is too large Load Diff