%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Vehicle guidance for obstacle avoidance example
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Kevin Passino
% Version: 1/25/01
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear % Initialize memory
xmin=[0; 0]; % Set edges of region want to search in
xmax=[30;30];
Nsteps=500; % Maximum number of steps to produce
% Next set the parameters of the vehicle:
lambda=0.1; % Step size to take in chosen direction at each move
Ns=16; % Number of points on circular pattern to sense
r=1; % Sensing radius
xs=0*ones(2,Ns); % Initialize
Jo(:,1)=0*ones(Ns,1);
Jg(:,1)=0*ones(Ns,1);
J(:,1)=0*ones(Ns,1);
theta(:,1)=0*ones(Ns,1);
for m=2:Ns % Compute the angles to be used around the circle
theta(m,1)=theta(m-1,1)+(pi/180)*(360/Ns);
end
% Goal position of vehicle
xgoal=[25; 25];
% Initial vehicle position
x=[5; 5];
% Weighting parameters for planning (sets priority for being aggresive
% in the direction of the goal vs. avoiding obstacles
w1=1;
w2=1.0000e-04;
% Allocate memory
x(:,2:Nsteps)=0*ones(2,Nsteps-1);
% The obstacles:
figure(1)
clf
% Plot initial and final positions
plot(5,5,'s',25,25,'x')
axis([0 30 0 30])
hold on
xlabel('x');
ylabel('y');
title('Obstacles (o), initial vehicle (square) and goal (x) positions');
hold on
% Plot obstacle positions (sets obstaclefunction)
plot(20,15,'o',8,10,'o',10,10,'o',12,10,'o',24,20,'o',18,20,'o')
hold off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plot the functions:
xx=0:31/100:30; % For our function the range of values we are considering
yy=xx;
% Compute the obstacle and goal functions
for jj=1:length(xx)
for ii=1:length(yy)
zz(ii,jj)=obstaclefunction([xx(jj);yy(ii)],w1);
end
end
for jj=1:length(xx)
for ii=1:length(yy)
zzz(ii,jj)=goalfunction([xx(jj);yy(ii)],xgoal,w2);
end
end
figure(2)
clf
surf(xx,yy,zz);
%colormap(jet)
% Use next line for generating plots to put in black and white documents.
colormap(white);
xlabel('x');
ylabel('y');
zlabel('w_1J_o');
title('Function w_1J_o showing (scaled) obstacle function values');
figure(3)
clf
contour(xx,yy,zz,25)
colormap(jet)
% Use next line for generating plots to put in black and white documents.
%colormap(white);
xlabel('x');
ylabel('y');
title('Contour map of w_1J_o and initial (square) and goal (x) positions');
hold on
% Plot initial and final positions
plot(5,5,'s',25,25,'x')
hold off
figure(4)
clf
surf(xx,yy,zzz);
view(82,26);
%colormap(jet)
% Use next line for generating plots to put in black and white documents.
colormap(white);
xlabel('x');
ylabel('y');
zlabel('w_2J_g');
title('Goal function (scaled)');
%rotate3d
figure(5)
clf
contour(xx,yy,zzz,25)
colormap(jet)
% Use next line for generating plots to put in black and white documents.
%colormap(gray);
xlabel('x');
ylabel('y');
title('Contour function of w_2J_g and initial (square) and goal (x) positions');
hold on
% Plot initial and final positions
plot(5,5,'s',25,25,'x')
hold off
figure(6)
clf
contour(xx,yy,zz+zzz,50)
colormap(jet)
% Use next line for generating plots to put in black and white documents.
%colormap(gray);
xlabel('x');
ylabel('y');
title('J=w_1J_o + w_2J_g and initial (square) and goal (x) positions');
hold on
% Plot initial and final positions
plot(5,5,'s',25,25,'x')
hold off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Start the simulation loop
for k=1:Nsteps
% Use projection to keep in boundaries (like hitting a wall and staying at it)
x(:,k)=min(x(:,k),xmax);
x(:,k)=max(x(:,k),xmin);
% Sense points on circular pattern
for m=1:Ns
xs(:,m)=[x(1,k)+r*cos(theta(m,1)); x(2,k)+r*sin(theta(m,1))]; % Point on circular pattern
Jo(m,1)=obstaclefunction(xs(:,m),w1); % Compute the obstace function (what is
% sensed at each sensed point
Jg(m,1)=goalfunction(xs(:,m),xgoal,w2); % Compute how well each point
% moves toward the goal
J(m,1)=Jo(m,1)+Jg(m,1); % Compute function for opt. in planning
end
% Next pick the best direction
[val,bestone]=min(J);
% Then, update the vehicle position (pick best direction and move step of lambda that way)
x(:,k+1)=[x(1,k)+lambda*cos(theta(bestone,1)); x(2,k)+lambda*sin(theta(bestone,1))];
% But the vehicle is in a real environment so when it tries to move to that point it
% only gets to near that point. To simulate this we perterb the final position.
Deltalambda=0.1*lambda*(2*rand-1); % Set the length perturbation to be up to 10% of the step size
Deltatheta=2*pi*(2*rand-1); % Set to be 360deg variation from chosen direction
x(:,k+1)=[x(1,k+1)+Deltalambda*cos(theta(bestone,1)+Deltatheta); ...
x(2,k+1)+Deltalambda*sin(theta(bestone,1)+Deltatheta)];
end % End main loop...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Next, provide some plots of the results of the simulation.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t=0:Nsteps; % For use in plotting
figure(7)
clf
plot(t,x(1,:),'k-',t,x(2,:),'k--')
ylabel('x, y')
xlabel('Iteration, k')
title('Vehicle trajectory (x solid, y dashed)')
figure(8)
clf
contour(xx,yy,zz,25)
colormap(jet)
% Use next line for generating plots to put in black and white documents.
%colormap(gray);
xlabel('x');
ylabel('y');
title('Vehicle path to avoid obstacles and reach goal');
hold on
plot(x(1,:),x(2,:),'r-')
plot(5,5,'s',25,25,'x')
hold off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% End of program
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%