-
Notifications
You must be signed in to change notification settings - Fork 0
/
run_model_vassil_v5.m
231 lines (194 loc) · 6.22 KB
/
run_model_vassil_v5.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
% Version 5
%
% - Changed robot so that it determines heading before moving.
% - Changed to use velocity control instead of distance control.
% - Uses obstacleSensor to detect obstacles in field of view.
%
%----------------------------------------------%
% Workspace Clear up
close all;
clear all;
clc;
%----------------------------------------------%
%----------------------------------------------%
% Setup Simulation
desired_coord(1,:) = [0 2];
desired_coord(2,:) = [4 0];
desired_coord(3,:) = [-1 4];
desired_coord(4,:) = [0 0];
desired_coord(5,:) = [-0 2];
sim_time = 60;
dT = 0.05;
point = 1;
xi = zeros(1,24); % initial state for x
LeftS = 0;
RightS = 0;
err_psi_i(1) = 0;
err_vel_i(1) = 0;
%----------------------------------------------%
%----------------------------------------------%
% Create Environment
max_x = 10;
max_y = 10;
Obs_Matrix = zeros(max_x/0.01,max_y/0.01);
wall = WallGeneration1(-1, 1,1.2,1.2,'h');
wall2 = WallGeneration1(-3, -3, -2, 2,'v');
for x=1:length(wall)
% xpos = x point of wall + origin
xpos = (wall(x,1)/0.01)+((max_x/2)/0.01);
ypos = (wall(x,2)/0.01)+((max_y/2)/0.01);
Obs_Matrix(ypos,xpos) = 1;
end
for x=1:length(wall2)
xpos = (wall2(x,1)/0.01)+((max_x/2)/0.01);
ypos = (wall2(x,2)/0.01)+((max_y/2)/0.01);
Obs_Matrix(ypos,xpos) = 1;
end
%----------------------------------------------%
tic;
%----------------------------------------------%
for outer_loop = 1:(sim_time/dT)
%----------------------------------------------%
%
%
%
% CONTROLLER SECTION
cur_x = xi(19);
cur_y = xi(20);
cur_psi = xi(24);
cur_vel = xi(13);
n = outer_loop;
% Check the sensors for objects:
[objectDetected] = obstacleSensor(cur_psi,cur_x,cur_y,max_x,max_y,Obs_Matrix);
if objectDetected == 1
[objectDetected,distance_min] = obstacleSensor(cur_psi,cur_x,cur_y,max_x,max_y,Obs_Matrix);
fprintf('Object Detected in %.2f \n',distance_min);
end
% get required heading for desired position
[at_waypoint, desired_psi] = los_auto(cur_x,cur_y,desired_coord,point);
% if at waypoint and if velocity is sufficiently low (i.e. robot has stopped)
if at_waypoint == 1 && cur_vel <= 0.01
robot_path(point,:) = [cur_x,cur_y];
if point < size(desired_coord,1)
% look at the next desired point
point = point+1;
[at_waypoint, desired_psi] = los_auto(cur_x,cur_y,desired_coord,point);
else
break;
end
end
%---------------------------------------------------------------------%
% Once we've obtained the desired heading a controller needs to be
% designed to feed appropriate voltages into the motors
%
% First calculate error err_psi between current and desired heading,
% then error between current and desired distance
% Change heading to be from 0 to 360 degrees
if cur_psi < 0
cur_psi_360 = cur_psi + 2*pi;
elseif cur_psi >= 2*pi
cur_psi_360 = cur_psi - 2*pi;
else
cur_psi_360 = cur_psi;
end
if desired_psi < 0
desired_psi_360 = desired_psi + 2*pi;
elseif desired_psi >= 2*pi
desired_psi_360 = desired_psi - 2*pi;
else
desired_psi_360 = desired_psi;
end
err_psi(n) = desired_psi - cur_psi_360;
% error shouldn't be bigger than 180 degrees:
if abs(err_psi(n)) > pi
err_psi(n)=-sign(err_psi(n))*(2*pi-abs(err_psi(n)));
end
[desired_vel] = getVelocity(desired_coord(point,:),cur_x,cur_y);
% store desired velocity throughout simulation for later plotting
desired_velocity(n) = desired_vel;
% While the heading is wrong, don't move robot
if abs(err_psi(n)) > 0.2
desired_vel = 0;
end
err_vel(n) = desired_vel - cur_vel;
%---------------------------------------------------------------------%
% PID Controllers for heading and velocity:
Kp_psi = 20;
Ki_psi = 0.1;
Kd_psi = 0.1;
Kp_vel = 2.5; %5
Ki_vel = 35; %70
Kd_vel = .01; %.01
if n == 1
prev_n = 1;
else
prev_n = n-1;
end
% For error in psi:
%
% Using Euler's backward rule
err_psi_i(n) = err_psi_i(prev_n) + err_psi(n)*dT;
err_psi_d(n) = (err_psi(n) - err_psi(prev_n))/dT;
u_psi(n) = Kp_psi * err_psi(n) + Ki_psi * err_psi_i(n) +...
+ Kd_psi * err_psi_d(n) ;
%
%
% For error in velocity:
err_vel_i(n) = err_vel_i(prev_n) + err_vel(n)*dT;
err_vel_d(n) = (err_vel(n) - err_vel(prev_n))/dT;
u_vel(n) = Kp_vel*err_vel(n)+Ki_vel*err_vel_i(n)+Kd_vel*err_vel_d(n);
%------------------------------------------------------------------%
% Convert inputs into voltages:
if abs(u_vel(n))> 12
u_vel(n) = sign(u_vel(n))*12;
end
Vl = (u_vel(n) + u_psi(n))/2;
Vr = (u_vel(n) - u_psi(n))/2;
if Vl > 7.4 || Vl < -7.4
Vl = sign(Vl)*7.4;
end
if Vr > 7.4 || Vr < -7.4
Vr = sign(Vr)*7.4;
end
V_matrix(1,n) = Vl;
V_matrix(2,n) = Vr;
%
%
%
%
%
%----------------------------------------------%
% Run Model
Va = [Vl; Vl; Vr; Vr];
[xdot, xi] = full_mdl_motors(Va,xi,0,0,0,0,dT);
xi = xi + (xdot*dT); % Euler intergration
% Store varibles
xdo(outer_loop,:) = xdot;
xio(outer_loop,:) = xi;
%----------------------------------------------%
%----------------------------------------------%
figure(1);
clf; hold on; grid on; axis([-5,5,-5,5]);
drawrobot(0.2,xi(20),xi(19),xi(24),'b');
drawSensorCone(xi(24),xi(19),xi(20),1);
xlabel('y, m'); ylabel('x, m');
plot(wall(:,1),wall(:,2),'k-');
plot(wall2(:,1),wall2(:,2),'k-');
pause(0.001);
%----------------------------------------------%
end
%----------------------------------------------%
% Plot which points the robot reached
figure(1);
for i=1:1:size(desired_coord,1)
plot(robot_path(i,2),robot_path(i,1),'-x');
plot(xio(:,20),xio(:,19),'k');
end
%----------------------------------------------%
toc;
%Plot Variables
figure(2); plot(xio(:,20),xio(:,19));
figure(3); plot(xio(:,19));
figure(4); plot(xio(:,24));
%figure(5);hold on; plot(xio(:,13));
%----------------------------------------------%