mirror of
https://github.com/ROB-535-F21-Team-3/Control-Project.git
synced 2025-08-19 17:22:45 +00:00
Position Limits & Update bound_cons
- Add max/min position limits - Delete `eq_cons` function for now - Update `bound_cons` to enforce limit and max/min position limits - Rename `nonlincon` to `road_obstacle_cons` - Parameterize index search around closest road boundary point in `road_obstacle_cons`
This commit is contained in:
@@ -29,6 +29,11 @@ global delta_lims Fx_lims
|
|||||||
delta_lims = [-0.5, 0.5];
|
delta_lims = [-0.5, 0.5];
|
||||||
Fx_lims = [-5e3, 5e3];
|
Fx_lims = [-5e3, 5e3];
|
||||||
|
|
||||||
|
% Position Limits
|
||||||
|
global x_lims y_lims
|
||||||
|
x_lims = [200, 1600];
|
||||||
|
y_lims = [-200, 1000];
|
||||||
|
|
||||||
% Initial Conditions (Equation 15)
|
% Initial Conditions (Equation 15)
|
||||||
state_init = [ ...
|
state_init = [ ...
|
||||||
287; ... % x [m]
|
287; ... % x [m]
|
||||||
@@ -208,40 +213,35 @@ function x0vec = initvec(x0, u0)
|
|||||||
end
|
end
|
||||||
|
|
||||||
%% mpc functions
|
%% mpc functions
|
||||||
function [Aeq,beq] = eq_cons(initial_idx,A,B,x_initial,npred,nstates,ninputs)
|
function [Lb, Ub] = bound_cons(idx, X_ref, U_ref)
|
||||||
%build matrix for A_i*x_i+B_i*u_i-x_{i+1}=0
|
global num_preds num_states num_inputs x_lims y_lims delta_lims Fx_lims
|
||||||
%in the form Aeq*z=beq
|
|
||||||
%initial_idx specifies the time index of initial condition from the reference trajectory
|
|
||||||
%A and B are function handles above
|
|
||||||
|
|
||||||
%initial condition
|
% initial_idx is the index along uref the initial condition is at
|
||||||
x_initial=x_initial(:);
|
Lb = -Inf(num_preds*(num_states+num_inputs), 1);
|
||||||
|
Ub = Inf(num_preds*(num_states+num_inputs), 1);
|
||||||
|
|
||||||
%size of decision variable and size of part holding states
|
for i = 0:(num_preds-1)
|
||||||
zsize=(npred+1)*nstates+npred*ninputs;
|
start_idx = get_start_idx(i);
|
||||||
xsize=(npred+1)*nstates;
|
|
||||||
|
|
||||||
Aeq=zeros(xsize,zsize);
|
% x
|
||||||
Aeq(1:nstates,1:nstates)=eye(nstates); %initial condition
|
Lb(start_idx+1) = x_lims(1) - X_ref(idx+i, 1);
|
||||||
beq=zeros(xsize,1);
|
Ub(start_idx+1) = x_lims(2) - X_ref(idx+i, 1);
|
||||||
beq(1:nstates)=x_initial;
|
|
||||||
|
|
||||||
state_idxs=nstates+1:nstates:xsize;
|
% y
|
||||||
input_idxs=xsize+1:ninputs:zsize;
|
Lb(start_idx+3) = y_lims(1) - X_ref(idx+i, 3);
|
||||||
|
Ub(start_idx+3) = y_lims(2) - X_ref(idx+i, 3);
|
||||||
|
|
||||||
for i=1:npred
|
% delta
|
||||||
%negative identity for i+1
|
Lb(start_idx+num_states+1) = delta_lims(1) - U_ref(idx+i, 1);
|
||||||
Aeq(state_idxs(i):state_idxs(i)+nstates-1,state_idxs(i):state_idxs(i)+nstates-1)=-eye(nstates);
|
Ub(start_idx+num_states+1) = delta_lims(2) - U_ref(idx+i, 1);
|
||||||
|
|
||||||
%A matrix for i
|
% F_x
|
||||||
Aeq(state_idxs(i):state_idxs(i)+nstates-1,state_idxs(i)-nstates:state_idxs(i)-1)=A(initial_idx+i-1);
|
Lb(start_idx+num_states+2) = Fx_lims(1) - U_ref(idx+1, 2);
|
||||||
|
Ub(start_idx+num_states+2) = Fx_lims(2) - U_ref(idx+1, 2);
|
||||||
%B matrix for i
|
|
||||||
Aeq(state_idxs(i):state_idxs(i)+nstates-1,input_idxs(i):input_idxs(i)+ninputs-1)=B(initial_idx+i-1);
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function [c, ceq] = nonlincon(Z, TestTrack, Xobs)
|
function [c, ceq] = road_obstacle_cons(Z, TestTrack, Xobs)
|
||||||
global num_preds num_states
|
global num_preds num_states
|
||||||
|
|
||||||
ceq = [];
|
ceq = [];
|
||||||
@@ -255,10 +255,11 @@ function [c, ceq] = nonlincon(Z, TestTrack, Xobs)
|
|||||||
[~,bl_idx] = min(vecnorm(TestTrack.bl - p));
|
[~,bl_idx] = min(vecnorm(TestTrack.bl - p));
|
||||||
[~,br_idx] = min(vecnorm(TestTrack.br - p));
|
[~,br_idx] = min(vecnorm(TestTrack.br - p));
|
||||||
|
|
||||||
bl_idx_start = clamp(bl_idx-1, 1, size(TestTrack.bl,2));
|
idx_search = 1;
|
||||||
bl_idx_end = clamp(bl_idx+1, 1, size(TestTrack.bl,2));
|
bl_idx_start = clamp(bl_idx-idx_search, 1, size(TestTrack.bl,2));
|
||||||
br_idx_start = clamp(br_idx-1, 1, size(TestTrack.br,2));
|
bl_idx_end = clamp(bl_idx+idx_search, 1, size(TestTrack.bl,2));
|
||||||
br_idx_end = clamp(br_idx+1, 1, size(TestTrack.br,2));
|
br_idx_start = clamp(br_idx-idx_search, 1, size(TestTrack.br,2));
|
||||||
|
br_idx_end = clamp(br_idx+idx_search, 1, size(TestTrack.br,2));
|
||||||
|
|
||||||
boundary_pts = [ ...
|
boundary_pts = [ ...
|
||||||
TestTrack.bl(:,bl_idx_start:1:bl_idx_end), ...
|
TestTrack.bl(:,bl_idx_start:1:bl_idx_end), ...
|
||||||
|
Reference in New Issue
Block a user