Projekt 02: Lego Mindstorms EV3 Segway: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(41 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:Projekte]]
[[Datei:Segway.jpg|250px|thumb|right|LEGO EV3 Segway]]
[[Datei:Segway.jpg|250px|thumb|right|LEGO EV3 Segway]]
'''Aufgabenstellung:'''
'''Aufgabenstellung:'''
Zeile 6: Zeile 7:
Das Projekt wurde von [http://193.175.248.56/wiki/index.php/Benutzer:Andre_Heuken André Heuken] und [http://193.175.248.56/wiki/index.php/Benutzer:Carsten_Pawliczek Carsten Pawliczek] im Rahmen des Elektrotechnik Fachpraktikums im WS 2013/14 bearbeitet. Zusätzlich zu diesem Artikel befinden sich weitere Dateien, wie zum Beispiel die Segway-Bauanleitung und vollständiger Programmcode, im SVN.
Das Projekt wurde von [http://193.175.248.56/wiki/index.php/Benutzer:Andre_Heuken André Heuken] und [http://193.175.248.56/wiki/index.php/Benutzer:Carsten_Pawliczek Carsten Pawliczek] im Rahmen des Elektrotechnik Fachpraktikums im WS 2013/14 bearbeitet. Zusätzlich zu diesem Artikel befinden sich weitere Dateien, wie zum Beispiel die Segway-Bauanleitung und vollständiger Programmcode, im SVN.


== Auswahl des passenden Reglers für einen Segway ==
== Auswahl des passenden Reglers für einen Segway ==  
Da es sich bei dem Segway um ein [http://de.wikipedia.org/wiki/Inverses_Pendel inverses Pendel] handelt, welches eine [http://de.wikipedia.org/wiki/Kritischer_Punkt_%28Dynamik%29 instabile Ruhelage] besitzt, muss der Regler ein PT2-Verhalten aufweisen. Mit einem Regler erster Ordnung (PT1) kann eine instabile Ruhelage nicht aufrecht erhalten werden.  
Bei einem Segway handelt es sich um ein [http://de.wikipedia.org/wiki/Inverses_Pendel inverses Pendel], welches eine [http://de.wikipedia.org/wiki/Kritischer_Punkt_%28Dynamik%29 instabile Ruhelage] besitzt. Mit einem Regler erster Ordnung (PT1) kann eine instabile Ruhelage nicht aufrecht erhalten werden. Es ist ein Regler 2. Ordnung nötig.
Nach Recherche haben wir uns für die Umsetzung des Segways mit einem PID-Regler entschieden. Dies ist ein stetiger Regler, dessen Stellwert jeden beliebigen Wert innerhalb eines Stellbereichs annehmen kann. Dieser regelt schnell und lässt keine bleibende Regelabweichung zu.[[Datei:Regler.pdf]]
Nach Recherche haben wir uns für die Umsetzung des Segways mit einem PID-Regler entschieden. Dies ist ein stetiger Regler, dessen Stellwert jeden beliebigen Wert innerhalb eines Stellbereichs annehmen kann. Dieser regelt schnell und lässt keine bleibende Regelabweichung zu. Dabei wirkt der P-Anteil als einfache Verstärkung der Regeldifferenz auf die Stellgröße ein. Der I-Anteil sorgt durch die zeitliche Integration der Regelabweichung dafür, dass die Regelabweichung auf Null kommt. Der D-Anteil reagiert auf die Änderungsgeschwindigkeit der Winkelbeschleunigung und erzeugt dadurch bei kleiner Regeldifferenz große Stellamplituden. Durch das Ermitteln der Reglerparametern für den P-, I- und D-Anteil durch ausprobieren lässt sich somit ein Regler entwerfen, der die benötigten Anforderungen erfüllt. Quellen: [[Datei:Regler.pdf]] sowie die Dokumentation über einen [http://ornella.iwr.uni-heidelberg.de/ROBOTICSLAB/ROBPROJECTS/COMPLETED/INV_PENDEL_SS10/files/dokumentation.pdf Regler eines inversen Pendels, Seite 10]


 
== Umbau eines Beschleunigungssensors für EV3/NXT ==
 
== Umbau eines BMA020 Sensors für EV3/NXT ==
Nach unserer Recherche haben wir uns aufgrund der guten Dokumentation auf der Seite  
Nach unserer Recherche haben wir uns aufgrund der guten Dokumentation auf der Seite  
von [http://www.stefanfrings.de/mindstorms/ Stefan Frings] für den Umbau eines Bosch BMA020 Beschleunigungssensors entschieden. Dieser Sensor ist aufgrund der Referenz Erdanziehungskraft außerdem in der Lage, den Neigungswinkel zu messen.
von [http://www.stefanfrings.de/mindstorms/ Stefan Frings] für den Umbau eines Bosch BMA020 Beschleunigungssensors entschieden. Dieser Sensor ist aufgrund der Referenz Erdanziehungskraft außerdem in der Lage, den Neigungswinkel zu messen. Da die Beschleunigung des Segways im Vergleich zur Erdanziehungskraft relativ klein ist und die Beschleunigung des Segways durch die Raddrehzahl von der Änderung der Beschleunigung des Sensors abgezogen werden kann, ist es möglich, einen Beschleunigungssensor als Neigungswinkelsensor in einem Segway verwenden.
[[Datei:Sensorori.jpg|100px|thumb|right|Sensor vor dem Umbau]]  
[[Datei:NeuS1.jpg|100px|thumb|right|Sensor mit abgelöteten Widerständen und Transistoren]]  
[[Datei:Sensor.jpg|100px|thumb|right|Sensor mit passender LEGO-Buchse]]
[[Datei:NeuS2.jpg|100px|thumb|right|Sensor mit passender LEGO-Buchse]]
Abweichend vor der Anleitung von Stefan Frings haben wir uns dafür entschieden, den Sensor an eine LEGO-Buchse zu löten, damit dieser frei platzierbar ist und nicht an ein Kabel mit beschränkter Länge gebunden ist.
Abweichend vor der Anleitung von Stefan Frings haben wir uns dafür entschieden, den Sensor an eine LEGO-Buchse zu löten, damit dieser frei platzierbar ist und nicht an ein Kabel mit beschränkter Länge gebunden ist.


== Ansteuerung des EV3 über MATLAB/Simulink ==  
== Ansteuerung des EV3 über MATLAB/Simulink ==  
=== Vorbereitungen mittels QUT-Toolkit und Kompilierer ===
=== Vorbereitungen mittels QUT-Toolkit und Kompilierer ===
Für die Kommunikation haben wir uns an die Anleitung der Queensland University of Technology, kurz QUT, gehalten, welche als Erste eine Kommunikation zwischen dem EV3 und MATLAB herstellen kann [[https://wiki.qut.edu.au/display/cyphy/QUT+EV3+MATLAB+toolkit QUT]].
Für die Kommunikation haben wir uns an die Anleitung der [http://www.qut.edu.au/ Queensland University of Technology], kurz QUT, gehalten, welche als Erste eine Kommunikation zwischen dem EV3 und [http://www.mathworks.de/matlabcentral/ MATLAB] herstellen kann [[https://wiki.qut.edu.au/display/cyphy/QUT+EV3+MATLAB+toolkit QUT]].
Wichtig hierbei ist die Neukompilierung mittels Visual Studio von 32bit auf 64bit der dort hochgeladenen <code>hidapi.dll</code>-Datei für 32bit-Systeme, auch wenn dort steht, dass dies nur bei 32bit-Systemen nötig sei. Dies ist nicht der Fall und führt ansonsten nicht zum Ziel. Das Toolkit muss, wie in MATLAB üblich, über '''Set Path''' eingebunden werden. Nachfolgend wird über den MATLAB-Befehl <code>mex -setup</code> ein passender Kompilierer ausgewählt, z.B. Visual Studio 2010 oder der frei verfügbare Windows SDK [[http://www.microsoft.com/en-us/download/details.aspx?id=8279 SDK-Download]]. Letzterer wurde von uns verwendet.
Wichtig hierbei ist die Neukompilierung mittels Visual Studio von 32bit auf 64bit der dort hochgeladenen <code>hidapi.dll</code>-Datei für 32bit-Systeme, auch wenn dort steht, dass dies nur bei 32bit-Systemen nötig sei. Die funktionierende <code>dll</code>-Datei liegt in unserem SVN-Ordner. Das Toolkit muss, wie in MATLAB üblich, über '''Set Path''' eingebunden werden. Nachfolgend wird über den MATLAB-Befehl <code>mex -setup</code> ein passender Kompilierer ausgewählt, z.B. Visual Studio 2010 oder der frei verfügbare Windows SDK [[http://www.microsoft.com/en-us/download/details.aspx?id=8279 SDK-Download]]. Letzterer wurde von uns verwendet.
 


=== Verbindungsaufbau zwischen MATLAB und EV3 ===
=== Verbindungsaufbau zwischen MATLAB und EV3 ===
Zum momentanen Zeitpunkt ist noch keine Kommunikation zwischen Simulink und dem EV3 möglich, da noch keine passende Toolbox vorhanden ist.
Zwischen Dezember 2013 und Januar 2014 war noch keine Kommunikation zwischen Simulink und dem EV3 möglich, da noch keine passende Toolbox vorhanden war.
Die Verbindung kann im Anschluss an die Vorbereitungen über <code>b = Brick('ioType','usb')</code> hergestellt werden. Danach sollte im Workspace die Variable <code>b</code> vorhanden sein und die Größe <code>1x1 Brick</code> haben. Der Verbindungsaufbau hat in unserem 2-Mann-Team allerdings trotz gleicher MATLAB-Version (2013a, 64bit) und selbem Betriebssystem (Windows 7, 64bit) nur auf einem Laptop funktioniert.
Die Verbindung kann im Anschluss an die Vorbereitungen über <code>b = Brick('ioType','usb')</code> hergestellt werden. Danach sollte im Workspace die Variable <code>b</code> vorhanden sein und die Größe <code>1x1 Brick</code> haben. Der Verbindungsaufbau hat in unserem 2-Mann-Team allerdings trotz gleicher MATLAB-Version (2013a, 64bit) und selbem Betriebssystem (Windows 7, 64bit) nur auf einem Laptop funktioniert.  


== Programmierung des Segways ==
== Programmierung des Segways ==
Da wir leider in unserem Projekt für längere Zeit keine Kommunikation mit dem EV3 herstellen konnten (basierend auf oben genannten Schwierigkeiten und Unklarheiten der Dokumentationen der QUT) ist unser Programm beschränkt auf die generelle Kommunikation zum EV3 und ledigliches Prinzipverhalten eines Segways, d.h. Gegensteuern bei Neigung in die eine oder andere Richtung. Aufgrund der Zeitnot durch die Kommunikationsschwierigkeiten stellt unser Programm einen Ansatz dar, der noch weiter ausgebaut werden müsste.
Da wir leider in unserem Projekt für längere Zeit keine Kommunikation mit dem EV3 herstellen konnten (basierend auf oben genannten Schwierigkeiten und Unklarheiten der Dokumentationen der QUT) ist unser Programm beschränkt auf die generelle Kommunikation zum EV3 und ledigliches Prinzipverhalten eines Segways, d.h. Gegensteuern bei Neigung in die eine oder andere Richtung. Aufgrund der Zeitnot durch die Kommunikationsschwierigkeiten stellt unser Programm einen '''Ansatz''' dar, der noch weiter ausgebaut werden müsste. Aus selbem Grund beinhaltet unser Ansatz noch keinen I-Anteil, der in einem PID-Regler typischerweise vorhanden sein müsste.
=== Programmcode ===
=== Programmcode ===
Eine Zusammenfassung der von uns verwendeten Befehle findet sich auf einer separaten [http://193.175.248.56/wiki/index.php/Lego_Mindstorms_EV3#EV3_Befehle_für_MATLAB Seite] wieder.
<code>
%% Verbindung aufbauen
disp('Connecting ... ')
b = Brick('ioType','usb');
b.beep();
disp('Connected')
%% Variablen initialisieren
t = 0;
kp = 0.5;
kd = 2;
motorPower = 0;
PAnteil = 0;
DAnteil = 0;
%% Motorpower festlegen und starten
b.outputPower(0,Device.MotorA+Device.MotorB,motorPower)
b.outputStart(0,Device.MotorA+Device.MotorB)
pause(0.1);                            % ohne Pause vor der Sensorabfrage entsteht ein NaN-Fehler
reading = b.inputReadSI(0,0,0);        % liest den (LEGO-)Gyrosensor auf Port 1 aus: b.inputReadSI(Ebene, Port, Modus);
pause(0.1);
reading = b.inputReadSI(0,0,0);        % doppelt hält besser, ansonsten entsteht ebenfalls oft ein NaN-Fehler
pause(0.1);
%% Hauptprogramm
  while(true)
  while(true)
     PAnteil = b.inputReadSI(0,0,0);    % Absoluter Winkel
     PAnteil = b.inputReadSI(0,0,0);    % Absoluter Winkel nach obigem Schema
    pause(0.1);       % Pause, da der Sensor nicht schnell genug auf die Abfrage reagiert
    PAnteil = b.inputReadSI(0,0,0)      % Wiederholung da der erste Aufruf NaN-Fehler erzeugt
     pause(0.1);
     pause(0.1);
     DAnteil = b.inputReadSI(0,0,1);    % Winkelgeschwindigkeit in deg/s
     PAnteil = b.inputReadSI(0,0,0);    % Wiederholung da der erste Aufruf NaN-Fehler erzeugt
     pause(0.1);
     pause(0.1);
     DAnteil = b.inputReadSI(0,0,1)     % Wiederholung da der erste Aufruf NaN-Fehler erzeugt
     DAnteil = b.inputReadSI(0,0,1);    % Winkelgeschwindigkeit in deg/s, immernoch auf Port 1 des EV3
     pause(0.1);
     pause(0.1);
      
     DAnteil = b.inputReadSI(0,0,1);     
     if PAnteil < reading   % wenn aktueller Winkel < initialisierter, senkrechter Winkel
    pause(0.1);   
             motorPower = (kp*PAnteil + kd*DAnteil);   % motorPower setzt sich zusammen, kp = 2, kd = 1
     if PAnteil < reading   % Wenn der aktuelle Winkel kleiner ist als der beim Initialisieren => Kippgefahr
             b.outputPower(0,Device.MotorA+Device.MotorB,motorPower); % Motoren bekommen die zuvor berechnete Motorpower
             motorPower = (kp*PAnteil + kd*DAnteil);           % b.inputReadSI(0,0,0) + 10;
             b.outputPower(0,Device.MotorA+Device.MotorB,motorPower);
             pause(0.0001);
             pause(0.0001);
     else PAnteil > reading % analog für den Fall, dass aktueller Winkel > initialisierter, senkrechter Winkel
     else PAnteil > reading % Kippgefahr in andere Richtung
             motorPower = -(kp*PAnteil + kd*DAnteil);           % motorPower mit negativem Vorzeichen
             motorPower = -(kp*PAnteil + kd*DAnteil);           % b.inputReadSI(0,0,0) - 10;
             b.outputPower(0,Device.MotorA+Device.MotorB,motorPower);
             b.outputPower(0,Device.MotorA+Device.MotorB,motorPower);
             pause(0.0001);
             pause(0.0001);
     end
     end
  end
  end
%% Motoren stoppen, Variablen löschen
b.outputStop(0,Device.MotorA+Device.MotorB,0)
delete(b)</code>
== Lessons learned - ein kleines Fazit & ZIP-Datei ==
In unserem Projekt konnten wir sehr gut unser bisher erlerntes Wissen über die Mess- und Regelungstechnik anwenden. Dies half uns bei der Wahl des passenden Regelkreises sowie bei der Wahl des Sensors, auch wenn wir aufgrund der Probleme mit MATLAB und EV3 nicht mehr zur Implementierung des eigenen Sensors gekommen sind, da die Implementierung das Schreiben eines passenden Treibers erfordert hätte. Aus selbem Grund war die Umsetzung der Ansteuerung per LEGO-App nicht mehr möglich. Wir haben gelernt, in zukünftigen Projekten frühzeitiger bei entstehenden Problemen zu Handeln.
Eine zip-Datei mit allen Projektunterlagen kann [http://www.file-upload.net/download-8550583/02_Segway.zip.html hier] heruntergeladen werden.


== Verbesserungsvorschläge zum Artikel ==
[[Benutzer:Ulrich Schneider|Ulrich Schneider]] ([[Benutzer Diskussion:Ulrich Schneider|Diskussion]]) 10:28, 24. Jan. 2014 (CET)
* Welche Regelstrecke haben Sie identifiziert? Wie sind Sie dabei vorgegangen? Welche Reglerparameter hat Ihr Regler? Wie haben Sie diese ermittelt? Eine fachliche Herleitung wäre wünschenswert. Wieso muss er Regler "ein PT2-Verhalten aufweisen"? Nennen Sie die Quellen Ihrer Recherche.
* Es ist unklar, wie Sie mit einem Beschleunigungssensor die Lage des Legway regeln wollen. Legen Sie Ihre Ansätze bitte deutlich dar.
* Link auf QUT Homepage und Matlab Central wäre wünscheswert.
* "Zum momentanen Zeitpunkt" ist eine zeitlich inkonkrete Aussage. Publizieren Sie bitte die dll, die funktioniert.
* Fotos sollten besser aufgelöst und besser beleuchtet sein. Schaltplan des Sensors fehlt.
* Der Quelltext ist nicht hilfreich, da Sie Ihre Konfiguration nicht beschrieben haben. Welcher Sensor ist an welchem Port? Wieso gibt der Sensor den P- und D-Anteil des Reglers aus? Sie schreiben oben von einem PID-Regler. Wo wird der I-Anteil berechnet.
* Quellenangaben fehlen
* Die geforderte ZIP Datei fehlt und somit fast sämmtliche für die Projektlösung geforderten Unterlagen.


== Kleine Sammlung an EV3-Befehlen ==
Eine Bibliothek über die MATLAB-Befehle für die Kommunikation zum EV3 ist derzeit noch nicht verfügbar, so dass wir uns die Befehle für die Ansteuerung aus den Beispielen der QUT-Seite raussuchen mussten. Nachfolgend ein paar Beispiele:
* <code>disp ('Text')</code> Zeigt <code>Text</code> auf dem Bildschirm des Bricks an
* <code>b.beep()</code> lässt den Brick ein Geräusch machen, hilfreich z.B. nach dem Verbindungsaufbau im Code
* <code>motorpower = 0</code> sollte in jedem Programm, in dem Motoren verwendet werden, zu Beginn stehen
* <code>b.outputPower(0,Device.MotorA+Device.MotorB,motorPower)</code> weist den Motoren auf den Kanälen A und B auf layer 0 die zuvor initialisierte motorPower zu, startet diese jedoch noch nicht
* <code>b.outputStart(0,Device.MotorA+Device.MotorB)</code> startet die Motoren auf den Kanälen A und B
* <code>reading = b.inputReadSI(0,0,0)</code> liest Sensoren aus. In der Klammer steht die erste Null für den layer, die Zweite für den Anschluss (beginnt bei 0) und die Dritte für den Modus. Der Gyrosensor hat hier z.B. die Möglichkeit, im Modus 0 den derzeitigen Winkel und im Modus 1 eine Winkelgeschwindigkeit zu liefern.
* <code>pause(0.1)</code> mussten wir überall zwischen den Sensorabfragen einbinden, da wir ansonsten einen NaN-Fehler erhalten haben
* <code>b.outputStop(0,Device.MotorA+Device.MotorB,0);</code> stoppt die zuvor verwendeten Motoren auf den Kanälen A und B


== Lessons learned - ein kleines Fazit ==
[[Benuzter:Mirekgoebel|Prof. Dr. Mirek Göbel]] am 31.01.2014:
In unserem Projekt konnten wir sehr gut unser bisher erlerntes Wissen über die Mess- und Regelungstechnik anwenden. Dies half uns bei der Wahl des passenden Regelkreises sowie bei der Wahl des Sensors, auch wenn wir aufgrund der Probleme mit MATLAB und EV3 nicht mehr zur Implementierung des eigenen Sensors gekommen sind, da die Implementierung das Schreiben eines passenden Treibers erfordert hätte. Aus selbem Grund war die Umsetzung der Ansteuerung per LEGO-App nicht mehr möglich. Wir haben gelernt, in zukünftigen Projekten frühzeitiger bei entstehenden Problemen zu Handeln.
* Wieso kann ein PID-Regler ohne Regelabweichung regeln? Das hängt von der Regelstrecke ab!
* Wie können die Regelparameter noch ermittelt werden! Teilen Sie Ihr Wissen auch anderen mit!
* Details über den EV3 bitte in einen eigenen Artikel auslagern "Lego Mindstorms EV3" und dort dann auch Tipps zu den Befehlen geben

Aktuelle Version vom 8. Oktober 2014, 09:17 Uhr

LEGO EV3 Segway

Aufgabenstellung:

  • Bauen eines Segways mit dem EV3
  • Verwendung eines selbst gewählten Low-Cost-Gyrosensors
  • Steuerbar über die LEGO-App

Das Projekt wurde von André Heuken und Carsten Pawliczek im Rahmen des Elektrotechnik Fachpraktikums im WS 2013/14 bearbeitet. Zusätzlich zu diesem Artikel befinden sich weitere Dateien, wie zum Beispiel die Segway-Bauanleitung und vollständiger Programmcode, im SVN.

Auswahl des passenden Reglers für einen Segway

Bei einem Segway handelt es sich um ein inverses Pendel, welches eine instabile Ruhelage besitzt. Mit einem Regler erster Ordnung (PT1) kann eine instabile Ruhelage nicht aufrecht erhalten werden. Es ist ein Regler 2. Ordnung nötig. Nach Recherche haben wir uns für die Umsetzung des Segways mit einem PID-Regler entschieden. Dies ist ein stetiger Regler, dessen Stellwert jeden beliebigen Wert innerhalb eines Stellbereichs annehmen kann. Dieser regelt schnell und lässt keine bleibende Regelabweichung zu. Dabei wirkt der P-Anteil als einfache Verstärkung der Regeldifferenz auf die Stellgröße ein. Der I-Anteil sorgt durch die zeitliche Integration der Regelabweichung dafür, dass die Regelabweichung auf Null kommt. Der D-Anteil reagiert auf die Änderungsgeschwindigkeit der Winkelbeschleunigung und erzeugt dadurch bei kleiner Regeldifferenz große Stellamplituden. Durch das Ermitteln der Reglerparametern für den P-, I- und D-Anteil durch ausprobieren lässt sich somit ein Regler entwerfen, der die benötigten Anforderungen erfüllt. Quellen: Datei:Regler.pdf sowie die Dokumentation über einen Regler eines inversen Pendels, Seite 10

Umbau eines Beschleunigungssensors für EV3/NXT

Nach unserer Recherche haben wir uns aufgrund der guten Dokumentation auf der Seite von Stefan Frings für den Umbau eines Bosch BMA020 Beschleunigungssensors entschieden. Dieser Sensor ist aufgrund der Referenz Erdanziehungskraft außerdem in der Lage, den Neigungswinkel zu messen. Da die Beschleunigung des Segways im Vergleich zur Erdanziehungskraft relativ klein ist und die Beschleunigung des Segways durch die Raddrehzahl von der Änderung der Beschleunigung des Sensors abgezogen werden kann, ist es möglich, einen Beschleunigungssensor als Neigungswinkelsensor in einem Segway verwenden.

Sensor mit abgelöteten Widerständen und Transistoren
Sensor mit passender LEGO-Buchse

Abweichend vor der Anleitung von Stefan Frings haben wir uns dafür entschieden, den Sensor an eine LEGO-Buchse zu löten, damit dieser frei platzierbar ist und nicht an ein Kabel mit beschränkter Länge gebunden ist.

Ansteuerung des EV3 über MATLAB/Simulink

Vorbereitungen mittels QUT-Toolkit und Kompilierer

Für die Kommunikation haben wir uns an die Anleitung der Queensland University of Technology, kurz QUT, gehalten, welche als Erste eine Kommunikation zwischen dem EV3 und MATLAB herstellen kann [QUT]. Wichtig hierbei ist die Neukompilierung mittels Visual Studio von 32bit auf 64bit der dort hochgeladenen hidapi.dll-Datei für 32bit-Systeme, auch wenn dort steht, dass dies nur bei 32bit-Systemen nötig sei. Die funktionierende dll-Datei liegt in unserem SVN-Ordner. Das Toolkit muss, wie in MATLAB üblich, über Set Path eingebunden werden. Nachfolgend wird über den MATLAB-Befehl mex -setup ein passender Kompilierer ausgewählt, z.B. Visual Studio 2010 oder der frei verfügbare Windows SDK [SDK-Download]. Letzterer wurde von uns verwendet.


Verbindungsaufbau zwischen MATLAB und EV3

Zwischen Dezember 2013 und Januar 2014 war noch keine Kommunikation zwischen Simulink und dem EV3 möglich, da noch keine passende Toolbox vorhanden war. Die Verbindung kann im Anschluss an die Vorbereitungen über b = Brick('ioType','usb') hergestellt werden. Danach sollte im Workspace die Variable b vorhanden sein und die Größe 1x1 Brick haben. Der Verbindungsaufbau hat in unserem 2-Mann-Team allerdings trotz gleicher MATLAB-Version (2013a, 64bit) und selbem Betriebssystem (Windows 7, 64bit) nur auf einem Laptop funktioniert.

Programmierung des Segways

Da wir leider in unserem Projekt für längere Zeit keine Kommunikation mit dem EV3 herstellen konnten (basierend auf oben genannten Schwierigkeiten und Unklarheiten der Dokumentationen der QUT) ist unser Programm beschränkt auf die generelle Kommunikation zum EV3 und ledigliches Prinzipverhalten eines Segways, d.h. Gegensteuern bei Neigung in die eine oder andere Richtung. Aufgrund der Zeitnot durch die Kommunikationsschwierigkeiten stellt unser Programm einen Ansatz dar, der noch weiter ausgebaut werden müsste. Aus selbem Grund beinhaltet unser Ansatz noch keinen I-Anteil, der in einem PID-Regler typischerweise vorhanden sein müsste.

Programmcode

Eine Zusammenfassung der von uns verwendeten Befehle findet sich auf einer separaten Seite wieder.

%% Verbindung aufbauen
disp('Connecting ... ')
b = Brick('ioType','usb');
b.beep();
disp('Connected')
%% Variablen initialisieren
t = 0;
kp = 0.5;
kd = 2;
motorPower = 0;
PAnteil = 0;
DAnteil = 0;
%% Motorpower festlegen und starten
b.outputPower(0,Device.MotorA+Device.MotorB,motorPower)
b.outputStart(0,Device.MotorA+Device.MotorB)
pause(0.1);                             % ohne Pause vor der Sensorabfrage entsteht ein NaN-Fehler
reading = b.inputReadSI(0,0,0);         % liest den (LEGO-)Gyrosensor auf Port 1 aus: b.inputReadSI(Ebene, Port, Modus);
pause(0.1);
reading = b.inputReadSI(0,0,0);         % doppelt hält besser, ansonsten entsteht ebenfalls oft ein NaN-Fehler
pause(0.1);
%% Hauptprogramm
while(true)
   PAnteil = b.inputReadSI(0,0,0);     % Absoluter Winkel nach obigem Schema 
   pause(0.1);
   PAnteil = b.inputReadSI(0,0,0);     % Wiederholung da der erste Aufruf NaN-Fehler erzeugt
   pause(0.1);
   DAnteil = b.inputReadSI(0,0,1);     % Winkelgeschwindigkeit in deg/s, immernoch auf Port 1 des EV3
   pause(0.1);
   DAnteil = b.inputReadSI(0,0,1);      
   pause(0.1);    
   if PAnteil < reading   % Wenn der aktuelle Winkel kleiner ist als der beim Initialisieren => Kippgefahr
           motorPower = (kp*PAnteil + kd*DAnteil);            % b.inputReadSI(0,0,0) + 10;
           b.outputPower(0,Device.MotorA+Device.MotorB,motorPower);
           pause(0.0001);
   else PAnteil > reading % Kippgefahr in andere Richtung
           motorPower = -(kp*PAnteil + kd*DAnteil);           % b.inputReadSI(0,0,0) - 10;
           b.outputPower(0,Device.MotorA+Device.MotorB,motorPower);
           pause(0.0001);
   end
end
%% Motoren stoppen, Variablen löschen
b.outputStop(0,Device.MotorA+Device.MotorB,0)
delete(b)

Lessons learned - ein kleines Fazit & ZIP-Datei

In unserem Projekt konnten wir sehr gut unser bisher erlerntes Wissen über die Mess- und Regelungstechnik anwenden. Dies half uns bei der Wahl des passenden Regelkreises sowie bei der Wahl des Sensors, auch wenn wir aufgrund der Probleme mit MATLAB und EV3 nicht mehr zur Implementierung des eigenen Sensors gekommen sind, da die Implementierung das Schreiben eines passenden Treibers erfordert hätte. Aus selbem Grund war die Umsetzung der Ansteuerung per LEGO-App nicht mehr möglich. Wir haben gelernt, in zukünftigen Projekten frühzeitiger bei entstehenden Problemen zu Handeln.

Eine zip-Datei mit allen Projektunterlagen kann hier heruntergeladen werden.

Verbesserungsvorschläge zum Artikel

Ulrich Schneider (Diskussion) 10:28, 24. Jan. 2014 (CET)

  • Welche Regelstrecke haben Sie identifiziert? Wie sind Sie dabei vorgegangen? Welche Reglerparameter hat Ihr Regler? Wie haben Sie diese ermittelt? Eine fachliche Herleitung wäre wünschenswert. Wieso muss er Regler "ein PT2-Verhalten aufweisen"? Nennen Sie die Quellen Ihrer Recherche.
  • Es ist unklar, wie Sie mit einem Beschleunigungssensor die Lage des Legway regeln wollen. Legen Sie Ihre Ansätze bitte deutlich dar.
  • Link auf QUT Homepage und Matlab Central wäre wünscheswert.
  • "Zum momentanen Zeitpunkt" ist eine zeitlich inkonkrete Aussage. Publizieren Sie bitte die dll, die funktioniert.
  • Fotos sollten besser aufgelöst und besser beleuchtet sein. Schaltplan des Sensors fehlt.
  • Der Quelltext ist nicht hilfreich, da Sie Ihre Konfiguration nicht beschrieben haben. Welcher Sensor ist an welchem Port? Wieso gibt der Sensor den P- und D-Anteil des Reglers aus? Sie schreiben oben von einem PID-Regler. Wo wird der I-Anteil berechnet.
  • Quellenangaben fehlen
  • Die geforderte ZIP Datei fehlt und somit fast sämmtliche für die Projektlösung geforderten Unterlagen.


Prof. Dr. Mirek Göbel am 31.01.2014:

  • Wieso kann ein PID-Regler ohne Regelabweichung regeln? Das hängt von der Regelstrecke ab!
  • Wie können die Regelparameter noch ermittelt werden! Teilen Sie Ihr Wissen auch anderen mit!
  • Details über den EV3 bitte in einen eigenen Artikel auslagern "Lego Mindstorms EV3" und dort dann auch Tipps zu den Befehlen geben