AEP Gruppe B2: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 7: Zeile 7:
== Software ==
== Software ==
Programmiert wurde der NXT mithilfe von Matlab 2014a 32-Bit und [[RWTH_Aachen_Toolbox_meets_NXT]].
Programmiert wurde der NXT mithilfe von Matlab 2014a 32-Bit und [[RWTH_Aachen_Toolbox_meets_NXT]].
 
== Konzept ==
== Quellcode ==
[[Datei:AEP Gruppe B2 UML.jpg|750px]]
== Quellcode (Auszug)==
<syntaxhighlight lang="matlab" style="background-color: #EFF1C1; font-size:larger">  
<syntaxhighlight lang="matlab" style="background-color: #EFF1C1; font-size:larger">  
 
Parameter eingeben
  %% Alles reseten zum Start
  COM_CloseNXT all
  clear all
  close all
  %% USB Verbindung herstellen
  handle = COM_OpenNXT();
  COM_SetDefaultNXT(handle);
  %% Ports
  nGyroPort = SENSOR_2;
  %% Init Gyro
  OpenGyro(nGyroPort);
  %% Parameter eingeben
   power = 50;
   power = 50;
   durchmesser = 0.056; %im Meter
   durchmesser = 0.056; %im Meter
Zeile 32: Zeile 21:
   StreckeVorfahren = 0.1; % 10 cm vorfahren
   StreckeVorfahren = 0.1; % 10 cm vorfahren
   grad  = round(strecke/radumfang * 360);      %2046 ;    % 2046,28 Grad(errechnet durch den Radumfang) entspricht 1m
   grad  = round(strecke/radumfang * 360);      %2046 ;    % 2046,28 Grad(errechnet durch den Radumfang) entspricht 1m
  %% Motorfunktionen  
Motorfunktionen  
   motorA = NXTMotor(MOTOR_A, 'Power',  power, 'TachoLimit', 0,'SmoothStart', true); %% Unendlich lange fahren
   motorA = NXTMotor(MOTOR_A, 'Power',  power, 'TachoLimit', 0,'SmoothStart', true); %% Unendlich lange fahren
   motorC = NXTMotor(MOTOR_C,'HoldBrake');  
   motorC = NXTMotor(MOTOR_C,'HoldBrake');  
   motorA.SendToNXT();
   motorA.SendToNXT();
   motorC.SendToNXT();
   motorC.SendToNXT();
  %% Set up ports
Motor vorbereiten
  CloseSensor(SENSOR_4);
  OpenUltrasonic(SENSOR_4);
  %% Motor vorbereiten
   bParklueckeGefunden = false;
   bParklueckeGefunden = false;
   XStart =0;
   XStart =0;
  %% Parlücke suchen
Parlücke suchen
   while(bParklueckeGefunden == false)
   while(bParklueckeGefunden == false)
    %% Messwerte holen
Messwerte holen
    distance = GetUltrasonic(SENSOR_4); % in cm
    data = motorA.ReadFromNXT();
    XAktuell = data.TachoCount*radumfang/360; % Aktuelle Distanz in m
     if (distance < 15) % Parklücke besetzt
     if (distance < 15) % Parklücke besetzt
        XStart = XAktuell;
     else
     else
         % Parklücke frei
         % Parklücke frei
        LueckenLaenge = XAktuell-XStart;
        disp([num2str(LueckenLaenge),'m >',num2str(luecke),'m'])
         if LueckenLaenge > luecke
         if LueckenLaenge > luecke
            % Luecke gefunden
            motorA.Stop('off');
             bParklueckeGefunden = true;           
             bParklueckeGefunden = true;           
         end
         end
     end
     end
   end
   end
  % 10 cm vorfahren
10 cm vorfahren
   motorA = NXTMotor(MOTOR_A, 'Power',  power, 'TachoLimit', round(StreckeVorfahren/radumfang * 360)); %% Unendlich lange fahren
   motorA = NXTMotor(MOTOR_A, 'Power',  power, 'TachoLimit', round(StreckeVorfahren/radumfang * 360)); %% Unendlich lange fahren
   motorA.SendToNXT();
   motorA.SendToNXT();
   motorA.WaitFor();      
   motorA.WaitFor();  
  %% Einparken State Machine
Einparken State Machine
  % Gyro reset -> Winkel = 0
Gyro reset -> Winkel = 0
   CalibrateGyro(nGyroPort, 'AUTO');
   CalibrateGyro(nGyroPort, 'AUTO');
   pause(1) % NICHT BEWEGEN
   pause(1) % NICHT BEWEGEN
  % Erst jetzt wieder Motor an!!!!
 
