W wypisanych poniżej podstronach znajdują się elementy dokumentacji zawierające informacje o poszczególnych jej elementach, ułożone wedle elementu bolidu (opony, układ napędowy etc.). Symulacja NIE jest naszego autorstwa, oryginalni autorzy to zespół Baltic Racing.
Wraz z postępem prac dokumentacja będzie aktualizowana.
1 - paramtery akumulatora
działanie/obliczanie zmiennych akumulaotra
Wstęp
calculateAccumulatorData.m - jest to opisywany plik
DZIAŁANIE PLIKU
pierwsze 4 linie służą do ładowania danych z plików MAT do
zmiennych w skrypcie.
Następnie zapisane są funkcje, które służą do liczenia poszczególnych danych.
Accumulator.V_i(i) = sum(Accumulator.Voltage_Cellpack(:,i)); - Oblicza sumę
napięć wszystkich ogniw w akumulatorze dla danego punktu czasowego (i),
przechowuje tę wartość w Accumulator.V_i(i).
Accumulator.A_accu_cell(i) = P_el(i) / Accumulator.V_i(i) / setup.nZellen_Parallel; -
Oblicza prąd akumulatora dla danego punktu czasowego (i) korzystając z mocy elektrycznej
(P_el), napięcia (Accumulator.V_i(i)) i liczby ogniw równoległych (setup.nZellen_Parallel).
Accumulator.Current_Cellpack_Pointer(i) - Określa wskaźnik aktualnego prądu dla pakietu
ogniw w 0,1A na podstawie mocy elektrycznej i napięcia.
Warunki “if” sprawdzają i ograniczają wartość Accumulator.Current_Cellpack_Pointer(i) w
określonym zakresie.
Accumulator.VirtualCurrent_Cellpack(i) - Oblicza wirtualny prąd dla pakietu ogniw na
podstawie skorygowanych danych rozładowania.
Accumulator.Energy_Cellpack(i) - Oblicza zużycie energii dla pakietu ogniw w jednostkach Ah
na podstawie wirtualnego prądu i czasu.
Accumulator.Energy_Cellpack_Total(i+1) - Sumuje całkowite zużycie energii do tego punktu
czasowego.
Accumulator.Capacity_Cellpack(1:131,i+1) - Aktualizuje pojemność pakietu ogniw na podstawie
zużycia energii.
Accumulator.SOC_Cellpack(1:131,i+1) - Oblicza stan naładowania (SOC) pakietu ogniw na
podstawie aktualnej i początkowej pojemności.
Accumulator.SOC_Pointer(1:131,i+1) - Określa wskaźnik SOC w milicentylach na podstawie
obliczonego SOC.
Accumulator.Current_Cellpack_Pointer_Voltage(1,i+1) - Określa wskaźnik napięcia pakietu
ogniw na podstawie obliczonego wskaźnika prądu.
Kolejne dwa warunki if ograniczają wartości wskaźnika napięcia i SOC do dopuszczalnego
zakresu.
W bloku try-catch jest próba dostępu do danych napięcia pakietu ogniw na podstawie
obliczonych wskaźników prądu i SOC. Jeśli operacja się nie powiedzie, kod nie rzuca błędem.
2 - paramtery akumulatora
interfejs do wprowadzania zmiennych akumulatora
Wstęp
Interfejs i jego oddziaływanie poszczególnych danych. Dany plik zaprojektowany jest w App Designer i jest podzielony na Design View oraz Code View
Działanie
Uruchomienie aplikacji:
Gdy aplikacja zostaje uruchomiona, jej konstruktor “Accumulator” jest wywoływany. Tworzy on
interfejs użytkownika poprzez wywołanie metody createComponents. Następnie uruchamiana
jest funkcja startupFcn, która inicjuje działanie aplikacji poprzez załadowanie danych,
obliczenie i wyświetlenie pojemności akumulatora oraz zmianę schematu kolorów interfejsu.
AccumulatorSetupUIFigure: Główne okno aplikacji.
AccumulatorPanel: Panel zawierający wszystkie komponenty interfejsu użytkownika związane z
akumulatorem.
changeColorScheme(app) – wiele zmiennych obsługujących zmiane kolorów interfejsu
Zamykanie aplikacji:
Gdy użytkownik próbuje zamknąć aplikację, wywoływana jest funkcja zwrotna
AccumulatorSetupUIFigureCloseRequest, która zapisuje dane i usuwa aplikację.
Wprowadzanie danych:
Wartości wprowadzone przez użytkownika, takie jak pojemność ogniwa, liczba ogniw w rzędzie i
równolegle, są automatycznie aktualizowane poprzez funkcje zwrotne, takie jak
CellCapacitymAhEditFieldValueChanged czy CellsinrowEditFieldValueChanged. Po zmianie
tych danych, wywoływana jest funkcja updateCapacity, która aktualizuje wyświetlane
wartości związane z pojemnością akumulatora.
Podsumowanie
Interfejs umożliwia użytkownikwi prowadzanie danych dotyczących akumulatora, ich
zapisywanie, resetowanie oraz prezentuje obliczone wartości. Dodatkowo, interfejs jest
dostosowywany do zdefiniowanego schematu kolorów.
3 - calculateSteeringData
Funkcja służąca do obliczenia kątów skrętu, odchylenia, kierownicy, obrotu odchylenia i ackermanna
Kąt odchylenia i obrót odchylenia grafika poglądowa
Ackermann grafika poglądowa
Działanie funkcji
Sprawdzenie kierunku skrętu:
%%Sprawdzenie kierunku zakrętu, gdy R jest dodatnie - skręt w prawoifR>0f=-1;elsef=1;end
Obliczanie kątów skrętu, odchylenia, kierownicy i obrotu odchylenia:
delta=wheelbase/1000/R;%kąt skrętu (dzielenie przez 1000 w celu konwersji na metry)beta=f*atan((lr/1000)/sqrt(R^2-(lr/1000)^2));%kąt odchyleniapsi1=vV/R;%kąt obrotu odchyleniadelta_sw=delta*180/pi*5.093;%kąt skrętu kierownicy (5.093 to mnożnik zależny od układu kierowniczego)
Obliczanie kątów skrętu dla koła wewnętrznego i zewnętrznego:
ifR>0%Gdy R jest dodatnie - skręt w prawo, a prawe koło jest wewnętrznym do łukudelta_fl=atan((wheelbase/1000)/(R+(track_f/1000/2)));%kąt skrętu lewego koładelta_fr=atan((wheelbase/1000)/(R-(track_f/1000/2)));%kąt skrętu lewego kołaackermann=atan(wheelbase/((wheelbase/tan(delta_fl))-track_f));%wartość ackermannaackermannPercent=delta_fr/ackermann*100;%procentowa wartość ackermannaelsedelta_fl=atan((wheelbase/1000)/(R-(track_f/1000/2)));delta_fr=atan((wheelbase/1000)/(R+(track_f/1000/2)));ackermann=atan(wheelbase/((wheelbase/tan(delta_fr))-track_f));ackermannPercent=delta_fl/ackermann*100;end
4 - Inicjalizacja powtórki symulacji
initializeSimulationReplay.m
Wstęp
Przebieg inicjalizacji powtórki symulacji w pliku initializeSimulationReplay.m
Funkcja initalizeSimulationReplay()
Opisywane niżej linie są wykresami prezentującymi trasę przejechaną przez bolid w trakcie symulacji.
Na początku funkcja ładuje plik z zapisem symulacji przejazdu oraz czyści linie wyświetlane w interfejsie.
Następnie na elemencie app.RunNumberSpinner program próbuje wykonać poniższe operacje (zablokować interakcje z nim oraz ustawić jego wartość na 1). Jeśli wystąpi jakiś błąd i nie będzie się tego dało zrobić to jest włączany oraz jego zakres jest zmieniany na od 1 do ilości przejazdów.
RunNumberSpinner
drawPedalPlots() - tworzy elementy obrazujące nacisk pedałów. Deklaracja funkcji na końcu pliku.
Następnie ustawiane są kolory zależne od wybranego motywu.
Funkcja hold() z parametrem ‘on’ sprawia, że kolejne rysowane linie nie wymazują poprzednich.
Następnie na GUI są przeprowadzane poniższe operacje:
Do struktory o nazwie saveFileData przypisywane są wszystkie wartości z wybranego wcześniej pliku z zapisem przejazdu (saveFile), żeby później te informacje zostały wpisane do elementów GUI (app.DropDown).
Wykonując poniższe funkcje program kolejno:
-zmienia limity rysowania linii
-rysuje zaznaczone w checkboxach rodzaje linii
-rysuje apexy jeśli odpowiedni checkbox jest zaznaczony
gdzie:
Parametr ‘app’ - aplikacja
Parametr ‘1’ - numer przejazdu
Parametr ‘saveFile’ - result; plik z zapisem telemetrii
Funkcja drawPedalPlots()
Ustawia właściwości elementów obrazujących nacisk pedałów.
Funkcja recordPedalPlot()
Pobierając plik z telemetrią ustawia wartości elementów obrazujących nacisk pedałów.
5 - Inicjowanie Opon do symulacji
Wdrożenie parametrów opon do symulacji LapSim (plik LoadTIR.m)
Wstęp
Plik LoadTIR.m umożliwia załadowanie pliku z danymi opony do symulacji. Wszystkie odniesienia do danej linii kodu odnoszą się do pliku dostępnego w oryginalnym repozytorium, bez żadnych uprzednich modyfikacji kodu.
Wybór pliku
Plik rozpoczyna sie deklaracją funkcji loadTIR z parametrem w postaci lokalizacji pliku zawierającego parametry opony. Parametr ten pojawia się także w plikach Conti_Tire_Plots zarówno dla obliczeń w płaszczyźnie wzdłużnej i poprzecznej, a także w pliku Find_maximum_corner_speed. Celem modyfikacji rodzaju opony konieczne będzie dostosowanie kodu, aby możliwy był wybór większej ilości opon i przeprowadzenia obliczeń na ich parametrach.
Rys.1 Odwołania do lokalizacji pliku z parametrycznym opisem opony
Następnie w linii 7 plik jest otwierany w trybie tylko do odczytu i inicjowane są dwie zmienne pełniące funkcję liczników.
Inicjacja parametrów
Rys.2 Fragment kodu zczytujący parametry opon z pliku
W pętli działającej do momentu zakończenia pliku zawierającego parametry zczytywane są kolejne parametry. Osobno przetwarzając każdą linijkę pliku. W pierwszej kolejności sprawdzane jest, czy dana linia kodu nie jest komentarzem bądź tytułem. korzystając z ustandaryzowanego sposobu wpisywania parametrów kolejne dane i ich nazwy są zczytywane i zapisywane do pamięci. Po zczytaniu danych plik jest zamykany i niepotrzebne dane są usuwane z pamięci.
Sprawdzenie masy
Rys.3 Podmiana masy
Ze względu na konflikt nazw zmiennych podmieniana jest nazwa zmiennej opisującej masę na nazwę pomocniczą.
Generowanie opon
Korzystając z pobranych wcześniej danych generowana jest parametryczna struktura opony.
Rys.4 Generowanie opon
Program przepisuje odczytane wcześniej dane do formatu właściwego, który ułatwia pracę nad danymi. Sprawdzane jest między innymi, czy odczytywana wartość ma format tekstowy czy liczbowy.
Rys.5 Dodawanie opisów opon
Finalnie zapisane dane są opisywane korzystając z nazw zmiennych.
6 - paramtery układu napędowego
interfejs do wprowadzania zmiennych układu napędowego
Wstęp
Interfejs i jego oddziaływanie poszczególnych danych. Dany plik zaprojektowany jest w App Designer i jest podzielony na Design View oraz Code View
DrivetrainSetupUIFigure: Objekt reprezentujący figurę w UI
PowertrainDataPanel: Panel przedstawiający dane o układzie napędowym
UITable: Tablica przedstawiająca tablicę w UI
idle_rpm1minEditField: Miejsce do edytowania obrotów na luzie
TorquemultiplierEditField: Miejsce do edytowania mnożnika momentu obrotowego
n_max1minEditField: Miejsce do edycji maksymalnych obrotów
DrivetrainEfficencyEditField: Miejsce do edycji efektywności układu napędowego
LayoutDropDown: Rozwijane UI do wyboru układu
LayoutDropDownLabel: Etykieta do rozwijanego elemntu UI
PowertrainSwitch: Przycisk do wyboru układu napędowego
EPowertrainParametersPanel: Panel zawierający parametry elektryczne układu napędowego
InverterEfficiencyEditField: Miejsce do edycji efektywności falownika
PowerlimitWEditField: Miejsce do edycji limitu mocy w watach
DeleteEngineButton: Przycisk, który usuwa parametry silnika
EnginePresetDropDown: Rozwijany element UI do wybory presetów silnika
Panel_2: Obiekt reprezentujący panel.
z_chaindriveEditField: Obiekt NumericEditField reprezentujący pole edycji dla napędu łańcuchowego.
z_sprocketEditField: Obiekt NumericEditField reprezentujący pole edycji dla zębatki.
ChaindriveSingleGearsetCheckBox: Obiekt CheckBox reprezentujący pole wyboru dla pojedynczego układu napędowego łańcuchowego.
loadPanel: Obiekt Panel reprezentujący panel dla obciążenia.
TY20BaselineButton: Obiekt Button reprezentujący przycisk dla podstawowej konfiguracji TY20.
SaveButton: Obiekt Button reprezentujący przycisk do zapisu.
ResetButton: Obiekt Button reprezentujący przycisk do resetowania.
ElectricBaselineButton: Obiekt Button reprezentujący przycisk dla podstawowej konfiguracji elektrycznej.
TY19BaselineButton: Obiekt Button reprezentujący przycisk dla podstawowej konfiguracji TY19.
ChaindrivePanel: Obiekt Panel reprezentujący panel dla napędu łańcuchowego.
i_PEditField: Obiekt NumericEditField reprezentujący pole edycji dla i_P.
GearboxPanel: Obiekt Panel reprezentujący panel dla skrzyni biegów.
n_downshift1minEditField: Obiekt NumericEditField reprezentujący pole edycji dla obrotów przy redukcji biegów.
EnableGearboxCheckBox: Obiekt CheckBox reprezentujący pole wyboru dla włączenia skrzyni biegów.
PlotGearboxdataButton: Obiekt Button reprezentujący przycisk do generowania wykresu danych skrzyni biegów.
GearboxTable: Obiekt Table reprezentujący tabelę dla danych skrzyni biegów.
Button_4: Obiekt Button reprezentujący kolejny przycisk.
Button_3: Obiekt Button reprezentujący jeszcze jeden przycisk.
n_shift1minEditField: Obiekt NumericEditField reprezentujący pole edycji dla obrotów przy zmianie biegów.
t_shiftsEditField: Obiekt NumericEditField reprezentujący pole edycji dla czasu zmiany biegów.
UIAxes3: Obiekt UIAxes reprezentujący osie do generowania wykresów.
UIAxes2: Obiekt UIAxes reprezentujący kolejne osie do generowania wykresów.
UIAxes: Obiekt UIAxes reprezentujący jeszcze inne osie do generowania wykresów.
Klasa Drivetrain reprezentuje obiekt odpowiedzialny za aktualizację wykresu dla krzywych momentu i mocy silnika.
Obiekt głównej aplikacji
CallingApp
Metoda updateMotorGraph(app) aktualizuje wykresy dla jednego silnika.
Metoda ta pobiera dane z tabeli UITable, oblicza moc i moment dla każdej wartości obrotów,
a następnie rysuje wykresy dla momentu i mocy.
Aktualizuje etykietę przekładni i zwraca wartość przekładni
Sprawdza, który układ silnika jest wybrany i dostosowuje liczbę silników
Motorsdropdown = app.LayoutDropDown.Value;
if (Motorsdropdown == "2 Motor RWD")
numberMotors = 2;
elseif (Motorsdropdown == "1 Motor RWD")
numberMotors = 1;
elseif (Motorsdropdown == "AWD")
numberMotors = 4;
end
Oblicza moment wytworzony przez daną liczbę silników
y_2 = y * numberMotors;
p_2 = zeros(1:length(x));
Oblicza moc silników dla danej wartości obrotów i momentu
for n = 1 : length(x)
p_2(n) = (y_2(n) * x(n)) / 9.5488 / 1000;
end
Czyści wykres UIAxes2, aby można go było ponownie utworzyć
cla(app.UIAxes2,'reset');
Metoda rysująca wykresy dla przekładni wtórnej.
x - Tablica wartości osi X.
y_2 - Tablica wartości osi Y dla momentu obrotowego.
p_2 - Tablica wartości osi Y dla mocy.
return Wartość całkowitego przekładniowego stosunku.
(double)updateGearRatio
return i_tot;
Zmienia schemat kolorów aplikacji.
(void)changeColorScheme
-Poniżej znajdują się zmienne reprezentujące kolory i style aplikacji.
PrimaryColor: Kolor podstawowy aplikacji.
OnPrimaryColor: Kolor tekstu na tle PrimaryColor.
PrimaryVariantColor: Wariant koloru podstawowego aplikacji.
OnPrimaryVariantColor: Kolor tekstu na tle PrimaryVariantColor.
SecondaryColor: Kolor drugorzędny aplikacji.
OnSecondaryColor: Kolor tekstu na tle SecondaryColor.
BackgroundColor: Kolor tła aplikacji.
OnBackgroundColor: Kolor tekstu na tle BackgroundColor.
SurfaceColor: Kolor powierzchni aplikacji.
OnSurfaceColor: Kolor tekstu na tle SurfaceColor.
ErrorColor: Kolor błędu aplikacji.
OnErrorColor: Kolor tekstu na tle ErrorColor.
BorderType: Typ obramowania aplikacji.
Host_Logo: Logo hosta aplikacji.
Ustawia kolor tła dla interfejsu użytkownika DrivetrainSetupUIFigure.
Dla każdego wiersza w tabeli, funkcja wywołuje funkcję updateGearRatio(app) w celu obliczenia całkowitego przełożenia. Następnie funkcja aktualizuje wartości w drugiej i trzeciej kolumnie tabeli na podstawie obliczonych wartości.
for i = 1:size(app.GearboxTable.Data, 1)
i_tot = updateGearRatio(app);
app.GearboxTable.Data(i,2) = app.GearboxTable.Data(i,1) * i_tot;
app.GearboxTable.Data(i,3) = app.n_max1minEditField.Value/(30/pi*app.GearboxTable.Data(i,2)/app.CallingApp.R0)*3.6;
Włącza możliwość edycji pól związanych z przesunięciami biegów.
app.t_shiftsEditField.Enable
Włącza lub wyłącza możliwość edycji etykiety pola t_shiftsEditField.
app.t_shiftsEditFieldLabel.Enable
Włącza lub wyłącza możliwość edycji pola n_shift1minEditField.
app.n_shift1minEditField.Enable
Analogicznie są włączabne możliwości edycji w innych polach.
Kod wykonywany po utworzeniu komponentu
function startupFcn(app, mainapp)
Aktualizuje wykres momentu i mocy silnika na podstawie danych z UITable
updateMotorGraph(app);
Callback edycji komórki: UITable
function UITableCellEdit(app, event)
updateMotorGraph(app);
Funkcja wywoływana po zmianie wartości: LayoutDropDown
function LayoutDropDownValueChanged(app, event)
updateMotorGraph(app);
Funkcja wywoływana po zmianie wartości: TorquemultiplierEditField
function TorquemultiplierEditFieldValueChanged(app, event)
updateMotorGraph(app);
Analogicznie są wywoływane inne funckje
Dodaje wpis do UITable
data = app.UITable.Data;
app.UITable.Data = [data; [0 0]];
Funkcja wywoływana po naciśnięciu przycisku Button_2. Usuwa ostatni wpis w tabeli UITable.
data = app.UITable.Data;
data((length(data)),:) = [];
app.UITable.Data = data;
Funkcja wywoływana przy próbie zamknięcia okna DrivetrainSetupUIFigure. Zapisuje dane i wyłącza przycisk Drivetrain Options w głównym oknie aplikacji.
function DrivetrainSetupUIFigureCloseRequest(app, event)
saveData(app);
app.CallingApp.DrivetrainButton.Enable = 'on';
delete(app)
Funkcja wywoływana po naciśnięciu przycisku SaveButton.
function SaveButtonPushed(app, event)
saveData(app);
Funkcja wywoływana po naciśnięciu przycisku ResetButton.
function ResetButtonPushed(app, event)
loadData(app);
Funkcja wywoływana po zmianie wartości pola InverterEfficiencyEditField. Aktualizuje wykres silnika.
function InverterEfficiencyEditFieldValueChanged(app, event)
updateMotorGraph(app);
Funkcja wywoływana po zmianie wartości przełącznika PowertrainSwitch. Aktualizuje parametry zależne od rodzaju napędu.
function PowertrainSwitchValueChanged(app, event)
value = app.PowertrainSwitch.Value;
if value == "Electric"
app.PowerlimitWEditField.Enable = true;
app.InverterEfficiencyEditField.Enable = true;
app.CallingApp.ptype = 1;
else
app.PowerlimitWEditField.Enable = false;
app.InverterEfficiencyEditField.Enable = false;
app.CallingApp.ptype = 0;
end
updateMotorGraph(app)
updateGearRatio(app)
Funkcja wywoływana po naciśnięciu przycisku Button_3. Dodaje nowy wiersz do tabeli GearboxTable.
function Button_3Pushed(app, event)
data = app.GearboxTable.Data;
app.GearboxTable.Data = [data; 0,0,0];
Funkcja wywoływana po naciśnięciu przycisku Button_4. Usuwa ostatni wpis w tabeli GearboxTable.
function Button_4Pushed(app, event)
Deletes the last entry in the UITable
data = app.GearboxTable.Data;
data((size(data,1)),:,:) = [];
app.GearboxTable.Data = data;
Funkcja wywoływana po zmianie wartości pola i_PEditField. Aktualizuje wykres silnika.
function i_PEditFieldValueChanged(app, event)
updateMotorGraph(app);
Funkcja wywoływana po naciśnięciu przycisku PlotGearboxdataButton. Wyświetla wykres danych z tabeli GearboxTable.
function PlotGearboxdataButtonPushed(app, event)
plotGearboxData(app.GearboxTable.Data,app.n_shift1minEditField.Value,app.t_shiftsEditField.Value,app.n_max1minEditField.Value);
Funkcja wywoływana po edycji komórki w tabeli GearboxTable. Aktualizuje przekładnie.
function GearboxTableCellEdit(app, event)
updateGearRatios(app);
Funkcja wywoływana po zmianie wartości pola EnableGearboxCheckBox. Aktualizuje przekładnie.
function EnableGearboxCheckBoxValueChanged(app, event)
updateGearbox(app);
Funkcja wywoływana po naciśnięciu przycisku TY19BaselineButton. Ustawia wartości związane z układem napędowym dla trybu spalinowego, ładuje dane z pliku “Dynojet Momentenverlauf.mat”, ustawia parametry układu napędowego dla symulacji oraz wywołuje funkcję loadData(app) w celu załadowania danych.
Funkcja wywoływana po naciśnięciu przycisku ElectricBaselineButton, ustawia wartości związane z układem napędowym dla trybu elektrycznego, umożliwia edycję pól PowerlimitWEditField i InverterEfficiencyEditField, wyłącza pole EnableGearboxCheckBox, ustawia parametry układu napędowego dla symulacji oraz wywołuje funkcję loadData(app) w celu załadowania danych.
Funkcja wywoływana po naciśnięciu przycisku TY20BaselineButton, ustawia wartości związane z układem napędowym dla trybu spalania, ładuje dane z pliku “Dynojet Momentenverlauf.mat”, Ustawia parametry układu napędowego dla symulacji oraz wywołuje funkcję loadData(app) w celu załadowania danych.
Funkcja wywoływana po zmianie wartości pola ChaindriveSingleGearsetCheckBox, ustawia wartość zmiennej i_chain na podstawie wartości pól związanych z przekładnią, jeśli pole ChaindriveSingleGearsetCheckBox jest zaznaczone, włącza pole związane z ilością zębów koła zębatego.
function ChaindriveSingleGearsetCheckBoxValueChanged(app, event)
value = app.ChaindriveSingleGearsetCheckBox.Value;
if value
app.i_chain = app.z_sprocketEditField.Value * app.z_chaindriveEditField.Value;
app.z_sprocketEditField.Enable = 'true';
else
app.i_chain = 1;
Funkcja wywoływana po zmianie wartości w polu EnginePresetDropDown, aktualizuje parametry silnika na podstawie wybranego silnika oraz Aktualizuje interfejs użytkownika.
function EnginePresetDropDownValueChanged(app, event)
value = app.EnginePresetDropDown.Value;
Funkcja wywoływana po naciśnięciu przycisku SaveEngineButton, zapisuje zmienne silnika do pliku .mat oraz dodaje nowy silnik do listy rozwijanej, jeśli nazwa nie jest już częścią listy.
function SaveEngineButtonPushed(app, event)
data = app.UITable.Data;
n = data(:,1);
M = data(:,2);
Jeśli nie ma argumentów wyjściowych, usuń obiekt aplikacji
if nargout == 0
clear app
Usunięcie UIFigure przy usuwaniu aplikacji
delete(app.DrivetrainSetupUIFigure)
7 - Linia Krzywa 2D
Funkcja LineCurvature2D oblicza krzywiznę linii 2D. Najpierw dopasowuje wielokąty do punktów, a następnie oblicza krzywiznę analityczną na podstawie wielokątów.
Zmienne wejściowe:
1. Vertices:
Macierz M x 2
Opis: Lista punktów tworzących linię, gdzie każda z M wierszy zawiera współrzędne x i y danego punktu.
Domyślnie: Jeśli Lines nie jest podane, przyjmuje się, że Lines = [1 2; 2 3; ...; M-1 M], co oznacza, że punkty są połączone w kolejności, w jakiej są podane.
Zmienna wyjściowa:
1. k:
Wektor M x 1
Opis: Wartości krzywizny dla każdego z M punktów linii. Każdy element wektora k odpowiada krzywiźnie w odpowiednim punkcie Vertices.
Przykład: k = [k1; k2; ...; kM], gdzie ki to krzywizna w punkcie i.
Przykład użycia:
Jeśli mamy punkty linii:
Vertices = [0, 0; 1, 1; 2, 0; 3, -1];
i chcemy obliczyć krzywiznę, możemy wywołać funkcję:
k = LineCurvature2D(Vertices);
Wykreśla linie łączące punkty z Vertices zgodnie z Lines.
Vertices(Lines(:,1),1) i Vertices(Lines(:,2),1) to współrzędne x punktów początkowych i końcowych odcinków linii.
Vertices(Lines(:,1),2) i Vertices(Lines(:,2),2) to współrzędne y punktów początkowych i końcowych odcinków linii.
Kolor wykresu: niebieski ('b').
8. Wykreślanie punktów:
plot(Vertices(:,1), Vertices(:,2), 'r.');
Wykreśla punkty Vertices.
Kolor wykresu: czerwony ('r').
9. Ustawienie równej skali osi:
axis equal;
Ustawia równe jednostki na osiach x i y, co zapewnia proporcjonalne wyświetlanie.
10. Lista zmiennych i ich opis:
Vertices:
Typ: Macierz M x 2
Opis: Współrzędne punktów (wierzchołków) linii.
Lines:
Typ: Macierz N x 2
Opis: Lista odcinków linii, zdefiniowana przez indeksy punktów w Vertices.
k:
Typ: Wektor M x 1
Opis: Wartości krzywizny dla punktów Vertices, skalowane przez 100.
N:
Typ: Macierz M x 2
Opis: Wektory normalne dla punktów z Vertices, obliczone przez LineNormals2D.
Funkcja
Obliczenie krzywizny linii na podstawie zadanych wierzchołków (Vertices) i odcinków linii (Lines). Obejmuje on kroki takie jak uzupełnianie brakujących sąsiadów, przeliczanie wektorów normalnych oraz obliczanie krzywizny na podstawie dopasowania wielomianu do wierzchołków.
Kod:
% Function is written by D.Kroon University of Twente (August 2011)
% If no line-indices, assume a x(1) connected with x(2), x(3) with x(4) ...
if(nargin<2)
Lines=[(1:(size(Vertices,1)-1))' (2:size(Vertices,1))'];
end
% Get left and right neighbor of each points
Na=zeros(size(Vertices,1),1); Nb=zeros(size(Vertices,1),1);
Na(Lines(:,1))=Lines(:,2); Nb(Lines(:,2))=Lines(:,1);
% Check for end of line points, without a left or right neighbor
checkNa=Na==0; checkNb=Nb==0;
Naa=Na; Nbb=Nb;
Naa(checkNa)=find(checkNa); Nbb(checkNb)=find(checkNb);
% If no left neighbor use two right neighbors, and the same for right...
Na(checkNa)=Nbb(Nbb(checkNa)); Nb(checkNb)=Naa(Naa(checkNb));
% Correct for sampeling differences
Ta=-sqrt(sum((Vertices-Vertices(Na,:)).^2,2));
Tb=sqrt(sum((Vertices-Vertices(Nb,:)).^2,2));
% If no left neighbor use two right neighbors, and the same for right...
Ta(checkNa)=-Ta(checkNa); Tb(checkNb)=-Tb(checkNb);
% Fit a polygons to the vertices
% x=a(3)*t^2 + a(2)*t + a(1)
% y=b(3)*t^2 + b(2)*t + b(1)
% we know the x,y of every vertice and set t=0 for the vertices, and
% t=Ta for left vertices, and t=Tb for right vertices,
x = [Vertices(Na,1) Vertices(:,1) Vertices(Nb,1)];
y = [Vertices(Na,2) Vertices(:,2) Vertices(Nb,2)];
M = [ones(size(Tb)) -Ta Ta.^2 ones(size(Tb)) zeros(size(Tb)) zeros(size(Tb)) ones(size(Tb)) -Tb Tb.^2];
invM=inverse3(M);
a(:,1)=invM(:,1,1).*x(:,1)+invM(:,2,1).*x(:,2)+invM(:,3,1).*x(:,3);
a(:,2)=invM(:,1,2).*x(:,1)+invM(:,2,2).*x(:,2)+invM(:,3,2).*x(:,3);
a(:,3)=invM(:,1,3).*x(:,1)+invM(:,2,3).*x(:,2)+invM(:,3,3).*x(:,3);
b(:,1)=invM(:,1,1).*y(:,1)+invM(:,2,1).*y(:,2)+invM(:,3,1).*y(:,3);
b(:,2)=invM(:,1,2).*y(:,1)+invM(:,2,2).*y(:,2)+invM(:,3,2).*y(:,3);
b(:,3)=invM(:,1,3).*y(:,1)+invM(:,2,3).*y(:,2)+invM(:,3,3).*y(:,3);
% Calculate the curvature from the fitted polygon
k = 2*(a(:,2).*b(:,3)-a(:,3).*b(:,2)) ./ ((a(:,2).^2+b(:,2).^2).^(3/2));
function Minv = inverse3(M)
% This function does inv(M) , but then for an array of 3x3 matrices
adjM(:,1,1)= M(:,5).*M(:,9)-M(:,8).*M(:,6);
adjM(:,1,2)= -(M(:,4).*M(:,9)-M(:,7).*M(:,6));
adjM(:,1,3)= M(:,4).*M(:,8)-M(:,7).*M(:,5);
adjM(:,2,1)= -(M(:,2).*M(:,9)-M(:,8).*M(:,3));
adjM(:,2,2)= M(:,1).*M(:,9)-M(:,7).*M(:,3);
adjM(:,2,3)= -(M(:,1).*M(:,8)-M(:,7).*M(:,2));
adjM(:,3,1)= M(:,2).*M(:,6)-M(:,5).*M(:,3);
adjM(:,3,2)= -(M(:,1).*M(:,6)-M(:,4).*M(:,3));
adjM(:,3,3)= M(:,1).*M(:,5)-M(:,4).*M(:,2);
detM=M(:,1).*M(:,5).*M(:,9)-M(:,1).*M(:,8).*M(:,6)-M(:,4).*M(:,2).*M(:,9)+M(:,4).*M(:,8).*M(:,3)+M(:,7).*M(:,2).*M(:,6)-M(:,7).*M(:,5).*M(:,3);
Minv=bsxfun(@rdivide,adjM,detM);
Kroki działania:
1. Sprawdzenie i przypisanie domyślnych indeksów linii:
if(nargin<2) Lines=[(1:(size(Vertices,1)-1))' (2:size(Vertices,1))']; end
Jeśli nie podano Lines, domyślnie zakłada, że punkty są połączone sekwencyjnie.
2. Znalezienie lewego i prawego sąsiada dla każdego punktu:
Opis: Lista odcinków linii, zdefiniowana przez indeksy punktów w Vertices.
Na:
Typ: Wektor M x 1
Opis: Indeksy lewych sąsiadów dla każdego punktu.
Nb:
Typ: Wektor M x 1
Opis: Indeksy prawych sąsiadów dla każdego punktu.
checkNa, checkNb:
Typ: Wektory logiczne M x 1
Opis: Wskazuje, które punkty nie mają lewego lub prawego sąsiada.
Naa, Nbb:
Typ: Wektory M x 1
Opis: Kopie Na i Nb, używane do uzupełniania braków.
Ta, Tb:
Typ: Wektory M x 1
Opis: Odległości do lewych i prawych sąsiadów.
x, y:`
Typ: Macierze M x 3
Opis: Współrzędne x i y dla punktów i ich sąsiadów.
M:
Typ: Macierz M x 9
Opis: Macierz współczynników dla dopasowania wielomianu.
invM:
Typ: Macierz M x 3 x 3
Opis: Odwrotność macierzy M.
a, b:
Typ: Macierze M x 3
Opis: Współczynniki wielomianów dopasowanych do współrzędnych x i y.
k:
Typ: Wektor M x 1
Opis: Wartości krzywizny dla punktów Vertices.
8 - Linia Znormalizowana 2D
Funkcja LineNormals2D oblicza normalne do punktów linii,
wykorzystując sąsiednie punkty każdego punktu konturu
oraz różnice w przód i w tył na końcach.
Wejście i wyjście:
Fragment kodu przyjmuje listę punktów/wierzchołków V o wymiarach 2 x M jako dane wejściowe.
Opcjonalnie można podać listę odcinków Lines, która jest listą N x 2 zawierającą indeksy wierzchołków
definiujących poszczególne odcinki linii
(jeśli nie jest podana, zakłada się, że Lines=[1 2; 2 3 ; ... ; M-1 M]).
Jako wynik zwraca normalne do wierzchołków N o wymiarach 2 x M.
V = Lista punktów/wierzchołków w postaci macierzy 2 x M.
Lines (opcjonalny) = Lista o wymiarach N x 2 zawierająca odcinki linii, wyrażone przez indeksy wierzchołków (jeśli nie jest podana, zakładamy, że Lines=[1 2; 2 3 ; ... ; M-1 M]).
N = Normalne do wierzchołków w postaci macierzy 2 x M.
Przykład:
Ten fragment kodu to przykładowe użycie funkcji LineNormals2D
w celu obliczenia normalnych do linii na płaszczyźnie 2D.
Dane wejściowe są wczytywane z pliku testowego (testdata).
Następnie funkcja LineNormals2D jest wywoływana,
aby obliczyć normalne do linii na podstawie podanych wierzchołków (Vertices) i odcinków (Lines).
Otrzymane normalne są następnie wykorzystywane do wygenerowania wykresu,
który przedstawia oryginalne linie oraz normalne do tych linii,
przedstawione jako linie przechodzące przez wierzchołki
i skierowane w kierunku normalnej zwiększonej dziesięciokrotnie.
testdata = nazwa pliku testowego.
FUNKCJA:
Funkcja napisana przez D. Kroona z Uniwersytetu w Twente (sierpień 2011)
Początek kodu odpowiada za ustalenie listy odcinków linii w przypadku,
gdy nie są podane indeksy linii.
Lista zmiennych:
nargin = Liczba argumentów wejściowych funkcji.
Lines = Lista odcinków linii, gdzie każdy odcinek jest połączeniem kolejnych punktów. Jeśli nie są podane indeksy linii, ta lista jest automatycznie generowana.
Obliczanie wektorów stycznych do krzywej poprzez
różnicę pomiędzy współrzędnymi punktów końcowych
i początkowych odcinków linii.
Lines(:,1) = indeksy początkowych punktów odcinków linii.
Lines(:,2) = indeksy końcowych punktów odcinków linii.
Vertices(Lines(:,1),:) = współrzędne początkowych punktów odcinków linii.
Vertices(Lines(:,2),:) = współrzędne końcowych punktów odcinków linii.
Wpływ wektorów stycznych na odległość dla każdego punktu/wierzchołka krzywej:
LL: Obliczana jest długość wektorów stycznych DT za pomocą funkcji sqrt(DT(:,1).^2+DT(:,2).^2).
DT(:,1)=DT(:,1)./max(LL.^2,eps): Normalizowane są współrzędne x wektorów stycznych przez kwadrat długości wektora (LL), z tym że minimalna wartość to eps (najmniejsza wartość reprezentowalna w danej precyzji arytmetyki).
DT(:,2)=DT(:,2)./max(LL.^2,eps): Normalizowane są współrzędne y wektorów stycznych przez kwadrat długości wektora (LL), z tym że minimalna wartość to eps.
D1=zeros(size(Vertices)); D1(Lines(:,1),:)=DT;: Tworzona jest macierz zerowa D1 o takim samym rozmiarze jak lista punktów/wierzchołków. Następnie wiersze odpowiadające początkowym punktom odcinków linii otrzymują wartości wektorów stycznych DT.
D2=zeros(size(Vertices)); D2(Lines(:,2),:)=DT;: Tworzona jest macierz zerowa D2 o takim samym rozmiarze jak lista punktów/wierzchołków. Następnie wiersze odpowiadające końcowym punktom odcinków linii otrzymują wartości wektorów stycznych DT.
D=D1+D2;: Sumowane są macierze D1 i D2, uzyskując macierz D, która zawiera wpływ wektorów stycznych na odległość dla każdego punktu/wierzchołka krzywej.
Normalizowanie wektorów normalnych:
LL: Obliczana jest długość wektorów normalnych D za pomocą funkcji sqrt(D(:,1).^2+D(:,2).^2).
N(:,1)=-D(:,2)./LL: Współrzędna x normalizowanego wektora normalnego jest ujemnym ilorazem współrzędnej y wektora normalnego przez długość LL.
N(:,2)= D(:,1)./LL: Współrzędna y normalizowanego wektora normalnego jest ilorazem współrzędnej x wektora normalnego przez długość LL.
Ostatecznie macierz N zawiera znormalizowane wektory normalne.
9 - Maksymalna prędkość na łuku
Opis kodu wyliczającego maksymalną prędkość bolidu na łuku korzystając z pliku zawierającego parametryczny opis opon i pliku opisującego model aerodynamiczny bolidu.
Opisany plik: Find_maximum_corner_speed.m
Czyszczenie środowiska
clear all
close all
Te dwie linie służą do czyszczenia środowiska MATLAB. clear all usuwa wszystkie zmienne z przestrzeni roboczej, a close all zamyka wszystkie otwarte okna graficzne.
Wczytywanie danych
load('Aero Downforce Daten.mat'); % Aero Daten
Ta linia wczytuje dane dotyczące sił aerodynamicznych z pliku .mat.
Te dwie linie wczytują dane o oponach z pliku .tir za pomocą funkcji loadTIR.
Inicjalizacja zmiennych
R = 10;
m = 280;
FZ_stat = 800;
k = 0;
Te linie inicjalizują zmienne używane w późniejszych obliczeniach. R to promień, m to masa, FZ_stat to statyczne obciążenie pionowe, a k to krok iteracji.
Pętla główna
for i = 1:8
v1 = 5;
v2 = 100;
FZ_stat = 800 + (i-1)*200;
...
end
Ta pętla wykonuje obliczenia dla różnych wartości obciążenia pionowego. W każdej iteracji, FZ_stat jest zwiększane o 200 jednostek.
Obliczenia w pętli
while v1 < v2
v1 = v1 + k;
Faero = interp1(v,FA,v1*3.6,'linear','extrap'); % [N] Abtriebskraft interpoliert
FZ(i) = FZ_stat + Faero/2;
v2 = sqrt(max(MF52_Fy_cs(0:-0.1:-12,FZ(i),0,0,TIRparam))*R/m);
k = k+0.0001;
end
Wewnątrz pętli głównej znajduje się pętla while, która wykonuje obliczenia dla danego obciążenia pionowego, dopóki pewien warunek nie zostanie spełniony. W każdej iteracji, v1 jest zwiększane o k, a k jest zwiększane o 0.0001.
Ta linia oblicza prędkość (v2) na podstawie obciążenia pionowego (FZ), promienia (R) i masy (m).
Obliczanie maksymalnego przyspieszenia bocznego
aQmax(i) = v2^2/R/9.81;
Ta linia oblicza maksymalne przyspieszenie boczne (aQmax) na podstawie prędkości (v2) i promienia (R).
Wykres wyników
scatter(FZ,aQmax)
Ta linia tworzy wykres punktowy (scatter plot), pokazujący maksymalne przyspieszenie boczne (aQmax) w funkcji obciążenia pionowego (FZ).
10 - Manadżer symulacji
simulationManager.m
Wstęp
simulationManager
Co się dzieje w ciele funkcji
Na początku podejmowana jest próba przypisania zmiennej sensitivityID2 z klasy startingParameters załadowanej z pliku generateStartingParameters.m do zmiennej lokalnej o tej samej nazwie. Jeśli się nie uda przypisywana jest jej wartość “0”.
W praktyce try powinien być wykonany, bo z pliku generateStartingParameters.m możemy wywnioskować, że w każdym przypadku będzie ta zmienna przechowywała jakąś wartość.
Jeśli ilość kroków symulacji (numSteps) będzie większa od 1 oraz zmienna sensitivityID będzie różna od 0 (w praktyce; jeśli sensitivity analysis będzie wyłączone) to wykonuje się kod przedstawiony wyżej, gdzie funkcja zeros() tworzy tablicę o wymiarach 1 x numSteps wypełnioną zerami.
W warunku mamy drugą wartość do śledzenia przy rysowaniu wykresu, czyli jeśli zaznaczony zostanie CheckBox włączający ją to warunek się spełni i wtedy:
tic - uruchamia stoper
wykonuje się pętla od 1 do numSteps z pętlą wewnętrzną z tym samym zakresem z przedstawionymi działaniami arytmetycznymi. Rezultatem tej pętli są wypiełnione tablice minValue i minValue2
Ale jeśli warunek się nie spełni, czyli nie włączymy drugiej wartości do śledzenia to:
tic - uruchamia stoper
wykonuje się analogiczna pętla ale tylko dla minValue jak przedstawiono poniżej:
Następnie zmienna steps jest zmniejszana o 1, żeby nie przekroczyć zakresu w następującej pętli równoległej, która do kolejnych komórek w tablicy result przypisuje wartości zwracane przez wywoływaną funkcję Vehiclesim_Endurance_GUI_Version() z parametrami
startingParameters
minValue()
minValue2()
sensitivityID
sensitivityID2
Do pliku z logami przez funkcję writeToLogfile zostaje zapisany czas wykonywania wszystkich powyższych operacji od momentu procedury tic do toc (zliczającej upłynięty czas).
Ładowana jest nazwa pliku z setupem.
Rezultaty są zapisywane do pliku .mat, dodając “_result” do nazwy, w tej samej lokalizacji co jest plik z setupem.
Plik zawiera parametryczny opis opony Continental, który jest używany do modelowania jej zachowania. Poniżej znajduje się dokumentacja poszczególnych sekcji tego pliku.
WstępPlik zawiera informacje o marce opony, modelu, klasie, rozmiarze oraz innych parametrach fizycznych opony. Został wygenerowany przez Wilke Eikermanna i Hannesa Dettmanna z działu badań i rozwoju Continental Reifen Deutschland GmbH. Plik jest własnością Continental AG i jego dystrybucja jest możliwa tylko za wyraźnym zezwoleniem Continental AG lub jej spółek zależnych.
USE_MODE to parametr w modelu opony, który określa, jakie obliczenia są wykonywane. Każda wartość USE_MODE odpowiada innemu zestawowi obliczeń:
0: Oblicza tylko Fz (siłę pionową), nie wykonuje ewaluacji Magic Formula.
1: Oblicza tylko Fx (siłę podłużną).
2: Oblicza tylko Fy, Mx, Mz (siłę boczną, moment względem osi X i moment względem osi Z).
3: Oblicza Fx, Fy, Mx, Mz bez kombinacji sił/momenty.
4: Oblicza Fx, Fy, Mx, Mz z kombinacją sił/momenty.
Dodanie 10 do dowolnej z powyższych wartości uwzględnia efekty relaksacji w obliczeniach.
Na przykład, USE_MODE = 12 oznacza, że obliczenia są wykonywane tylko dla Fy, Mx, Mz i uwzględniają efekty relaksacji.
Ważne jest, aby zauważyć, że model opony jest ważny tylko dla określonego USE_MODE. Inne tryby mogą nie dostarczyć dokładnych wyników, ponieważ model został skonstruowany do pracy w określonym trybie.
Jednostki
W pliku parametrycznym wszystkie dane podawane są w odniesieniu do jednostek układu SI
Sekcja modelu zawiera informacje o typie modelu opony, wersji formatu pliku, stronie opony, trybie użycia i innych parametrach związanych z modelem opony.
Sekcja wymiarów zawiera informacje o fizycznych wymiarach opony, takich jak promień opony bez obciążenia, szerokość opony, stosunek wysokości do szerokości, promień obręczy i szerokość obręczy.
Ten kod definiuje kształt opony za pomocą profilu bocznego opony wzdłuż jej szerokości. Każda linia reprezentuje punkt na profilu opony, gdzie pierwsza wartość to odległość od środka opony (wzdłuż promienia), a druga wartość to szerokość opony w tym punkcie.
1.0 0.0 oznacza, że na początku (w środku opony), szerokość opony wynosi 0.0.
1.0 0.4 oznacza, że gdy przechodzimy na zewnątrz opony, szerokość opony zwiększa się do 0.4.
1.0 0.9 oznacza, że szerokość opony nadal rośnie, osiągając 0.9.
0.9 1.0 oznacza, że na zewnątrz opony, szerokość opony osiąga swoje maksimum (1.0), ale odległość od środka opony nieznacznie się zmniejsza (0.9).
W ten sposób kod definiuje kształt opony jako profil boczny, który jest symetryczny względem osi opony. Wizualizacja tego kształtu przypominałaby krzywą, która jest szeroka na zewnątrz, ale zwęża się do środka opony.
Współczynniki w płaszczyźnie wzdłużnej i poprzecznej
Współczynniki w płaszczyźnie wzdłużnej opisują zachowanie opony podczas poślizgu podłużnego, zarówno w stanie czystego poślizgu, jak i poślizgu łączonego.
[LONGITUDINAL_COEFFICIENTS]% Współczynniki - poślizg podłużny (poślizg czysty)PCX1=+1.786E+000 $typarr(61)% Współczynnik kształtu Cfx dla siły podłużnejPDX1=+2.933E+000 $typarr(62)% Tarcie podłużne Mux przy FznomPDX2=-4.400E-001 $typarr(63)% Zmienność tarcia Mux z obciążeniemPDX3=+2.080E+001 $typarr(60)% Zmienność tarcia Mux z pochyleniemPEX1=+8.710E-001 $typarr(64)% Krzywizna podłużna Efx przy FznomPEX2=-3.800E-002 $typarr(65)% Zmienność krzywizny Efx z obciążeniemPEX3=+0.000E+000 $typarr(66)% Zmienność krzywizny Efx z kwadratem obciążeniaPEX4=+7.100E-002 $typarr(67)% Czynnik w krzywiznie Efx podczas jazdyPKX1=+8.531E+001 $typarr(68)% Sztywność poślizgu podłużnego Kfx/Fz przy FznomPKX2=-2.025E+001 $typarr(69)% Zmienność sztywności poślizgu Kfx/Fz z obciążeniemPKX3=+5.000E-001 $typarr(70)% Wykładnik w sztywności poślizgu Kfx/Fz z obciążeniemPHX1=+0.000E+000 $typarr(71)% Przesunięcie poziome Shx przy FznomPHX2=+0.000E+000 $typarr(72)% Zmienność przesunięcia Shx z obciążeniemPVX1=+0.000E+000 $typarr(73)% Przesunięcie pionowe Svx/Fz przy FznomPVX2=+0.000E+000 $typarr(74)% Zmienność przesunięcia Svx/Fz z obciążeniem% Współczynniki - poślizg podłużny (poślizg łączony)RBX1=+2.372E+001 $typarr(75)% Czynnik nachylenia dla redukcji Fx poślizgu łączonegoRBX2=+2.597E+001 $typarr(76)% Zmienność nachylenia redukcji Fx z kappaRCX1=+7.495E-001 $typarr(77)% Czynnik kształtu dla redukcji Fx poślizgu łączonegoREX1=-4.759E-001 $typarr(82)% Czynnik krzywizny łączonego FxREX2=+8.109E-001 $typarr(83)% Czynnik krzywizny łączonego Fx z obciążeniemRHX1=+0.000E+000 $typarr(78)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonego
Współczynniki w płaszczyźnie poprzecznej opisują zachowanie opony podczas poślizgu poprzecznego, zarówno w stanie czystego poślizgu, jak i poślizgu łączonego.
[LATERAL_COEFFICIENTS]% Współczynniki - poślizg poprzeczny (poślizg czysty)PCY1=+1.725E+000 $typarr(91)% Współczynnik kształtu Cfx dla siły podłużnejPDY1=+2.733E+000 $typarr(92)% Tarcie podłużne Mux przy FznomPDY2=-6.022E-001 $typarr(93)% Zmienność tarcia Mux z obciążeniemPDY3=+4.007E+000 $typarr(94)% Zmienność tarcia Mux z pochyleniemPEY1=-5.000E-001 $typarr(95)% Krzywizna podłużna Efx przy FznomPEY2=-2.000E+000 $typarr(96)% Zmienność krzywizny Efx z obciążeniemPEY3=+2.260E-001 $typarr(97)% Zmienność krzywizny Efx z kwadratem obciążeniaPEY4=-3.367E-002 $typarr(98)% Czynnik w krzywiznie Efx podczas jazdyPKY1=-5.047E+001 $typarr(99)% Sztywność poślizgu podłużnego Kfx/Fz przy FznomPKY2=+1.923E+000 $typarr(100)% Zmienność sztywności poślizgu Kfx/Fz z obciążeniemPKY3=+2.877E-001 $typarr(101)% Wykładnik w sztywności poślizgu Kfx/Fz z obciążeniemPHY1=+0.000E+000 $typarr(102)% Przesunięcie poziome Shx przy FznomPHY2=+0.000E+000 $typarr(103)% Zmienność przesunięcia Shx z obciążeniemPHY3=-1.810E-002 $typarr(104)% Zmienność przesunięcia Shx z obciążeniemPVY1=+0.000E+000 $typarr(105)% Przesunięcie pionowe Svx/Fz przy FznomPVY2=+0.000E+000 $typarr(106)% Zmienność przesunięcia Svx/Fz z obciążeniemPVY3=-2.649E+000 $typarr(107)% Przesunięcie pionowe Svx/Fz przy FznomPVY4=-1.058E+000 $typarr(108)% Zmienność przesunięcia Svx/Fz z obciążeniem% Współczynniki - poślizg poprzeczny (poślizg łączony)RBY1=+2.033E+001 $typarr(109)% Czynnik nachylenia dla redukcji Fx poślizgu łączonegoRBY2=+8.152E+000 $typarr(110)% Zmienność nachylenia redukcji Fx z kappaRBY3=-1.243E-002 $typarr(111)% Zmienność nachylenia redukcji Fx z kappaRCY1=+9.317E-001 $typarr(112)% Czynnik kształtu dla redukcji Fx poślizgu łączonegoREY1=-3.982E-004 $typarr(113)% Czynnik krzywizny łączonego FxREY2=+3.077E-001 $typarr(114)% Czynnik krzywizny łączonego Fx z obciążeniemRHY1=+0.000E+000 $typarr(115)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoRHY2=+0.000E+000 $typarr(116)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoRVY1=+0.000E+000 $typarr(117)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoRVY2=+0.000E+000 $typarr(118)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoRVY3=+0.000E+000 $typarr(119)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoRVY4=+0.000E+000 $typarr(120)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoRVY5=+0.000E+000 $typarr(121)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoRVY6=+0.000E+000 $typarr(122)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoPTY1=+3.260e+000 $typarr(123)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonegoPTY2=+2.250e+000 $typarr(124)% Czynnik przesunięcia dla redukcji Fx poślizgu łączonego
SHXA = RHX1;
Ustawienie przesunięcia poziomego SHXA na wartość współczynnika RHX1, który opisuje przesunięcie poziome dla redukcji siły Fx przy poślizgu łączonym.
BXA = (RBX1 + RBX3 .* GAMMA^2) .* cos(atan(RBX2 .* KAPPA)) .* LXAL;
Obliczenie BXA, czynnika nachylenia dla redukcji siły Fx przy poślizgu łączonym, z uwzględnieniem kąta nachylenia GAMMA, poślizgu KAPPA oraz współczynnika skalowania LXAL, wpływającego na Fx zależnie od kąta alfa.
CXA = RCX1;
Ustawienie CXA na wartość współczynnika RCX1, który określa kształt funkcji redukcji siły Fx przy poślizgu łączonym.
EXA = REX1 + REX2 * DFZ;
Obliczenie EXA, czynnika krzywizny łączonego Fx, z uwzględnieniem zmiany obciążenia pionowego opony DFZ.
GXA0 = cos(CXA .* atan(BXA .* ALPHAS - EXA .* (BXA .* ALPHAS - atan(BXA .* ALPHAS))));
Obliczenie GXA0, pierwotnej wartości funkcji kształtu siły Fx, na podstawie skorygowanego kąta poślizgu ALPHAS, czynnika nachylenia BXA, kształtu funkcji CXA i czynnika krzywizny EXA.
GXA = GXA0 ./ cos(CXA .*atan(BXA .* SHXA - EXA .* (BXA .* SHXA - atan(BXA .* SHXA))));
Normalizacja GXA0 poprzez podzielenie przez wartość korygującą, aby uwzględnić przesunięcie poziome SHXA w obliczeniach, dając końcową wartość funkcji kształtu siły Fx GXA.
FX = FX0 .* GXA;
Obliczenie końcowej siły poślizgu podłużnego FX, mnożąc pierwotną siłę podłużną FX0 przez funkcję kształtu GXA.
SHX = (PHX1 + PHX2 .* DFZ) .* LHX;
Obliczenie przesunięcia poziomego SHX w oparciu o zmianę obciążenia pionowego DFZ i współczynnik skalowania LHX, uwzględniając podstawowe przesunięcie PHX1 i jego zmienność z DFZ (PHX2).
BYK = RBY1 .* cos(atan(RBY2 .* (ALPHA - RBY3))) .* LYKA;
Obliczenie współczynnika kształtu BYK dla bocznej siły poślizgu, uwzględniając kąt poślizgu ALPHA i współczynnik skalowania LYKA, który wpływa na relację między kątem poślizgu a siłą boczną.
CYK = RCY1;
Ustawienie wartości sztywności kształtu CYK na stałą RCY1.
EYK = REY1 + REY2 * DFZ;
Obliczenie czynnika krzywizny EYK w oparciu o zmianę obciążenia pionowego DFZ i stałe REY1 oraz REY2.
DYK = FY0 ./ (cos(CYK .* atan(BYK .* SHYK - EYK .* (BYK .* SHYK - atan(BYK .* SHYK)))));
Obliczenie siły podstawowej DYK dla bocznej siły poślizgu, korzystając z podstawowej wartości siły bocznej FY0 i korygując ją o czynniki kształtu BYK, sztywności CYK oraz krzywizny EYK.
DVYK = MUY .* Fz .* (RVY1 + RVY2 .* DFZ + RVY3 .* GAMMA) .* cos(atan(RVY4 .* ALPHA));
Obliczenie wartości pionowego przesunięcia DVYK na podstawie szczytowego współczynnika tarcia MUY, obciążenia pionowego Fz, zmiany obciążenia DFZ, kąta nachylenia GAMMA i kąta poślizgu ALPHA.
SVYK = DVYK .* sin(RVY5 .* atan(RVY6 .* KAPPA)) .* LVYKA;
Obliczenie dodatkowego składnika siły bocznej SVYK, który jest funkcją przesunięcia pionowego DVYK, poślizgu KAPPA oraz współczynnika skalowania LVYKA, wpływającego na siłę boczną indukowaną przez poślizg.
GYK0 = cos(CYK .* atan(BYK .* KAPPAS - EYK .* (BYK .* KAPPAS - atan(BYK .* KAPPAS))));
Obliczenie pierwotnej wartości funkcji kształtu siły bocznej GYK0, na podstawie korygowanego poślizgu KAPPAS, czynnika kształtu BYK, sztywności CYK oraz krzywizny EYK.
GYK = GYK0 ./ (cos(CYK .* atan(BYK .* SHYK - EYK .* (BYK .* SHYK - atan(BYK .* SHYK)))));
Normalizacja GYK0 przez podzielenie przez korektę, aby uwzględnić przesunięcie poziome SHYK w obliczeniach, dając końcową wartość funkcji kształtu siły bocznej GYK.
FY = FY0 .* GYK + SVYK;
Obliczenie końcowej bocznej siły poślizgu FY, mnożąc podstawową siłę boczną FY0 przez funkcję kształtu GYK i dodając składnik przesunięcia pionowego SVYK.
GAMMAY = GAMMA .* LGAY;
Dostosowuje kąt nachylenia (GAMMA) przez współczynnik skalowania (LGAY), aby uwzględnić wpływ nachylenia na generowanie siły bocznej.
ALPHAY = ALPHA + SHY;
Dostosowuje kąt poślizgu (ALPHA) o obliczone poziome przesunięcie (SHY), uwzględniając zmieniony efektywny kąt poślizgu ze względu na zmiany obciążenia i nachylenia.
CY = PCY1 .* LCY;
Określa współczynnik kształtu (CY) dla siły bocznej, uwzględniając podstawową wartość (PCY1) i współczynnik skalowania (LCY).
MUY = (PDY1 + PDY2 .* DFZ) .* (1 - PDY3 .* GAMMAY.^2) .* LMUY;
Oblicza szczytowy współczynnik tarcia (MUY) dla siły bocznej, uwzględniając zmianę obciążenia pionowego (DFZ), kwadrat kąta nachylenia (GAMMAY^2) i współczynnik skalowania LMUY.
DY = MUY .* Fz;
Oblicza podstawową siłę boczną (DY) poprzez pomnożenie szczytowego współczynnika tarcia (MUY) przez obciążenie pionowe (Fz).
EY = (PEY1 + PEY2 .* DFZ) .* (1 - (PEY3 + PEY4 .* GAMMAY) .* sign(ALPHAY)) .* LEY;
Określa czynnik krzywizny (EY) dla krzywej siły bocznej, biorąc pod uwagę zmianę obciążenia pionowego (DFZ), kąt nachylenia (GAMMAY), znak dostosowanego kąta poślizgu (ALPHAY) oraz współczynnik skalowania LEY.
BY = KY ./ (CY .* DY);
Określa współczynnik sztywności (BY) dla krzywej siły bocznej na podstawie sztywności przy skręcaniu (KY), współczynnika kształtu (CY) i podstawowej siły bocznej (DY).
SVY = Fz .* ((PVY1 + PVY2 .* DFZ) .* LVY + (PVY3 + PVY4 .* DFZ) .* GAMMAY) .* LMUY;
Oblicza pionowe przesunięcie (SVY) krzywej siły bocznej ze względu na zmianę obciążenia pionowego (DFZ), kąt nachylenia (GAMMAY) i współczynniki skalowania LVY i LMUY.
FY0 = DY .* sin(CY .* atan(BY .* ALPHAY - EY .* (BY .* ALPHAY - atan(BY .* ALPHAY)))) + SVY;
Oblicza początkową siłę boczną (FY0) jako sumę siły (DY) pomnożonej przez funkcję trygonometryczną, uwzględniającą współczynnik kształtu (CY), współczynnik sztywności (BY), dostosowany kąt poślizgu (ALPHAY), czynnik krzywizny (EY) oraz pionowe przesunięcie (SVY).
FY = FY0;
Przypisuje końcową wartość siły bocznej (FY) na podstawie obliczonej wartości początkowej (FY0).
Obliczanie sił poprzecznych
Plik calculateLatTireforces.m zawiera funkcję służącą do obliczania maksymalnych sił bocznych (poprzecznych), które mogą być przenoszone przez opony pojazdu. Stworzona przez Erica Dorniedena z zespołu Baltic Racing, funkcja ta jest chroniona prawami autorskimi tej organizacji z roku 2021.
Obliczanie sił
Funkcja calculateLatTireforces przyjmuje jako argumenty siły pionowe działające na poszczególne koła pojazdu (FWZ_vl, FWZ_vr, FWZ_hl, FWZ_hr), kąt nachylenia opony względem podłoża (GAMMA), parametry opony (TIRparam), a także początkowe kąty poślizgu dla opon przednich (alpha_f) i tylnych (alpha_r). Zwraca maksymalne siły boczne dla każdego koła (FWYmax_fl, FWYmax_fr, FWYmax_rl, FWYmax_rr), całkowite siły boczne dla osi przedniej i tylnej (FWYmax_f, FWYmax_r), oraz obliczone kąty poślizgu dla opon przednich i tylnych (alpha_f, alpha_r).
Główna funkcja
W zależności od liczby argumentów, funkcja używa dwóch różnych metod obliczania sił bocznych:
Dla ośmiu argumentów, obliczenia są bezpośrednie, wykorzystując funkcję MF52_Fy_cs do określenia maksymalnej siły bocznej dla każdej opony:
Gdy liczba argumentów jest mniejsza niż osiem, funkcja przeprowadza iteracyjne obliczenia dla zakresu kątów poślizgu od 0 do 12 stopni (co 0,025 stopnia), wybierając wartość maksymalną i odpowiadający jej kąt poślizgu dla każdej opony:
Na koniec, funkcja sumuje siły boczne dla opon położonych po tej samej stronie osi, aby uzyskać całkowitą siłę boczną, jaką może przenieść oś przednia i tylna:
FWYmax_f=FWYmax_fl+FWYmax_fr;% [N] Maksymalna siła boczna osi przedniej
Obliczanie sił wzdłużnych
Plik calculateLongiTireforces.m zawiera funkcję do obliczania maksymalnych sił podłużnych, które mogą być przenoszone przez opony pojazdu. Autorem kodu jest Eric Dornieden z zespołu Baltic Racing, a prawa autorskie należą do Baltic Racing z 2021 roku.
Główna Funkcja
Funkcja calculateLongiTireforces akceptuje jako argumenty wejściowe siły pionowe działające na każde koło pojazdu (FWZ_vl, FWZ_vr, FWZ_hl, FWZ_hr), kąt nachylenia opony (GAMMA), parametry opon (TIRparam) oraz kąty poślizgu dla opon przednich (alpha_f) i tylnych (alpha_r). Funkcja zwraca maksymalne siły podłużne dla każdej z opon (FWXmax_fl, FWXmax_fr, FWXmax_rl, FWXmax_rr) oraz sumaryczne maksymalne siły podłużne dla osi przedniej i tylnej (FWXmax_f, FWXmax_r).
Obliczanie Sił
Funkcja wykorzystuje różne metody obliczania maksymalnych sił podłużnych w zależności od liczby przekazanych argumentów:
Dla ośmiu argumentów funkcja bezpośrednio oblicza maksymalną siłę podłużną dla każdej opony, używając funkcji MF52_Fx_cs, która prawdopodobnie modeluje siły opon na podstawie danych takich jak kąt poślizgu, obciążenie pionowe, kąt przechylenia i parametry opony:
Gdy liczba argumentów jest inna, funkcja zakłada kąt poślizgu równy zero i oblicza maksymalne siły podłużne dla każdej opony w oparciu o ten założony kąt poślizgu:
Po obliczeniu maksymalnych sił podłużnych dla każdej opony, funkcja sumuje siły dla opon umieszczonych po tej samej stronie osi, aby określić całkowitą maksymalną siłę podłużną, którą może przenieść oś przednia i tylna:
FWXmax_f=FWXmax_fl+FWXmax_fr;% [N] Maksymalna siła podłużna osi przedniej
Obciążenie dynamiczne w kierunku poprzecznym
Funkcja calculateWheelloadLatDisp oblicza przemieszczenie obciążenia koła w kierunku poprzecznym. Jest to kluczowy element w obliczaniu przeniesienia obciążenia koła.
track_f, track_r: Szerokość toru przedniego i tylnego koła.
lr, lf: Odległość od tylnego i przedniego końca pojazdu do środka ciężkości.
wheelbase: Rozstaw osi pojazdu.
FVY: Siła boczna działająca na pojazd.
h_rc_f, h_rc_r: Wysokość środka ciężkości przedniego i tylnego zawieszenia.
Opis działania
Funkcja oblicza przeniesienie obciążenia koła w kierunku poprzecznym na podstawie różnych parametrów pojazdu i sił działających na pojazd. Obliczenia są wykonywane dla każdego koła pojazdu.
Przeniesienie obciążenia geometryczne:
dFWZfl_geometric=-lr/wheelbase*FVY*h_rc_f/track_f;% [N] Geometryczne przeniesienie obciążenia dla koła przedniego lewegodFWZfr_geometric=lr/wheelbase*FVY*h_rc_f/track_f;% [N] Geometryczne przeniesienie obciążenia dla koła przedniego prawegodFWZrl_geometric=-lf/wheelbase*FVY*h_rc_r/track_r;% [N] Geometryczne przeniesienie obciążenia dla koła tylnego lewegodFWZrr_geometric=lf/wheelbase*FVY*h_rc_r/track_r;% [N] Geometryczne przeniesienie obciążenia dla koła tylnego prawego
Przeniesienie obciążenia sprężyste:
dFWZfl_elastic=-lr/wheelbase*FVY*(h_COG-h_rc_f)/track_f;% [N] Elastyczne przeniesienie obciążenia dla koła przedniego lewegodFWZfr_elastic=lr/wheelbase*FVY*(h_COG-h_rc_f)/track_f;% [N] Elastyczne przeniesienie obciążenia dla koła przedniego prawegodFWZrl_elastic=-lf/wheelbase*FVY*(h_COG-h_rc_r)/track_r;% [N] Elastyczne przeniesienie obciążenia dla koła tylnego lewegodFWZrr_elastic=lf/wheelbase*FVY*(h_COG-h_rc_r)/track_r;% [N] Elastyczne przeniesienie obciążenia dla koła tylnego prawego
Dynamiczne przeniesienie obciążenia:
dFWZfl_y=dFWZfl_geometric+dFWZfl_elastic;% [N] Przeciążenie dynamiczne koła przedniego lewegodFWZfr_y=dFWZfr_geometric+dFWZfr_elastic;% [N] Przeciążenie dynamiczne koła przedniego prawegodFWZrl_y=dFWZrl_geometric+dFWZrl_elastic;% [N] Przeciążenie dynamiczne koła tylnego lewegodFWZrr_y=dFWZrr_geometric+dFWZrr_elastic;% [N] Przeciążenie dynamiczne koła tylnego prawego
Obciążenie dynamiczne w kierunku wzdłużnym
Funkcja calculateWheelloadLongDisp oblicza dynamiczne przemieszczenie obciążenia koła w kierunku podłużnym. Jest to kluczowy element w obliczaniu przeniesienia obciążenia koła.
Funkcja oblicza dynamiczne przeniesienie obciążenia koła w kierunku podłużnym na podstawie różnych parametrów pojazdu i sił działających na pojazd. Obliczenia są wykonywane dla każdego koła pojazdu.
dFWZfl_x=-m_ges*aVX*h_COG/wheelbase
Sztywność pionowa opony
Funkcja calculateVtirestiff oblicza pionową sztywność opony dla każdego z czterech kół pojazdu.
Argumenty funkcji
Funkcja przyjmuje następujące argumenty:
Fz: Wektor sił pionowych dla różnych warunków.
cZ_tire: Wektor sztywności opony dla różnych warunków.
FWZ_fl, FWZ_fr, FWZ_rl, FWZ_rr: Siły pionowe działające na przednie lewe, przednie prawe, tylne lewe i tylne prawe koło pojazdu.
Działanie funkcji
Funkcja interpoluje sztywność opony (cZ_tire) na podstawie siły pionowej (Fz) dla każdego koła pojazdu. Interpolacja jest liniowa i ekstrapolowana poza zakres wektora Fz, jeśli to konieczne.
Wyniki funkcji
Funkcja zwraca cztery wartości: cZ_fl, cZ_fr, cZ_rl, cZ_rr, które reprezentują sztywność opony dla przedniego lewego, przedniego prawego, tylnego lewego i tylnego prawego koła pojazdu.
Wyjaśnione są tutaj wszystkie parametry które ładowane są do klasy startingParameters, przekazywane dalej do funkcji simulationManager.m
Co się dzieje w ciele funkcji
Na początku otwierany jest interfejs wyboru pliku. Zastosowany jest filtr na rozszerzenie pliku .mat. Do zmiennej carDatafile jest załadowywana nazwa wybranego pliku, a do zmiennej path jego ścieżka (bez nazwy samego pliku).
Następnie do kolejnych zmiennych klasy startingParameters przypisywane są wartości pobrane z elementów interfejsu użytkownika (typu DropDown i CheckBox) i inne, jak przedstawiono poniżej:
Zmienna
Co jest do niej przypisywane
disciplineID
dyscyplina (z UI)
carDatafile
carDatafile
path
path
TrackFileName
nazwa pliku toru
brakeFunction
system hamulców (z UI)
logCellData
informacja czy cell data zapisywać do pliku z logami
debugMessages
informacja czy wypisywać logi do debugowania (z UI)
startingSpeed
prędkość startowa dla wybranego toru
numOfLaps
ilość okrążeń do przejechania dla wybranego toru
Debug
wartość “0”
Jeśli chcemy wyeksportować aplikację:
Zmienna
Co jest do niej przypisywane
processDataButtonHandle
przycisk rozpoczęcia symulacji
textAreaHandle
pole tekstowe w zakładce “How-to”
W przeciwnym razie do obu tych zmiennych przypisywane są wartości “0”.
Jeśli włączona jest analiza czułości:
Zmienna
Co jest do niej przypisywane
sensitivityID
co chcemy śledzić (z UI)
minValue
minimalna wartość
stepSize
rozmiar kroku
numSteps
ilość kroków symulacji
Wewnątrz tej funkcji warunkowej występuje druga; jeśli zaznaczony jest CheckBox włączający drugi zestaw elementów UI to wyżej wymienione zmienne (poza numSteps) zostają powielone i przypisane do nich zostają wartości z odpowiadających im elementów UI.
W przeciwnym razie, przypisywane są do nich domyślne wartości “0” oraz dla numSteps “1”, co się tyczy zarówno pierwszej jak i drugiej funkcji warunkowej.
Na samym końcu wywoływana jest funkcja simulationManager() z parametrem klasa startingParameters czyli z całym zestawem zmiennych.
13 - Pliki .mat i .csv
Pliki .mat i .csv nie zawierają skryptów, są to zbiory danych jako wyniki symulacji, dane do symulacji czy parametryczne opisy tras.
Data Inspector
Folder zawiera pliki .csv i .mat, które są wynikami przeprowadzonych symulacji bądź danymi na których twórcy wzorowali się tworząc własną symulację.
Każdy plik z danymi o trasie ma inną strukturę a z danych wynika, że są to dane telemetryczne pojazdów podczas przejazdu na danej trasie, znajdują się tam między innymi informacje o temperaturach, balansie hamulców czy przeciążeniach.
Logged Data
Najważniejszym do analizy plikiem jest loggedDataTest.csv lub jego wariant loggedData.csv. Zawierają one informacje o przejazdach pojazdu po nieokreślonej w pliku trasie, jednak w nich najlepiej można zaobserwować zmiany parametrów pojazdu w trakcie jazdy.
Struktura pliku loggedDataTest
Zdjęcie powyżej to fragment omawianego pliku, widać że są dane uzyskane z symulacji bądź zgrupowane dane z systemu telemetrycznego.
Trasy i przejazdy
Nurburgring.csv
Daytona.csv
Zdjęcia powyżej to przykady jak wygląda zbiór danych z przejazdu po trasie w przypadku pojazdów spoza klasy FORMULA STUDENT.
Dla przykładu plik Daytona.csv opisuje prędkości przejazdu po Daytonie przez Porsche 997. Kolejne kolumny pliku to prędkości notowane przez pojazd oraz przez GPS w różnych osiach, notowana jest także zmiana wysokości.
14 - oddziaływanie sił
działanie/obliczanie poszczególnych sił na pojazd
Wstęp
BrakeCalculation.mlx- opisywany plik, działanie poszczególnych funkcji
Działanie
Zmienne wyświetlane na samym początku.
g = 9.81; - Przyspieszenie ziemskie w m/s^2.
M = 282.283; - Masa pojazdu w kilogramach.
prozF = 0.42582; - Procentowa masa na przedniej osi.
prozR = 1 - prozF; - Procentowa masa na tylnej osi.
Z = 2.3; - Współczynnik przesterowania.
H = 250.338; - Wysokość środka ciężkości nad ziemią w milimetrach.
l = 1530; - Środkowa odległość osi w milimetrach.
lv = 878.488; - Odległość środka ciężkości pojazdu od tylnej osi w milimetrach.
lh = 651.512; - Odległość środka ciężkości pojazdu od przedniej osi w milimetrach.
MuR = 2.3; - Współczynnik tarcia hamulca.
drV = 428; - Średnica tarczy hamulcowej przedniej w milimetrach.
drH = 428; - Średnica tarczy hamulcowej tylnej w milimetrach.
v = 100; - Prędkość pojazdu w km/h.
dKv = 25; - Średnica tłoczka cylindra hamulcowego przedniego w milimetrach.
dKh = 25; - Średnica tłoczka cylindra hamulcowego tylnego w milimetrach.
diV = 199.742; - Średnica wewnętrzna tarczy hamulcowej przedniej w milimetrach.
daV = 148.742; - Średnica zewnętrzna tarczy hamulcowej przedniej w milimetrach.
diH = 147; - Średnica wewnętrzna tarczy hamulcowej tylnej w milimetrach.
daH = 200; - Średnica zewnętrzna tarczy hamulcowej tylnej w milimetrach.
MuBelag = 0.6; - Współczynnik tarcia klocków hamulcowych z tarczą.
X = H / l; - Współczynnik dynamicznego rozkładu masy pojazdu.
Funkcje z poszczególnymi zmiennymi oraz ich działanie.
Gesamtgewichtskraft(g, M) - Oblicza siłę ciężkości całego pojazdu.
BetaetigungskraftBremszylinder(bremsdruck, AZ) - Oblicza siłę działającą na cylindry hamulcowe.
15 - Presety
Folder Presets zawiera pliki z przykładowymi wartościami technicznymi bolidu, jak również środowiskowymi np. temperatura i ciśnienie powietrza. Poniżej zostały opisane poszczególne zmienne. Pliki: TY19_HighDownforce.mat, TY19_LowDownforce.mat, TY19_MedDownforce.mat, TY19_NoDownforce.mat, TY20_HighDownforce.mat, TY20_LowDownforce.mat, TY20_MedDownforce.mat, TY20_NoDownforce.mat, TY22_HighDownforce.mat, TY22_LowDownforce.mat, TY22_MedDownforce.mat, TY22_NoDownforce.mat, loadSetup.m
Definicje zmiennych
Zmienna
Definicja
m_ges
masa pojazdu
h_cog
wysokosc srodka ciezkosci
x_cog
srodek masy w osi X
x_va
polozenie przedniej osi
m_driver
masa kierowcy
h_cog_driver
wysokość środka ciężkości kierowcy
x_cog_driver
położenie środka ciężkości kierowcy w osi x
m_ballast
dociążenie kierowcy
h_cog_ballast
wysokość środka ciężkości dociążenia kierowcy
x_cog_ballast
położenie środka ciężkości dociążenia kierowcy
thetaV_X
nieuzywane?
thetaV_Y
nieuzywane?
thetaV_Z
nieuzywane?
wheelbase
rozstaw osi
track
nieuzywane?
J_Tire
nieuzywane?
p_Tire
cisnienie opon
LMUX
Longitudinal scaling factor
LMUY
Lateral scaling factor
k_R
uzyte: FR = k_R*FWZges; % [N] Rolling resistance
FB
wartosc startowa symulacji
camber
pochylenie kół
m_ph
rozlozenie masy
ptype
zmienna binarna uzywana jako warunek
p_max
maksymalna moc silnika
n_max
maksymalne obroty silnika
drivertrain_eff
sprawnosc ukladu napedowego
invertor_eff
sprawnosc falownika
z_chaindriver
rozmiar zebatki po stronie kol
z_sprocket
rozmiar zebatki po stronie silnika
trq_multiplier
nieuzywane?
engine_param
macierz parametrów silnika
num_motors
liczba silnikow
gearbox
zmienna do okreslenie czy jest wiecej niz jeden bieg
i_P
cos z przelozeniem?
i_param
macierz przełożeń dla kolejnych biegów
n_shift
obroty silnika przy ktorych nastepuje zmiana biegu na wyzszy
n_downshift
obroty silnika przy ktorych nastepuje zmiana biegu na nizszy
t_shift
czas zmiany biegu
c_w
wspolczynnik oporu powietrza
c_l
wspolczynnik oporu powietrza
A
powierzchnia przekroju bolidu???
downforce_data
nieuzywane?
downforce_multiplier
mnożnik sily dociskowej?
aero_pv
uzyte: dFWZrl_aero = Faero/2*aero_ph; % [N] Aerodynamic force on rear left wheel
DRS
czy DRS jest dostepny/wlaczony
c_d_DRS
wspolczynnik oporu powietrza z wlaczonym drs
c_l_DRS
wspolczynnik oporu powietrza z wlaczonym drs
ConstantDownforce
stala sily docisku
DRS_Radius
promien DRS?
V_i
napiecie baterii
Energy_i
nieuzywane?
nZellen_Parallel
liczba celi baterii polaczonych rownolegle?
nZellen_Reihe
liczba celi baterii polaczonych szeregowo?
capacity_cell
pojemnosc celi baterii
t_L
temperatura powietrza
p_L
cisnienie atmosferyczne
R_L
stala gazowa dla powietrza
g
przyspieszenie ziemskie
Porównanie wartości w poszczególnych plikach
W przygotowaniu
Ładowanie setupów do symulacji
Plik loadSetup.m w katalogu głównym odpowiada za załadowanie wszystkich tych parametrów do symulacji.
Prototyp funkcji
functionloadSetup(app, file)
Parametry
app: Obiekt aplikacji, do którego ładowane są parametry.
file: Ścieżka do pliku konfiguracyjnego .mat.
Działanie
Funkcja ładowania próbuje wczytać dane z pliku .mat i przypisuje je do właściwości obiektu app. Parametry są podzielone na kategorie takie jak szkielet, zawieszenie, napęd, aerodynamika, akumulator i warunki środowiskowe. Dodatkowo aplikacja sprawdza stan skrzyni biegów i zeruje jej przełożenia.
W razie wystąpienia błędu podczas ładowania, funkcja zapisuje komunikat o błędzie do pliku dziennika.
Zastosowanie
Funkcja jest wywoływana z obiektem aplikacji i ścieżką do pliku konfiguracyjnego, inicjując aplikację z załadowanymi ustawieniami pojazdu.
16 - Wykresy sił na oponach
Opis skryptów badających siły przenoszone przez opony w zależności od poślizgu korzystając z paretrów opon Continental FormulaStudent 205 407 R13 65kPa
Wstęp
Realizacja wykresów opisujących zachowanie opon odbywa się za pomocą plików Conti_Tire_Plots_Lateral.m i Conti_Tire_Plots_Longitudinal.m opisujących siły w kierunku poprzedznym i wzdłużnym. Obydwa skrypty są bardzo podobne, jednakże znajdują się tam różnice w danych charakterystyczne dla opisywanego kierunku sił.
Analiza w kierunku poprzecznym
Zmienne:
Rys.1 Zmienne dla pliku …Lateral.m
ALPHA: Jest to kąt poślizgu bocznego w stopniach. Kąt poślizgu bocznego jest to kąt między kierunkiem jazdy a kierunkiem, w którym opona jest skierowana.
GAMMA: Jest to kąt pochylenia w stopniach. Kąt pochylenia jest to kąt, pod którym opona jest pochylona względem pionu.
KAPPA: Jest to poślizg opony. Poślizg opony jest to różnica między prędkością obrotową opony a prędkością pojazdu.
FileNameLocation: Jest to ścieżka do pliku Tir. Plik Tir zawiera wszystkie parametry opony, które są potrzebne do modelowania jej zachowania.
TIRparam: Jest to struktura zawierająca parametry opony. Parametry te są wczytywane z pliku Tir.
Fz_r: Jest to obciążenie koła z tyłu w pozycji statycznej. Obciążenie to jest mierzone w niutonach.
Fy: Jest to przenoszona siła koła. Siła ta jest obliczana na podstawie parametrów opony i warunków jazdy.
Funkcje:
Rys.2 Funkcje dla pliku …Lateral.m
loadTIR: Jest to funkcja, która wczytuje plik Tir do struktury. Plik Tir zawiera wszystkie parametry opony, które są potrzebne do modelowania jej zachowania.
MF52_Fy_cs: Jest to funkcja, która oblicza przenoszoną siłę koła. Funkcja ta oblicza siłę na podstawie parametrów opony i warunków jazdy.
Analiza w kierunku wzdłużnym
Funkcje i zmienne niewymienione poniżej są analogiczne jak opisane powyżej.
Zmienne:
Rys.3 Zmienne dla pliku …Longitudinal.m
ALPHA: Kąt poślizgu bocznego w stopniach.
GAMMA: Kąt pochylenia w stopniach.
KAPPA: Poślizg opony.
FileNameLocation: Ścieżka do pliku Tir.
TIRparam: Struktura zawierająca parametry opony.
Fz_r: Obciążenie koła z tyłu w pozycji statycznej.
Fy / Fx: Przenoszona siła koła (boczna / podłużna).
Funkcje:
Rys.4 Funkcje dla pliku …Longitudinal.m
loadTIR: Wczytuje plik Tir do struktury.
MF52_Fy_cs / MF52_Fx_cs: Oblicza przenoszoną siłę koła (boczną / podłużną).
Wykresy:
Pierwszy skrypt generuje wykres siły bocznej w zależności od kąta poślizgu bocznego i poślizgu podłużnego.
Rys.5 Wykres rysowany przez plik …Longitudinal.m
Drugi skrypt generuje wykres siły podłużnej w zależności od poślizgu opony i kąta poślizgu bocznego.
Rys.6 Wykres rysowany przez plik …Longitudinal.m
Problemy:
Ze względu na brak kompletnych informacji na temat wielu zmiennych z pliku .tir opisującego parametry badanej opony na ten moment nie wiemy, jak zmieniane w obydwu skryptach parametry wpływają na wynik symulacji.
17 - catstruct.m
catstruct.m - łączenie struktur w jedną
Wstęp
Ta funkcja z pliku catstruct.m służy w skrócie do łączenia wielu struktur w jedną.
Działanie funkcji
narginchk() jest wykorzystwane do sprawdzenia czy ilość argumentów przesłanych do aktualnie wykonującej się funkcji mieści się w zadanym zakresie. Jeśli tak jest to nargin nic nie robi, natomiast jeśli liczba tych argumentów wyjdzie poza któryś z limitów to nargin wyrzuci błąd. W naszym przypadku ilość argumentów przesłanych do funkcji musi wynosić co najmniej 1. Zaraz potem do N jest przypisane nargin, które to zwraca ich ilość.
rys. 1
isstruct(A) zwraca prawdę jeśli A jest strukturą lub fałsz jeśli A strukturą nie jest.
varargin zwraca ciąg 1xN, gdzie N to ilość inputów przesłanych do wykonywanej funkcji, lub zwraca pusty ciąg jeśli nie przesłano żadnego. Więc wraz z negacją ~ sprawdzamy tak naprawdę czy przesłano jakieś argumenty (o ile dobrze rozumiem, bo nigdzie znalazłem czegoś o varargin{end}, który przechowuje wartość ostaniej komórki ciągu). Jeśli nie to a, natomiast jeśli tak to b:
a - przejście do warunku 2.
b - sorted = 0
isequal porównuje dwa lub więcej wartości/ciągi i jeśli są sobie równe to zwraca true lub fałsz jeżeli równe nie są. Tak więc sprawdzamy czy varargin{end} ma wartość ‘sorted’. Jeśli tak to a, jeśli nie to b:
a - narginchk() opisany jest wyżej. Podany zakres jest od 2 do infinity, a więc muszą być conajmniej dwa inputy przesłane do funkcji, aby narginchk nie wyrzucił błędu. Reszta jak na załączonym obrazku rys. 1., gdzie N to ilość tych inputów
b - wyrzucony zostaje błąd o podanej treści
sz0 = [] będzie później wykorzystywany do sprawdzenia czy wszystkie inputy mają taki sam rozmiar
NonEmptyInputs = false(N,1) oraz NonEmptyInputsN = 0 użyte będzie później do oceny stanu inputów
FN = cell(N,1) oraz VAL = cell(N,1) wykorzystywane do zbierania nazw oraz inputów
18 - Logi
writeToLogfile(text, Debug, textAreaHandle) - Opisane tu jest w jaki sposób zapisywane i wypisywane są logi
Wstęp
Opisane tu jest w jaki sposób zapisywane i wypisywane są logi.
Poniższy obrazek prezentuje cały kod pliku writeToLogfile.m
Działanie funkcji writeToLogfile(text, Debug, textAreaHandle)
Najpierw za pomocą funkcji fopen(filename,permission) otwierany jest plik o nazwie ErrorLog.txt podanej w pierwszym parametrze, a jako drugi parametr podawany jest rodzaj dostępu do pliku - a - oznaczający otworzenie lub utworzenie pliku do zapisu oraz dodanie tekstu na koniec pliku.
Pierwsza funkcja warunkowa sprawdza czy plik został poprawnie otworzony. Jeśli fid jest równy -1, co oznacza, że funkcja fopen nie mogła otworzyć pliku, to fukncja error(msg) wyrzuca i wyświetla błąd o treści zdefiniowanej w parametrze msg
Funkcja fprintf(fileID,formatSpec,A1,...,An) i jej parametry:
parametr
zmienna
co przechowuje
fileID
fid
identyfikator wcześniej otworzonego pliku
formatSpec
‘%s: %s\n’
format tekstu - “A1: A2nowa linia”
A1
datestr(now, 0)
aktualny czas w formacie ‘dd-mmm-yyyy HH:MM:SS’
A2
text
tekst, który chcemy zapisać w pliku; parametr text funkcji writeToLogfile
Funkcja fclose zamyka plik.
Druga funkcja warunkowa sprawdza czy nargin (ilość parametrów podanych przy wywołaniu funkcji) jest równe 3 oraz Debug (parametr funkcji writeToLogfile) jest true.
Jeśli oba te warunki zostaną spełnione to w elemencie GUI textArea (ten w zakładce How-to) zostanie dopisana linia “loaded Track!" na jego końcu.
19 - Renderowanie Trasy
renderSelectedTrack.m - renderowanie wybranej trasy
Wstęp
renderSelectedTrack.m - renderowanie wybranej trasy
Tracks.Data
Tracks.Data to, jak widać na załączonym obrazku, matryca wypełniona pewnymi wartościami. Na niej opiera się cały plik renderSelectedTrack.m
Kolumna 1 - nazwa trasy
Kolumna 2 - długość trasy
Kolumna 3 - ???
Kolumna 4 - wartość określająca czy na trasie jest podział dyscyplin
Kolumna 5 - liczba okrążeń
Kolumna 6 - prędkość startowa
Kolumna 7 - nazwa pliku trasy
Deklaracja zmiennych
Pobierana jest nazwa pliku z nazwą toru z listy rozwijanej DropDown (tej z zakładki Simulation Setup, z sekcji Scenario, podpisanej jako Track).
Za pomocą funkcji load(filename,variables) ładowana jest wybrana trasa z podaną nazwą trasy.
Do x_Track_preview i y_Track_preview przypisywane są odpowiednio koordynaty x i y trasy przyjmując za jednostkę metry.
s_preview to przebieg długości trasy.
TrackName to nazwa trasy pobrana z wcześniej wspomnianej listy TrackDropDown (zakładka Simulation Setup => sekcja Scenario => Track).
Zmienna
Co przechowuje
x_Track_preview
koordynaty x trasy w [m]
y_Track_preview
koordynaty y trasy w [m]
s_preview
przebieg długości trasy
TrackName
nazwa trasy pobrana z wcześniej wspomnianej listy TrackDropDown (zakładka Simulation Setup => sekcja Scenario => Track)
app.StartingSpeed
prędkość startowa dla danej trasy, konwertując ją ze stringa na zmienną typu double
app.numOfLaps
ilość okrążeń dla danej trasy, konwertując ją ze stringa na zmienną typu double
Funkcje warunkowe
W pierwszym warunku po przekonwertowaniu zmiennej typu string na double sprawdzane jest czy na wybranej trasie są w ogóle dyscypliny. Jeśli tak to app.DisciplineDropDown zostaje włączony. W przeciwnym wypadku zostaje wyłączony.
Następnie ustawiany jest motyw kolorystyczny w zależności czy zaznaczony został odpowiedni checkbox - app.DarkModeCheckBox.
dopisać
Czwarta funkcja warunkowa zawsze się wykona bo tak zostało zapisane w kodzie (DrawApexes ustawione na 1 czyli na true - ergo - warunek zawsze prawdziwy).
Funkcja hold z drugim parametrem “on” ustawia podany w pierszym parametrze wykres na niepoddający się wymazywaniu istniejących linii przy rysowaniu nowych.
Zmienna ApexIndizes to kurwa co to nwm pózniej dopisze bo psycha siada
Funkcja scatter , gdzie:
Parametr
Czym jest
app.UIAxes2
docelowy element
x_Track_preview(ApexIndizes)
objaśniona wcześniej zmienna
y_Track_preview(ApexIndizes)
objaśniona wcześniej zmienna
20
pole powierzchni znaczników (w jednostce points)
‘r’
kolor - red (czerwony)
‘filled’
opcja do wypełnienia środka markerów
Przez app.UIAxes2.reset resetowany jest graficzny elementu app.UIAxes2.
Funkcja title(target,titletext,Name,Value) zatytułowuje wykres, gdzie:
Parametr
Czym jest
target
element docelowy (tutaj app.UIAzes2)
titletext
nazwa toru podawana przez zmienną TrackName
Name
nazwa atrybutu (tutaj rozmiar czcionki)
Value
wartość atrybutu
Oraz ustawiana jest grubość jego linii i kolory zależne od wybranego motywu.
app.LengthLabel.Text = "Track Length: " + max(s_preview) + " m" ustawia tekst labela w kącie wykresu na pokazany tutaj tekst, gdzie max(s_preview) to maksymalna wartość z ciągu s_preview. W praktyce przedstawia on długość trasy.
20 - TirFiles
updateTirFiles.m - Wypełnienie wybranej listy rozwijanej dropDown plikami .tir
Wstęp
Funkcja zapełnia podany w parametrze dropDown element GUI typu dropDown listą plików o rozszerzeniu .tir z podanej lokalizacji i jej podfolderów.
Nazwa zmiennej
Co przechowuje
folderPath
ścieżka do plików .tir
fileList
lista wszystkich plików o .tir w lokalizacji folderPath i jej podfolderach
fileNames
lista nazw wszystkich plików z fileList
dropDown.Items
itemy elementu dropDown podanego przy wywołaniu funkcji updateTirFiles wypełnione listą fileNames
W praktyce funkcja ta jest wykorzystywana jeden raz w pliku Suspension.mlapp i dotyczy tylko elementu app.TIRFileDropDown, w zakładce General, podpisanego jako TIR File.