diff options
Diffstat (limited to 'Kod/bilbana')
| -rw-r--r-- | Kod/bilbana/files/Bana1.mat | bin | 621 -> 1216 bytes | |||
| -rw-r--r-- | Kod/bilbana/files/Bana2.mat | bin | 623 -> 1207 bytes | |||
| -rw-r--r-- | Kod/bilbana/yc4/choose_position.m | 28 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/debug.m | 5 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/detect_missed.m | 8 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/do_boot.m | 62 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/do_car.m | 95 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/do_gov.m | 9 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/fit_percents.m | 11 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_aprox_v.m | 11 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_car_constant.m | 2 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_new_u.m | 4 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_new_v.m | 6 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_seg_constant.m | 19 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_time_as_string.m | 12 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/gov_set.m | 6 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/main.m | 167 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/setup_car.m | 17 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/verbose.m | 6 |
19 files changed, 347 insertions, 121 deletions
diff --git a/Kod/bilbana/files/Bana1.mat b/Kod/bilbana/files/Bana1.mat Binary files differindex d83861f..e745c59 100644 --- a/Kod/bilbana/files/Bana1.mat +++ b/Kod/bilbana/files/Bana1.mat diff --git a/Kod/bilbana/files/Bana2.mat b/Kod/bilbana/files/Bana2.mat Binary files differindex 622fc18..743de15 100644 --- a/Kod/bilbana/files/Bana2.mat +++ b/Kod/bilbana/files/Bana2.mat 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 |
