diff options
| -rw-r--r-- | Dokument/Teknisk Dokumentation/spåna på governor.txt | 17 | ||||
| -rw-r--r-- | Kod/bilbana/Graph/graphs_test.m | 7 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/choose_position.m | 41 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/detect_missed.m | 9 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/do_car.m | 132 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_aprox_v.m | 37 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_car_constant.m | 4 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/get_new_v.m | 21 | ||||
| -rw-r--r-- | Kod/bilbana/yc4/main.m | 15 |
9 files changed, 249 insertions, 34 deletions
diff --git a/Dokument/Teknisk Dokumentation/spåna på governor.txt b/Dokument/Teknisk Dokumentation/spåna på governor.txt new file mode 100644 index 0000000..e8cb78b --- /dev/null +++ b/Dokument/Teknisk Dokumentation/spåna på governor.txt @@ -0,0 +1,17 @@ +Funktionen ska utifrån köregenskaper för bil, vald referenstid och, om gemensam målgång aktiverad, skillnad i bilarnas placering och se till att rätt gaspådrag skickas till banan. + +Vi utgår ifrån de redan skrivna bankartorna (bana1.mat och bana2.mat) och multiplicerar dess spänningsvärde med en car_constant. Programmet kommer sedan ihåg hur lång tid varje segment tagit för olika car_constant och gör en modell över hur hög den bör vara för att nå en viss segmentstid. gov_set väljer sedan segmentstider utifrån vald referenstid (och om gemensam målgång aktiverad car_diff). + +gov_mem +Sparar car_constant och tid från varje segment. + +gov_calc +gör en modell över hur lång tid ett segment tar relativt sin car_constant. + +gov_set +Väljer en tid för varje segment utifrån referenstid, car_diff (om gemensam målgång aktiverad) + +Almänna komentarer: +Kan behövas nån form av ingångshastighet till varje segment så att segmentstidens samband med car_constant tydligare kan ses. Beroende på hur snabbt bilen accelererar kan detta vara helt onödigt. +Hur ska kallibrerigsvarven hanteras? Antagligen behövs specialkod för första varvet så att bilen inte behöver köra jättelångsamt hela varvet. Kanse går det att gissa på en lite högre car_constant efter bara nåt varv. +Tänker att övre gräns ej behöver sättas om bankartorna är korrekt gjorda.
\ No newline at end of file diff --git a/Kod/bilbana/Graph/graphs_test.m b/Kod/bilbana/Graph/graphs_test.m index ddc3b64..955aeee 100644 --- a/Kod/bilbana/Graph/graphs_test.m +++ b/Kod/bilbana/Graph/graphs_test.m @@ -1,3 +1,4 @@ +%{ %% Data needed A = [3.9,1.1,2.2,1.8,1.4,3.9,1.5,3.4,1.4; 4.2,1.1,2.2,1.8,1.4,3.4,1.5,3.4,1.4; @@ -11,4 +12,8 @@ car1.seg_times = C; car1.lap_times = [14.1,13.8,14.15,13.9,14.1,14]; ref_lap_time = 14; %% Actual test -graphs(car1.lap_times,ref_lap_time,car1.seg_times,5)
\ No newline at end of file +graphs(car1.lap_times,ref_lap_time,car1.seg_times,5) +%} +position = 2.54; +segment = 2; +detect_missed(position,segment,1)
\ No newline at end of file diff --git a/Kod/bilbana/yc4/choose_position.m b/Kod/bilbana/yc4/choose_position.m new file mode 100644 index 0000000..d6db2ca --- /dev/null +++ b/Kod/bilbana/yc4/choose_position.m @@ -0,0 +1,41 @@ +function [new_position, seg_plus] = choose_position(position,segment, track) +%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; +%% Vilken givare ligger närmast pos_c? +near = []; +for i = 1:length(track_len) + diff = abs(track_len(track, i) - pos_c); + if i == 1 + near = [i, diff]; + else + if diff < near(2) + near = [i, diff]; + end + end +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 +end + diff --git a/Kod/bilbana/yc4/detect_missed.m b/Kod/bilbana/yc4/detect_missed.m new file mode 100644 index 0000000..fb80d1c --- /dev/null +++ b/Kod/bilbana/yc4/detect_missed.m @@ -0,0 +1,9 @@ +function [out] = detect_missed( position, segment, track) +%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); +out = a <= position; +end + diff --git a/Kod/bilbana/yc4/do_car.m b/Kod/bilbana/yc4/do_car.m new file mode 100644 index 0000000..504486a --- /dev/null +++ b/Kod/bilbana/yc4/do_car.m @@ -0,0 +1,132 @@ +function [car, stop, display_data] = do_car(car, t, display_data) +%DO_CAR Ger nya värden till struct car, avgör om koden ska stoppas samt hämtar displaydata. +%{ +Input/Output: +car - En struct med data för en viss bil + car.num - Vilken bil det är (1 eller 2) + car.running - Om bilen körs eller inte + 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.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) + car.map - Tabell med hastighetskoefficienter för alla positioner (.mat + fil) + car.miss_probability - Sannorlikheten för artificiellt introducerade + missade givare +t - Längden (s) på nuvarande programcykel +display_data - Buffer med den data som ska skickas till displayen vid nästa + anrop +stop - Huruvida koden ska stoppas eller inte +%} +stop = 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 + disp('Hoppar �ver givare'); + car.new_check_point = false; + beep; + end +end + +%% CHECK LAP AND CHECKPOINT +if car.running == true + if car.lap ~= 0 + if toc(car.seg_tic) > 9.0 + set_car_speed(1, 0); + set_car_speed(2, 0); + %disp(strjoin({'AvÃ¥kning bil', num2str(car.num)})); + disp('J = Ja, N = Nej') + car.response = input('Vill du fortsätta? [N] ', 's'); + if car.response == 'J' + car.seg_tic = tic; + else + stop = true; + return; + end + end + end + %% 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); + car.position = get_position(aprox_v, car.position, t); + if detect_missed( car.position, car.segment, car.num) + disp('Miss?'); + + %disp(toc(car.miss_time)); + %if car.miss_time == 0 + % car.miss_time = tic; + %end + end + end + 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 + car.segment = car.segment + 1; + car.seg_tic = tic; + if car.lap > 2 % S�kerhetsmarginal (B�r vara 1?) + disp(car); + [new_position, seg_plus] = ... + choose_position(car.position, car.segment, car.num); + if seg_plus ~= 0 && car.segment == 1 + disp('Hoppar �ver missad givare 1/2'); + else + car.position = new_position; + car.segment = car.segment + seg_plus; + end + %car.miss_time = uint64(0); + else + car.position = car.seg_len(car.segment); + %car.miss_time = uint64(0); + end + end + end + if car.new_lap == true + car.new_lap = false; + beep; + if car.lap == 0 + % dont save time for first lap + car.segment = 1; + car.lap = car.lap + 1; + car.seg_tic = tic; + car.lap_tic = tic; + else + % beep; + car.seg_times(car.lap, car.segment) = toc(car.seg_tic); + car.seg_tic = tic; + car.lap_times(car.lap) = toc(car.lap_tic); + car.lap_tic = tic; + car.position = 0; + + 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; + car.lap = car.lap + 1; + end + end +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); +end + +%% CONTROLLER +if car.running == true && car.automatic == false + % set_car_speed(car.num, mult * ((max - get_manual_speed(car.num)) / div)); +end + +%% EXECUTE +if car.running == true && car.automatic == true + set_car_speed(car.num, car.u); +end +end diff --git a/Kod/bilbana/yc4/get_aprox_v.m b/Kod/bilbana/yc4/get_aprox_v.m index 41a3c9e..1867565 100644 --- a/Kod/bilbana/yc4/get_aprox_v.m +++ b/Kod/bilbana/yc4/get_aprox_v.m @@ -1,21 +1,32 @@ -function [v] = get_aprox_v(cur_seg,last_seg_times) -%GET_APROX_V Tillfällig? Behövs för att testa get_position. Ger -%medelhastigheten för nuvarande segment på förra varvet. +function [v] = get_aprox_v(cur_seg, lap, seg_times, track) +%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 +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_len2 = [2.53 0.53 1.87 2.68 1.24 1.81 4.03 3.09 2.19]; -%v = last_seg_times(cur_seg)/seg_len(cur_seg); -v = seg_len1(cur_seg)/last_seg_times(cur_seg); +% seg_len = []; -% switch(track) -% case 1 -% v = seg_len1(cur_seg)/last_seg_times(cur_seg); -% case 2 -% v = seg_len2(cur_seg)/last_seg_times(cur_seg); -% end +if track == 1 + seg_len = seg_len1; +else + seg_len = seg_len2; end +if cur_seg > 9 + cur_seg = cur_seg - 9; +end + +while lap > 0 + lap = lap - 1; + if seg_times(lap, cur_seg) ~= 0 + v = seg_len(cur_seg) / seg_times(lap, cur_seg); + return + end +end +disp('bara nollor?'); + +end diff --git a/Kod/bilbana/yc4/get_car_constant.m b/Kod/bilbana/yc4/get_car_constant.m index eb3bd22..e5e9801 100644 --- a/Kod/bilbana/yc4/get_car_constant.m +++ b/Kod/bilbana/yc4/get_car_constant.m @@ -13,9 +13,9 @@ precision. switch(in_pos) case 1 - car_constant = 1; + car_constant = 0.95; case 2 - car_constant = 1.2; + car_constant = 1.2; end end diff --git a/Kod/bilbana/yc4/get_new_v.m b/Kod/bilbana/yc4/get_new_v.m index 273be4d..e722326 100644 --- a/Kod/bilbana/yc4/get_new_v.m +++ b/Kod/bilbana/yc4/get_new_v.m @@ -1,20 +1,21 @@ -function [ new_v ] = get_new_v( old_v, speed_constant, target_diff, car_position_diff, agressiveness ) +function [ new_v ] = get_new_v( position, list) %GET_NEW_V Hastigheten som bilen ska få nästa cykel. %{ Utgår ifrån position och ger motsvarande hårdkodade värde på v för nuvarande sub_segment. %} -position = old_v*100; %temp input för position -list = speed_constant; %temp input för listan Bana1 +position = position*100; %temp input för position + + + for i = 1:length(list) - if position > 1960 - new_v = list(length(list),4); - - elseif list(i,1) > position + if list(i,1) > position new_v = list((i-1),4); break - end - -end + elseif i == length(list) + new_v = list(80,4); + break + end end + diff --git a/Kod/bilbana/yc4/main.m b/Kod/bilbana/yc4/main.m index 4733055..cc15f34 100644 --- a/Kod/bilbana/yc4/main.m +++ b/Kod/bilbana/yc4/main.m @@ -22,6 +22,7 @@ hf=figure('position', [0 0 eps eps], 'menubar', 'none'); initialize_counters(1) initialize_counters(2) + config_IOs load('bilbana\files\Bana1.mat') @@ -31,6 +32,7 @@ start_race(1) start_race(2) car1 = struct; +car1.num = 1; car1.running = false; car1.automatic = true; car1.segment = 1; @@ -43,10 +45,9 @@ car1.seg_len = [0.0 2.53 3.05 4.73 7.68 8.98 10.93 14.69 17.57]; car1.map = Bana1; car1.approximation = []; car1.miss_probability = 0.0; -car1.num = 1; - car2 = struct; +car2.num = 2; car2.running = false; car2.automatic = true; car2.segment = 1; @@ -58,8 +59,6 @@ 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.map = Bana2; car2.miss_probability = 0.0; -car2.num = 2; - highToc = 0; @@ -105,14 +104,14 @@ while 1 [car1, car1.stop, display_data] = do_car(car1, t, display_data); [car2, car2.stop, display_data] = do_car(car2, t, display_data); - if car1.stop == true + if car1.stop == true disp('stopped by car 1'); break; - end - if car2.stop == true + end + if car2.stop == true disp('stopped by car 2'); break; - end + end %% END OF LOOP while 1 %Whileloop med paus som k�rs till pausen �verskridit 0.07 sekunder |
