Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %% Initial setup
- clc;
- close all;
- clear all;
- colours = [ 0 0.4470 0.7410
- 0.8500 0.3250 0.0980
- 0.9290 0.6940 0.1250
- 0.4940 0.1840 0.5560
- 0.4660 0.6740 0.1880
- 0.3010 0.7450 0.9330
- 0.6350 0.0780 0.1840];
- lw = 1.5;
- ms = 8;
- addpath('/home/manuel/manuel_ws/casadi_ws/casadi_prog')
- import casadi.*
- %------------------------------------------------------
- T = 8; % Time horizon
- N = 40; % number of control intervals
- dt = T/N; % length of 1 control interval [s]
- %% Continuous dynamics
- addpath('/home/manuel/manuel_ws/casadi_ws/casadi_prog')
- import casadi.*
- %------------------------------------------------------
- p = MX.sym('p',3);
- yaw = MX.sym('yaw');
- v = MX.sym('v',4);
- u = MX.sym('u',4);
- x = [p; yaw; v];
- tau = 1;
- R = MX([cos(yaw) -sin(yaw) 0;
- sin(yaw) cos(yaw) 0;
- 0 0 1]);
- xdot = [ R*v(1:3); v(4); -(v+u)/tau];
- % Continuous time dynamics
- f = Function('f', {x, u}, {xdot},{'x','u'},{'xdot'});
- %% Integrator
- addpath('/home/manuel/manuel_ws/casadi_ws/casadi_prog')
- import casadi.*
- %------------------------------------------------------
- %The problem we want to solve
- prob = struct('x',x,'p',u,'ode',f(x,u));
- % Runge Kutta order 4
- rk_opts = struct;
- rk_opts.t0 = 0;
- rk_opts.tf = T/N;
- rk_opts.number_of_finite_elements = 1;
- % Legendre order 4
- leg_opts = struct;
- leg_opts.collocation_scheme = 'legendre';
- leg_opts.t0 = 0;
- leg_opts.tf = T/N;
- leg_opts.number_of_finite_elements = 1;
- leg_opts.interpolation_order = 4;
- % Reference Runge-Kutta implementation
- intg = integrator('intg','rk',prob,rk_opts);
- res = intg('x0',x,'p',u);
- % Discretized (sampling time dt) system dynamics as a CasADi Function
- F = Function('F', {x, u}, {res.xf},{'x(0)','u(0)'},{'x(dt)'});
- %%
- S = [0.4, 0, 0; 0, 0.1, 0; 0, 0, 0.01];
- alpha = 0.01;
- % alpha = 1-0.9973;
- z_alpha = norminv(1-alpha);
- r_box_x = 1;
- r_box_y = 0.5;
- r_obs_x = r_box_x*sqrt(2);
- r_obs_y = r_box_y*sqrt(2);
- E = [1/r_obs_x, 0, 0;
- 0 1/r_obs_y, 0;
- 0 0 0];
- %r_box = 1;
- xo= 5;
- yo= -0.01;
- zo= 0;
- xo2 = 1;
- yo2 = 4;
- x0 = zeros(numel(x),1);
- x0(1) = 0;
- x0(2) = 0;
- u0 = zeros(numel(u),1);
- %Plane
- v = [x0(1) - xo, x0(2) - yo, x0(3) - zo]';
- n = v/norm(v);
- ref = repmat([10;0;0],1,N+1); size(ref);
- x0 = zeros(numel(x),1);
- x0(1) = 0;
- x0(2) = 0;
- u0 = zeros(numel(u),1);
- z_alpha = norminv(1-alpha/N);
- %% Optimal control problem (Zhu)
- addpath('/home/manuel/manuel_ws/casadi_ws/casadi_prog')
- addpath('/home/manuel/manuel_ws/matlab_ws/shapes')
- import casadi.*
- %------------------------------------------------------
- opti = casadi.Opti();
- % Decision variables for states
- X = opti.variable(numel(x),N+1);
- U = opti.variable(numel(u),N);
- % Parameter for initial state
- %x0 = opti.parameter(nx);
- % Aliases for states
- px = X(1,:);
- py = X(2,:);
- pz = X(3,:);
- theta = X(4,:);
- vf = X(5,:);
- vs = X(6,:);
- vu = X(7,:);
- vh = X(8,:);
- pos = X(1:3,:);
- % Gap-closing shooting constraints
- for k=1:N
- opti.subject_to(X(:,k+1)==F(X(:,k),U(:,k)));
- %opti.subject_to( n(1)*(px(k)-xo) + n(2)*(py(k)-yo) > r_obs + z_alpha.*sqrt(transpose(n)*S*n));
- opti.subject_to( n(1)*(px(k)-xo)/r_obs_x + n(2)*(py(k)-yo)/r_obs_y > 1 + z_alpha.*sqrt(transpose(n)*E*S*E'*n));
- end
- opti.subject_to(X(:,1)==x0);
- %Cost
- L=[];
- % for i= 1:N
- % L = L+(pos(:,i) - ref(:,i)).^2 + U(:,i).^2
- % end
- opti.minimize(sumsqr(pos-ref) + 2*sumsqr(U));
- opti.solver('ipopt')
- sol = opti.solve();
- sol1.px = sol.value(px);
- sol1.py = sol.value(py);
- sol1.pz = sol.value(pz);
- %% Optimal control problem 2 (Kamel)
- addpath('/home/manuel/manuel_ws/casadi_ws/casadi_prog')
- addpath('/home/manuel/manuel_ws/matlab_ws/shapes')
- import casadi.*
- %------------------------------------------------------
- opti = casadi.Opti();
- % Decision variables for states
- X = opti.variable(numel(x),N+1);
- U = opti.variable(numel(u),N);
- % Parameter for initial state
- %x0 = opti.parameter(nx);
- % Aliases for states
- px = X(1,:);
- py = X(2,:);
- pz = X(3,:);
- theta = X(4,:);
- vf = X(5,:);
- vs = X(6,:);
- vu = X(7,:);
- vh = X(8,:);
- pos = X(1:3,:);
- r_max = max([r_obs_x r_obs_y]);
- s_max = max(max(S));
- % Gap-closing shooting constraints
- for k=1:N
- opti.subject_to(X(:,k+1)==F(X(:,k),U(:,k)));
- opti.subject_to( (px(k) - xo).^2 + (py(k)-yo).^2 > (r_max + 3*s_max).^2);
- end
- opti.subject_to(X(:,1)==x0);
- %Cost
- L=[];
- % for i= 1:N
- % L = L+(pos(:,i) - ref(:,i)).^2 + U(:,i).^2
- % end
- opti.minimize(sumsqr(pos-ref) + 2*sumsqr(U));
- opti.solver('ipopt')
- sol = opti.solve();
- sol2.px = sol.value(px);
- sol2.py = sol.value(py);
- sol2.pz = sol.value(pz);
- %% Optimal control problem (Vasileios)
- z_alpha = norminv(1-alpha/(6*N));
- addpath('/home/manuel/manuel_ws/casadi_ws/casadi_prog')
- addpath('/home/manuel/manuel_ws/matlab_ws/shapes')
- import casadi.*
- %------------------------------------------------------
- opti = casadi.Opti();
- % Decision variables for states
- X = opti.variable(numel(x),N+1);
- U = opti.variable(numel(u),N);
- % Parameter for initial state
- %x0 = opti.parameter(nx);
- % Aliases for states
- px = X(1,:);
- py = X(2,:);
- pz = X(3,:);
- theta = X(4,:);
- vf = X(5,:);
- vs = X(6,:);
- vu = X(7,:);
- vh = X(8,:);
- pos = X(1:3,:);
- % Gap-closing shooting constraints
- for k=1:N
- opti.subject_to(X(:,k+1)==F(X(:,k),U(:,k)));
- opti.subject_to( ((px(k) - xo)/(r_box_x + z_alpha*S(1,1))).^2 + ((py(k)-yo)/(r_box_y+ z_alpha*S(2,2))).^2 > 3);
- end
- opti.subject_to(X(:,1)==x0);
- %Cost
- L=[];
- % for i= 1:N
- % L = L+(pos(:,i) - ref(:,i)).^2 + U(:,i).^2
- % end
- opti.minimize(sumsqr(pos-ref) + 2*sumsqr(U));
- opti.solver('ipopt')
- sol = opti.solve();
- sol4.px = sol.value(px);
- sol4.py = sol.value(py);
- sol4.pz = sol.value(pz);
- %% Optimal control problem (Ours)
- z_alpha = norminv(1-alpha/N);
- addpath('/home/manuel/manuel_ws/casadi_ws/casadi_prog')
- addpath('/home/manuel/manuel_ws/matlab_ws/shapes')
- import casadi.*
- %------------------------------------------------------
- opti = casadi.Opti();
- % Decision variables for states
- X = opti.variable(numel(x),N+1);
- U = opti.variable(numel(u),N);
- % Parameter for initial state
- %x0 = opti.parameter(nx);
- % Aliases for states
- px = X(1,:);
- py = X(2,:);
- pz = X(3,:);
- theta = X(4,:);
- vf = X(5,:);
- vs = X(6,:);
- vu = X(7,:);
- vh = X(8,:);
- pos = X(1:3,:);
- % Gap-closing shooting constraints
- for k=1:N
- opti.subject_to(X(:,k+1)==F(X(:,k),U(:,k)));
- opti.subject_to( ((px(k) - xo)/(r_box_x + z_alpha*S(1,1))).^2 + ((py(k)-yo)/(r_box_y+ z_alpha*S(2,2))).^2 > 3);
- end
- opti.subject_to(X(:,1)==x0);
- %Cost
- L=[];
- % for i= 1:N
- % L = L+(pos(:,i) - ref(:,i)).^2 + U(:,i).^2
- % end
- opti.minimize(sumsqr(pos-ref) + 2*sumsqr(U));
- opti.solver('ipopt')
- sol = opti.solve();
- sol3.px = sol.value(px);
- sol3.py = sol.value(py);
- sol3.pz = sol.value(pz);
- %% Plot 2D
- addpath('/home/manuel/manuel_ws/matlab_ws/plots')
- y = linspace(-3,3,100);
- x = xo + r_obs_x*(1 + z_alpha.*sqrt(transpose(n)*E*S*E'*n) - n(2)*(y-yo)/r_obs_y)/n(1);
- close all;
- fig =figure;
- hold on
- plot(sol1.px,sol1.py,'-o','Color',colours(5,:), 'LineWidth', lw, 'MarkerSize', ms)
- plot(sol2.px,sol2.py,'-*','Color',colours(3,:), 'LineWidth', lw, 'MarkerSize', ms)
- plot(sol3.px,sol3.py,'->','Color',colours(1,:), 'LineWidth', lw, 'MarkerSize', ms)
- %plot(sol4.px,sol4.py,'->','Color',colours(4,:), 'LineWidth', lw, 'MarkerSize', ms)
- %plot(x,y,'Color',colours(3,:), 'LineWidth', lw, 'MarkerSize', ms)
- rectangle('Position',[xo-r_obs_x yo-r_obs_y 2*r_obs_x 2*r_obs_y],'Curvature',[1 1],'LineWidth', lw, 'FaceColor', [colours(2,:) 0.25], 'EdgeColor', [colours(2,:) 0.85]);
- rectangle('Position',[xo-r_box_x yo-r_box_y 2*r_box_x 2*r_box_y], 'LineWidth', lw, 'FaceColor', [colours(2,:) 0.9], 'EdgeColor', [colours(2,:) 0.85]);
- %rectangle('Position',[xo-r_obs yo-r_obs 2*r_obs 2*r_obs],'Curvature',[1 1])
- %axis([-2 2 0 6])
- %rectangle('Position',[xo-0.2 yo-0.2 0.4 0.4],'Curvature',[0.2 0.2], 'LineWidth', lw, 'FaceColor', 'w', 'EdgeColor', 'none');
- %text('Position',[xo-0.05, yo],'string','O','FontSize',15)
- ylim([-3 3])
- xlim([0 10])
- daspect([1 1 1]);
- legend('Linearized chance constraint (Zhu et. al. [6])', 'Robust constraint (Kamel et. al. [5])','Our approach','Location','southeast');
- xlabel('$x (m)$')
- ylabel('$y (m)$')
- grid on
- width = 6;
- height = 5;
- fontsize = 14;
- printPaperFig(fig, width, height, fontsize,'trajectory');
- %% Solution
- zhu.obj = 3.2140000085882039e+03;
- zhu.sec = 0.225;
- kamel.obj = 1.3419447587855689e+03;
- kamel.sec = 0.652;
- vasi.obj = 1.2474557178331086e+03;
- vasi.sec = 0.498;
- our.obj = 1.2283172186935908e+03;
- our.sec = 0.494;
- % Relative values
- zhu.obj = zhu.obj/our.obj;
- zhu.sec = zhu.sec/our.sec
- kamel.obj = kamel.obj/our.obj;
- kamel.sec = kamel.sec/our.sec
- vasi.obj = vasi.obj/our.obj;
- vasi.sec = vasi.sec/our.sec
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement