clc;
close all;
clear all;
clc;
close all;
clear all;
Vd = 4.5;
Wd = 3;
R = Vd/Wd;
T = 0.01;
t = 0:T:(2*pi*R/Vd);
x0 = 0;
y0 = 1;
th0 = 0;
p = [];
u = [];
p(:,1) = [x0,y0,th0]';
u(:,1) = [Vd*cos(th0);Vd*sin(th0);Wd];
for k = 1:length(t)-1
p(:,k+1) = p(:,k) + T*[Vd*cos(p(3,k));Vd*sin(p(3,k));Wd];
p(3,k+1) = correct_angle(p(3,k+1));
u(:,1) = [Vd*cos(p(3,k+1));Vd*sin(p(3,k+1));Wd];
end
xr0 = -0.5;
yr0 = -1.5;
thr0 = pi/2;
b = 0.1;
pr0 = [xr0;yr0;thr0];
pr = [];
pr(:,1) = get_position(pr0,b);
gain=20*[1,1];
u_controller = [];
for k = 1:length(t)-1
u_controller(:,k) = get_speed(p(:,k),pr(:,k),u(:,k),gain,b);
V_controller = u_controller(1,k);
W_controller = u_controller(2,k);
pr(:,k+1) = pr(:,k) + T*[V_controller*cos(p(3,k));V_controller*sin(p(3,k));W_controller];
draw_robot_follow_path(p,k)
end
function draw_robot_follow_path(p,k)
xmin = -1;
xmax = 5;
ymin = 0;
ymax = 5;
mob_l = 0.5;
mob_W = 0.25;
Tire_W = 0.125;
Tire_l = mob_l/2;
plot(p(1,1:k+1),p(2,1:k+1),'-r' ,'LineWidth' , 1.5)
axis square;
hold on
v1=[mob_l;-mob_W];
v2=[-mob_l/4;-mob_W];
v3=[-mob_l/4;mob_W];
v4=[mob_l;mob_W];
v5=[Tire_l/2;-mob_W-0.02];
v6=[Tire_l/2;-mob_W-Tire_W-0.02];
v7=[-Tire_l/2;-mob_W-Tire_W-0.02];
v8=[-Tire_l/2;-mob_W-0.02];
v9=[Tire_l/2;mob_W+0.02];
v10=[Tire_l/2;mob_W+0.02+Tire_W];
v11=[-Tire_l/2;mob_W+0.02+Tire_W];
v12=[-Tire_l/2;mob_W+0.02];
v13=[0;-mob_W-0.02];
v14=[0;mob_W+0.02];
v15=[mob_l+Tire_l/2;Tire_W/2];
v16=[mob_l+Tire_l/2;-Tire_W/2];
v17=[mob_l-Tire_l/2;-Tire_W/2];
v18=[mob_l-Tire_l/2;Tire_W/2];
x = p(1,k);
y = p(2,k);
th = p(3,k);
R = [cos(th) -sin(th) ;sin(th) cos(th)];
p = [x;y];
v1=R*v1+p;
v2=R*v2+p;
v3=R*v3+p;
v4=R*v4+p;
v5=R*v5+p;
v6=R*v6+p;
v7=R*v7+p;
v8=R*v8+p;
v9=R*v9+p;
v10=R*v10+p;
v11=R*v11+p;
v12=R*v12+p;
v13=R*v13+p;
v14=R*v14+p;
v15=R*v15+p;
v16=R*v16+p;
v17=R*v17+p;
v18=R*v18+p;
Body= [v1 v2 v3 v4 v1];
Body_x = Body(1,:);
Body_y = Body(2,:);
plot(Body_x , Body_y ,'-k','LineWidth',2);
fill(Body_x , Body_y ,'k');
axis([xmin xmax ymin ymax]);
axis square;
R_Tire = [v5 v6 v7 v8 v5];
R_Tire_x = R_Tire(1,:);
R_Tire_y = R_Tire(2,:);
plot(R_Tire_x , R_Tire_y ,'-k','LineWidth',2);
fill(R_Tire_x , R_Tire_y,'r');
axis([xmin xmax ymin ymax]);
axis square;
L_Tire = [v9 v10 v11 v12 v9];
L_Tire_x = L_Tire(1,:);
L_Tire_y = L_Tire(2,:);
plot(L_Tire_x , L_Tire_y ,'-k','LineWidth',2);
fill(L_Tire_x , L_Tire_y,'r');
axis([xmin xmax ymin ymax]);
axis square;
line = [v13 v14];
line_x = line(1,:);
line_y = line(2,:);
plot(line_x , line_y ,'-y' ,'LineWidth',2);
axis([xmin xmax ymin ymax]);
axis square;
F_Tire = [v15 v16 v17 v18 v15];
F_Tire_x = F_Tire(1,:);
F_Tire_y = F_Tire(2,:);
plot(F_Tire_x, F_Tire_y ,'-k' ,'LineWidth',2);
fill(F_Tire_x , F_Tire_y,'r');
axis([xmin xmax ymin ymax]);
axis square;
hold off;
drawnow;
end
function [ u_controller ] = get_speed(p,pr,u,gain,b)
gain1=gain(1);
gain2=gain(2);
xd_dot = u(1);
yd_dot = u(2);
xd = p(1);
yd = p(2);
thd = p(3);
x_b = pr(1);
y_b = pr(2);
th_b = pr(3);
ex = xd-x_b;
ey = yd-y_b;
xb_dot = xd_dot + gain1*ex;
yb_dot = yd_dot + gain2*ey;
vec1 = [xb_dot;yb_dot];
vec2 = [cos(th_b) -b*sin(th_b);sin(th_b) b*cos(th_b)];
u=vec2\vec1;
end
function pb = get_position(p,b)
xreal = p(1);
yreal = p(2);
threal = p(3);
xb = xreal+b*cos(threal);
yb = yreal+b*sin(threal);
pb=[xb;yb;threal];
end
function [ out ] = correct_angle( in )
out = mod(in,2*pi);
out(out>pi) = out(out>pi)-2*pi;
end