Erst jetzt wieder Motor an!!!!
   nState = 1;
   nState = 1;
   bEinparkenErfolgreich = false;
   bEinparkenErfolgreich = false;
  Gierrate = 0;
  GierWinkel =0;
  tic
  tAlt=0; % Init Stoppuhr
                motorA = NXTMotor(MOTOR_A, 'Power',  -power * 0.7, 'TachoLimit', 0,'SmoothStart', true); %% Unendlich lange fahren
                motorA.SendToNXT();
  motorC = NXTMotor(MOTOR_C, 'Power',  -20, 'TachoLimit', 40); %% Unendlich lange lenken
  motorC.SendToNXT();
   while(bEinparkenErfolgreich==false)
   while(bEinparkenErfolgreich==false)
    %% Gyro auslesen
    Gierrate = GetGyro(nGyroPort);
    tNeu = toc;
    dt = tNeu -tAlt; % Zeit seit letztem Durchgang
    GierWinkel = GierWinkel + Gierrate*dt; % in deg
     switch nState
     switch nState
         case 1
         case 1
            disp(['1: ',num2str(GierWinkel),' < -40'])
            if (GierWinkel< -36)
               
                motorC = NXTMotor(MOTOR_C, 'Power',  20, 'TachoLimit', 80); %% Unendlich lange lenken
                motorC.SendToNXT();
                 nState = 2;
                 nState = 2;
            end;
 
           
         case 2
         case 2
            disp(['2: ',num2str(GierWinkel),' >0'])
            if (GierWinkel > - 18)
               
                motorA.Stop('off');
                motorC.Stop('off');
                motorC = NXTMotor(MOTOR_C, 'Power',  -40);%, 'TachoLimit', 20); %% Unendlich lange lenken
                motorC.SendToNXT();
                %motorA.WaitFor();
                motorA = NXTMotor(MOTOR_A, 'Power',  20,  'TachoLimit', 175); %% Vorwärts fahren
                %TachoLimit = 1000;
                motorA.SendToNXT();
               
                motorA.WaitFor(); 
               
                 nState = 3;
                 nState = 3;
               
            end;
     
         case 3
         case 3
         
                 nState = 4;
            data=motorA.ReadFromNXT();
            disp(['3: ',num2str(data.TachoLimit),' > 300'])
            if (data.TachoLimit >= 10000)
                  
                % MOTORE STOPPEN
                motorA.Stop('off');
                motorC.Stop('off');
                %nState = 4;
         
            end;
          nState = 4;
         case 4
         case 4
            motorA.Stop('off');
            motorC.Stop('off');
             NXT_PlayTone(440, 100); % Fanfare
             NXT_PlayTone(440, 100); % Fanfare
             bEinparkenErfolgreich = true;% Parkvorgang abgeschlossen       
             bEinparkenErfolgreich = true;% Parkvorgang abgeschlossen       
     end
     end
    tAlt = tNeu; % Zeit merken;
   end;   
   end;   
  %% Alles aufräumen
  CloseSensor(SENSOR_4);
  CloseSensor(nGyroPort);
  motorA.Stop('off');
  motorC.Stop('off');%wegen 'Hold Brake'
  COM_CloseNXT(handle);
</syntaxhighlight>
</syntaxhighlight>



Version vom 19. Juni 2014, 11:02 Uhr

Fahrzeug Gruppe B2

Im SoSe14 wurde im Rahmen des Informatikpraktikums II die Aufgabe gestellt, ein autonom einparkendes Fahrzeug zu entwickeln. Als Grundlage diente ein Lego_Mindstorms_NXT. Entwickelt wurde dieses Fahrzeug von Dominik Bräker, Nina Gorski und Sebastian Henneböhl.

Aufbau

Seitenansicht

Bauplan

Hier ist der Bauplan für den LEGO Digital Designer zu finden. Datei:AEP Gruppe B2.lxf.zip

Software

Programmiert wurde der NXT mithilfe von Matlab 2014a 32-Bit und RWTH_Aachen_Toolbox_meets_NXT.

Konzept

Quellcode (Auszug)

 
Parameter eingeben
  power = 50;
  durchmesser = 0.056; %im Meter
  radumfang = durchmesser * pi;
  fahrzeuglaenge = 0.32; %in m
  luecke = fahrzeuglaenge * 1.3; %1,5 fache größe des fahrzeugs
  lueckegrad = round(luecke/radumfang * 360); 
  strecke = 1; %in m
  StreckeVorfahren = 0.1; % 10 cm vorfahren
  grad  = round(strecke/radumfang * 360);       %2046 ;    % 2046,28 Grad(errechnet durch den Radumfang) entspricht 1m
Motorfunktionen 
  motorA = NXTMotor(MOTOR_A, 'Power',  power, 'TachoLimit', 0,'SmoothStart', true); %% Unendlich lange fahren
  motorC = NXTMotor(MOTOR_C,'HoldBrake'); 
  motorA.SendToNXT();
  motorC.SendToNXT();
Motor vorbereiten
  bParklueckeGefunden = false;
  XStart =0;
Parlücke suchen
  while(bParklueckeGefunden == false)
Messwerte holen
    if (distance < 15) % Parklücke besetzt
    else
        % Parklücke frei
        if LueckenLaenge > luecke
            bParklueckeGefunden = true;          
        end
    end
  end
10 cm vorfahren
  motorA = NXTMotor(MOTOR_A, 'Power',  power, 'TachoLimit', round(StreckeVorfahren/radumfang * 360)); %% Unendlich lange fahren
  motorA.SendToNXT();
  motorA.WaitFor(); 
Einparken State Machine
Gyro reset -> Winkel = 0
  CalibrateGyro(nGyroPort, 'AUTO');
  pause(1) % NICHT BEWEGEN

Erst jetzt wieder Motor an!!!!
  nState = 1;
  bEinparkenErfolgreich = false;
  while(bEinparkenErfolgreich==false)
    switch nState
        case 1
                nState = 2;
        case 2
                nState = 3;
        case 3
                nState = 4;
        case 4
            NXT_PlayTone(440, 100); % Fanfare
            bEinparkenErfolgreich = true;% Parkvorgang abgeschlossen       
    end
  end;


--Ulrich Schneider (Diskussion) 08:31, 19. Jun. 2014 (CEST)

Tipps:

  • Quellcode absetzen (s.o.)
  • Inhalt ist übnersichtlich
  • Teammitglieder auf USER-Seite verlinken
  • Veröffentlichen Sie nicht den Quelltext, sondern das Konzept und die PAP. Sonst kopieren in einem Jahr alle Studierenden Ihren Quelltext.



→ zurück zum Hauptartikel: Informatikpraktikum 2 - SoSe14