Fahrzeugsoftware: Unterschied zwischen den Versionen
Zeile 201: | Zeile 201: | ||
==== param_BSF.m ==== | ==== param_BSF.m ==== | ||
==== param_CAR.m ==== | ==== param_CAR.m ==== | ||
==== | ==== param_ESM_offline.m ==== | ||
==== param_OSE.m ==== | ==== param_OSE.m ==== | ||
==== param_SAB.m ==== | ==== param_SAB.m ==== |
Version vom 1. Februar 2014, 13:54 Uhr
Zur groben Übersicht ein eventueller Leitfaden!!!!
Allgemeines
Das Projekt "Autonom fahredes Fahrzeug für den Carolo Cup" ist ausschlißlich in MATLAB 2013a / Simulink (für AEP, BSF, Längs- und Querregelung) und Visual Studio (Spurtracking mit Kamera, Objekterkennung mit Laserscanner und Kamera) programmiert.
Zu beachten ist dabei, dass keine MATLAB 2012a und MATLAB 2013a Skripte gemischt werden dürfen. Es muss eine einheitliche Programmierung in der gleichen Version erfolgen! Sollte also eine neue Version MATLAB 2014a auf dem Markt erscheinen, muss darauf geachtet werden, alle einzelnen Skripte und Bibliotheken auf diese Version zu aktualisieren.
Es bestehen zwei Simulinkmodelle, die je nach Auswahl in der Hauptdatei "start.m" ausgeführt werden. Zum Einen gibt es den Offline-Betrieb, welcher zur Simulation der einzelnen Funktion zur Verfügung steht, um Fehler in der Programmierung schnellstmöglich beheben zu können. Zum Anderen existiert der Online-Betrieb, welcher mit den realen Rückgabewerten der am Fahrzeug verbauten Sensoren arbeitet und den Motor und die Servolenkung über PWM-Signale ansteuert.
- Aufruf unter SVN/.../start.m mit MATLAB 2013a (32 bit)
Das Hauptprogramm, worin alle Bibliotheken und Parameter geladen werden, ist die Datei "start.m".
Matlabskripte
Hauptdatei start.m
Die Datei "start.m" ist diejenige Datei, in der zu Beginn entschieden wird, in welchen Modi das Simulink geöffnet werden soll. Dabei kann zu Beginn zwischen dem Online- und Offline-Betrieb gewählt werden.
%% Auswahl des Simulationstyps %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Schalter "Simulation". % 0: Modell für die dSPACE-Karte % 1: Simulation offline Schalter_offline = 1;
Im Anschluss wird die Wahl getroffen, welche Aktion das Fahrzeug durchführen soll. Die Variable "Simulinkmodus" wird im späteren Verlauf dafür verwendet, die passenden Parameter für die entsprechende Durchführung zu laden.
%% Auswahl des Simulinkmodus %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1: BSF (Bahn und Spurführung) % 2: AEP (Einparkmodus: Lücke suchen, vermessen und anschließend anhalten) % 3: AEP (Einparkmodus: Lücke suchen, vermessen und einparken) Simulinkmodus = 3;
In der Regel wird von den einzelnen Funktion die Geschwindigkeit und der Lenkwinkel selbst bestimmt. Dennoch gibt es die Möglichkeit, die Werte manuell zu bestimmen. Dafür muss der Variablen Lw_Vw_Manuell der Wert 1 zugewiesen werden und im Anschluss die Gewünschte Geschwindigkeit in Metern pro Sekunde und der Lenkwinkel in Radiant eingegeben werden.
%% Quelle für Solllenkwinkel und Sollgeschwindigkeit %%%%%%%%%%%%%%%%%%%% % 0: Automatisch % 1: manuelle Vorgabe (Werte s. u. beim Fahrmanöver) Lw_Vx_Manuell = 0; % Bei Wahl der manuellen Vorgaben PAR_Famo_VxSollManuell_f64 = 0.5; % Sollgeschwindigkeit [m/s] PAR_Famo_LwSollManuell_f64 = 2 * pi/180; % Solllenkwinkel [rad]
Für den Fall der Wahl des Einparkmodus besteht die Möglichkeit, die parkenden Fahrzeuge in der Parkbucht per Zufall setzen zu lassen, oder für schnelles Testen die größte Parklücke direkt nach dem ersten parkenden Fahrzeug zu positionieren (siehe param_Sen_offline.m).
%% Im Fall AEP: Positionswahl der Objekte %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1: Positionierung zufällig % 0: Positionierung vorgegeben (größte Lücke vorne) global PAR_Modi_Schalter_Luecke_int PAR_Modi_Schalter_Luecke_int = 0;
Im darauf folgenden Schritt wird die Basisschrittweiter der Simulation bestimmt. Dabei ist darauf zu achte, dass die Bahn- und Spurführung keine größere Schrittweite als 0,005s besitzen darf, da sonst die Querregelung instabil wird. Die Einparksimulation hingegen wird deutlich langsamer bei einer so geringen Schrittweite. Daher ist für diese der Wert 0,02s gewählt worden. Die Variable "T" wird im Offline-Simulinkmodell für die einzustellende Schrittweite verwendet.
%% Basisschrittweite [s] switch Schalter_offline case 1 T = 0.005; % Basisschrittweite [s] offline: Regelung BSF mit T = 0,02 instabil! if Simulinkmodus == 3 || Simulinkmodus == 2 T = 0.02; % Basisschrittweite [s] end case 0 T = 0.005; % Basisschrittweite [s] online end
Abschließend mit Auswahlmöglichkeit für den Benutzer ist Wahl der Simulationsdarstellung für den Offline-Betrieb zu nennen. Es gibt einerseits die Möglichkeit, sich die gesamte Draufsicht von Fahrspur und Fahrzeug (eventuell auch Parkbucht mit parkenden Fahrzeugen) anzeigen zu lassen, andereseits kann man sich auch nur die Fahrspur plotten lassen. Der Wert 1 bedeutet jeweils die Aktivierung der Plots.
%% Simulations Darstellungen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Darstellung der Draufsicht während der Simulation? % 0: Aus % 1: Ein PAR_Darstellung_Schalter_EIN_bit = 1; % Darstellung der Fahrspur während der Simulation? % 0: Aus % 1: Ein PAR_Darstellung_Fahrspur_Schalter_EIN_bit = 0;
Sind die gewünschten Einstellungen getroffen, so folgt alles weitere automatisch der Betätigung des Play-Buttons in MATLAB. Je nach ausgewähltem Modus und gewünschter Simulation oder Betrieb auf dem Fahrzeug werden nachfolgend erläuterte notwendige Variablen definiert (Beispiel: Wahl des Modus 1 => Bahn- und Spurführung; kurz: BSF): Für die Simulation der Bahn- und Spurführung wird der Variablen Simulinkmodus der Wert 1 zugewiesen. Durch eine Switch-Case-Abfrage wird zu Beginn das Einspurmodell aktiviert, die Abstandssensorik Ausgeschaltet (nicht benötigt), der Kamerasensor eingeschaltet (Spurdetektion) und die Startposition im Plot bestimmt (x und y Position). Die Sartausrichtung soll bei 0° liegen. Durch eine weitere Fallunterscheidung wird betrachtet, ob der Benutzer den Solllenkwinkel und die Sollgeschwindigkeit manuell eingegeben hat oder automatisch ermitteln lassen möchte. Zu guter letzt wird der dem Modus entsprechenden Taster, falls es sich um eine Offline-Simulation handeln soll, mit "wahr" (boolean(1)) belegt, wohin gegen die restlichen Taster "falsch" zugewiesen bekommen (boolean(0)).
switch Simulinkmodus case 1 % BSF PAR_SimSchalter_ESM_Kinematikmodell = 1; % Einspurmodell PAR_SenAbs_Schalter_EIN_bit = 0; % Abstandssensorik Aus PAR_SenKam_Schalter_EIN_bit = 1; % Kamerasensor PAR_Esm_x0_I_f64 = 8; % Startposition in x_I PAR_Esm_y0_I_f64 = -10; % Startposition in y_I PAR_Esm_psi0_I_f64 = 0 * pi/180; % Startausrichtung zu x_I switch Lw_Vx_Manuell case 0 PAR_Modi_Schalter_Lw_int = 1; % Quelle für den Solllenkwinkel aus BSF Funktion PAR_Modi_Schalter_Vx_int = 1; % Quelle für den Sollgeschwindigkeit aus BSF Funktion case 1 PAR_Modi_Schalter_Lw_int = 3; % manuelle Vorgabe für den Solllenkwinkel PAR_Modi_Schalter_Vx_int = 3; % manuelle Vorgabe für den Sollgeschwindigkeit end if Schalter_offline == 1 PAR_SenTast_AEP_bit = boolean(0); PAR_SenTast_BSF_Rundk_bit = boolean(1); PAR_SenTast_BSF_RundkHindernis_bit = boolean(0); PAR_SenTast_reserve_bit = boolean(0); end case 2 % AEP (Lücke suchen, vermessen und anschließend anhalten) PAR_SenAbs_Schalter_EIN_bit = 1; % Abstandssensorik Ein PAR_SimSchalter_ESM_Kinematikmodell = 2; % 2: für Kinematikmodell (einfaches Modell zum Einparken!) PAR_AEP_Measure_or_Park = 1; % Vermessen und anhalten wenn die vermessene Lücke groß genug ist PAR_SenKam_Schalter_EIN_bit = 0; % Kamerasensor Aus (Alle Ausgänge = 0) PAR_Esm_x0_I_f64 = -9.58; % Startposition in x_I PAR_Esm_y0_I_f64 = -10; % Startposition in y_I PAR_Esm_psi0_I_f64 = 0 * pi/180; % Startausrichtung zu x_I switch Lw_Vx_Manuell case 0 PAR_Modi_Schalter_Lw_int = 2; % Quelle für den Sollllenkwinkel aus AEP Funktion PAR_Modi_Schalter_Vx_int = 2; % Quelle für den Sollgeschwindigkeit aus AEP Funktion case 1 PAR_Modi_Schalter_Lw_int = 3; % manuelle Vorgabe für den Sollllenkwinkel PAR_Modi_Schalter_Vx_int = 3; % manuelle Vorgabe für den Sollgeschwindigkeit end if Schalter_offline == 1 PAR_SenTast_AEP_bit = boolean(1); PAR_SenTast_BSF_Rundk_bit = boolean(0); PAR_SenTast_BSF_RundkHindernis_bit = boolean(0); PAR_SenTast_reserve_bit = boolean(0); else PAR_SenTast_AEP_bit = boolean(0); end case 3 % AEP (Lücke suchen, vermessen und einparken) PAR_SenAbs_Schalter_EIN_bit = 1; % Abstandssensorik Ein PAR_SimSchalter_ESM_Kinematikmodell = 2; % für Kinematikmodell (einfaches Modell zum Einparken!) PAR_AEP_Measure_or_Park = 2; % Vermessen, Parken, Korrekturzug, Anhalten PAR_SenKam_Schalter_EIN_bit = 0; % Kamerasensor Aus (Alle Ausgänge = 0) PAR_Esm_x0_I_f64 = -9.58; % Startposition in x_I PAR_Esm_y0_I_f64 = -10; % Startposition in y_I PAR_Esm_psi0_I_f64 = 0 * pi/180; % Startausrichtung zu x_I switch Lw_Vx_Manuell case 0 PAR_Modi_Schalter_Lw_int = 2; % Quelle für den Sollllenkwinkel aus AEP Funktion PAR_Modi_Schalter_Vx_int = 2; % Quelle für den Sollgeschwindigkeit aus AEP Funktion case 1 PAR_Modi_Schalter_Lw_int = 3; % manuelle Vorgabe für den Sollllenkwinkel PAR_Modi_Schalter_Vx_int = 3; % manuelle Vorgabe für den Sollgeschwindigkeit end if Schalter_offline == 1 PAR_SenTast_AEP_bit = boolean(1); PAR_SenTast_BSF_Rundk_bit = boolean(0); PAR_SenTast_BSF_RundkHindernis_bit = boolean(0); PAR_SenTast_reserve_bit = boolean(0); else PAR_SenTast_AEP_bit = boolean(0); end end
Nach diesen Zuordnungen werden dem Skript Pfade hinzugefügt und notwendige Parameter geladen.
%% Pfade setzen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% addpath(genpath('bibliotheken')) addpath(genpath('darstellung')) addpath(genpath('funktionen')) addpath(genpath('parameter')) %% Parameter laden %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% param_CAR param_AEP param_BSF param_OSE param_SAB switch Schalter_offline case 1 param_AKT_offline param_SEN_offline param_ESM_offline case 0 param_AKT_online param_SEN_online end
Abschließend wird das Offline- oder Online-Simulinkmodell geöffent und ein Text als Zeichen der Fertigstellung des Modells im Command Window von MATLAB angezeigt.
%% Modell öffnen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% switch Schalter_offline case 1 open('CCF_offline'); case 0 open('CCF_online'); end % Meldung anzeigen fprintf('%s: Parameter geladen. Öffne das Modell....\n', mfilename)
Parameterdateien
param_AEP.m
param_AKT_offline.m
param_AKT_online.m
param_BSF.m
param_CAR.m
param_ESM_offline.m
param_OSE.m
param_SAB.m
param_SEN_offline.m
param_SEN_online.m
Bibliotheken
bib_AutonomesEinparken.mdl
bib_BahnPlanungSpurfuehrung.mdl
bib_Einspurmodell_offline.mdl
bib_Fahrtmodus.mdl
bib_Kinematikmodell_offline.mdl
bib_ObjektSpurErkennung.mdl
bib_Sensoren_Aktoren_offline.mdl
bib_Sensoren_Aktoren_online.mdl
bib_SerCom
bib_Signalaufbereitung
Darstellungen
plot_nach_Einparksimulation.m
plot_nach_Simulation.m
plot_nach_Simulation_BSF.m
plot_nach_Simulation_sollgewschw.m
Funktionen
fahrbahn.m
fahrzeug.m
funktion_kameramodell.m
funktion_simulink_bus_add_to_workspace.m
funktion_simulink_simultan.m
funktion_simulink_simultan_draufsicht.m
funktion_simulink_simultan_Fahrspur.m
parkObjekt.m
Simulinkmodell
Offline-Betrieb zur Simulation
-> laden von CCF_offline
Sensorsimulierung
Kinematikmodell
Aktuatorsimulierung
Online-Betrieb auf dem Fahrzeug
-> Laden von CCF online
ControlDesk
Simulinkmodell einbinden
- in Simulink strg+b zum Builden - in ControlDesk Reloade /Rebuilden(Refresh?)
Layouts
Sensorinbetriebnahme
- Taster - Gyro, Hall, Infrarot
Modus überwachung
- In welchem Modus befinde ich mich? Was ist alles aktiv, was nicht?
Aufnahmen
- Wie nehme ich Sensorsignale in ControlDesk auf?