Mobiler Rover
Einführung
Das Mobile Rover-Projekt besteht aus einem programmierbaren Roboter, der mit MATLAB über Wi-Fi kommunizieren kann, um Operationen mit einem Bildverarbeitungsalgorithmus durchzuführen. Der Rover wird von einem Arduino MKR1000, dem Arduino MKR Carrier, zwei DC-Motoren mit Encodern, einem Mikro-Servomotor und einigen Sensoren gesteuert. Auf dem Rover installieren Sie einen farbcodierten Aufkleber, der als Markierung für den Bildverarbeitungsalgorithmus dient. Dieser erkennt mit Hilfe einer Webcam die Position und Ausrichtung des Roboters.
In diesem Projekt programmieren Sie den mobilen Rover für eine Vielzahl von Aufgaben, wie z.B. Folgen von Pfaden, Bewegen von Objekten mit dem Gabelstapler und Umgehen von Hindernissen. Sie lernen wichtige Robotik-Konzepte kennen, z.B. die Funktionsweise von Differentialantriebsrobotern und die Simulation ihres Verhaltens, die Kontrolle ihrer Position oder Geschwindigkeit sowie die Lokalisierung. Nach Abschluss des Projekts haben Sie genug Wissen, Ihre eigenen Roboter zu entwickeln und zu programmieren, um intelligent zu reisen und alle Arten von lustigen Aufgaben zu erledigen.
Wenn Sie bereit sind, mit der Codierung zu beginnen, sollten Sie den Rover gemäß den Anweisungen, die Sie unten finden, aufgebaut haben:
In den Übungen, aus denen sich dieses Projekt zusammensetzt, werden Sie folgendes lernen:
- Übung 1: Steuern Sie den Rover und Gabelstapler von MATLAB aus.
- Übung 2: Verwenden Sie kinematische Gleichungen, um die Roverbewegung zu simulieren und eine Steuerung im offenen Regelkreis durchzuführen.
- Übung 3: Führen Sie die Regelung des Rovers durch.
- Übung 4: Verwenden Sie Zustände, um a) Ihren Rover so zu programmieren, dass er der Sequenz folgt, und um b) stationäre Fehler und Überschreitungen Ihres geschlossenen Regelkreises zu beseitigen.
- Übung 5: Lokalisieren Sie den Rover mit Hilfe der Bildverarbeitung.
- Übung 6: Steuern Sie den Rover und den Gabelstapler, um das gewünschte Objekt aufzunehmen und abzusetzen.
- Übung 7: Aktivieren Sie die Wi-Fi-Kommunikation zwischen Rover und MATLAB.
Hinweis: Die voreingestellte Drahtlänge des DC Motor mit Encoder ist für den Zeichenroboter erforderlich. Es wird empfohlen, die Drahtlänge für das Mobile Rover Projekt nicht zu verkürzen..
ÜBUNG 1:
5.1 Steuerung des Rovers und Gabelstaplers mit MATLAB
Steuern Sie den Rover und den Gabelstapler von MATLAB# Der Mini-Mobil-Rover ist ein Differential-Antriebsroboter, der über separate DC Motoren verfügt, die jedes seiner Räder steuern. Sie können die Fahrtrichtung steuern, indem Sie die Geschwindigkeit der einzelnen Räder variieren, ohne dass eine separate Lenkung erforderlich ist. In dieser Übung lernen Sie, wie Sie den Rover fahren und den Gabelstapler mit MATLAB bedienen.
In dieser Übung lernen Sie Folgendes:
- Steuerung der Grundbewegung eines Differentialantriebsroboters.
- Verbinden von MATLAB mit dem Rover.
- Rover in gerader Linie fahren lassen.
- Rover im Kreis fahren lassen.
- Gabelstapler des Rovers steuern lassen.
So kommunizieren Sie mit dem Rover
Zunächst verbinden Sie den Arduino MKR1000 über das USB-Kabel mit Ihrem Computer:
Um zwischen MATLAB und Arduino zu kommunizieren, müssen Sie die Portnummer kennen, mit der Ihr Arduino verbunden ist. Sie können diese anhand der Schritte bestimmen, die in Abschnitt 2.1.3 Arbeiten mit digitalen Outputs in "2.1 Arduino Getting Started " beschrieben sind. Denken Sie daran, dass die Portnamen von Betriebssystem zu Betriebssystem unterschiedlich sind, d.h. sie unterscheiden sich für Windows (wo sie COM## genannt werden, wobei ## eine eindeutige numerische Kennung ist), OSX (/dev/tty.usbmodem###) und Linux (/dev/ttyACM##).
Sobald Sie die Portnummer kennen, geben Sie die folgenden Befehle mit der entsprechenden Portnummer ein, um (a) ein Arduino-Objekt mit den erforderlichen Bibliotheken und (b) ein separates Objekt für den Carrier zu erstellen:
>> a = arduino(' COMX', 'MKR1000', 'Libraries', 'Arduino/MKRMotorCarrier');>> carrier = addon(a,'Arduino/MKRMotorCarrier');Steuern Sie den Rover von MATLAB
In einer gerader Linie fahren
Sie wissen wahrscheinlich intuitiv, dass der Rover geradeaus fahren wird, wenn sich beide Räder mit gleicher Geschwindigkeit und in die gleiche Richtung drehen. Lassen Sie uns die DC-Motoren des Rovers mit der gleichen Geschwindigkeit drehen und beobachten, ob er wie erwartet geradlinig läuft. Geben Sie die folgenden Befehle ein, um die DC-Motoren an MATLAB anzuschließen:
>> dcmLeft = dcmotor(carrier,4);>> dcmRight = dcmotor(carrier,3);Geben Sie nun an, dass die DC-Motoren mit 25% der maximalen Drehzahl drehen sollen:
>> dcmLeft.DutyCycle = 0.25;>> dcmRight.DutyCycle = 0.25;Sobald Sie angegeben haben, wie schnell sich die Motoren drehen müssen, ist der nächste Schritt, sie zu drehen! Geben Sie die folgenden Befehle ein, um die Motoren 10 Sekunden lang mit dieser Geschwindigkeit zu betreiben:
>> start(dcmLeft)>> start(dcmRight)>> pause(10)>> stop(dcmLeft)>> stop(dcmRight)Messen Sie, wie weit sich der Rover bei Verwendung dieser Befehle bewegt hat. Die Informationen, die von den an jedem der DC Motoren angeschlossenen Encoders kommen, werden noch nicht gelesen. Es gibt also keine Möglichkeit, sicherzustellen, dass sich der Rover entweder vollständig gerade bewegt (es kann leichte Unterschiede im Verhalten zwischen den Motoren geben) oder dass er sich bei jeder Ausführung des Programms gleich weit bewegt (mit der Zeit werden die Batterien immer weniger geladen und verhalten sich unterschiedlich).
Im Kreis fahren
Wenn Sie gefragt wurden, wie Sie den Rover in einem Kreis fahren lassen sollen, könnte Ihre Antwort lauten: a) nur das eine Rad zu drehen, aber nicht das andere oder b) beide Räder mit der gleichen Geschwindigkeit, aber in entgegengesetzte Richtungen zu drehen.
Beide Antworten sind korrekt, aber die Art und Weise, wie sich der Rover bewegt, ist unterschiedlich. Lassen Sie uns den ersten Fall analysieren:
Drehen Sie ein Rad, aber nicht das andere. Versuchen Sie die folgenden Befehle mit dem Rover:
>> dcmLeft.DutyCycle = 0;>> dcmRight.DutyCycle = 0.25;>> start(dcmLeft)>> start(dcmRight)>> pause(10)>> stop(dcmLeft)>> stop(dcmRight)Sie sollten beachten, dass sich der Rover im Kreis um sein linkes Rad dreht.
Der andere Fall erforderte, dass Sie beide Räder mit gleicher Geschwindigkeit, aber in entgegengesetzter Richtung drehen. Versuchen Sie, die Räder mit gleicher und entgegengesetzter Geschwindigkeit zu drehen, indem Sie den folgenden Code in MATLAB ausführen:
>> dcmLeft.DutyCycle = -0.25;>> dcmRight.DutyCycle = 0.25;>> start(dcmLeft)>> start(dcmRight)>> pause(10)>> stop(dcmLeft)>> stop(dcmRight)Sie sollten sehen, dass sich der Rover im Kreis um seine Mitte dreht.
Steuern Sie den Gabelstapler des Rovers
Der Gabelstapler des Rovers wird von einem Standard-Servomotor gesteuert, der mit der MKR motor Carrier board verbunden ist; das bedeutet, Sie können den Winkel steuern, in dem sich der Motor dreht. Normalerweise können sich Standardservos zwischen 0 und 180 Grad drehen, aber es kann auch andere Typen geben.
Hinweis: Das Arduino Engineering Kit enthält nur Standard-Servomotoren.
In diesem Abschnitt bewegen Sie zunächst den Servo in die Position "Down", was einem Winkel von Null Grad entspricht. Sie verwenden dazu die writePosition(s,0);- Anweisung, die im folgenden Code gezeigt wird. Anschließend fahren Sie den Servo in die Position "Up", was einem Winkel von 125 Grad am eigentlichen Servomotor entspricht. Im zweiten Eingang der writePosition Funktion stellt 0 die minimal mögliche Position dar, die bei Standard-Servomotoren Null Grad ist, und 1 die maximal mögliche Position, die 180 Grad beträgt. Geben Sie die folgenden Befehle ein, um sich mit dem Servo zu verbinden und den Gabelstapler zwischen den Positionen Up und Down zu bewegen:
>> s = servo(carrier,1);>> writePosition(s,0)>> pause(5)>> writePosition(s,0.7)Review/Zusammenfassung
-
Sie haben gelernt, wie man den Rover geradlinig und im Kreis fährt.
-
Sie haben gelernt, wie man den Gabelstapler steuert, der in späteren Übungen zum Anheben des Ziels verwendet wird.
LEARN BY DOING
-
Lassen Sie den Rover im Kreis mit unterschiedlichem Radius fahren, indem unterschiedliche Geschwindigkeiten an beide Räder gesendet werden.
-
Lassen Sie den Rover in einer Reihenfolge fahren: vorwärts, dann um 90 Grad nach links und dann wieder nach vorne.
ÜBUNG 2:
5.2 Simulation der Rover-Kinematik und Open-Loop-Steuerung
In Übung 1 haben Sie gelernt, wie Sie den Rover in einer Geraden und im Kreis fahren lassen. Um den Rover jedoch auf komplexeren Wegen zu bewegen, müssen Sie die zugrunde liegenden kinematischen Gleichungen verstehen, die die Geschwindigkeit jedes Rads mit der Geschwindigkeit und Fahrtrichtung des Rovers in Beziehung setzen. In dieser Lektion lernen Sie die grundlegenden kinematischen Gleichungen hinter Differentialantriebsrobotern und wie Simulink Ihnen helfen kann, die Bewegung des Rovers für verschiedene Eingänge zu visualisieren und zu simulieren. Sie werden dann das, was Sie durch diese Simulationen gelernt haben, anwenden, um den Rover in der realen Welt zu steuern.
In dieser Übung werden Sie Folgendes lernen:
- Verstehen Sie die kinematischen Gleichungen des Rovers.
- Simulieren Sie den Rover mit kinematischen Gleichungen.
- Modellieren und simulieren Sie die Roverbewegung mit Simulink.
- Steuern Sie den Rover mit Open-Loop.
- Verwenden Sie Simulink Modelle, um den eigentlichen Rover zu steuern.
Kinematik des Rovers
Das folgende Diagramm zeigt die Grundkinematik des Rovers (oder eines beliebigen Differentialantriebsroboters):
Das Diagramm stellt einige wichtige Parameter vor, die mit differentiellen Antriebsrobotern verbunden sind, darunter Drehradius ($R$), Drehrate ($\omega_{l}$), momentaner Krümmungsmittelpunkt (ICC), Radgeschwindigkeiten ($v_{l}$, $v_{r}$), Roverlänge ($L$) und Vorwärtsgeschwindigkeit ($v$). Wenn Sie mehr über die in diesem Diagramm dargestellten Konzepte erfahren möchten, besuchen Sie bitte diese Seite.
Konzentrieren wir uns auf die Drehrate und die Vorwärtsgeschwindigkeit.
Drehrate: $\omega =\frac{v_{r}-v_{l}}{L}$
Vorwärtsgeschwindigkeit: $v=\frac{v_{r}+v_{l}}{2}$
Radgeschwindigkeiten ($v_{l}$, $v_{r}$) können basierend auf Radius ($r$) und Drehzahlen ($\omega_{l}$, $\omega_{r}$) berechnet werden:
$v_{l}= \omega_{l} \cdot r$
$v_{r}= \omega_{r} \cdot r$
Wenn man diese Werte in die vorherigen Gleichungen einfügt, erhält man die Ergebnisse:
$\omega =\frac{r\cdot \left( \omega _{r}- \omega _{l} \right) }{L}$
$v=\frac{r\cdot \left( \omega _{r}+ \omega _{l} \right) }{2}$
Umstellen dieser Gleichungen:
$\omega _{r}+ \omega _{l}=\frac{2v}{r}$
$\omega _{r}- \omega _{l}=\frac{L \omega }{r}$
Lösung für $\omega_{r}$ and $\omega_{l}$:
$\omega _{r}=\frac{v+ \left( \frac{L}{2} \right) \omega }{r}$
$\omega _{l}=\frac{v- \left( \frac{L}{2} \right) \omega }{r}$
In Matrixschreibweise:
$\left[ \begin{matrix} \omega _{l}\\ \omega _{r}\\ \end{matrix} \right] =\frac{1}{r}\cdot \left[ \begin{matrix} 1 & \frac{-L}{2}\\ 1 & \frac{L}{2}\\ \end{matrix} \right] \cdot \left[ \begin{matrix} v\\ \omega \\ \end{matrix} \right]$
Für unseren Rover, $L$ = 8,8 cm und $r$ = 4,5 cm. Unter Verwendung dieser Werte und der obigen Gleichungen berechnen wir, wie schnell jedes Rad gedreht werden muss, um den Rover mit einer gewünschten Vorwärtsgeschwindigkeit und Drehrate zu bewegen. Betrachten wir zwei einfache Szenarien:
- Fahren Sie den Rover geradeaus mit 10 cm/s ($v$ = 10 cm/s, $\omega$ = 0 deg/s) $\omega_{r}$ = $\omega_{l}$ = 127.3 deg/s (einschließlich Einheitenumrechnungen)
- Drehen Sie den Rover 180 Grad in 10 Sekunden mit null Vorwärtsgeschwindigkeit ($v$ = 0 cm/s, $\omega$ = 18 deg/s)
$\omega _{r} = 17.6 deg/s$, $\omega _{l} = -17.6 deg/s$ (includes unit conversions)
Implementieren von Gleichungen in Simulink
Das Ziel dieses Beispiels ist es, Sie bei der Implementierung der oben dargestellten Gleichungen mit Simulink zu unterstützen, die dann zum Antreiben des Rovers verwendet werden können. Wir haben ein Modell vorbereitet, in dem eine Reihe von Blöcken miteinander verbunden ist. Sie führen die in den obigen Gleichungen dargestellten Matrixoperationen aus und berechnen die Winkelgeschwindigkeiten für jeden der Motoren ($\omega_{r}$ und $\omega_{rl}$), die eine gewünschte lineare und Winkelgeschwindigkeit des gesamten Rovers aufweisen. Öffnen Sie das Modell, indem Sie den folgenden Befehl in MATLAB eingeben:
>> basicKin_sim
Die Blöcke auf der linken Seite sind konstante Blöcke, in denen Sie die gewünschte Rover-Geschwindigkeit und Drehrate angeben können. Die Blöcke auf der rechten Seite sind Anzeigeblöcke und zeigen die resultierenden $\omega_l$ und $\omega_{r}$ Werte.
Aber bevor Sie sich das Subsystem convToWheelVel ansehen, beachten Sie, dass L, r, und TS im Workspace definiert wurden.
Simulink verfolgt das Konzept der Model Callbacks. Diese werden verwendet, um MATLAB-Skripte oder Funktionen zu verschiedenen Zeiten aufzurufen. Dieses Modell verwendet den Callback PostLoadFcn, um ein MATLAB-Skript direkt nach dem Laden des Simulink Modells in den Speicher aufzurufen. Das hier aufgerufene Skript ist paramsBasicKinematics, und diese Variablen (L, r, und TS) sind in diesem Skript als konstante Werte definiert.
L und r sind die Abmessungen unseres Rovers, und TS ist die Probezeit des Modells. Die Samplezeit ist ein Parameter, der angibt, wann Ausgaben des Simulink Modells erzeugt werden sollen und gegebenenfalls, wann Blöcke während der Simulation aktualisiert werden sollen.
Sie können die Modellrückrufe anzeigen, indem File > Model Properties > Model Properties auswählen. Klicken Sie im Fenster Modelleigenschaften auf Click Callbacks, die wie unten gezeigt angezeigt wurden.
Öffnen wir nun das convToWheelVel Subsystem durch Doppelklick.
Hier sehen Sie die inports ($v$ und $\omega$) auf der linken Seite und die outports ($\omega_{l} (deg/s)$ und $\omega_{r} (deg/s)$) auf der rechten Seite. Der D2R Block neben dem Inport w wandelt Grad in Bogenmaß um, während die R2D Blöcke den umgekehrten Vorgang ausführen, bevor sie die resultierenden Daten an die Outports senden. Die dicken schwarzen Linien sind Mux- und Demux Blöcke; sie ermöglichen es uns, die Daten in Vektoren anzuordnen und bei Bedarf wieder in Skalare zu trennen. Dies ermöglicht es uns, eine Matrixmultiplikation mit dem ersten dreieckigen Gain Block (K*u) auf dem Vektor durchzuführen. Der zweite Gain Block multipliziert die Komponenten des resultierenden Vektors mit 1/r.
Dieses Subsystem berechnet $\omega_{l}$ und $\omega_{r}$ für eine bestimmte gewünschte Geschwindigkeit und Drehrate. Die in diesem Subsystem implementierten Gleichungen werden innerhalb des Modells als Referenz angezeigt. Dies ist eine Funktion in Simulink, mit der Sie Dokumentation in die Modelle selbst einbinden können. Das macht es einfacher, Ihre Arbeit mit anderen zu teilen.
Gehen wir zurück zum obersten Modell, indem wir wie unten gezeigt auf basicKin_sim klicken.
Versuchen Sie beispielsweise $v$ = 10 cm/s and $\omega$ = 0 deg/s und klicken Sie auf das Run-Symbol wie unten gezeigt. Simulink führt dann die Berechnung durch und aktualisiert das Display einmal alle 0,01 Sekunden, wie durch die Abtastzeit TS angegeben. Auf dem Display sollten Sie Ergebnisse sehen, die mit den zuvor berechneten Werten übereinstimmen, in diesem Fall: $\omega_{l} = \omega_{r}=127.3 deg/s$
Versuchen Sie es noch einmal mit v = 0 cm/s und w = 18 deg/sec und starten Sie das Modell erneut. Die Ergebnisse sind wieder konsistent und in diesem Fall:
$\omega _{l}=-17.6\frac{deg}{s}; \omega _{r}=17.6\frac{deg}{s}$
Simulation der Bewegung des Rovers
Im vorherigen Abschnitt wurde Simulink verwendet, um grundlegende kinematische Gleichungen des Rovers zu implementieren, aber das Modell berücksichtigte nicht die Position des Rovers in realen Koordinaten. Die Position (x, y) und Richtung ($\theta$) des Rovers in einem X-Y-Koordinatensystem kann mit den folgenden Gleichungen beschrieben werden:
$\theta \left( t \right) = \int _{0}^{t} \omega \left( t \right) dt~~ x \left( t \right) = \int _{0}^{t}v \left( t \right) \cdot cos\theta \left( t \right) dt~~~~~ y \left( t \right) = \int _{0}^{t}v \left( t \right) \cdot sin \theta \left( t \right) dt$
Schauen wir uns nun an, wie man mit Simulink diese Gleichungen implementiert und die Bewegung des Rovers im Laufe der Zeit simuliert. Öffnen Sie zunächst das kinEq_sim Modell aus MATLAB:
>> kinEq_simIn diesem Modell sehen Sie, dass es anstelle einfacher konstanter Eingaben, die im Vorgängermodell vorhanden waren, jetzt Signal builder Blocks mit der Bezeichnung $v (cm/s)$ und $\omega (deg/s)$ gibt. Diese liefern Signale, die sich im Laufe der Zeit ändern zu convToWheelVel subsystem. Anstatt die Ergebnisse einfach anzuzeigen, werden sie als Eingang an das Rover Simulation subsystem weitergegeben, das das Verhalten des Rovers mathematisch modelliert und eine visuelle Simulation des Rovers erstellt, der sich um eine 100 cm x 100 cm "Arena" bewegt.
Hinweis: Das convToWheelVel Subsystem ist das gleiche Subsystem wie das Vorgängermodell.
Doppelklicken Sie auf den v (cm/s) Block, um zu sehen, wie das Signal aussieht.
Das Signal sieht aus wie ein Schritt, der für die ersten fünf Sekunden eine Größe von 5 cm/s hat und dann auf 0 cm/s absinkt.
Das Signal für w (deg/s) ist ein Rechtecksignal, das zwischen 5 und 10 Sekunden eine Größe von 18 Grad/s und zu allen anderen Zeiten Null aufweist.
Da die Eingangssignale nach 10 Sekunden beide Null sind, wird die Simulationsstoppzeit wie unten gezeigt auf 11 Sekunden eingestellt.
Öffnen Sie das Rover Simulation subsystem. Es gibt zwei inports um die Winkelgeschwindigkeit jedes Rades einzubringen, und es gibt hier drei Subsysteme: die Encoder simulation, die Vehicle kinematics (Fahrzeugkinematik) und die Robot path plotter (Roboter-Pfadplotter) Modelle.
Das Encoder-Simulation subsystem wandelt die gewünschten Raddrehzahlen von Grad/s in Grad um, die vom Rad gedreht werden, um den Encoder auf Ihrem Rover nachzubilden. Um mehr über den tatsächlich verwendeten Encoder und sein Verhalten zu erfahren, lesen Sie bitte den Abschnitt 2.3.2.2.3.Lesen der Encoder in "2.3 Simulink Getting Started" zählt.
Das Subsystem Vehicle kinematics implementiert die zuvor vorgestellten Gleichungen für $\theta$(t), x(t) und y(t). Öffnen Sie dieses Subsystem. An dieser Stelle wissen Sie genug über Simulink, um mehr Informationen über jeden einzelnen der Blöcke zu finden. Lassen Sie sich so viel Zeit wie nötig, um zu verstehen, wie sich die Gleichungen in die folgenden Blockdiagramme umsetzen lassen. Im Wesentlichen werden Sie sehen, dass die outports das Ergebnis von Integrationsoperationen sind, und die outports sind die Ausrichtung des Rovers und seiner x- und y-Koordinaten.
Im vehiclePath MATLAB Funktions Block sehen Sie, wie die Gleichungen hier umgesetzt werden. Ein MATLAB FunktionsBlock ermöglicht die Integration von MATLAB-Code in Simulink Modelle.
Navigieren Sie zurück zur Subsystem Rover Simulation und öffnen Sie das Subsystem Robot path plotter.
Sie werden sehen, dass es neben den Eingängen einen konstanten Block gibt, der den Wert 5 an den MATLAB Funktions Block sendet. Hiermit wird die Trajektorie des Roboters gezeichnet. Öffnen Sie den plotRobot MATLAB Funktions Block, um zu sehen, wie man den Pfad des Roboters x, y und $\theta$ mit der Zeit ändert.
Sobald Sie mit der Funktionsweise des Modells vertraut sind, klicken Sie auf Run.
Sie werden sehen, wie sich der Rover 11 Sekunden lang in der 100 cm x 100 cm großen Arena bewegt. Die Simulation basiert auf einer Ausgangsposition von StartX = 50 cm, StartY = 20 cm und StartTheta = 90 deg. Diese Variablen wurden früher im Workspace durch das Modell Callback PostLoadFcn definiert, wie Sie es im Vorgängermodell gesehen haben. Insgesamt bewegte sich der Rover 25 cm in y-Richtung und drehte sich dann um 90 Grad, basierend auf den Eingängen des Signal Builder.
Fahren des Rovers mit einer Open-Loop-Steuerung
Sobald Sie die Simulation ausprobiert haben, ist es an der Zeit, den Rover dazu zu bringen, das gleiche Manöver in der realen Welt durchzuführen. Wir haben für Sie ein Simulink Modell vorbereitet, um schnell zu sehen, wie das funktionieren könnte. Öffnen Sie das Modell roverOpenloop_hw aus MATLAB:
>> roverOpenloop_hwDieses Modell ähnelt dem im vorherigen Abschnitt. Allerdings werden die Ausgänge nicht an ein mathematisches Modell des Rovers gesendet, sondern an die Motoren, die auf dem realen Rover montiert sind.
Die Eingangssignale und das Subsystem convToWheelVel sind die gleichen wie beim Vorgängermodell, aber die Drehzahlen werden direkt an die eigentlichen Motoren gesendet, die als Blöcke im Modell dargestellt werden.
Die Blöcke LeftMotor and RightMotor stammen aus der Bibliothek Simulink Support for Arduino MKR Motor Carrier, wie unten gezeigt.
Wie in Abschnitt 2.2.3 beschrieben, sollte der Eingang zu den Motorblöcken ein PWM-Signal und nicht eine Solldrehzahl sein. Innerhalb der Subsysteme LeftMotor and RightMotor werden also die vorgegebenen Drehzahlen mit neuen Motorcharakterisierungsdaten in PWM umgewandelt. Der Grund für die Notwendigkeit neuer Charakterisierungsdaten ist die Motorcharakterisierung in Abschnitt 2.2.3 in "2.2 MATLAB Getting Started". Diese wurde durchgeführt, als sich die Räder des Rovers frei in der Luft drehten. Die neue Motorcharakterisierung wurde ermittelt als sich der Rover auf dem Boden bewegte und der Akku mit vollem Ladegerät ausgestattet war. Die bereitgestellten Daten (Data.xlsx) für den Rover zeigen den Zusammenhang zwischen PWM-Wert und der vorgegebenen Motordrehzahl. Dies wird durch den Block Lookup table innerhalb der Subsysteme LeftMotor and RightMotor dargestellt.
Überprüfen Sie die Portnummern, die von den DC-Motorblöcken in den Subsystemen LeftMotor und RightMotor angegeben werden, um sicherzustellen, dass die Anschlüsse für den rechten und linken Motor Ihres Rovers mit den in diesen Blöcken angegebenen übereinstimmen. Das folgende Bild zeigt den DC-MotorBlock innerhalb des RightMotor Subsystems.
Wichtig: Verbinden Sie Ihren Rover über das USB-Kabel mit dem Computer, ohne den Akku einzuschalten.
Drücken Sie die Schaltfläche Deploy to Hardware im Modellfenster Toolstrip. Dadurch wird das Code-Äquivalent Ihres Modells erzeugt und auf den Arduino MKR1000 hochgeladen. So wird sichergestellt, dass der Rover den Code auf dem Board ausführen kann, selbst wenn er vom Computer getrennt ist.
Trennen Sie das USB-Kabel vom Rover und legen Sie den Rover auf den Boden oder eine andere Fläche, wo er genügend Platz zum Bewegen hat. Der Rover ist zerbrechlich, und er könnte beschädigt werden, wenn er von Ihrem Schreibtisch fällt.
Schalten Sie den Rover ein (mit der Batterie) und messen Sie die Entfernung, die er auf dem Boden zurücklegt. Ihr Ziel ist es, zu überprüfen, ob die realen experimentellen Bedingungen das wiederholen, was Sie zuvor im Modell simuliert haben.
Erinnern wir uns, dass sich der Rover in der Simulation um 25 cm in y-Richtung bewegt und dann um 90 Grad gedreht hat. Hat der echte Rover das Gleiche getan?
Sie werden wahrscheinlich sehen, dass er das nicht hat. Im Allgemeinen ist es sehr schwierig, Ihr System mit Hilfe der Open-Loop-Steuerung genau zu steuern, es sei denn, Sie haben ein sehr genaues Modell Ihres Motorverhaltens und Ihrer Betriebsumgebung. In unserem Fall war die Motorcharakterisierung nicht konsequent genug und es wurde eine einfache Beziehung zwischen PWM und Motordrehzahl verwendet. Selbst wenn die Charakterisierung konsequent wäre, gäbe es Probleme, wenn Sie den Rover auf einer anderen Oberfläche als der für die Motorcharakterisierung verwendeten Oberfläche betreiben wollen, oder wenn die Batterie nicht mit der gleichen Spannung arbeitet
Notwendigkeit einer Closed Loop Steuerung
In der nächsten Übung werden Sie sehen, wie die closed-loop Steuerung dazu beiträgt, die Einschränkungen zu beseitigen, die bei der open-loop Steuerung auftraten. Dadurch ermöglicht die closed-loop Steuerung eine wesentlich genauere Steuerung der Rover-Position.
Review/Zusammenfassung
-
Wir haben gesehen, wie man kinematische Gleichungen und inverse Kinematik verwendet, um die Roverbewegung zu simulieren.
-
Wir haben gesehen, wie man dieses Verständnis übersetzt, um den Rover in der realen Welt zu kontrollieren.
-
Wir haben gesehen, dass die mathematische Modellierung optimiert werden muss, um den realen Bedingungen besser gerecht zu werden.
FILES
-
basicKinsim.slx
-
kinEqsim.slx
-
roverOpenloophw.slx
-
roverMotorshw.slx
-
Data.xlsx
LEARN BY DOING
Versuchen Sie, die Eingangssignale im Signal Builder Block mit verschiedenen Kombinationen von v und w zu aktualisieren. Können Sie den Rover in einem Kreis bewegen oder einer bestimmten Bewegungsabfolge fahren lassen (z.B. nach vorne 20 cm in y-Richtung, nach vorne 90 Grad, nach vorne 20 cm in x-Richtung)?
ÜBUNG 3:
5.3 Closed-loop Steuerung der Roverposition
In dieser Übung wird Simulink verwendet, um einen PI-Regler zu implementieren, der den vom Rover bewegten Abstand steuert. Sie werden lernen, wie Sie die Encoderdaten der Räder des Rovers lesen und diese Daten als Rückmeldung an Ihre Steuerung verwenden können. Sie werden auch lernen, wie Sie die PI-Werte des Reglers einstellen, um die Leistung zu optimieren.
In dieser Übung werden Sie außerdem Folgendes lernen:
- Grundlagen eines PI-Reglerdesigns und damit auch der PID-Regler.
- Lesen von Encoderdaten.
- Abstimmen der Parameter eines Controllers in Simulink.
- Implementieren einer Steuerung auf dem Rover.
Grundlagen eines PID-Reglers
Ein PID Regler (proportional-integral-derivative controller) ist ein Regelkreis-Rückführmechanismus, der in Systemen verwendet wird, die eine kontinuierlich modulierte Regelung erfordern. PID-Regler arbeiten mit dem Fehlerterm der Differenz zwischen tatsächlichem und gewünschtem Verhalten. Sie wenden eine Korrektur auf Ihr System an, die auf den mit dem Fehler verbundenen Proportional-, Integral- und Derivatbedingungen basiert. Dies hat den Effekt, dass Korrekturen für den vergangenen Fehler (I), den aktuellen Fehler (P) und den zukünftigen Fehler (D) vorgenommen werden. Die Korrektur wird durch die Gleichung beschrieben:
$u=Kp\cdot e+Ki\cdot \int _{}^{}e dt+Kd\cdot\frac{de}{dt}$
Wo Kp (im PID Controller Block von Simulink wird dies durch den Buchstaben P dargestellt), Ki (I) und Kd (D) sind Konstantenkoeffizienten, die das System definieren. In dieser Übung werden einige Konzepte vorgestellt, die mit der PID-Regelung im Rahmen des Mobile Rover-Projekts verbunden sind. Weitere Informationen finden Sie unter diesem link.
Steuerung der Roverposition unter Verwendung eines PID-Reglers
In Übung 2 wurden die Einschränkungen der Verwendung der Open-Loop-Steuerung zur Steuerung der Position des Rovers erwähnt. Lassen Sie uns sehen, wie die PID-Regelung im geschlossenen Regelkreis diese Einschränkungen beseitigen kann. Öffnen Sie zunächst das Modell distanceClosedloop_hw:
>> distanceClosedloop_hwDie rechte Seite dieses Modells ist die gleiche wie das Modell roverOpenloop_hw aus der vorherigen Übung. Der Unterschied besteht darin, dass die Geschwindigkeitseingabe an das convToWheelVel Subsystem nun auf dem Fehlerterm zwischen dem tatsächlichen und dem gewünschten Abstand des Rovers basiert. Die Herausforderung besteht darin, den tatsächlichen Abstand mit Hilfe einer Abtastvorrichtung am Rover zu bestimmen. In diesem Fall können die DrehEncoder gleich verwendet werden, wie Sie später sehen werden.
Um das Steuerungsdesign in der Anfangsphase zu vereinfachen, betrachten wir den Rover, der sich in einer geraden Linie bewegt. In diesem Fall ist die vorgegebene Drehrate für den Rover Null. Im nächsten Abschnitt erfahren Sie, wie Sie den Drehwinkel des Rovers steuern können.
Der gewünschte Abstand wird mit dem Signal Builder Block festgelegt. Doppelklicken Sie auf diesen Block und öffnen Sie ihn. Beachten Sie, wie die angegebene Schritt-Eingabe von 25 cm bei 5 Sekunden erfolgt. Das folgende Bild zeigt das Zeitdiagramm für das Signal.
Wie bereits erwähnt, ist der Sensor, der die vom Rover zurückgelegte Strecke bestimmt, der Encoder. Der gemessene Abstand vom Messgerät wird in das Modell im Subsystem mit der Bezeichnung Actual distance eingelesen. Öffnen Sie dieses Subsystem und beobachten Sie die verschiedenen Blöcke, aus denen es besteht.
Es gibt zwei Subsysteme: RightEncoder und LeftEncoder. Die Ausgänge dieser Subsysteme werden in einem Vektor angeordnet. Dann werden sie mit einer Konstanten multipliziert, um die Encoderwerte in Entfernung umzuwandeln. Die Konstante basiert auf den Eigenschaften des Systems, nämlich dem Radius des Rades. Das Ergebnis wird zu einem Durchschnitt berechnet und an den Verzerrungsausgang gesendet.
Die Blöcke RightEncoder und LeftEncoder lesen Zähldaten von den Encodern des Rades und wandeln diese in Grad um. Um Encodergrade in den von den Rädern bewegten Abstand umzuwandeln, werden die folgenden Gleichungen verwendet:
$dr=\frac{ 2\cdot \pi \cdot r \cdot RWD}{360};dl=\frac{2\cdot \pi \cdot r\cdot LWD}{360}$
Hier bezeichnen $dr$ und $dl$ die Entfernung, die durch das rechte bzw. linke Rad bewegt wird, und r ist der Radradius.
Navigieren Sie zurück zum obersten distanceClosedloop_hw Modell und beobachten Sie, wie der Fehler als Differenz zwischen gewünschter und tatsächlicher Entfernung berechnet wird. Dieser wird als Eingang für den PID-Regler verwendet.
Öffnen Sie den Block PID Controller und beachten Sie, dass standardmäßig ein einfacher P controller verwendet wird, da die Integral- und Ableitungsbegriffe ($Ki$ und $Kd$) beide Null sind.
Sie werden dies auf dem Rover mit dem external mode von Simulink testen. Im externen Modus erstellt Simulink aus dem Modell eine ausführbare Datei und lädt sie auf den Arduino. Die Verbindung mit Simulink bleibt erhalten, da die ausführbare Datei auf der Hardware läuft, so dass Sie Parameter einstellen und interessante Signale mit Hilfe von Scope Blöcken überwachen können. Weitere Informationen zum externen Modus finden Sie unter 2.3.2.2.2 Betreiben eines DC Motors unter "2.3 Simulink Getting Started".
Stellen Sie sicher, dass der Simulationsmodus auf Extern eingestellt ist und die Stoppzeit der Simulation 30 Sekunden beträgt.
Für die Bequemlichkeit und um Ihnen zu helfen, einige der Konzepte hinter der PID-Regelung zu erlernen, setzen Sie zunächst den Rover auf das Ziel oder eine andere Plattform, die es ermöglicht, dass sich die Räder frei drehen können. Ihr Rover muss über das USB-Kabel mit dem Computer verbunden sein, d.h. er kann sich nicht weit bewegen. Schalten Sie die Rover-Batterie ein, da die Motoren dort ihre Energie herbekommen.
Führen Sie das Simulink Modell aus. Nach dem Herunterladen des Codes auf den Arduino öffnet sich der Scope Block automatisch. Dies trägt dazu bei, die gewünschte und aktuelle Position zu visualisieren während die Datei ausgeführt wird.
Das Ergebnis des Scopes zeigt in diesem Fall den gewünschten Abstand in Gelb und den tatsächlichen Abstand in Blau. Sie können sehen, dass es eine kleine Diskrepanz zwischen ihnen gibt. PID-Regler versuchen, diese Fehler zu kompensieren.
Vergrößern Sie die x-Achse, um einen genaueren Blick auf die Sprungantwort zu werfen. Klicken Sie dazu auf die Lupe in der Symbolleiste und wählen Sie den Bereich, den Sie vergrößern möchten, indem Sie auf die Grafik klicken und sie wie unten gezeigt ziehen.
Die Zeit, die benötigt wird, um 90% des Sollwertes zu erreichen, heißt Anstiegszeit . Für P = 1 beträgt die Anstiegszeit ca. 1,25 Sekunden. Angesichts der spezifischen Eigenschaften des Rovers wird eine langsamere Anstiegszeit bevorzugt. Sie können den Rover in kleinen Bereichen einsetzen und im Allgemeinen will man nicht, dass sich der Rover zu schnell bewegt, da er sonst vom Boden abheben könnte. Das können Sie üben, indem Sie selbst mit dem Rover experimentieren.
Die folgende Referenztabelle zeigt, wie sich die Erhöhung der Gewinne P (Kp), I (Ki) und D (Kd) auf die wichtigsten Merkmale der Systemantwort auswirkt.
| Verstärkung erhöhen, um gewünschte Reaktion zu erhalten | Rise time | Overshoot | Steady-state error |
|---|---|---|---|
| P | Decrease | Increase | Decrease |
| I | Decrease | Increase | Decrease |
| D | Minimal Change | Decrease | No change |
Bitte beachten Sie, dass weder kein overshoot noch steady-state error(Überschwingen oder Schrittzustandsfehler )eingeführt wurde. Sie werden in den folgenden Abschnitten diskutiert.
Basierend auf der vorherigen Tabelle sollten Sie zur Erhöhung der rise time den P-Wert verringern. Ändern Sie den P-Wert im Controller Block auf 0. 01, wählen Sie OK und drücken Sie dann Run.
Dadurch wurde die Anstiegszeit auf 9 Sekunden erhöht und gleichzeitig der steady-state error (Schrittzustandsfehler) signifikant erhöht. Diese ist als Differenz zwischen Soll- und Istwert einer Variablen definiert, wenn das System ein Gleichgewicht erreicht hat.
Hinweis: Das Gleichgewicht wird auch als stationärer Zustand bezeichnet.
Hinweis: In einigen unserer Tests haben wir festgestellt, dass sich einer der Motore nicht frei dreht, was dazu führte, dass der stationäre Fehler größer als 5 war. In diesem Fall können Sie die Erkenntnisse von oben nutzen, um eine andere P-Verstärkung zu erzielen, die einen besseren stationären Fehler ergibt.
Basierend auf der Tabelle hilft das Hinzufügen eines Integral Terms zum Controller, den stationären Fehler zu verringern. Öffnen Sie den PID-Regler Block, wählen Sie PI in der Dropdown-Liste Regler und geben Sie einen integralen Verstärkungswert (I) von 0 ein. 002 . Es ist eine gute Faustregel, immer darauf zu achten, dass der P-Wert höher als der I-Wert ist.
Klicken Sie auf Apply und dann auf Run your Simulink model. Ihr Bereich sollte so aussehen.
Die Einführung des I-Wertes reduzierte stationäre Fehler signifikant, aber Sie können sehen, dass es noch einen weiteren Effekt eingeführt hat, genannt overshoot. Dieser overshoot wird auf ca. 6 cm gemessen. Dies ist in unserem Fall unerwünscht, da der Rover an der Zielposition vorbeifährt und dann beim Versuch, seine Position zu korrigieren, schwingt.
Unter Bezugnahme auf die Tabelle können Sie den P- und I-Wert erhöhen, um overshoot zu vermeiden.
Versuchen Sie, die P- und I-Werte mit Trial-and-Error zu erhöhen, bis Sie ein gutes Gleichgewicht zwischen rise time, Schrittzustand Fehler und oversthoot in Ihrem Modell erreichen.
Trennen Sie nun das an den PC angeschlossene USB-Kabel und bewegen Sie Ihren Rover auf den Boden, um zu überprüfen, wie die Steuerung funktioniert. Schließen Sie den Akku an und messen Sie, wie weit er sich bewegt. Bewegt er sich die erwarteten 25 cm?
Sie werden wahrscheinlich feststellen, dass es sich um eine Bewegung von 25 cm handelt, aber Sie müssen die PID-Werte an die neuen Betriebsbedingungen anpassen (d.h. die Räder sind nicht frei drehbar, wenn sie auf dem Boden stehen). Die genauen Werte hängen von der von Ihnen verwendeten Oberfläche ab. Bei mehreren Tests auf relativ harten, teppichbeschichteten Oberflächen wurde festgestellt, dass P = 0,2 und I = 0,001 einen guten Ausgangspunkt darstellen. In einigen Tests gaben diese Werte einen overshoot und Schrittzustand Fehler von jeweils etwa 0,2 cm an.
In der nächsten Übung werden Sie sehen, wie Sie Überschwemmungen und Schrittzustandsfehler durch logikbasierte Programmierung und Zustandsübergänge beseitigen können.
Hinweis: In einigen unserer Tests bewegte sich der Rover nie in einer geraden Linie, was auf den Unterschied bei den Motoren zurückzuführen ist. Sie werden in der nächsten Übung lernen, wie Sie dieses Problem angehen können.
Steuern Sie den Drehwinkel des Rovers mit einem PI-Regler
Dieser Abschnitt ergänzt den vorherigen, in dem es darum ging, dass sich der Rover über eine bestimmte Strecke in einer bestimmten Zeitspanne über eine Linie bewegt. In diesem Fall werden Sie sich darauf konzentrieren, eine ähnliche Kontrolle über die Drehbewegung des Rovers zu erlangen.
In der vorherigen Übung sahen Sie die Gleichungen, um Encodergrade in die zurückgelegte Entfernung umzuwandeln:
$dr=\frac{ 2\cdot \pi \cdot r \cdot RWD}{360};dl=\frac{2\cdot \pi \cdot r\cdot LWD}{360}$
Die Gleichung, um den vom Rover verschobenen Winkel zu erhalten, ist:
$angle=\frac{dr-dl}{L}$
Um den PI-Regler für den Drehwinkel des Rovers zu konstruieren, können Sie den gleichen Ansatz verwenden, der auch für die Steuerung der vom Rover bewegten Strecke verwendet wurde. Öffnen Sie das Modell angleClosedloop_hw:
>> angleClosedloop_hwSie können die Analogie zwischen diesem Modell und dem vorherigen sehen. In diesem Fall wird die Lineargeschwindigkeit konstant gehalten (Null), während die Drehgeschwindigkeit mit dem Block PID Controller gesteuert wird. Diesmal wird nicht der Abstand als Eingang verwendet, sondern der Winkel des Rovers. Diese Daten werden auch vom Encodersensor unter Verwendung der obigen Gleichung erhalten. Wenn Sie mehr darüber erfahren möchten, wie die Daten erfasst werden, öffnen Sie das Subsystem Actual angle und schauen Sie es sich genauer an.
Öffnen Sie den Block PID-Regler und notieren Sie die PI-Werte. Diese Werte von P = 3 und I = 1 waren ein guter Ausgangspunkt für die Tests, die wir bei der Versuchsplanung durchgeführt haben. In unserem Fall bewegte sich der Rover auf einer relativ harten, mit Teppichen ausgelegten Oberfläche. Beim Einsatz sollte sich der Rover in einem Kreis um sich selbst drehen und versuchen, 90 Grad zu erreichen.
Führen Sie das Modell mit Ihrem Rover auf dem Boden aus und stimmen Sie die PI-Werte nach Bedarf ab, bis Sie mit der Leistung unter den Bedingungen Ihres Versuchsaufbaus zufrieden sind, wie im vorherigen Abschnitt.
Review/Zusammenfassung
-
Wir haben gesehen, wie man PID-Regler entwickelt, um die Position und den Winkel des Rovers zu steuern.
-
Wir haben gesehen, wie man den externen Modus verwendet, um die Verstärkung von P, I und D durch Trial-and-Error in Simulink einzustellen und die Ergebnisse mit dem Scope Block zu überwachen.
FILES
-
distanceClosedloophw.slx
-
angleClosedloophw.slx
LEARN BY DOING
Implementieren Sie einen PID-Regler und verstehen Sie, wie sich der Differentialterm auf Ihre Reglerleistung auf verschiedenen Oberflächen auswirkt.
ÜBUNG 4:
5.4 Programmierung des Rovers, um Pfadanweisungen zu folgen
Nachdem Sie nun gelernt haben, wie man einen geschlossenen PID-Regler auf dem Rover implementiert, lassen Sie uns sehen, wie man den Rover dazu bringt, einer Reihe von Pfadanweisungen zu folgen. Simulink und Stateflow werden verwendet, um den Rover anzuweisen, eine bestimmte Strecke vorwärts zu fahren und sich um eine bestimmte Gradzahl zu drehen. Wir werden auch sehen, wie die Zustandslogik unerwünschte Effekte wie steady state error und overshoot Ihrer Steuerung beseitigen kann.
In dieser Übung werden Sie Folgendes lernen:
- Verwenden Sie bestimmte Zustände, um Ihren Rover so zu programmieren, dass er einer Reihe von Pfadanweisungen folgt.
- Verwenden Sie die Zustandslogik, um steady state error und overshoot Ihres PI-Reglers zu vermeiden.
- Verstehen Sie die Logik des Zustands.
Simulieren Sie den Rover nach einer Folge von Pfadanweisungen
Damit Sie mit dem Experimentieren beginnen können, wird ein Modell mit der Zustandslogik zur Verfügung gestellt, das zur Steuerung des Rovers erforderlich ist. Öffnen Sie zunächst das Modell kinEq_states_sim.slx:
>> kinEq_states_simDieses Modell führt eine Simulation der Bewegung des Rovers durch. Es hat die Subsysteme convToWheelVel und Rover Simulation sowie das StateLogic Diagramm. Die Ausgänge der Rover-Simulation, Entfernung und Winkel werden der Zustandslogik im Modell zugeführt, wodurch eine Rückkopplungsschleife entsteht.
Dieses Modell verwendet das gleiche convToWheelVel Subsystem aus früheren Übungen, um Radgeschwindigkeiten basierend auf der gewünschten Rover-Geschwindigkeit und Drehrate zu berechnen, die aus dem StateLogic Diagramm bereitgestellt werden.
Das Subsystem Rover Simulation hat eine Modifikation gegenüber den vorherigen Übungen. Funktionell ist es immer noch gleich, aber jetzt gibt es auch Werte für Roverabstand und Winkel aus.
Diese Werte (Abstand und Winkel) werden in das Stateflow Chart eingegeben, das durch das StateLogic Chart dargestellt wird. Dieses berechnet die Geschwindigkeit und die Rotationsrate des Rovers.
Bevor Sie das Diagramm öffnen, sollten Sie sich mit Stateflow vertraut machen. Stateflow ist ein Softwarepaket, das MATLAB und Simulink um Werkzeuge zur Modellierung von Logik und ereignisgesteuerten Systemen erweitert. Dieses Beispiel stellt wesentliche Aspekte von Stateflow im Rahmen des Rover-Projekts vor. Wenn Sie Stateflow weiter erkunden möchten, können Sie sich das Stateflow Übersichtsvide und andere dazugehörige Videos.
Öffnen Sie das StateLogic Diagramm mit einem Doppelklick. Sie werden eine andere Art von Blockdiagramm sehen, in dem die verschiedenen Schritte, die auf dem Rover auszuführen sind, in abgerundeten Kästen angezeigt werden. Diese werden states genannt und werden sequentiell angezeigt. Sie haben eine Übergangsbedingung, die durch einen Pfeil am Ausgang jeder Box angezeigt wird. Diese verschiedenen Ereignisse können entweder zeitlicher Natur sein (z.B. Verlassen des Blocks nach einer bestimmten Zeit) oder boolesche Anweisungen (z.B. Vergleich verschiedener Variablen mit einer Konstanten).
Dieses Stateflow Diagramm hat fünf Zustände, die jeweils einer Betriebsart des Rovers entsprechen. Wenn activ, wird der Inhalt des Zustands sequentiell ausgeführt.
Der Rover befindet sich zu Beginn der Simulation im Zustand StopFirst. In diesem Zustand werden die Rover-Geschwindigkeit und -Drehzahl auf Null gesetzt, so dass sich der Rover nicht bewegt.
Dieser Zustand wird inaktiv, wenn die Übergangsbedingung erfüllt ist, in diesem after(1, sec). Die Übergangsbedingung wird bei jedem Zeitschritt der Simulation getestet, der durch die Abtastzeit gekennzeichnet ist.
Eine Sekunde nach der Simulation geht der Rover in den Zustand MoveForward über, wo er eine bestimmte Strecke vorwärts fährt. Der entry Aktion wird unmittelbar nach Eintritt in diesen Zustand ausgeführt, und hier wird der desDist auf 30 cm gesetzt. Die Eingangsbedingung kann als "Setup"-Code für jeden Zustand betrachtet werden; der entry Code läuft vor allem anderen in der Grafik angeführten, sobald der Zustand aktiv wird.
Nach der entry Phase und solange dieser Zustand aktiv ist, werden die Befehle in der Aktion during ausgeführt. Der Code für during kann als Basis einer "for"Loop betrachtet werden. Wenn der Zustand dann inaktiv wird, werden die Exit-Befehle ausgeführt. Die Simulink Function distCtrl wird aufgerufen, die den in der vorherigen Übung entwickelten PI-Regler implementiert. Eine Simulink Funktion ist eine Funktion, die über Simulink Blöcke definiert ist und zu jedem Zeitpunkt aus Stateflow Diagrammen oder anderen Simulink Modellen aufgerufen werden kann.
Zum Übergang aus dem MoveForward Zustand muss die nächste Übergangsbedingung erfüllt sein: abs(desDist - dist) < 0.1
Dies legt fest, dass der Rover, wenn er innerhalb von 0,1 cm des gewünschten Abstandes liegt, in den nächsten Zustand übergehen soll. Beachten Sie, dass, wenn Ihr PID-Regler overshoot im Abstandsverhalten des Rovers erzeugt, diese eliminiert wird, da der Rover beim ersten Mal, wenn er innerhalb von 0,1 cm zum gewünschten Abstand kommt, in den nächsten Zustand übergeht, und jegliches Schwingungsverhalten eliminiert wird.
Nach 30 cm vorwärts ist der nächste Zustand des Rovers Pause. Der Rover ist in diesem Zustand stationär, aber nur für 1 Sekunde, wenn die nächste Übergangsbedingung erfüllt ist.
Nach Pause geht der Rover in den Kurvenzustand. Dieser Zustand ist wie der MoveForward Zustand, nur dass der Rover anstatt 30 cm vorwärts zu fahren, angewiesen wird, sich um 180 Grad zu drehen. Dieser Zustand verwendet die Simulink Function angCtrl, die den PI-Regler implementiert, der im Modell angleClosedloop_hw entworfen wurde. Sobald der Rover-Winkel innerhalb von 0,1 Grad des gewünschten Winkels liegt, wechselt der Rover in den Stop Zustand.
Führen Sie eine Simulation des Modells durch, um zu sehen, wie der Rover durch die Zustände voranschreitet. Klicken Sie dazu im Diagramm StateLogic auf die Schaltfläche Ausführen in der Symbolleiste, wie in der folgenden Abbildung dargestellt.
Zu Beginn der Simulation sehen Sie die verschiedenen Zustände hervorgehoben, wenn sie aktiv werden.
Programmierung des aktuellen Rover, um Pfadanweisungen zu folgen
Nachdem Sie das Verhalten des Rovers simuliert haben, um der Reihenfolge der Anweisungen zu folgen, stellen wir die Anwendung auf den aktuellen Rover um. Verbinden Sie Ihren Rover über das USB-Kabel mit dem PC und öffnen Sie das Modell roverClosed_states_hw.slx, indem Sie Folgendes eingeben:
>> roverClosed_states_hwDiesmal hat das Modell die Motoren auf der rechten Seite und die Winkel- und Abstandsinformationen werden in das Stateflow Diagramm auf der linken Seite des Diagramms eingegeben.
Dieses Modell ist wie das Simulationsmodell, hat aber einige wesentliche Unterschiede:
- Die Eingabe in das StateLogic Diagramm ist nun der tatsächliche Abstand und Winkel des Rovers, gemessen von den Encodern.
- Die im Subsystem convToWheelVel berechneten Drehzahlen ($\omega_l$ ,$\omega_r$) sind die Eingaben für die eigentlichen Motoren.
Bevor Sie dieses Modell auf dem Rover betreiben, passen Sie die PI controller gains inside StateLogic an Ihre Designs aus der vorherigen Übung an.
Klicken Sie auf die Schaltfläche Deploy to Hardware, um den Code auf den Arduino MKR1000 zu laden.
Sobald die Übertragung abgeschlossen ist, stellen Sie den Rover auf den Boden und schalten Sie ihn mit den Batterien ein. Beobachten Sie, wie genau Ihr Rover die im Diagramm StateLogic angegebene Reihenfolge einhält.
Hinweis: Wenn sich Ihr Rover nicht geradlinig bewegt oder sich in diesen Zuständen an Ort und Stelle dreht, kann dies daran liegen, dass sich die Betriebsbedingungen gegenüber den Experimenten zur Motorcharakterisierung geändert haben. Sie könnten eine der folgenden Möglichkeiten nutzen:
- Laden des Akkus auf die ursprüngliche Spannung
- LeAbkühlen der Motoren
- Aktivieren beider Controller während der Roverbewegung
Wir haben ein vorgefertigtes Modell zur Verfügung gestellt, das zeigt, wie man beide Controller aktiviert. Um dieses Modell zu öffnen, geben Sie roverClosedBoth_states_hw.slx im MATLAB Command Window ein. In diesem Modell untersuchen Sie die Zustände MoveForward und Turn im StateLogic Diagramm, um die Implementierung zu verstehen. Denken Sie daran, dass Sie auch den externen Modus verwenden können, um jedes Problem zu debuggen, auf das Sie stoßen.
Review/Zusammenfassung
-
Wir haben gesehen, wie man Zustände verwendet, damit Ihr Rover einer Pfadsequenz folgt.
-
Wir haben gesehen, wie man Zustände verwendet, um Ihren Controller zu deaktivieren, wodurch Überschwinger und stationäre Fehler des Controllers beseitigt werden.
FILES
-
kinEq_statessim.slx
-
roverClosed_states_hw.slx
-
roverClosedBoth_states_hw.slx
LEARN BY DOING
Erweitern Sie die im StateLogic Chart angegebenen Pfadanweisungen und beobachten Sie, wie sich der Rover verhält.
ÜBUNG 5:
5.5 Ortsbestimmung zur Berechnung der Roverposition
Bei der Arbeit mit Rovern ist es oft wichtig, deren Standort zu kennen, während sie sich bewegen. Diese Übung zeigt, wie man eine Webcam mit einem Lokalisierungsalgorithmus verwendet, um die Position und den Kurs des Rovers zu berechnen. Um sicherzustellen, dass der Rover im Sichtfeld der Webcam bleibt, wird die Bewegung des Rovers innerhalb einer bestimmten "Arena" eingeschränkt. Beginnen Sie mit dem Bau der Arena und führen Sie dann einige Kalibrierschritte durch, um die für Ihre Einrichtung spezifischen Bedingungen zu berücksichtigen (z.B. Beleuchtung oder Standort der Webcam in Bezug auf die Arena). Dann werden Sie lernen, wie der Lokalisierungsalgorithmus funktioniert und ihn verwenden, um die Position und den Kurs des Rovers innerhalb der Arena zu berechnen. Dies wird auch verwendet, um das Ziel zu lokalisieren, das der Rover mit seinem Gabelstapler bewegt.
In dieser Übung werden Sie Folgendes lernen:
- Richten Sie die Betriebsumgebung des Rovers ein und kalibrieren Sie sie.
- Verwenden Sie die Lokalisierung, um die Position und Ausrichtung des Rovers zu berechnen.
Bau einer Arena für den Rover
Das folgende Bild zeigt eine exemplarische Arena für den Rover, die aus einem Whitepaper und einem schwarzen Marker besteht. Auf dem Bild sehen Sie auch den Rover. Dies kann Ihnen eine Vorstellung von den Proportionen geben und darüber, wie groß oder klein Ihre Arena sein kann.
Die Hauptanforderung an Ihre Arena ist, dass sie einen weißen Hintergrund haben muss. Sie können mit einem weißen Poster oder mit mehreren zusammengehefteten Blättern bauen.
Die Größe der Arena ist flexibel, muss aber in das Sichtfeld Ihrer Webcam passen. Der Lokalisierungsalgorithmus erfordert, dass die Webcam mindestens 100 cm (ca. 3,5 Fuß) über der Arena platziert wird. Richten
Sie Ihre Webcam über dem Bereich ein, in dem Sie Ihre Arena bauen. In Matlab rufen Sie den Videofeed auf, indem Sie die folgenden Befehle ausführen:
>> cam = webcam('USB2.0 PC CAMERA');>> preview(cam)Hinweis: Für die Ausführung dieser Befehle muss das MATLAB Support Package für USB-Webcam installiert sein. Siehe Abschnitt 1.3.4 MATLAB und SImulink Installation
Passen Sie die Position der Webcam sowie die Größe und Platzierung der Arena an, bis sie in das Sichtfeld passt, wie im Bild unten gezeigt.
Sie können größere Arenen aufnehmen, wenn Sie die Webcam weiter weg bewegen. Jedoch wird zu einem bestimmten Zeitpunkt die Genauigkeit des Lokalisierungsalgorithmus beeinträchtigt. Aus früheren Tests ging hervor, dass eine Arenengröße von 75 cm x 75 cm, die sich innerhalb von 450 cm (ca. 15 Fuß) von der Webcam befindet, gut funktioniert.
Wenn Sie Ihre Arena bauen, achten Sie darauf, dass der weiße Hintergrund über die tatsächliche Größe der Arena hinausgeht. Nach unseren Erfahrungen ist für den Bildverarbeitungsalgorithmus ein zusätzlicher Rand von ca. 5 cm erforderlich. Dadurch wird sichergestellt, dass zwischen dem Fußboden und der Arena ein gewisser Puffer vorhanden ist.
Markiere die Ecken der Arena, die Mittelpunkte aller Kanten und den gesamten Mittelpunkt mit einem X, das aus mindestens 100 cm Entfernung sichtbar ist (wie im Bild gezeigt). Hier wurde ein schwarzer Marker verwendet.
Vergewissern Sie sich noch einmal, dass sich die Webcam mindestens 100 cm über der Arena befindet und sich die gesamte Arena im Sichtfeld befindet. Der nächste Schritt ist die Kalibrierung des Bildverarbeitungsalgorithmus.
Kalibrierung der Arena und des Umfeldes
Das roverCalibration Skript besteht aus fünf Schritten, um die vom Lokalisierungsalgorithmus benötigte Kalibrierung durchzuführen. Öffnen Sie das Skript und führen Sie die einzelnen Schritte aus.
>> edit roverCalibrationHinweis: Der Kalibrierungsprozess muss bei jeder Änderung der Webcam/Arena-Einrichtung, einschließlich der Lichtverhältnisse neu durchgeführt werden. Es ist eine zeitaufwändige Aufgabe, daher wird empfohlen, mit der Ausführung dieses Programms zu warten, bis Sie mit Ihrem Setup vertraut sind. Hier ist eine Schritt-für-Schritt-Anleitung, wie der Kalibriervorgang durchgeführt wird.
Der Abschnitt "Step 1: Prepare the MATLAB Workspace" des Skripts hilft beim Löschen vorhandener Variablen und beim Schließen offener Figuren. Klicken Sie auf Ausführen und Erweitern, um diesen Code auszuführen und zum nächsten Abschnitt zu gelangen.
Damit die Kalibrierung funktioniert, muss der Algorithmus die Abmessungen der Arena kennen. Geben Sie die Höhe und Breite Ihrer Arena in " Step 2: Enter the arena's dimensions " wie unten gezeigt ein. Die Einheiten müssen in Zentimetern angegeben werden.
Klicken Sie nach der Eingabe der Abmessungen auf Run und Advance.
In " Step 3: Initialize the webcam and compute the transformation that gives the orthogonal view, " wird die Webcam initialisiert. Später wird die Transformation berechnet, die die orthogonale Ansicht des Rovers ergibt. Um Ihre Webcam auszuwählen, können Sie die diese im Live-Skript wie unten gezeigt auswählen.
Betrachten wir nun den Transformationsabschnitt dieses Schrittes. Normalerweise ist es schwierig, die Webcam direkt über der Arena zu platzieren, und stattdessen wird die Kamera dort platziert, wo sie Bilder aus einem gewissen Abwärtswinkel aufnimmt. Die Bildverarbeitung kann verwendet werden, um das Bild zu korrigieren. Das macht es unseren Lokalisierungsalgorithmus einfacher, die Position zu berechnen. Führen Sie diesen Abschnitt aus, indem Sie auf die Schaltfläche Run und Advance klicken, um zu sehen, welche Auswirkungen dies auf das Bild hat. Befolgen Sie die Anweisungen im MATLAB Command Window.
Das Webcam-Bild wird angezeigt. Um die Transformation des Bildes zu berechnen, klicken Sie auf die vier Ecken der Arena im Bild.
Wichtig: Stellen Sie sicher, dass sich der Rover in der Arena befindet. Wenn nicht, müssen Sie diesen Abschnitt des Codes noch einmal mit dem Rover in der Arena ausführen.
Wenn Sie sich das transformierte Bild ansehen möchten, führen Sie in MATLAB den folgenden Befehl aus:
>> imshow(orthoImg)Hinweis: Es ist üblich, dass bei orthogonal gedrehten Bildern in diesem Projekt fehlende Bildteile vorhanden sind. Dies sind die schwarzen Abschnitte am unteren Rand des obigen Bildes.
Da die Webcam Bilder aus einem Winkel aufnimmt, ändert sich die Höhe des Rovers über verschiedene Entfernungen unterschiedlich. Schritt 4 wurde in "Step 4a Compute the location offset for the rove " (Berechnen des Positionsversatzes für den Rover) und "Step 4b: Compute the location offset for the target" (Berechnen Sie den Positionsversatz für das Ziel) aufgeteilt. In Schritt 4a werden Sie Bilder des Rovers an den vier Rändern der Arena (TOP, BOTTOM, LINKS und RECHTS, wie in der folgenden Bildserie gezeigt) aufnehmen, um dies zu berücksichtigen.
OBEN
UNTEN
LINKS
RECHTS
Führen Sie den ersten Abschnitt von Schritt 4a des Live-Skripts aus, indem Sie auf Run Section klicken, und platzieren Sie den Rover dann wie in den in MATLAB angezeigten Eingabeaufforderungen beschrieben.
Im nächsten Abschnitt des Codes arbeitet die Funktion calibrateLocationOffset mit den Bildern, die Sie gerade aufgenommen haben. Das aufklappende Bild zeigt eine klare Visualisierung, wie die Höhenunterschiede zwischen den verschiedenen Bildtiefen der Kamera ausgeglichen werden. Klicken Sie auf die in den Popup-Figuren angegebenen Punkte (Mitte des Rovers und Mitte der Scheibe), um die Offsets zu berechnen.
Klicken Sie nun auf den Abschnitt " Compute the offsets of the rover“ (Berechnen der Offsets des Rovers) und dann auf Run and Advance, um alle notwendigen Aufgaben auszuführen.
Als nächstes wiederholen wir diese Aufgaben für das Target in Schritt 4b. Klicken Sie erneut auf die Schaltfläche Run and Advance und folgen Sie den in MATLAB angezeigten Anweisungen.
Führen Sie den nächsten Abschnitt mit dem Titel "Compute the location offset for the target“ aus, wo Sie den Rover gemäß den Anweisungen im MATLAB Command Window an verschiedenen Stellen platzieren und dann auf die Stellen klicken, an denen das Target platziert wurde, gefolgt von der Mitte des Targets im Bild. Die Lokalisierungsergebnisse hängen stark von diesen Schritten ab und können zu Problemen führen, wenn die Kalibrierung nicht korrekt durchgeführt wird. In diesem Abschnitt des Live-Skripts wird ein Beispielbild angeboten.
In "Step 5: Calibrate the color threshold of the disc“ (Kalibrieren des Farbschwellenwertes der Disc) sehen Sie, wie Sie die Beleuchtung berücksichtigen können. Klicken Sie auf diesen Abschnitt des Codes, wählen ihn aus und klicken Sie auf Run this section of code. Achten Sie darauf, dass Sie auf dem angezeigten Bild in der folgenden Reihenfolge auf die Kreise klicken: Zuerst rot, dann grün und dann blau.
Hinweis: Nachdem Sie die Kreise angeklickt haben, sollten Sie die ENTER-Taste drücken, um Ihre Auswahl zu bestätigen.
Damit haben Sie nun die Parameter kalibriert, um eine orthogonale Ansicht des Rovers zu erhalten, um eventuelle Positionsversätze innerhalb dieser Ansicht zu korrigieren und zu berücksichtigen, wie die Beleuchtung die RGB-Werte für Farben beeinflussen kann. Alle Kalibrierdaten werden gespeichert und bei der Ausführung der Lokalisierungsskripte wiederverwendet.
Ortung des Rovers und des Ziels
Nachdem Sie die Kalibrierung abgeschlossen haben, sehen wir, wie wir mit dem Lokalisierungsalgorithmus die Position und den Kurs des Rovers innerhalb der Arena in fünf einfachen Schritten berechnen können. Öffnen Sie das Live-Skript roverLocalization.mlx:
>> edit roverLocalizationLassen Sie uns "Step 1: Prepare the MATLAB Workspace" dieses Live-Skripts ausführen, um den Workspace zu bereinigen und die zuvor erzeugten Kalibrierdaten zu laden.
Geben Sie die Abmessungen Ihrer Arena in "Step 2: Enter the arena's dimension and calculate conversion factor" (Abmessungen der Arena und Berechnung des Umrechnungsfaktors) und führen Sie diesen Codeabschnitt aus. Der in diesem Abschnitt berechnete Umrechnungsfaktor bezieht sich auf die realen Abmessungen der Arena in Zentimetern und die Anzahl der Pixel im Bild. Dies wird erreicht, indem man die physikalischen Arena-Messungen mit der entsprechenden Anzahl von Pixeln aus dem Bild teilt.
Wählen Sie unter "Step 3: Initialize the webcam" die entsprechende Webcam aus den vorgeschlagenen aus und führen Sie diesen Codeabschnitt zur Initialisierung der Webcam aus.
Der folgende Abschnitt, genannt "Schritt 4a: Get the location and heading of the rover," verwendet die Kalibrierdaten, um die Position und den Kurs des Rovers innerhalb des Bildes zu bestimmen. Nachfolgend ein Ablaufplan dargestellt, der einen Überblick über den Lokalisierungsalgorithmus selbst gibt.
Line-by-Line-Erklärung: roverPosAng Funktion
Um die Rover-Position und die Richtung aus dem orthogonalen Bild zu erhalten, haben wir die Funktion roverPosAng erstellt.
Diese Funktion berechnet die Roverposition (x,y) und die Richtung (heading). x und y werden in
Pixelkoordinaten zurückgegeben.
function [x,y,heading] = roverPosAng(IMG,P)Erstellen Sie ein scheibenförmiges Strukturierungselement mit der strel Funktion. Ein strukturierendes
Element ist eine Schlüsselkomponente morphologischer Operationen. Es stellt eine binär bewertete
Nachbarschaft von Pixeln dar, in der die wahren Pixel in die morphologische Berechnung einbezogen werden
und die falschen Pixel nicht. Nach der Erstellung des Strukturierungselements wenden Sie den
RGB-Schwellenwert basierend auf den Kalibrierdaten im Vektor P an.
% Create a disk object (will be used to clean up the image) and apply the RGB threshold values for the image
delta = 20;
s = strel('disk',3);
threshR = P(1,:) + delta.*[-1 1 1];
threshG = P(2,:) + delta.*[1 -1 1];
threshB = P(3,:) + delta.*[1 1 -1];
% Threshold each channel of the image
Rin = IMG(:,:,1) > threshR(1) & IMG(:,:,2) > threshR(2) & IMG(:,:,3) > threshR(3);
Gin = IMG(:,:,1) > threshG(1) & IMG(:,:,2) > threshG(2) & IMG(:,:,3) > threshG(3);
Bin = IMG(:,:,1) > threshB(1) & IMG(:,:,2) > threshB(2) & IMG(:,:,3) > threshB(3);Verwenden Sie das strel Objekt s, um Rauschen aus den Schwellenbildern zu entfernen. Jede Bereich mit
einem Radius von weniger als 3 Pixeln gilt als Rauschen.
% Remove RGB points that do not have a radius of 3 pixels
Rf = imopen(Rin,s);
R = imclose(Rf,s);
Gf = imopen(Gin,s);
G = imclose(Gf,s);
Bf = imopen(Bin,s);
B = imclose(Bf,s);Finden Sie die Zentren der drei farbigen Kreise auf dem Marker und verwenden Sie diese, um die Mitte der
Scheibe zu bestimmen.
% Get the red centroid
sR = regionprops(R,'centroid');
cR = sR.Centroid;
% Get the green centroid
sG = regionprops(G,'centroid');
cG = sG.Centroid;
% Get the blue centroid
sB = regionprops(B,'centroid');
cB = sB.Centroid;
% Determine where the center of the rover's colored wheel is located
cPlate = (cR + cG + cB)/3;Berechnen Sie den Kurs des Rovers basierend auf der roten Markierung, die mit der Vorwärtsrichtung des
Rovers übereinstimmt. Verwenden Sie das Konzept der Quadranten, da atand verwendet wird.
%% Heading calculation (Getting the orientation of the rover)
thetaRC = atand((cPlate(2) - cR(2)) / (cPlate(1) - cR(1)));
% Add 180 offset if red marker lies to the left of center, given the
% conventions noted earlier.
if cR(1) >= cPlate(1) && cR(2) > cPlate(2)
heading = 180 - abs(thetaRC);
elseif cR(1) > cPlate(1) && cR(2) > cPlate(2)
heading = abs(thetaRC);
elseif cR(1) >= cPlate(1) && cR(2) > cPlate(2)
heading = 180+ abs(thetaRC);
elseif cR(1) > cPlate(1) && cR(2) > cPlate(2)
heading = 360 - abs(thetaRC);
endAusgabe von x, y und heading (Richtung)
% Output the heading and (x,y) coordinates of the rover
x = cPlate(1);
y = cPlate(2);
if heading > 360
heading = heading - 360;
endWeitere Informationen finden Sie unter roverPosAng und getLocation Funktionen. Lassen Sie uns Run und vorankommen.
In "Step 4b: Get the location of the target" (Ermitteln der Position des Ziels) wird die Position des Ziels anhand der Kalibrierdaten berechnet. Lassen Sie uns diesen Codeabschnitt ausführen.
Nachdem Sie nun die Standort- und Kursinformationen von Rover und Ziel haben, führen Sie "Step 5: Visualize Results" (Ergebnisse visualisieren) aus, um die Ergebnisse zu veranschaulichen, die das eigentliche Bild überlagern.
Wenn Sie diesen Code ausführen, sollten Sie ein Bild sehen, das die gesamte Szene mit dem Rover, dem Ziel und der Arena anzeigt:
Troubleshooting Tipps
Bei der Kalibrierung der RGB-Werte in der roverCalibration kann es dazu kommen, dass obwohl Sie Sie die Punkte in der richtigen Reihenfolge auswählen, der Algorithmus vorgibt, dass die Reihenfolge falsch ist. Versuchen Sie in dem Fall, das Live-Skript unter verschiedenen Lichtverhältnissen erneut auszuführen. Wenn das Bild in MATLAB übersättigt oder extrem hell/dunkel erscheint, kann dies die RGB-Farbkalibrierung beeinträchtigen.
Verwenden Sie den folgenden Dokumentationslink, um weitere Informationen darüber zu finden, wie Sie die Eigenschaften des Webcam-Objekts anpassen und die Bildqualität verbessern können: https://www.mathworks.com/help/supportpkg/usbwebcams/ug/set-properties-for-webcam-acquisition.html
Wenn Sie bei der Ausführung von roverLocalization eine Fehlermeldung wie die folgende erhalten, konnte der Algorithmus keinen Schwerpunkt für den Rover finden.
Um dies zu überwinden, gibt es folgende Möglichkeiten:
- Führen Sie den letzten Abschnitt des Kalibrieralgorithmus erneut aus, um neue RGB-Schwellenwerte zu erhalten. Schlechte Lichtverhältnisse oder plötzliche Änderungen der Beleuchtung können die Leistung des Algorithmus beeinflussen.
- Passen Sie die Größe des strel Objekts auf Zeile 5 der roverPosAng Funktion an.
Wenn Sie eine ähnliche Fehlermeldung von der Funktion targetPos erhalten, versuchen Sie Folgendes:
- Anpassung der Konstanten, mit denen das Bild auf Zeile 18 von targetPos eingestellt wird. Bestimmte Lichtverhältnisse können dazu führen, dass ein akzeptabler Schwellenwert für schwarze Objekte höher oder niedriger als die voreingestellten Werte sein müssen.
- Anpassen der Größe des Strel-Objekts auf Zeile 5 der targetPos Funktion.
Wenn die Koordinaten des Rovers oder Ziels in der RoverLokalisierung nicht korrekt sind, stellen Sie sicher, dass die von Ihnen eingegebenen Werte arenaHeight und arenaWidth korrekt sind. Wenn die Abmessungen nicht übereinstimmen, können Sie die richtigen Koordinaten in Pixeln, aber falsche Koordinaten in Zentimetern erhalten.
Review/Zusammenfassung
- Wir haben gesehen, wie man die Arena einrichtet und für verschiedene Parameter kalibriert.
- Wir haben gesehen, wie man die Lokalisierung durchführt, um die Position und Ausrichtung des Rovers zu berechnen.
FILES
-
roverCalibration.mlx
-
roverLocalization.mlx
LEARN BY DOING
Führen Sie die RoverCalibration aus und beobachten Sie, wie sich die Offsetwerte der Position auf die Genauigkeit des Lokalisierungsalgorithmus auswirken. Versuchen Sie, Punkte auszuwählen, die etwas von den gewünschten Punkten entfernt sind.
Versuchen Sie, die Größe des Strel Objekts zu ändern, das von der Funktion targetPos und roverPosAng verwendet wird. Um zu verstehen, wie die Strel Funktion in unseren Algorithmen hilft, geben Sie den folgenden Befehl in MATLAB ein:
>> doc strelUm die Genauigkeit zu verbessern, muss die Größe dieses Objekts je nach Konfiguration geändert werden. Der Datencursor macht das Messen der Pixelgröße verschiedener Objekte im Bild sehr einfach, da er den genauen Wert des Pixels liefert. Sie können den Datencursor aktivieren, indem Sie auf die Schaltfläche klicken, die im Screenshot unten gezeigt wird.
ÜBUNG 7:
5.7 Den Rover über Wi-Fi steuern
In der vorherigen Übung haben Sie gesehen, wie Sie einen Lokalisierungsalgorithmus anwenden können, um die anfängliche Position und Ausrichtung des Rovers zu berechnen, und wie Sie diese Informationen in den Wegplanungsalgorithmus integrieren können. Im Allgemeinen ist es auch wünschenswert, die Lokalisierung in regelmäßigen Abständen durchzuführen, während sich der Rover bewegt, um die aus den Encoderdaten berechneten Standortinformationen zu ergänzen.
Diese Übung zeigt, wie Sie Ihr Simulink Modell so konfigurieren, dass es Daten von MATLAB über Wi-Fi empfängt. Sie erfahren auch, wie Sie Daten aus MATLAB an Ihren Rover senden können. Diese Daten basieren dann auf der aktuellen Position des Rovers, die über die Lokalisierung berechnet wurde. Dadurch können Sie mit einem Rover arbeiten, dessen Wegpunkte sich im Laufe der Zeit ändern können, wenn Sie die von der Kamera erhaltenen Lokalisierungsinformationen berücksichtigen. Mit anderen Worten, Sie müssten den Rover nicht jedes Mal neu programmieren, wenn sich die Ausgangsbedingungen ändern, da er mit der Kamera den Algorithmus in Echtzeit speist.
In dieser Übung werden Sie Folgendes lernen:
- Senden von Anweisungen aus MATLAB per Wi-Fi an den Rover.
- Aufbau einer Wi-Fi-Kommunikation zwischen Rover und MATLAB.
- Nutzung der Lokalisierung, um die Position des Rovers zu berechnen, während er sich bewegt.
Wi-Fi-Daten in Ihrem Simulink Modell empfangen
Lassen Sie uns zunächst roverReceive_hw.slx öffnen:
>> roverReceive_hwDies ist ein einfaches Modell, das zeigt, wie Sie Anweisungen an den Rover über Wi-Fi senden können. Es verwendet Subsysteme und Blöcke, mit denen Sie vertraut sind, zur Berechnung von Radgeschwindigkeiten und zur Ansteuerung von Motoren.
Neu ist jedoch, dass dieses Modell Daten zur Steuerung des Rovers verwendet, die über Wi-Fi eingehen. Dabei ist es egal ob er vorwärts oder rückwärts fahren oder anhalten und ob er den Gabelstapler bewegen soll oder nicht. Die Blöcke moveForward und FLangle steuern die drahtlose Kommunikation zum und vom Rover. Öffnen Sie den mit moveForward bezeichneten Block, um zu sehen, wie dies konfiguriert ist.
Dieser Block ermöglicht die Eingabe von Daten vom Typ Data type und von der Größe Data size (N) am Lokalen IP-Port. Die Daten werden in Abständen von 0,01 Sekunden gelesen, wie durch die Sample time bestimmt. Der hier verwendete Lokale IP Port Wert ist der Standardwert. Da es mehrere Wi-Fi Blöcke gibt, werden diese mit unterschiedlichen Werten gesetzt.
Daten, die an diesen Block gesendeten sind, sind entweder 0 oder 1. Wenn der Eingang 1 ist, bewegt sich der Rover mit 10 cm/s vorwärts. Er bewegt sich nicht, wenn der Eingang 0 ist.
Der andere Wi-Fi receive Block mit der Bezeichnung FLangle steuert den Stapler, um von der UP-Position nach DOWN zu fahren.
Es gibt noch einen letzten Schritt zur Wi-Fi-Konfiguration, bevor Sie dieses Modell auf dem Rover einsetzen. Sie müssen die Wi-Fi-Eigenschaften dieses Modells so konfigurieren, dass der Rover eine IP-Adresse erhält, die zur Kommunikation verwendet werden kann. Klicken Sie dazu auf das Zahnradsymbol.
Öffnet den Dialog Configuration Parameters. Um Ihr Modell zu konfigurieren, klicken Sie auf Hardware Implementation > Target hardware resources > WiFi properties.
Geben Sie die SSID und das WPA-Passwort des drahtlosen Netzwerks ein. Diese sind die gleichen wie die, die Sie verwenden würden, um Ihren Laptop oder Ihr Smartphone mit dem Wi-Fi-Netzwerk zu verbinden. Sie benötigen dazu natürlich ein funktionierendes Wi-Fi-Netzwerk, das in dem Raum arbeitet, in dem Sie experimentieren. An dieser Stelle ist es nicht möglich, die Access-Point Funktionalität des MKR 1000 in Ihrem Kit zu nutzen, um ein eigenes Netzwerk aufzubauen.
Das Modell ist nun so eingerichtet, dass der Rover Befehle über Wi-Fi von MATLAB empfangen kann. Lassen Sie uns zu MATLAB übergehen, um zu sehen, wie man Befehle über Wi-Fi sendet.
Senden von Befehlen von MATLAB an den Rover über Wi-Fi
Beginnen Sie mit dem Öffnen von commandRover.mlx:
>> edit commandRoverLassen Sie uns den Code analysieren, um zu sehen, wie er funktioniert. Einige der Code-Abschnitte sollten erst nach der Bereitstellung der Simulink-Anwendung auf dem Rover ausgeführt werden, also lassen Sie uns vorerst einfach verstehen, was der Code tut. Später dann kann er in der Übung ausgeführt werden.
Die ersten drei Schritte führen die notwendigen Einstellungen für den Lokalisierungsalgorithmus durch, einschließlich des Ladens von Kalibrierungsdaten, der Eingabe von Arena-Informationen und der Initialisierung der Webcam. Sie können auf die vorherigen Übungen zurückgreifen, wenn Sie weitere Informationen über ihre Funktionsweise benötigen. Diese wurden da ausführlich erklärt.
In "Step 4: Get the location of the Rover" wird der Lokalisierungsalgorithmus aufgerufen, um den Standort und die Richtung des Rovers zu berechnen und die Ergebnisse in cmRoverInitial zu speichern. Die gewünschte y-Lage des Rovers ist als Anfangsposition plus 30 cm angegeben.
Nachdem Sie die Anfangsposition des Rovers und die gewünschte Endposition festgelegt haben, können Sie die Wi-Fi-Kommunikation mit dem Rover einrichten. Erstellen Sie zunächst mit der Funktion tcpip Objekte, die die Verbindung zwischen MATLAB und den IP-Ports darstellen, die den Blöcken moveForward und FLangle in roverReceive_hw.slx entsprechen.
Hinweis: Sobald diese Objekte erstellt sind, können Sie mit fwrite Daten an die angegebenen IP-Ports senden.
Im Abschnitt "Step 6: Move forward and drop the forklift" werden die Daten von MATLAB an die eingesetzte Simulink-Anwendung über Wi-Fi gesendet. Dieser Schritt beginnt mit der Definition einer Variablen moveFlag, die als Eingabe für den moveForward Block verwendet wird. Wenn moveFlag gleich 1 ist, bewegt sich der Rover vorwärts in y-Richtung mit 10 cm/s, und wenn es gleich 0 ist, bewegt sich der Rover nicht.
moveFlag wird zunächst auf 1 gesetzt und mit Hilfe einer bedingten Logik wird der Rover angewiesen, weiter vorwärts zu fahren, bis die y-Lage des Rovers (berechnet durch den Lokalisierungsalgorithmus, der einmal pro Sekunde läuft) näher als 1 cm von an der gewünschten y-Lage liegt
Sobald das Kriterium erfüllt ist, passieren zwei Dinge:
- moveFlag wird auf 0 gesetzt, so dass der Rover nicht mehr vorwärts fährt.
- Eine for-Schlaufe wird verwendet, um den Gabelstapler von der Position UP (125 Grad) in die Position DOWN (0 Grad) zu bewegen.
Zusammenfassend lässt sich sagen, dass der MATLAB-Code über Wi-Fi-Kommunikation den Rover anweist, sich zum gewünschten y-Punkt zu bewegen und dann den Gabelstapler abzusenken.
Steuern des Rovers aus MATLAB über WiFi
Nachdem Sie sich mit den Simulink Modellen und dem MATLAB-Code vertraut gemacht haben, beginnen wir nun mit der Steuerung des Rovers aus MATLAB.
Als erstes entscheiden Sie sich für einen Ort, an dem Sie den Rover auf die Arena stellen können. Von dieser Stelle aus muss er sich mindestens 30 cm in y-Richtung vorwärts können.
Wichtig: Wie üblich, wenn sich Teile Ihres Setups geändert haben (z.B. Webcam oder Standort der Arena, Beleuchtung), müssen Sie neu kalibrieren.
Verteilen Sie roverReceive_hw.slx auf den Rover. Wenn die Codegenerierung abgeschlossen ist, klicken Sie auf View Diagnostics, um die IP-Adresse Ihres Rovers abzurufen.
Notieren Sie sich im öffnenden Diagnostics Viewer die IP-Adresse des Rovers.
Öffnen Sie jetzt CommandRover.mlx und führen Sie die ersten vier Schritte aus. Denken Sie daran, allen Anweisungen im Live-Skript zu befolgen.
Geben Sie die IP-Adresse Ihres Rovers in "Step 5: Create objects to connect to the IP ports on the rover" ein und klicken Sie auf Run and Advance.
Sie werden feststellen, dass sich der Rover für ca. 1 Sekunde bewegt und dann stoppt. MATLAB ruft den Lokalisierungsalgorithmus auf, um die aktuelle y-Lage des Rovers zu berechnen und zeigt sie im Output Window an.
Sobald sich der Rover 30 cm in y-Richtung von seinem Ausgangspunkt entfernt hat, senkt sich der Gabelstapler ab. An dieser Stelle ist die Bewerbung abgeschlossen.
Review/Zusammenfassung
Wir haben gesehen, wie man über Wi-Fi von MATLAB zum Rover kommuniziert und dieser Anweisungen erhält.
FILES
-
roverReceive_hw.slx
-
commandRover.mlx
LEARN BY DOING
Fügen Sie einen weiteren Wi-Fi Block zu Ihrem Simulink Modell hinzu und aktualisieren Sie Ihren MATLAB-Code entsprechend, so dass Sie den Rover bei Bedarf drehen lassen können.
5.8 Zusammenfassung - Lesson Learned
In diesem Kapitel wurden Sie mit einer Reihe von Themen vertraut gemacht:
Differentialantrieb Mathematik
Die Steuerung eines Differentialantriebsroboters. Sie mussten einen einfachen zweirädrigen Rover bauen, der einen Mechanismus (Gabelstapler) zum Heben und Senken von Gegenständen trägt.
Open-loop vs. Closed-loop und PID-Regler
Um den Rover zu bewegen, haben Sie als zwei mögliche Strategien Open-loop und Closed-loop kennengelernt. Nachdem Sie den Open-Loop-Regler verwendete nur Informationen aus dem Modell der Motoren unter nicht optimalen Bedingungen. Diesen haben Sie dann verworfen. Dafür haben Sie gelernt, wie Sie einen Closed-Loop-Regler mit einem PID-Regler mit Simulink implementieren können. Obwohl diese Strategie viel besser war als der Open-Loop-Controller, zeigte sie dennoch zwei unerwünschte Nebeneffekte: stationäre Fehler und Überschwingen.
Zustandsmaschinen zur Kompensation von Fehlern
Es gibt jedoch eine Möglichkeit, diese beiden Effekte zu vermeiden In unserem Fall durch die Verwendung einer mit Stateflow implementierten Zustandsmaschine. Stateflow ist eine Toolbox innerhalb der MATLAB-Suite. Stateflow war auch nützlich, um ein einfaches Programm zur Steuerung des Gabelstaplers auf dem Rover zu erstellen. Dieses ermöglicht, anspruchsvollere Aufgaben zu realisieren, die sowohl das Bewegen des Rovers, das Suchen nach einem Objekt an einem gewünschten Ort als auch das Umsetzen des Objektes an einen anderen Ort beinhalten. Die Ausgangsbedingungen des Systems waren jedoch noch unbekannt: Wo befand sich der Rover zum Zeitpunkt des Starts unseres MATLAB Live Script?
Bildverarbeitung zur Unterstützung der Objektortung in Echtzeit
Dieses letzte Problem wird mit einer Kamera und einem Bildverarbeitungsalgorithmus gelöst, der nach dem RGB-Marker des Rovers sucht. Das ermöglicht den Rover mit ziemlich hoher Genauigkeit auf einer Arena einer vorgegebenen Größe zu finden. Wir haben gesehen, dass dies ein komplexes Kalibrierungsverfahren erfordert, was bei jeder Änderung der Bedingungen durchgeführt werden muss.
Drahtlose Kommunikation
Schließlich ist es mit Hilfe der drahtlosen Kommunikation möglich, den Rover im gleichen Wi-Fi-Netzwerk wie den Computer zu betreiben, auf dem MATLAB läuft. Dadurch kann der Rover direkt mit Simulink kommunizieren und so die Möglichkeit eines dynamischen Konfigurationsmechanismus zu eröffnen.
5.9 Abschließende Herausforderung
Nach all den Erfahrungen in diesem Kapitel sind wir nun bereit, eine Herausforderung zu formulieren, die alle Komponenten dieses Moduls beinhaltet.
Steuerung des Rovers mit dem Lokalisierungsalgorithmus
In den vorangegangenen Übungen haben Sie gesehen, wie der Rover seinen Weg von einem Startpunkt zum Ziel und schließlich zu einem bestimmten Endpunkt planen kann. Ein Vorbehalt bei diesem Ansatz ist, dass es außer den Encoderdaten keine Rückmeldung über die Roverposition gibt. Wenn die Räder zu rutschen beginnen oder die Encoderdaten verrauscht sind, werden Sie Probleme bekommen.
Es wäre gut, wenn mehrere Sensoren Daten über die Position des Rovers liefern könnten. Damit lassen sich die potenziellen Probleme weitgehend überwinden. Wie Sie in Übung 7 gesehen haben, können Sie Signale von Ihrem MATLAB Computer an ein deploytes SimulinkModell über Wi-Fi Blöcke senden. Als letzte Aufgabe implementieren Sie einen Wegplanungsalgorithmus auf dem Rover, der den Lokalisierungsalgorithmus aus Übung 5 verwendet. Dieser Lokalisierungsalgorithmus liefert dann ein noch weitergehendes Feedback.
Das ist Ihre letzte Herausforderung. Erstellen Sie einen fantastischen mobilen Rover!