summaryrefslogtreecommitdiffstats
path: root/Kod/bilbana
diff options
context:
space:
mode:
Diffstat (limited to 'Kod/bilbana')
-rw-r--r--Kod/bilbana/files/Bana1.matbin621 -> 1216 bytes
-rw-r--r--Kod/bilbana/files/Bana2.matbin623 -> 1207 bytes
-rw-r--r--Kod/bilbana/yc4/choose_position.m28
-rw-r--r--Kod/bilbana/yc4/debug.m5
-rw-r--r--Kod/bilbana/yc4/detect_missed.m8
-rw-r--r--Kod/bilbana/yc4/do_boot.m62
-rw-r--r--Kod/bilbana/yc4/do_car.m95
-rw-r--r--Kod/bilbana/yc4/do_gov.m9
-rw-r--r--Kod/bilbana/yc4/fit_percents.m11
-rw-r--r--Kod/bilbana/yc4/get_aprox_v.m11
-rw-r--r--Kod/bilbana/yc4/get_car_constant.m2
-rw-r--r--Kod/bilbana/yc4/get_new_u.m4
-rw-r--r--Kod/bilbana/yc4/get_new_v.m6
-rw-r--r--Kod/bilbana/yc4/get_seg_constant.m19
-rw-r--r--Kod/bilbana/yc4/get_time_as_string.m12
-rw-r--r--Kod/bilbana/yc4/gov_set.m6
-rw-r--r--Kod/bilbana/yc4/main.m167
-rw-r--r--Kod/bilbana/yc4/setup_car.m17
-rw-r--r--Kod/bilbana/yc4/verbose.m6
19 files changed, 347 insertions, 121 deletions
diff --git a/Kod/bilbana/files/Bana1.mat b/Kod/bilbana/files/Bana1.mat
index d83861f..e745c59 100644
--- a/Kod/bilbana/files/Bana1.mat
+++ b/Kod/bilbana/files/Bana1.mat
Binary files differ
diff --git a/Kod/bilbana/files/Bana2.mat b/Kod/bilbana/files/Bana2.mat
index 622fc18..743de15 100644
--- a/Kod/bilbana/files/Bana2.mat
+++ b/Kod/bilbana/files/Bana2.mat
Binary files differ
diff --git a/Kod/bilbana/yc4/choose_position.m b/Kod/bilbana/yc4/choose_position.m
index d6db2ca..5d2dee3 100644
--- a/Kod/bilbana/yc4/choose_position.m
+++ b/Kod/bilbana/yc4/choose_position.m
@@ -1,18 +1,17 @@
-function [new_position, seg_plus] = choose_position(position,segment, track)
+function [new_position, seg_plus] = choose_position(position,segment, track, track_len)
%CHOOSE_POSITION Välj vad position ska vara
% Kör endast vid ny indata. Kollar om indatan är rimlig eller om någon
% givare missats. Sedan väljs position efter vilken givare det var som
% passerades. seg_plus anger om och med hur mycket car.segment bör
% justeras för att kompensera efter missad givare.
-track_len = [0 2.53 3.05 4.73 7.68 8.98 10.93 14.96 17.57;
- 0 2.53 3.05 4.92 7.60 8.84 10.65 14.68 17.76];
-set_pos = [0 2.53 3.05 4.73 7.68 8.98 10.93 14.96 17.57;
- 0 2.53 3.05 4.92 7.60 8.84 10.65 14.68 17.76];
pos_c = position;
+
+track_len = track_len(1: length(track_len) - 1);
+
%% Vilken givare ligger närmast pos_c?
near = [];
for i = 1:length(track_len)
- diff = abs(track_len(track, i) - pos_c);
+ diff = abs(track_len(i) - pos_c);
if i == 1
near = [i, diff];
else
@@ -23,19 +22,8 @@ for i = 1:length(track_len)
end
disp(near);
%% Beräkning av passerad givare
-if near(1) == segment
- new_position = set_pos( track, segment);
- seg_plus = 0;
- disp('In right segment');
-else
- if near(2) < 0.7 % Behöver bli smartare. Typ jämföra andra normal miss med denna miss
- seg_plus = max(0, near(1) - segment);
- new_position = set_pos(track, segment + seg_plus);
- else
- new_position = set_pos(track, segment); % ineff borde kombineras
- seg_plus = 0;
- disp('In right segment ich');
- end
-end
+seg_plus = max(0, near(1) - segment)
+new_position = track_len(segment + seg_plus);
end
+
diff --git a/Kod/bilbana/yc4/debug.m b/Kod/bilbana/yc4/debug.m
index 12acbf4..0295e02 100644
--- a/Kod/bilbana/yc4/debug.m
+++ b/Kod/bilbana/yc4/debug.m
@@ -1,3 +1,6 @@
function [] = debug(tag, strings)
-disp(strjoin({'DEBUG (', tag, '): ', strings}, ''))
+global log_debug;
+if log_debug
+ disp(strjoin({'DEBUG (', tag, '): ', strings}, ''))
+end
end
diff --git a/Kod/bilbana/yc4/detect_missed.m b/Kod/bilbana/yc4/detect_missed.m
index fb80d1c..1321920 100644
--- a/Kod/bilbana/yc4/detect_missed.m
+++ b/Kod/bilbana/yc4/detect_missed.m
@@ -1,9 +1,9 @@
-function [out] = detect_missed( position, segment, track)
+function [out] = detect_missed( position, segment, track, track_len)
%DETECT_MISSED Retunerar true om position ligger utanför nuvarande segment
%
-track_len = [2.53 3.05 4.73 7.68 8.98 10.93 14.96 17.57 19.60;
- 2.53 3.05 4.92 7.60 8.84 10.65 14.68 17.76 19.95];
-a = track_len(track, segment);
+
+track_len = track_len(2: length(track_len));
+a = track_len(segment);
out = a <= position;
end
diff --git a/Kod/bilbana/yc4/do_boot.m b/Kod/bilbana/yc4/do_boot.m
new file mode 100644
index 0000000..5019319
--- /dev/null
+++ b/Kod/bilbana/yc4/do_boot.m
@@ -0,0 +1,62 @@
+function [car, boot] = do_boot(car, boot)
+%BOOT Summary of this function goes here
+% Detailed explanation goes here
+if car.running == true
+ %% BEFORE FIRST LAP
+ if car.lap == 0
+ t = toc(boot.time);
+ if t > 0.6
+ car.constant = car.constant + 0.12;
+ disp('###')
+ disp(car.num)
+ disp(car.constant)
+ boot.time = tic;
+ end
+ end
+ %% WHEN NEW LAP
+ if car.new_lap == 1
+ car.constant = car.constant + 0.4;
+ disp('###')
+ disp(car.num)
+ disp(car.constant)
+ end
+ %% First segment
+ if car.lap == 1 && car.segment == 1 || car.lap == 1 && car.segment == 2
+ t = toc(boot.time);
+ if t > 0.8
+ car.constant = car.constant + 0.06;
+ disp('###')
+ disp(car.num)
+ disp(car.constant)
+ boot.time = tic;
+ end
+
+ end
+ %% ide höj carconstant så att den blir mer aggresivare ju längre tid som det går t.ex efter 3.5 s
+ %% if car.lap == 1 && car.segment == 1 || car.lap == 1 && car.segment == 2
+ %% t = toc(boot.time);
+ %% if t > 1.0
+ %% car.constant = car.constant + 0.5;
+ %% disp('###')
+ %% disp(car.num)
+ %% disp(car.constant)
+ %% boot.time = tic;
+ %% end
+ %%
+ %% end
+
+ %% END BOOTSTRAP
+ if car.segment > 3
+ disp(car.constant);
+ seg_time = car.seg_times(1, 3)
+ laptime_forecast = seg_time / 0.102
+ forecast_ref_diff = laptime_forecast - car.ref_time
+ forecast_ref_diff_rel = forecast_ref_diff / car.ref_time
+ car.constant = car.constant + (forecast_ref_diff_rel * 0.15)
+ boot.status = 0;
+ disp('END OF BOOTSTRAP')
+ disp(car.num)
+ disp(car.constant)
+ end
+end
+end \ No newline at end of file
diff --git a/Kod/bilbana/yc4/do_car.m b/Kod/bilbana/yc4/do_car.m
index ce3d76c..4792ca7 100644
--- a/Kod/bilbana/yc4/do_car.m
+++ b/Kod/bilbana/yc4/do_car.m
@@ -1,4 +1,4 @@
-function [car, stop, display_data] = do_car(car, t, display_data)
+function [car, halt, display_data] = do_car(car, t, display_data, boot)
%DO_CAR Ger nya värden till struct car, avgör om koden ska stoppas samt hämtar displaydata.
%{
Input/Output:
@@ -8,8 +8,10 @@ car - En struct med data för en viss bil
car.automatic - Om bilen körs automatiskt eller inte
car.segment - Bilens nuvarande segment
car.lap - Bilens nuvarande varv
- car.lap_times - Bilens sparade varvtider (1 x n matris)
- car.seg_times - Bilens sparade segmentstier (n x m matris)
+ car.lap_times - Bilens sparade varvtider (1 x v matris)
+ car.seg_times - Bilens sparade segmentstier (v x 9 matris)
+ car.seg_constant_list = []; % TODO Sparar alla seg_constants som
+ använts (v x 9 matris)
car.position - Bilens nuvarande placering på banan i meter från
start/mål
car.seg_len - Banans längd från start till givarna (1 x 9 matris)
@@ -17,13 +19,15 @@ car - En struct med data för en viss bil
fil)
car.miss_probability - Sannorlikheten för artificiellt introducerade
missade givare
+ car.lap_constants = [1,1,1,1,1,1,1,1,1]; % TODO seg_constanst för
+ nuvarande varv. Skapas av gov_set() vid nytt varv
t - Längden (s) på nuvarande programcykel
display_data - Buffer med den data som ska skickas till displayen vid nästa
- anrop
+anrop
stop - Huruvida koden ska stoppas eller inte
%}
-stop = false;
+halt = false;
if car.running == true
[car.new_lap, car.new_check_point, car.time] = get_car_position(car.num);
if car.new_check_point == true && rand < car.miss_probability && car.lap >= 4
@@ -33,10 +37,14 @@ if car.running == true
end
end
+if car.stopped == true
+ return
+end
+
%% READ INPUT FROM TRACK
if car.running == true
if car.lap ~= 0
- if toc(car.seg_tic) > 9.0
+ if toc(car.seg_tic) > 9.0 && not(boot.status)
set_car_speed(1, 0);
set_car_speed(2, 0);
%disp(strjoin({'Avåkning bil', num2str(car.num)}));
@@ -45,7 +53,7 @@ if car.running == true
if car.response == 'J'
car.seg_tic = tic;
else
- stop = true;
+ halt = true;
return;
end
end
@@ -54,39 +62,66 @@ if car.running == true
%% CALC POSITION
if car.lap > 1
% car.last_seg_times = car.seg_times(car.lap - 1, 1:9);
- aprox_v = get_aprox_v(car.segment + detect_missed(car.position, car.segment, car.num), car.lap, car.seg_times, car.num);
+ aprox_v = get_aprox_v(car.segment + detect_missed(car.position, car.segment, car.num, car.pos_at), car.lap, car.seg_times, car.num, car.seg_len);
car.position = get_position(aprox_v, car.position, t);
- if detect_missed( car.position, car.segment, car.num)
+ if detect_missed( car.position, car.segment, car.num, car.pos_at)
disp('Miss?');
-
+
%disp(toc(car.miss_time));
%if car.miss_time == 0
- % car.miss_time = tic;
+ % car.miss_time = tic;
%end
end
end
+ if car.stopping == true
+ % CHECK IF CAR IS AT THE END OF TRACK
+ if car.position > (car.map(80, 1) / 100) - 0.8 % 80cm
+ disp(car.position)
+ disp((car.map(80, 1) / 100) - 300)
+ set_car_speed(car.num, 0);
+ car.stopped = true;
+ return
+ end
+ end
+
%% CHECK POINT
if car.new_check_point == true
if car.new_lap == false % choose_position krachar vid nytt varv (seg 10)
if car.lap ~= 0
car.seg_times(car.lap, car.segment) = toc(car.seg_tic);
- end
+ end
+
+ seg_time = car.seg_times(car.lap, car.segment)
+ lap_time_now = toc(car.lap_tic)
+ % s = vt
+ % v = s/t
+ % t = s/v
+ prev_seg_v = car.seg_len(car.segment) / toc(car.seg_tic)
+ track_remaining = car.pos_at(length(car.pos_at)) - car.pos_at(car.segment + 1)
+
+ car.forecasts(car.lap, car.segment) = lap_time_now + track_remaining/prev_seg_v
+
car.segment = car.segment + 1;
car.seg_tic = tic;
if car.lap > 2 % S�kerhetsmarginal (B�r vara 1?)
- disp(car);
+ disp(car)
[new_position, seg_plus] = ...
- choose_position(car.position, car.segment, car.num);
- if seg_plus ~= 0 && car.segment == 1
+ choose_position(car.position, car.segment, car.num, car.pos_at);
+ if seg_plus ~= 0 && car.segment == 2
disp('Hoppar �ver missad givare 1/2');
else
car.position = new_position;
car.segment = car.segment + seg_plus;
- end
+ end
+ if seg_plus ~= 0 && car.segment ~= 2
+ car.seg_times(car.lap, car.segment - seg_plus - 1) = 0;
+ disp(car.seg_times(car.lap, :))
+ disp(seg_plus)
+ end
%car.miss_time = uint64(0);
else
- car.position = car.seg_len(car.segment);
+ car.position = car.pos_at(car.segment);
%car.miss_time = uint64(0);
end
end
@@ -94,7 +129,10 @@ if car.running == true
%% NEW LAP
if car.new_lap == true
- car.new_lap = false;
+ disp('NEW LAP')
+
+ car.lap_constants = gov_set(car.constant);
+ car.new_lap = false; %TODO remove
beep;
if car.lap == 0
% dont save time for first lap
@@ -103,13 +141,26 @@ if car.running == true
car.seg_tic = tic;
car.lap_tic = tic;
else
- % beep;
- car.seg_times(car.lap, car.segment) = toc(car.seg_tic);
+ % beep;
+ % Spara inte seg_time om missad givare
+ if car.segment == 9
+ car.seg_times(car.lap, car.segment) = toc(car.seg_tic);
+ end
car.seg_tic = tic;
car.lap_times(car.lap) = toc(car.lap_tic);
car.lap_tic = tic;
car.position = 0;
+ % save segment percentage from last lap
+ car.percents = fit_percents(car.percents, car.lap_times(car.lap), car.seg_times(car.lap,:))
+
+ if car.lap == 1 && size(car.seg_times, 2) < 9
+ disp('FEL: För få segment!!')
+ car.stopped = true;
+ other_car.stopped = true;
+ return
+ end
+
display_data = [display_data, put_text(100, 16 + (16 * car.num), 'L', strjoin({num2str(car.lap), get_time_as_string(round(car.lap_times(car.lap) * 1000))}, ' '))];
car.segment = 1;
@@ -120,10 +171,8 @@ end
%% CALCULATE
if car.running == true && car.automatic == true
- car.car_constant = get_car_constant(car.num);
car.v = get_new_v(car.position, car.map);
- car.track_u_constant = get_track_u_constant();
- car.u = get_new_u(car.v, car.car_constant, car.track_u_constant);
+ car.u = get_new_u(car.v, car.constant);
end
%% CONTROLLER
diff --git a/Kod/bilbana/yc4/do_gov.m b/Kod/bilbana/yc4/do_gov.m
new file mode 100644
index 0000000..d38336a
--- /dev/null
+++ b/Kod/bilbana/yc4/do_gov.m
@@ -0,0 +1,9 @@
+function [ car ] = do_gov( car )
+%UNTITLED Summary of this function goes here
+% Detailed explanation goes here
+if car.new_check_point
+ status = car.forecasts(car.lap, car.segment-1)/car.ref_time;
+ car.constant = car.constant + (status - 1) * 0.01;
+ disp(car.constant);
+end
+
diff --git a/Kod/bilbana/yc4/fit_percents.m b/Kod/bilbana/yc4/fit_percents.m
new file mode 100644
index 0000000..ffdb9fc
--- /dev/null
+++ b/Kod/bilbana/yc4/fit_percents.m
@@ -0,0 +1,11 @@
+function [ new_percents ] = fit_percents( percents, lap_time, seg_times )
+%FIT_PERCENTS Summary of this function goes here
+% Detailed explanation goes here
+new_percents = [];
+for i = 1:length(percents)
+ old_p = percents(i);
+ cur_p = seg_times(i) / lap_time;
+ new_p = old_p - (old_p + cur_p) / 2;
+ new_percents(i) = new_p;
+end
+
diff --git a/Kod/bilbana/yc4/get_aprox_v.m b/Kod/bilbana/yc4/get_aprox_v.m
index 1867565..737dfac 100644
--- a/Kod/bilbana/yc4/get_aprox_v.m
+++ b/Kod/bilbana/yc4/get_aprox_v.m
@@ -1,21 +1,12 @@
-function [v] = get_aprox_v(cur_seg, lap, seg_times, track)
+function [v] = get_aprox_v(cur_seg, lap, seg_times, track, seg_len)
%GET_APROX_V Tillf�llig? Beh�vs f�r att testa get_position. Ger
%medelhastigheten f�r nuvarande segment p� f�rra varvet.
%{
cur_seg: Nuvarande segment
last_seg_times: 1x9 vektor med f�rra varvets segmenttider
%}
-seg_len1 = [2.53 0.53 1.68 2.92 1.2 2.01 3.83 2.89 1.99];
-seg_len2 = [2.53 0.53 1.87 2.68 1.24 1.81 4.03 3.09 2.19];
-
% seg_len = [];
-if track == 1
- seg_len = seg_len1;
-else
- seg_len = seg_len2;
-end
-
if cur_seg > 9
cur_seg = cur_seg - 9;
end
diff --git a/Kod/bilbana/yc4/get_car_constant.m b/Kod/bilbana/yc4/get_car_constant.m
index 5513721..ae0bb0c 100644
--- a/Kod/bilbana/yc4/get_car_constant.m
+++ b/Kod/bilbana/yc4/get_car_constant.m
@@ -15,7 +15,7 @@ switch(in_pos)
case 1
car_constant = 0.95;
case 2
- car_constant = 0.8;
+ car_constant = 1.0;
end
end
diff --git a/Kod/bilbana/yc4/get_new_u.m b/Kod/bilbana/yc4/get_new_u.m
index ee624fe..ab5e016 100644
--- a/Kod/bilbana/yc4/get_new_u.m
+++ b/Kod/bilbana/yc4/get_new_u.m
@@ -1,4 +1,4 @@
-function [ new_u ] = get_new_u( new_v, car_constant, track_u_constant )
+function [ new_u ] = get_new_u( new_v, seg_constant)
%GET_NEW_U Summary of this function goes here
% Detailed explanation goes here
@@ -9,6 +9,6 @@ ett högre new_u. De andra parametrarna som påverkar new_u är car_constant och tr
dessa värden dessa antar desto högre värde antar också new_u. new_u är programmets sista output, dess värde
0 till 127 är det gaspådrag som appliceras på bilen.
%}
-new_u = new_v*car_constant*track_u_constant;
+new_u = new_v*seg_constant;
end
diff --git a/Kod/bilbana/yc4/get_new_v.m b/Kod/bilbana/yc4/get_new_v.m
index e722326..e56f572 100644
--- a/Kod/bilbana/yc4/get_new_v.m
+++ b/Kod/bilbana/yc4/get_new_v.m
@@ -4,12 +4,8 @@ function [ new_v ] = get_new_v( position, list)
Utgår ifrån position och ger motsvarande hårdkodade värde på v för
nuvarande sub_segment.
%}
-position = position*100; %temp input för position
-
-
-
+position = position*100;
for i = 1:length(list)
-
if list(i,1) > position
new_v = list((i-1),4);
break
diff --git a/Kod/bilbana/yc4/get_seg_constant.m b/Kod/bilbana/yc4/get_seg_constant.m
new file mode 100644
index 0000000..2de04ca
--- /dev/null
+++ b/Kod/bilbana/yc4/get_seg_constant.m
@@ -0,0 +1,19 @@
+function [out] = get_seg_constant(position, lap_constants, track, track_len)
+%GET_SEG_CONSTANT Avgör vilken seg_constat som ska användas utifån
+%nuvarande position.
+%{
+position - Position i meter från start
+lap_constants - De seg_constants som ska användas detta varv
+track - den bana/bil som beräkningarna ska göras för
+%}
+
+track_len = track_len(1: length(track_len) - 1);
+
+for i = 1:length(track_len)
+ if position >= track_len(i)
+ seg_constant_num = i;
+ end
+end
+out = lap_constants(seg_constant_num);
+end
+
diff --git a/Kod/bilbana/yc4/get_time_as_string.m b/Kod/bilbana/yc4/get_time_as_string.m
index 24b6bc5..f99c53d 100644
--- a/Kod/bilbana/yc4/get_time_as_string.m
+++ b/Kod/bilbana/yc4/get_time_as_string.m
@@ -1,10 +1,16 @@
function num_as_str = get_time_as_string(millis)
%GET_TIME_AS_STRING Number of milliseconds, formatted mm:ss.s and rounded
% Detailed explanation goes here
-minutes = num2str(fix(millis / (1000*60)));
+minutes = fix(millis / (1000*60));
seconds = mod(millis, 1000*60);
+rest = round(mod(seconds, 1000), -2) / 100;
+if rest == 10
+ seconds = seconds + 1*1000;
+ rest = 0;
+end
+minutes_str = num2str(minutes);
seconds_str = sprintf('%02d', fix(seconds / 1000));
-rest_str = num2str(round(mod(seconds, 1000), -2) / 100);
-num_as_str = strjoin({minutes, ':', seconds_str, '.', rest_str}, '');
+rest_str = num2str(rest);
+num_as_str = strjoin({minutes_str, ':', seconds_str, '.', rest_str}, '');
end
diff --git a/Kod/bilbana/yc4/gov_set.m b/Kod/bilbana/yc4/gov_set.m
new file mode 100644
index 0000000..22765c0
--- /dev/null
+++ b/Kod/bilbana/yc4/gov_set.m
@@ -0,0 +1,6 @@
+function [out] = gov_set(car_constant)
+%GOV_SET TODO - Just nu temp lösning
+% Detailed explanation goes here
+out = car_constant*ones(1,9);
+end
+
diff --git a/Kod/bilbana/yc4/main.m b/Kod/bilbana/yc4/main.m
index 64951aa..519fbf9 100644
--- a/Kod/bilbana/yc4/main.m
+++ b/Kod/bilbana/yc4/main.m
@@ -1,9 +1,30 @@
+clear all;
+display_active = false;
+
+%% INIT TRACK
+disp('Startar bilbanan. Avsluta med q.')
+hf=figure('position', [0 0 eps eps], 'menubar', 'none');
+
+initialize_counters(1)
+initialize_counters(2)
+
+config_IOs
+
+start_race(1)
+start_race(2)
+
%% INIT
+global log_debug;
+log_debug = true;
+global log_verbose;
+log_verbose = false;
% INIT DISPLAY
-addpath display/ClientServerApp/Release
-cd display/ClientServerApp/Release
-!startServer
-cd ../../..
+if display_active
+ addpath display/ClientServerApp/Release
+ cd display/ClientServerApp/Release
+ !startServer
+ cd ../../..
+end
display = struct;
display.data = [];
@@ -16,46 +37,63 @@ display.shm_interp.data = [];
display.last_send = tic;
display.send_interval = 0.5;
-disp('Startar bilbanan. Avsluta med q.')
-hf=figure('position', [0 0 eps eps], 'menubar', 'none');
-
-% initialize_counters(1)
-% initialize_counters(2)
-
-% config_IOs
-
load('bilbana\files\Bana1.mat')
load('bilbana\files\Bana2.mat')
-% start_race(1)
-% start_race(2)
-
car1 = struct;
car1.num = 1;
car1.running = false;
-car1.automatic = false;
+car1.automatic = true;
+car1.stopping = false;
+car1.stopped = false;
car1.segment = 1;
car1.lap = 0;
car1.lap_times = [];
car1.seg_times = [];
+car1.seg_constant_list = []; % TODO
car1.position = 0;
-car1.seg_len = [0.0 2.53 3.05 4.73 7.68 8.98 10.93 14.69 17.57];
+car1.pos_at = [0.0 2.53 3.05 4.73 7.68 8.98 10.93 14.69 17.57 19.60];
+car1.seg_len = [2.53 0.53 1.68 2.92 1.2 2.01 3.83 2.89 1.99];
+car1.percents = []; % TODO
car1.map = Bana1;
car1.approximation = [];
car1.miss_probability = 0.0;
+car1.lap_constants = [1,1,1,1,1,1,1,1,1]; % TODO
+car1.constant = 0.1;
+car1.stop = false;
car2 = struct;
car2.num = 2;
car2.running = false;
-car2.automatic = false;
+car2.automatic = true;
+car2.stopping = false;
+car2.stopped = false;
car2.segment = 1;
car2.lap = 0;
car2.lap_times = [];
car2.seg_times = [];
car2.position = 0;
-car2.seg_len = [0.0 2.53 3.05 4.92 7.60 8.84 10.65 14.68 17.76];
+car2.pos_at = [0.0 2.53 3.05 4.92 7.62 9.02 10.72 14.68 17.76 19.95];
+car2.seg_len = [2.53 0.52 1.87 2.70 1.40 1.70 4.03 3.08 2.19];
+car2.percents = [0.088, 0.022, 0.102, 0.15, 0.058, 0.11, 0.212, 0.146, 0.113];
+
car2.map = Bana2;
-car2.miss_probability = 0.05;
+car2.miss_probability = 0.1;
+car2.seg_constant_list = []; % TODO
+car2.lap_constants = [1,1,1,1,1,1,1,1,1]; % TODO
+car2.seg_constant = 1;
+car2.constant = 0.1;
+car2.stop = false;
+
+boot1 = struct;
+boot1.status = false;
+boot1.time = 0;
+
+boot2 = struct;
+boot2.status = false;
+boot2.time = 0;
+
+halt = false;
ref_time = 13;
@@ -142,16 +180,6 @@ while 1
end
end
-%{
-ref_time = input('Vilken referenstid ska användas? [13] ', 's');
-ref_time = str2double(ref_time);
-if isnan(ref_time)
- ref_time = 13;
- elseif not(isreal(ref_time))
- ref_time = 13;
-end
-%}
-
debug('DISPLAY', ['CAR1.RUNNING=', car1.running, ', CAR1.AUTOMATIC=', car1.automatic])
debug('DISPLAY', ['CAR2.RUNNING=', car2.running, ', CAR2.AUTOMATIC=', car2.automatic])
debug('DISPLAY', ['CHOSEN REFERENCE TIME=', ref_time])
@@ -165,31 +193,53 @@ while 1
if strcmp(get(hf,'currentcharacter'),'q')
close(hf)
break
+ elseif strcmp(get(hf, 'currentcharacter'), 's')
+ car1.stopping = true;
+ car2.stopping = true;
end
+end
- figure(hf)
- drawnow
+figure(hf)
+drawnow
- [car1, car1.stop, display.data] = do_car(car1, t, display.data);
- [car2, car2.stop, display.data] = do_car(car2, t, display.data);
+[car1, halt, display.data] = do_car(car1, t, display.data);
+if halt
+ break
+end
+[car2, halt, display.data] = do_car(car2, t, display.data);
+if halt
+ break
+end
- if car1.stop == true
- disp('stopped by car 1');
- break;
- end
- if car2.stop == true
- disp('stopped by car 2');
- break;
- end
+%% BOOTSTRAP
+if boot1.status
+ [car1, boot1] = do_boot(car1, boot1);
+end
+if boot2.status
+ [car2, boot2] = do_boot(car2, boot2);
+end
+%% GOVERNOR
+if not(boot1.status) && car1.lap ~= 0
+ car1 = do_gov(car1);
+end
+if not(boot2.status) && car2.lap ~= 0
+ car2 = do_gov(car2);
+end
+%%
- %% END OF LOOP
- while 1 %Whileloop med paus som k�rs till pausen �verskridit 0.07 sekunder
- % DISPLAY
- display.send_delay = tic;
- if toc(display.last_send) > display.send_interval
+if (~car2.running && car1.stopped) || (~car1.running && car2.stopped) || (car1.stopped && car2.stopped)
+ break;
+end
+
+%% END OF LOOP
+while 1 %Whileloop med paus som k�rs till pausen �verskridit 0.07 sekunder
+ % DISPLAY
+ display.send_delay = tic;
+ if toc(display.last_send) > display.send_interval && display_active
% queue control signal
if car1.running && car1.automatic
% display.data = [display.data, put_text(20, 16 + (16 * 1), 'L', num2str(car1.u))];
+ display.data = [display.data, update_bar_graph(1, car1.u)];
end
if car2.running && car2.automatic
% display.data = [display.data, put_text(20, 16 + (16 * 2), 'L', num2str(car2.u))];
@@ -234,16 +284,29 @@ disp(car2);
terminate(1);
terminate(2);
-
-matlabclient(3);
-
+if display_active
+ matlabclient(3);
+end
%% DISPLAY GRAPHS
if car1.running == true
- graphs(car1.lap_times, ref_time, car1.seg_times, 1);
+ graphs(car1.lap_times, car1.ref_time, car1.seg_times, 1);
end
if car2.running == true
- graphs(car2.lap_times, ref_time, car2.seg_times, 2);
+ graphs(car2.lap_times, car2.ref_time, car2.seg_times, 2);
+end
+
+%% SAVE VARIABLES FROM CAR STRUCT
+dateStr = datestr(now, 'yyyy-mm-dd');
+timeStr = datestr(now, 'HH.MM');
+
+if car1.lap > 2
+ filenameMat1 = strjoin({'bilbana1_', dateStr, 'T', timeStr, '.mat'}, '');
+ save(filenameMat1, '-struct', 'car1');
+end
+if car2.lap > 2
+ filenameMat2 = strjoin({'bilbana2_', dateStr, 'T', timeStr, '.mat'}, '');
+ save(filenameMat2, '-struct', 'car2');
end
diff --git a/Kod/bilbana/yc4/setup_car.m b/Kod/bilbana/yc4/setup_car.m
new file mode 100644
index 0000000..1ab75e0
--- /dev/null
+++ b/Kod/bilbana/yc4/setup_car.m
@@ -0,0 +1,17 @@
+function [] = setup_car(car, track)
+%UNTITLED2 Summary of this function goes here
+% Detailed explanation goes here
+disp('J = Ja (automatiskt), M = Ja (manuellt), N = Nej');
+
+car.response = input('Vill du köra bil 1? [N] ', 's');
+if car.response == 'J'
+ car.running = true;
+ car.automatic = true;
+elseif car.response == 'M'
+ car.running = true;
+ car.automatic = false;
+else
+ car.running = false;
+end
+end
+
diff --git a/Kod/bilbana/yc4/verbose.m b/Kod/bilbana/yc4/verbose.m
new file mode 100644
index 0000000..d24a384
--- /dev/null
+++ b/Kod/bilbana/yc4/verbose.m
@@ -0,0 +1,6 @@
+function [] = verbose(tag, strings)
+global log_verbose;
+if log_verbose
+ disp(strjoin({'VERBOSE (', tag, '): ', strings}, ''))
+end
+end