Selbstbalancierendes Motorrad
6. Selbstbalancierendes Motorrad
Das Motorradprojekt besteht aus einem zweirädrigen Roboter, der über eine rotierende Scheibe auswuchten und sich bewegen kann, um zu kompensieren, wenn das Motorrad aus dem Gleichgewicht gerät. Das Motorrad wird von einem Arduino MKR1000, dem Arduino MKR Motor Carrier, einem Gleichstrommotor zum Bewegen des Hinterrades, einem Encoder, einem Gleichstrommotor zum Drehen der Scheibe, einer 6-achsigen IMU, einem Standard-Servomotor zum Steuern des Motorradgriffs, einem Abstandssensor und einem Drehzahlmesser gesteuert. Das Motorrad kann mit MATLAB® über Wi-Fi kommunizieren. In diesem Projekt lernen Sie, wie Sie das Gesamtverhalten des Fahrzeugs simulieren und Modelle der Komponenten erstellen können, um die Qualität der Simulation sowie eines der Regelalgorithmen zu verbessern. Außerdem erfahren Sie, wie Sie das Motorrad mit Simulink® programmieren, seinen Auswuchtalgorithmus steuern, es geradlinig bewegen und Hindernisse erkennen. Nach Abschluss des Projekts verfügen Sie über das notwendige Wissen, um Ihre eigenen selbst-balancierenden Motorrad zu bauen, und wer weiß, vielleicht entwerfen Sie noch ein weiteres Hoverboard® oder sogar den nächsten Arduino gesteuerten Segway®. Bevor Sie mit dem Modellieren beginnen, müssen Sie das Motorrad montieren, indem Sie die Anweisungen unter folgender Adresse befolgen
In den Übungen, aus denen sich dieses Projekt zusammensetzt, lernen Sie, wie Sie Folgendes tun können:
-
Übung 1: Modellieren Sie das Fahrzeug und lernen Sie, wie man sein Verhalten simuliert
-
Einführung in die verschiedenen Werkzeuge, insbesondere den Simulation Data Inspector, der Ihnen hilft, Signale zwischen Simulationen anzuzeigen und zu vergleichen
-
PID-Regler, die zur Steuerung des Neigungswinkels des Motorrads verwendet werden
-
- Übung 2: Komponenten modellieren und Simulink erstellen blockiert ihre Datenblätter
- Übung 3: Erstellen Sie einen Balance Control Algorithmus mit den Modellen, die Sie für die verschiedenen Komponenten erstellt haben
- Übung 4: Lernen Sie, wie man das Motorrad ausbalanciert, wenn es einer Geraden folgt
- Übung 5: Balancieren Sie das Motorrad beim Lenken und nutzen Sie den Neigungswinkel zu Ihrem Vorteil.
ÜBUNG 1:
6.1 Modellfahrzeug und Simulation
Das Motorrad ist ein Fahrzeug, das die Balance über ein Trägheitsradsystem steuert, das durch die Implementierung eines Proportional-Integral-Differentielle (PD)-Reglers gesteuert wird. In dieser Übung lernen Sie, wie Sie verschiedene Werkzeuge verwenden können, um eine Simulation der Bewegung des Motorrads zu erstellen und einen Algorithmus zu entwickeln, der das Fahrzeug unter verschiedenen äußeren Bedingungen ausgleicht.
In dieser Übung lernen Sie:
- die physische Dynamik des Motorrad-Trägheitsmodells zu verstehen.
- Identifizieren Sie die drei Regelungsbegriffe in einem PD-Regler und verstehen Sie deren jeweilige Auswirkungen in einem geschlossenen Regelkreis.
- Verwenden Sie einen Simulation Data Inspector, um eine Systemsimulation zu überwachen und zu verfeinern.
- Entwickeln Sie einen Regelalgorithmus, um das Motorrad auszubalancieren.
Verstehen wir zunächst die Bewegungsgleichungen des Motorrads
Beginnen wir mit dem Verständnis der Bewegungsgleichungen für das Motorrad-Trägheitsmoment Radsystem. In der folgenden Herleitung werden wir eine vereinfachte Version des Systems untersuchen, damit Sie eine funktionierende Simulation erstellen können, die nicht zu komplex ist.
Wir werden die folgenden Annahmen treffen:
- Das Motorrad kann sich nur um die Bodenrad-Achse bewegen.
- Es gibt keine Drehreibung zwischen dem Motorrad und dem Boden oder zwischen dem Motorrad und dem Trägheitsrad.
- Die Dicke der Motorradräder ist vernachlässigbar.
- Der Luftwiderstand ist vernachlässigbar.
Werfen wir einen Blick auf ein Diagramm, das die Koordinaten, auf die wir uns beziehen werden, zusammen mit wichtigen physikalischen Größen zeigt:
Zum besseren Verständnis dieses Diagramms stellen Sie sich vor, dass Sie das Motorrad von hinten betrachten. Sie können das Motorrad in dieser Ausrichtung vor Ihnen platzieren, während Sie die Beschreibung durchlesen, da es Ihnen helfen wird, die Physik des Projekts besser zu verstehen. Die wichtigste hier gezeigte Koordinate ist der Neigungswinkel, θ, der definiert ist als 0 Grad, wenn das Motorrad perfekt aufrecht steht, positiv, wenn sich das Motorrad von hinten gesehen gegen den Uhrzeigersinn neigt, und negativ, wenn sich das Motorrad im Uhrzeigersinn neigt. Ein weiterer wichtiger Winkel ist die Drehbewegung des Trägheitsrades, φ. Da sich das Trägheitsrad im Verhältnis zum Rest des Motorrads dreht, variiert φ im Wert, wobei die positive Verschiebung als gegen den Uhrzeigersinn definiert ist.
Als nächstes, finden Sie den Massenschwerpunkt des gesamten Motorradsystems (einschließlich des Trägheitsrades). Diese Position kann experimentell im Labor gemessen werden, liegt aber etwa direkt unter dem Trägheitsrad. Der Schwerpunkt der Massenposition ist wichtig für die Dynamik des Motorrads, da die Schwerkraft direkt über diesen Punkt wirkt. Die Höhe des Schwerpunktes vom Boden aus, wenn das Motorrad aufrecht steht (θ = 0), ist definiert als $h_c$$_m$
Das Motorradsystem kann sich frei um die Bodenrad-Achse (ground-wheel axis) drehen, die eine imaginäre Linie ist, die die Punkte an den Hinter- und Vorderrädern verbindet, wo sie den Boden berühren (im Bild). Das Trägheitsrad kann sich um seine eigene Achse drehen, die direkt durch die Mitte des Trägheitsrades verläuft.
Jetzt, denken wir an die Drehmomente im Motorradsystem. In einem System, das frei um eine Achse drehbar ist, tritt ein Drehmoment auf, wenn an einem bestimmten Punkt der Drehachse eine Kraft auf das System ausgeübt wird. Die Größe des Drehmoments kann mit Hilfe der folgenden Gleichung bestimmt werden:
$\tau$ = $|F \cdot r\cdot \sin(\alpha)|$
In dieser Gleichung wird das Drehmoment, $\tau$, in Einheiten der Kraft*Länge (z.B. Newtonmeter) ausgedrückt. F ist die ausgeübte Kraft, r ist die Entfernung zwischen dem Ort, an dem die Kraft aufgebracht wird, und der Drehachse, und $\alpha$ ist der Winkel, der am Kraftausübungspunkt zwischen der Kraftrichtung und der Drehachse gemessen wird. Gemäß der Gleichung wird das maximale Drehmoment erreicht, wenn die Kraft im rechten Winkel (90 Grad) aufgebracht wird. Es gibt kein Drehmoment, wenn die Kraft direkt auf die Drehachse oder von ihr weg aufgebracht wird. Darüber hinaus können Sie bei gleicher Kraft mehr Drehmoment erhalten, wenn die Kraft weiter von der Drehachse entfernt aufgebracht wird.
Für eine bestimmte Drehachse gibt es ein Nettodrehmoment, das die Summe aller Drehmomente ist, die um diese Achse auf das System wirken. Das Nettodrehmoment ist proportional zur Winkelbeschleunigung des rotierenden Systems:
$\tau_{sys} = \sum_{i}\tau_{i,sys}=I_{sys}\ddot\theta_{sys}$
In dieser Gleichung bezeichnet $\tau_{i,sys}$ das Drehmoment, das durch die Kraft i auf das System um die Drehachse aufgebracht wird. $I_{sys}$ ist das Trägheitsmoment des Systems in Bezug auf die Drehachse. Das Trägheitsmoment ist eine Eigenschaft eines starren Objekts, das die Massenverteilung des Objekts in Bezug auf eine Drehachse misst. $\ddot\theta_{sys}$ ist die Winkelbeschleunigung des Objekts um die Drehachse.
Wir betrachten das Motorradsystem, das die Hinter- und Vorderräder, die Lenksäule, die Motorradkarosserie (mit all ihrer eingebetteten Elektronik) und das Trägheitsrad umfasst. Die Drehachse für dieses System ist die Bodenrad-Achse, und das Maß der Drehung ist der zuvor definierte Neigungswinkel θ.
Das Drehmoment, das auf das Motorrad (bezeichnet als M) um die Bodenradachse wirkt, besteht aus 3 Hauptkomponenten:
- Gravitationsdrehmoment $(\tau_{g,M})$
- Trägheitsdrehmoment $(\tau_{IW,M})$
- Externes Drehmoment $(\tau_{ext,M})$
Das Gravitationsdrehmoment ist darauf zurückzuführen, dass die Schwerkraft auf den Schwerpunkt des Motorradsystems heruntergezogen wird, wenn es nicht direkt über der Bodenradachse liegt (wenn es sich lehnt). Mit Hilfe der ersten Gleichung von oben lässt sich das Gravitationsmoment wie folgt ermitteln:
$\tau_{g,M} = M_M \cdot g \cdot h_{cm}\cdot sin(\theta)$
In der obigen Gleichung ist $M_M$ die Masse des Motorradsystems, g die konstante Gravitationsbeschleunigung, $h_c$$_m$ die Höhe des Massenschwerpunkts von der Bodenradlinie und θ der Neigungswinkel. In dieser Gleichung (und allen Gleichungen in diesem Kapitel) wird ein positiver Drehmomentwert definiert, der sich gegen den Uhrzeigersinn in Bezug auf die verstandene Drehachse bewegt. Sie können sehen, dass es kein Schwerkraftmoment gibt, wenn das Motorrad perfekt aufrecht steht (θ = 0). Bei einem kleinen Neigungswinkel θ wird ein kleines Schwerkraftdrehmoment auf das Motorrad in der gleichen Richtung wie die Schräglage ausgeübt. Wenn der Winkel größer wird, steigt das Drehmoment, bis das Motorrad um 90 Grad fällt. Das einzige Drehmoment, das auf das Motorrad wirkt, hätte das Motorradsystem ein instabiles Gleichgewicht bei θ = 0. Das bedeutet, dass jede kleine Störung des Motorrads aus seinem Gleichgewicht dazu führt, dass das System von seiner Gleichgewichtsposition weg beschleunigt und sich nicht wieder in Richtung dieses bewegt.
Glücklicherweise gibt es andere Drehmomente im Motorradsystem, um ein Herunterfallen zu verhindern! Wenn der Trägheitsradmotor betätigt wird, übt die Motorwelle ein Drehmoment auf die Trägheitsradscheibe aus, wodurch sie beschleunigt (rotierend) wird. Die Trägheitsradscheibe übt dann durch die Erhaltung des Drehimpulses ein gleiches und entgegengesetztes Drehmoment auf die Motorwelle aus. Nennen wir das Reaktionsdrehmoment $\tau_{IW,M}$.
Der letzte Typ ist das externe Drehmoment, $\tau_{ext,M}$. Dieses Drehmoment umfasst alle anderen auf das System wirkenden Drehmomentquellen. Dies könnte Dinge wie eine schräge oder unebene Oberfläche, die gegen das Motorrad drückt, Luftwiderstand, Wind und verschiedene andere Störungen wie das seitliche Drücken des Motorrads mit dem Finger beinhalten. In dieser theoretischen Diskussion konzentrieren wir uns auf das ideale Szenario, in dem $\tau_{ext,M}$ = 0. Letztendlich wollen Sie, dass Ihr Motorrad ausbalanciert wird, auch wenn eine angemessene Anzahl von externen Störungen darauf einwirkt.
So haben wir das Nettodrehmoment auf dem Motorrad über die Bodenrad-Linie:
$\tau_{net,M} = I_M \cdot \ddot\theta = \tau_{g,M} + \tau_{IW,M} + \tau_{ext,M}\approx \tau_{g,M} + \tau_{IW,M}$
$I_M$ ist hier das Trägheitsmoment des Motorradsystems um die Bodenrad-Achse.
Jetzt, betrachten wir eine weitere Drehachse: diejenige, die durch die Trägheitsradmotorwelle verläuft. Bei dieser Drehachse ist nur das Trägheitsrad frei drehbar. Die Drehmomente, die entlang dieser Achse wirken, stammen vom Gleichstrommotor, den wir $\tau_{motor,IW}$ nennen werden, und von dissipativen Kräften wie Reibung zwischen den beweglichen Teilen und Widerstandseffekten, $\tau_{fric,IW}$. Wir gehen davon aus, dass es in diesem System keinen solchen mechanischen Widerstand gibt, oder $\tau_{fric,IW}$ = 0. Bei gleicher Drehmomentdefinition haben wir die folgende Gleichung:
$\tau_{net,IW} = I_{IW}\ddot\phi = \tau_{motor,IW} + \tau_{fric,IW} \approx \tau_{motor,IW}$
Hier ist $I_{IW}$ das Trägheitsmoment der Trägheitsradscheibe in Bezug auf ihre Mittelachse und $\ddot\phi$ ist die Winkelbeschleunigung der Trägheitsradscheibe. Sie haben die direkte Kontrolle über $\tau_{motor,IW}$ wenn Sie den Trägheitsrad-Gleichstrommotor über das MKR1000 Board aktivieren.
Als nächstes, lassen Sie uns alles zusammenfassen. Denken Sie daran, dass das Drehmoment, das die Motorwelle auf das Trägheitsrad ausübt, gleich und entgegengesetzt zum Drehmoment ist, das das Trägheitsrad auf die Motorwelle und damit auf den Rest des Motorrads ausübt. Oder,
$\tau_{IW,M} = -\tau_{motor,IW}$
Indem wir die vorherige Gleichung ersetzen, erhalten wir:
$\tau_{net,M} \approx \tau_{g,M} - \tau_{motor,IW}$
$I_M \cdot \ddot\theta \approx M_M \cdot g \cdot h_{cm} \cdot \sin(\theta) - \tau_{motor,IW}$
Die Bewegung des Trägheitsrades wird definiert durch:
$I_{IW} \cdot \ddot\phi = \tau_{motor,IW}$
Wir haben nun die Dynamik des Neigungswinkels, ausgedrückt in Form von messbaren konstanten Größen (d.h. Massen, Längen und Trägheitsmomente). Die Frage ist nun: "Was sollte $\tau_{motor,IW}$ sein, damit sich das Motorrad bei θ = 0 stabilisiert?" Wir werden diese Frage in diesem Kapitel und im Projekt untersuchen.
Zunächst betrachten wir das einfachste Korrekturdrehmoment, das den instabilen Balancepunkt in einen stabilen Balancepunkt verwandeln kann. Angenommen, der Neigungswinkel ist sehr klein (vielleicht ein paar Grad). Die folgende Näherung gilt für kleine Werte von θ (gemessen in Bogenmaß):
$\sin(\theta) \approx \theta$
Wir haben dann eine einfachere angenäherte Differentialgleichung für den Neigungswinkel:
$I_M \cdot \ddot\theta \approx M_M\cdot g\cdot h_{cm}\cdot\theta - \tau_{motor,IW}\sin(\theta) \approx \theta$
Angenommen, wir programmieren den Motor so, dass er ein Drehmoment ausübt, das proportional zum Neigungswinkel selbst ist:
$\tau_{motor,IW} = K_p\cdot\theta$
Hier ist $K_p$ eine Konstante, deren Optimalwert durch Simulation und Experimentieren bestimmt werden kann. Indem wir die vorherige Gleichung ersetzen, erhalten wir:
$I_M \cdot \ddot\theta \approx -(K_p - M_M\cdot g\cdot h_{cm})\theta$
Wenn $K_p$ größer als $M_M \cdot g \cdot h_{cm}$ ist, dann ist die Winkelbeschleunigung des Motorrads um die Bodenradachse in die entgegengesetzte Richtung des Neigungswinkels. Insbesondere, wenn sich das Motorrad in eine Richtung neigt, beschleunigt es in die andere Richtung. Wenn sich das Motorrad auf die andere Seite des Balancepunkts bewegt, wechselt die Winkelbeschleunigung dann die Richtung, um das Motorrad wieder ins Gleichgewicht zu bringen. Dies ist ein stabiles Gleichgewicht, d.h. wenn sich das System aus der Gleichgewichtsposition heraus bewegt, stellt es sich wieder in Richtung Gleichgewicht zurück.
Die Lösung der Differentialgleichung hat die folgende Form:
$\theta(t) = A\sin(\sqrt{\frac{K_p - M_M \cdot g \cdot h_{cm}}{I_M}}t + B)$
In der obigen Gleichung sind A und B Konstanten, die von den Anfangswerten von θ und $\dot\theta$ abhängen. Wenn Sie die Konstante $K_p$ erhöhen, wird die Schwingungsfrequenz schneller. In diesem Idealfall schwingt das Motorradsystem ohne störende Drehmomente für immer um die vertikale Position mit konstanter Amplitude. Dies wird als Proportionalregelung bezeichnet und ist oft ein erster Versuch, einen Regelalgorithmus zu entwickeln, um ein System in einen gewünschten Zustand zu bringen. Wir werden dieses Verhalten verbessern wollen, so dass die Schwingungen in der Amplitude abklingen und sich schließlich auf einen konstanten Neigungswinkel von 0 einstellen. Das Motorradsystem reagiert dann stabil, wenn zufällige Störungen auf es einwirken. Im folgenden Abschnitt werden Sie Simulink verwenden, um diese Dynamik zu modellieren.
Physikalische Modellierung in Simulink
Erster Test: Drehmomentfreies Trägheitsrad
Sobald Sie die Gleichungen verstehen, die die Dynamik des Motorrads regeln, ist der nächste Schritt, über mögliche Wege nachzudenken einen Steuermechanismus zu implementieren. Dieser wird, angesichts der im Kit verfügbaren Teile, das Motorrad vertikal ausbalancieren. Sehen wir uns ein Simulink-Modell an, das das physikalische Verhalten des Motorrads implementiert, wie im vorherigen Abschnitt beschrieben. Öffnen Sie das folgende Modell:
Da Sie das Modell ändern werden, speichern Sie es als myMoto.slx.
Das Modell enthält einen Motorradsubsystem Block (Motorcycle subsystem Block). Dabei handelt es sich um einen Block, der ein Datenarray, einen Signalvervielfacher und einen direkten Dateneingabeblock erzeugt.
>> motoSys0_startUntersuchen Sie den Motorcycle subsystem Block und machen Sie sich mit den verschiedenen darin angezeigten Block vertraut:
Beachten Sie, dass die Inportsgrößen für das Subsystem ein externes Drehmoment aus der Umgebung und ein Drehmoment sind, welches der Trägheitsradmotor auf das Motorrad ausübt. Das Modell innerhalb des Subsystems erzeugt die interessierenden physikalischen Größen: den Neigungswinkel θ, seine zeitliche Ableitung $\dot\theta$, und die zeitliche Ableitung des Trägheitsradwinkels $\dot\phi$.
Die physikalische Dynamik des Motorrads wird hier mit Simscape Multibody™ modelliert, das Teil des Modellierungssoftwarepakets Simscape™ ist und es Ihnen ermöglicht, Mehrkomponenten-Systeme zu simulieren und zu animieren, in denen physikalische Massen durch geometrische Beschränkungen verbunden sind. Beachten Sie, dass es in diesem Simscape-basierten Modell farbige Signale ohne Pfeile gibt. Dies sind Simscape-Signale, und sie stellen physikalische Verbindungen zwischen Komponenten dar, im Gegensatz zu Simulink-Signalen, die unidirektionale Datenflüsse darstellen. Die Blöcke, die sich mit diesen Simscape-Signalen verbinden, stellen physikalische Komponenten dar und Dreh- und Translationswandlungen zwischen ihnen und verschiedenen Bezugsrahmen. Beachten Sie, dass es für jeden der 5 unabhängig voneinander beweglichen Teile des Motorrads Blöcke gibt: die Karosserie des Motorrads, die Hinter- und Vorderräder, das Reaktionsrad und die Lenksäule. Diese Blöcke enthalten die Bauteilgeometrien, Massen, Trägheitsmomente und Bezugskoordinaten für jedes der 5 Teile. Schließlich können Sie mit den Blöcken Simulink-PS Converter und PS-Simulink Converter Simscape-Signale in und aus Simulink-Signalen konvertieren, so dass sie mit dem Rest des Modells verbunden werden können.
Wir werfen einen Blick auf den Revolute Joint Block, der mit der Rear Wheel Komponente (Hinterradkomponente) verbunden ist. Der Block Revolute Joint definiert eine Drehachse der Bewegung zwischen zwei festen Komponenten im Modell. Doppelklicken Sie auf den Block und erweitern Sie die State Targets:
Hier werden die Outportsbedingungen für den Neigungswinkel und dessen Zeitableitung festgelegt. Sie werden in den MATLAB-Variablen theta0 und thetadot0 gespeichert. Ebenso werden der Anfangswinkel und die Winkelgeschwindigkeit des Trägheitsrades im Block Revolute Joint neben der Inertia Wheel Komponente gespeichert.
Mal sehen, wie sich das Motorrad verhält, wenn kein externes Drehmoment und kein Motordrehmoment angelegt wird. Sie führen das Modell aus und sehen Sie sich die Simscape Multibody Animation an, wenn sie im Mechanics Explorer Window erscheint. Das folgende Bild zeigt einen Ausschnitt aus der Simulation:
Im Animationswindow sehen Sie ein 3D-Modell mit verschiedenen Objekten, die in verschiedenen Farben dargestellt sind. Wir haben die Modelle im Hinblick auf die unabhängigen beweglichen Teile im Motorrad vorbereitet: die Vorder- und Hinterräder, die Lenksäule, die Motorradkarosserie und das Trägheitsrad. Unterhalb des Animationswindows befindet sich eine einfache Symbolleiste, mit der Sie die Wiedergabe der Animation steuern können. Im oberen rechten Teil des Animationswindows befindet sich eine Reihe von Schaltflächen, mit denen Sie zoomen, schwenken und den Blickwinkel ändern können. Nehmen Sie sich einen Moment Zeit, um mit den Tasten Wiedergabe und Perspektive zu experimentieren, bis das Motorrad im Betrachtungsrahmen vollständig sichtbar ist.
Das Simulationswindow verfügt über eine vollständige Physik-Engine, die die Schwerkraft simulieren kann. Ohne Hilfe des Trägheitsmotors dreht sich das Motorrad einfach um die Bodenradlinie und schwingt aufgrund der Schwerkraft um die Abwärtsrichtung. Man kann beobachten, dass das Modell keinen physischen "Boden" enthält und sich weiter dreht, direkt dort, wo sich der Boden befinden würde. Obwohl es möglich ist, Hard-Stop-Grenzen mit Simscape Multibody zu modellieren, werden wir unsere Aufmerksamkeit auf das Verhalten des Systems richten, wenn der Neigungswinkel des Motorrads nahe Null liegt.
Als nächstes, werfen wir einen quantitativen Blick auf das Verhalten des Motorrads. Gehen Sie zurück zum Modellwindow und klicken Sie auf die Schaltfläche Simulation Data Inspector im Simulink Toolstrip, wie im folgenden Bild dargestellt:
Durch Auswählen dieser Schaltfläche wird das Window Simulation Data Inspector (SDI) geöffnet. SDI ist eine Umgebung, in der Sie protokollierte Daten aus Simulationen anzeigen, sie in einer beliebigen Kombination von grafischen Achsen untersuchen und die gleichen Signale über mehrere Simulationen hinweg vergleichen können. Sie werden SDI verwenden, um das Verhalten des Motorradsystems zu beobachten und Ihren Regelalgorithmus zur Leistungsoptimierung zu verfeinern.
Wenn Sie im SDI Window Theta und Thetadot aus der Liste wählen, beobachten Sie der verfügbaren Signale aus an den grafischen Achsen. Wenn Sie sich an die Ansicht des Motorcycle Blocks erinnern, gab es nur drei outports: Theta, Thetadot und die Trägheitsradgeschwindigkeit (inertia wheel speed). Das nächste Bild zeigt die Ergebnisse dieser Operation für unsere Simulation:
Sie werden feststellen, dass die Signale ein oszillierendes Verhalten aufweisen. Sie können die Signaleigenschaften unten links sehen; klicken Sie auf eines der Signale, um auszuwählen, welches angezeigt wird.
Deaktivieren Sie die Winkelmessungen und aktivieren Sie das Kontrollkästchen Trägheitsradgeschwindigkeit (inertia wheel speed), um das Verhalten auf dem Bildschirm zu sehen:
Beachten Sie, wie das Trägheitsrad als Reaktion auf die Bewegung des Motorrads um die Bodenrad-Achse schwingt. Seine Form reagiert eindeutig auf das gleiche Schwingungsverhalten (gleiche Frequenz und ähnliche Form - aber invertiert zum Thetadot), das wir für die beiden anderen Signale beobachtet haben.
Um das Verhalten des Modells weiter zu untersuchen, müssen Sie die Outportsbedingungen ändern. Stellen Sie die Anfangsbedingungen wie folgt ein:
>> theta0 = 15;
>> thetadot0 = -135;Führen Sie die Simulation aus und sehen Sie sich die Animation an. Was ist diesmal passiert? Können Sie den Zusammenhang zwischen den Anfangswinkelbedingungen und dem Verhalten des Motorrads in der Animation herausfinden? Um dies zu verstehen, sollten Sie die neuen Daten im SDI Window beobachten und mit den Daten der vorherigen Simulation vergleichen. Das folgende Bild zeigt, dass der erste Durchlauf der Simulation einige Zeit gebraucht hat, um einen stationären Zustand zu erreichen. Dabei tritt das Theta-Signal in einen rein oszillierenden Zustand über im Vergleich zum zweiten, bei dem sich das Signal unmittelbar in diesem Zustand befindet:
Versuchen Sie, mit verschiedenen Outportsbedingungen zu experimentieren und untersuchen Sie deren Auswirkungen auf das modellierte Verhalten. Noch wichtiger ist, dass Sie die Simulation überprüfen, um zu sehen, was mit dem Motorrad passiert. Denken Sie daran, dass Sie eine Situation überprüfen, in der das Trägheitsrad kein Drehmoment aufbringt, was nicht das Verhalten des Motorrads in der realen Welt ist.
Zweiter Test: Hinzufügen des Motordrehmoments
Nun experimentieren wir mit dem Motordrehmoment auf dem Trägheitsrad. Für diesen Test müssen Sie zunächst die Anfangsbedingungen wie folgt einstellen:
>> theta0 = 1;
>> thetadot0 = 0;Gehen Sie zur obersten Ebene des myMoto.slx-Modells und stellen Sie den Wert im Constant Block auf 1e-3 ein:
Beobachten Sie den Einfluss auf den Neigungswinkel (Theta) und die Trägheitsraddrehzahl im Vergleich zum ersten Lauf:
Der Neigungswinkel schwingt weiter, hat aber nun eine zusätzliche Komponente, die ihn bei konstanter Geschwindigkeit abnehmen lässt. In der realen Welt bedeutet dies, dass das Motorrad fallen wird, aber da es im Modell keinen "Boden" als solchen gibt, beginnt sich das Motorrad um seine horizontale Achse zu drehen.
Wie Sie sehen können, soll die Durchschnittsgeschwindigkeit des Trägheitsrades auf unbestimmte Zeit steigen. Wie Sie wissen, ist dies in der realen Welt nicht möglich, da das Motorrad irgendwann kaputt geht: Entweder stoppt der Motor seine Beschleunigung aufgrund mechanischer Bedingungen oder der Motorfahrer bricht wegen Überstrom ab. Obwohl keine dieser Situationen wünschenswert ist, ist es ungewiss, was zuerst passieren wird (z.B. mechanische oder elektrische Schäden). Deshalb müssen wir eine Steuerung entwickeln, die einen solchen Zustand nie erreicht.
Entwickeln eines Reglers für die Balance
Lasst uns dem Trägheitsrad ein wenig Drehmoment hinzufügen. Um das Motorrad im Gleichgewicht zu halten, müssen wir herausfinden, wie wir einige der Informationen, die wir von Theta und Thetadot sammeln, nutzen können, um das auf das Motorrad wirkende Gravitationsmoment auszubalancieren. In Bezug auf die zuvor abgeleiteten Gleichungen wollen wir θ (Theta auf dem Modell) immer nahe Null halten, um das Motorrad auszubalancieren. Der einfachste Weg, das Motorrad auszubalancieren, besteht darin, ein Drehmoment anzulegen, das proportional und entgegengesetzt zu θ ist. Dazu muss der Motor ein proportionales Drehmoment auf das Trägheitsrad in die gleiche Richtung wie θ aufbringen.
Ab dem letzten Modell (myMoto.slx) löschen Sie den Constant Block und fügen Sie einen Gain Block hinzu. Stellen Sie den Verstärkungswert auf 1e-2 ein. Verbinden Sie den Gain Block wie in der folgenden Abbildung gezeigt und beschriften Sie ihn. In der Abbildung wird deutlich, wie wir Theta verwende, um den Motorradblock zu beeinflussen:
Wir haben den Gain Block als $K_p$ bezeichnet, um zu signalisieren, dass es sich um eine klassische Proportionalregelung handelt (das "P" von PID); wie Sie sich vorstellen können, werden wir von hier aus ein Argument darüber entwickeln, wie die Proportionalkomponente funktioniert und warum es zweckmäßig ist, ihr weitere Teile hinzuzufügen, um einen besseren Mechanismus zur Steuerung des Rades zu schaffen. Führen Sie die Simulation aus und sehen Sie sich die Animation im Mechanics Explorer window an. Was sind Ihre Beobachtungen zur Stabilität des Motorrads und zum Schwingungsverhalten? Untersuchen Sie den Signal-Theta im SDI Window für diese letzte Simulation:
Versuchen Sie nun, die Simulation mit verschiedenen Werten der Verstärkung auszuführen und untersuchen Sie Theta im SDI Window. Im folgenden Bild haben wir einen Wert von 2e-2 angewendet und Sie können sehen, wie sowohl die Frequenz als auch die Amplitude von Theta beeinflusst werden:
Was passiert mit Theta, wenn die proportionale Verstärkung erhöht und verringert wird? Was passiert, wenn die Proportionalverstärkung zu hoch oder zu niedrig eingestellt ist?
Wie bei unserer früheren Ableitung sollten Sie beachten, dass die Erhöhung der Proportionalverstärkung dazu führt, dass die Schwingungsfrequenz steigt und auch die Schwingungsamplitude zunimmt. Wenn Sie die Verstärkung zu niedrig einstellen, wird nicht genügend Drehmoment vom Motor zur Verfügung stehen, um das Motorrad im Gleichgewicht zu halten. Wenn die Proportionalverstärkung zu hoch eingestellt ist, überkompensiert das Motorrad und drückt zu weit über den Schwerpunkt hinaus, was zu einem Sturz führt.
Suchen Sie einen Wert für die Proportionalverstärkung, die das Motorrad stabil ausgleicht, und stellen Sie ihn im $K_p$ Gain Block ein. Führen Sie die Simulation durch, um einen Satz von Basisdaten in SDI zu erhalten; wir werden diese Daten später als Referenz verwenden und gleichzeitig das Design der Steuerung verbessern.
Verringern der Schwingung in Ihrem Controller
Der $K_p$ = 1e-2 gebaute Controller ist stabil, aber Theta schwingt um den gewünschten Neigungswinkel mit konstanter Amplitude auf unbestimmte Zeit. Ändern wir den Regelalgorithmus so, dass sich die Schwingungen im Theta mit der Zeit dämpfen. Dazu müssen Sie nicht nur dem Neigungswinkel entgegenwirken, sondern auch der Winkelgeschwindigkeit des Neigungswinkels, also der Geschwindigkeit, mit der er sich verändert.
Füge einen weiteren Gain Block und einen Add Block zum Modell hinzu. Stellen Sie den Verstärkungswert des neuen Gain Blocks auf 5e-3. Verbinden und beschriften Sie den neuen Gain Block "Kd", da er den Ableitungsbegriff des PID-Reglers einführt. Die endgültige Konfiguration sollte mit dem folgenden Schaltplan übereinstimmen:
Starten Sie das Modell und schauen Sie sich die Animation an. Dann untersuchen Sie Theta in der SDI-Ansicht und vergleichen Sie es mit Theta aus dem vorherigen Durchlauf:
Wie beeinflusst die Verstärkung der Ableitung die Schwingungen im Theta? Wie Sie sehen können, wird das Schwingungsverhalten nun mit der Zeit eliminiert oder "gedämpft", so dass Theta konstant wird und somit einen stabilen Zustand erreicht. Sie sollten sich fragen, ob der stationäre Wert von Theta wünschenswert ist. Warum oder sollten wir nicht wollen, dass diese Variable einen Gleichgewichtszustand erreicht? Wenn Sie darüber nachdenken, müssen Sie, sobald das Motorrad die perfekte vertikale Position erreicht hat, das Trägheitsrad nicht mehr beschleunigen, da es keine externe Kraft zum Ausgleich gibt. Wenn jedoch der stationäre Zustand erreicht wird, bevor das Motorrad die vertikale Position erreicht hat, ist es keine so gute Idee, die Beschleunigung des Rades zu stoppen. Beachten Sie, dass der stationäre Zustand erreicht wird, wenn Theta auf einem konstanten Wert ungleich Null liegt, was bedeutet, dass das Motorrad nicht im Gleichgewicht ist. Zusammenfassend wollen wir, dass das System in einer bestimmten Zeitspanne (nicht zu früh, nicht zu spät) einen stationären Zustand von Null erreicht.
Bevor man sich auf die Kompensation des stationären Fehlers konzentriert, die Schwingung des Neigungswinkels zu untersuchen. Sie können diese eliminieren, indem Sie mit der differentiellen Verstärkung (derivative gain) experimentieren. Was passiert mit den Schwingungen im Theta, wenn die differentielle Verstärkung erhöht und verringert wird? Was sind die Kompromisse im Neigungsverhalten, wenn die differentielle Verstärkung erhöht oder verringert wird?
Sie werden sehen, dass bei einer Erhöhung der Ableitungsverstärkung weniger Schwingungen auftreten, bevor der Neigungswinkel einen stetigen Wert erreicht, und die Schwingungsamplitude schneller abnimmt. Wenn sie verringert wird, gibt es mehr Schwingungszyklen, und es dauert länger, bis ein stationärer Zustand erreicht ist. Wenn die Ableitungsverstärkung zu hoch eingestellt ist, kann sich der Neigungswinkel des Motorrads abrupt ändern, was dazu führen kann, dass es instabil wird. Schwingungen im Neigungswinkel als auch große Änderungen des Neigungswinkels innerhalb kurzer Zeit sind für die Balance Steuerung des Motorrads nicht wünschenswert.
Sowohl die Proportional- als auch die differentielle Verstärkung können so eingestellt werden, dass sich das System bei Störungen aus dem Zielzustand wie gewünscht verhält. Versuchen Sie verschiedene Kombinationen von $K_p$- und $K_d$-Verstärkungswerten, um zu sehen, ob Sie das gewünschte Verhalten empirisch erreichen können.
Als Übung finden wir Werte für die proportionale und abgeleitete Verstärkung, die es Theta ermöglicht, innerhalb von 0,05 Grad seines stationären Wertes zu bleiben, bevor 1 Sekunde verstrichen ist. Das folgende SDI-Diagramm zeigt, was Sie bei der Simulation dieses Szenarios (Kp = 1e-2 und Kd = 1e-3): beachten sollten:
Beseitigung des Fehler im stationären Zustand
Bevor der Steuerungsalgorithmus komplexer wird (und das wird er!), lassen Sie uns ein separates Subsystem erstellen. Markieren Sie die beiden Gain Blöcke und den Add Block, klicken Sie mit der rechten Maustaste auf einen ausgewählten Block und klicken Sie auf Create Subsystem from Selection:
Wir empfehlen, den Subsystem Block wie abgebildet mit dem Namen "Controller" zu kennzeichnen:
Doppelklicken Sie auf den Controller-Block, um in dieses neue Subsystem zu gelangen, und ordnen Sie die Blöcke neu an, um das Subsystem zu bereinigen.
Nun kümmern wir uns um den stationären Fehler. Eine reine proportional-differentielle Steuerung oder PD controller leidet häufig unter stationären Fehlern nach einer Störung des Soll-Zustandes. Sie können dies beheben, indem Sie der Steuerung einen Integralbegriff hinzufügen, der der Anhäufung von Fehlern im Laufe der Zeit entgegenwirkt. Aus diesem Grund verwenden wir nur den ersten Ansatz zur Erhöhung der Proportionalverstärkung.
Erhöhen Sie die Kp-Verstärkung auf 1e-1 und starten Sie das Modell, um die Animation anzusehen. Untersuchen Sie dann Theta in der SDI-Ansicht und vergleichen Sie es mit Theta aus dem vorherigen Lauf:
Stimmen Sie Ihren PD-Regler (Proportional-Derivative-Regler) mit unterschiedlichen Werten für die Verstärkung ab, bis Sie einen guten Kompromiss gefunden haben. Das Trägheitsrad an Ihrem Motorrad sollte dazu beitragen können, den Neigungswinkel mit einer angemessenen Geschwindigkeit so auszugleichen, dass keine Schwingungen auf dem Neigungswinkel auftreten.
Für Kp = 5e-1 und Kd = 8e-2 erhalten Sie die folgende Theta-Kurve, die gut aussieht.
Optimierung der Parameter
Zur Vereinfachung der Parametereinstellung und zur späteren Vorbereitung auf eine beliebige Motordrehmomentkonstante können Sie der Summe der drei Steuerbegriffe eine Gesamtverstärkung hinzufügen. Dazu fügen Sie nach dem letzten Add Block einen Gain Block hinzu und stellen den Gain-Wert auf 1e-2 ein. Korrigieren Sie dann die Verstärkungswerte Ki, Kp und Kd, indem Sie die vorhandenen Werte durch 1e2 teilen:
Die im vorherigen Bild angezeigte Konfiguration scheint an dieser Stelle stabil genug zu sein. Darüber hinaus ist es durch Hinzufügen des endgültigen Multiplikators einfacher, mit dem Modell zu arbeiten. Dies erleichtert die Feinabstimmung des Reglers, um auf zufällige Schwankungen des Drehmoments zu reagieren.
Reaktion auf zufällige Störungen
Ihr PID-Regler funktioniert unter idealen Bedingungen mit dem zuvor gezeigten Setup gut. Die Frage ist, ob er auch bei zufälligen Störungen gut funktioniert. Dies ist ein Bereich, der auch mit MATLAB durch Hinzufügen eines Zufallsrauschens modelliert werden kann. Dies können Sie tun, indem Sie den Wert für die externe Drehmomentverstärkung auf 1e-2 setzen. Dadurch wird die externe Drehmomenteingabe an den Motorradblock besser sichtbar:
Führen Sie die Simulation aus und sehen Sie sich die entsprechende Animation an. Untersuchen Sie Theta in der SDI-Ansicht und vergleichen Sie es mit dem vorherigen Lauf:
Wie verhält sich Ihr PID-Regler Ihrer Meinung nach bei zufälligen Umgebungseinflüssen basierend auf den Daten aus der Simulation (die sich leicht von denen unterscheiden werden, die Sie im Bild sehen)? Sie können versuchen, die Werte Kp, Ki und Kd zu ändern, um zu sehen, ob Sie den Fehler ausgleichen können. Ein typischer iterativer Abstimmungsprozess würde das Testen verschiedener Rauschpegel und die weitere Abstimmung der proportionalen, integralen und differentiellen Verstärkungen beinhalten, um Stabilität, Reaktionsgeschwindigkeit, Überschwingen und stationäre Genauigkeit zu optimieren.
Die empirische Änderung der Werte hat Ihnen eine Vorstellung davon gegeben, welche Steuerungsbegriffe die meiste Arbeit zur Stabilisierung des Motorrads leisten. Dies lässt sich viel besser verstehen, wenn man sich einige der Signale im PID-Regler ansieht. Beschriften Sie die Signale innerhalb des Controller Subsystems wie abgebildet:
Als nächstes wählen Sie alle Signale aus, die den letzten Hinzufügesatz umgeben. Klicken Sie mit der rechten Maustaste auf eine der Signalleitungen und wählen Sie Log Selected Signals aus der Dropdown-Liste:
Simulation ausführen und die Steuerbegriffe in der SDI-Ansicht untersuchen:
Welcher Term trägt den größten Teil zum Motordrehmoment bei?
In diesem Fall erbringen beide aufgrund des anfänglichen Neigungswinkels ungleich Null einen vergleichbaren Aufwand.
Hinweis: Sie haben viel mit diesem Modell gearbeitet, Änderungen hinzugefügt und so weiter; bitte denken Sie daran, Ihr Systemmodell zu speichern.
FILES
- motoSys0start.slx
- motoSys1controller.slx Entspricht myMoto am Ende dieser Übung.
LEARN BY DOING
Sie haben nun gelernt, wie man einen PID-Regler implementiert, der den Neigungswinkel des Motorrads als Parameter verwendet, zusammen mit der zeitlichen Veränderung des Winkels. Dank dieser Parameter ist es möglich, ein Simulink-Modell zu erstellen, das die Geschwindigkeit des Trägheitsrades steuert, was wiederum zum Auswuchten des Motorrads beiträgt.
Außerdem haben Sie gesehen, wie der PID-Regler auf verschiedene Zufallsreize reagiert und welche Faktoren (Kp, Ki und Kd) am wichtigsten sind, um dem unerwünschten Drehmoment am Motorrad entgegenzuwirken, das es zum Fallen bringen könnte. Sie haben auch gelernt, wie man eine Simulation eines 3D-Modells implementiert, das auf Verhaltensweisen reagiert, die durch Simulink Blöckebestimmt sind, etwas, das Sie in späteren Abschnitten in diesem Kapitel lernen werden, wie man auf ein echtes physisches Motorrad anwendet.
Ab sofort simulieren Sie das Motorrad und den PID-Regler und fügen dem System eine Normalverteilung des externen Drehmomentgeräusches hinzu. Um mehr über das physikalische Verhalten des PID-Balance-Regelalgorithmus zu erfahren, versuchen Sie, dem System andere Arten von Störungen hinzuzufügen, wie z.B. eine Konstante, Sinuswelle oder eine Kombination von Wellenformen. Verwenden Sie SDI, um zu überwachen, was mit der Trägheitsraddrehzahl, dem MotorTorque Command, dem Neigungswinkel und den PID-Begriffen geschieht. Wenn das Verhalten instabil ist, bestimmen Sie, ob Sie die PID-Bedingungen anpassen können, um das Gleichgewicht zu kompensieren und wiederherzustellen.
ÜBUNG 2:
6.2 Motorradhardware und Komponenten
In dieser Übung erstellen Sie Modelle der Komponenten, die Sie an die Motorradhardware anschließen können, und fügen die Komponenten Ihre eigenen Modelle hinzu (z.B. Ihren selbstgebauten PID-Regler), um Algorithmen zu erstellen, die direkt aus Simulink auf Ihrer Arduino-Hardware eingesetzt werden.
Sie konzentrieren sich auf wenige Komponenten: den Gleichstrommotor, der das Trägheitsrad steuert, den Tachosensor und die Inertial Measurement Unit (IMU). Sie können dieses Wissen jedoch auf alle Komponenten anwenden, die Sie später in Ihren Experimentierkasten aufnehmen möchten.
In dieser Übung lernen Sie Folgendes:
- Verstehen Sie die Fähigkeiten und relevanten Spezifikationen für den Gleichstrommotor des Trägheitsrades, den Tacho und die BNO055 IMU.
- Erstellen Sie Komponentenmodelle zur Konfiguration und zum Testen einzelner Geräte.
Komponenten
Trägheitsrad-Gleichstrommotor
Zunächst richten Sie den Gleichstrommotor ein, mit dem ein Drehmoment auf das Trägheitsrad aufgebracht wird, wodurch das Motorrad ein gleiches und entgegengesetztes Gegenmoment ausübt. Verwenden Sie je nach dem im Kit enthaltenen Trägheitsradmotor das entsprechende Hardwarespezifikationsblatt.
- Wenn Ihr Massenträgheitsmotor mit dem Aufkleber „12 V DC“ versehen ist, verwenden Sie dieses Blatt.
- Wenn nicht, haben Sie einen 6-V-Gleichstrommotor und verwenden dieses Blatt.
Öffnen Sie das iWheel0start.slx Modell, das ziemlich leer aussieht, wie Sie im folgenden Bild sehen können:
>> iWheel0_startIn den folgenden Abschnitten werden Sie diesem Modell Blöcke hinzufügen, um es Ihren Bedürfnissen für die Durchführung der Experimente anzupassen. Sie werden dieses Modell verwenden, um Drehmomentwerte für den Trägheitsradmotor zu steuern. In Ihrem Regelalgorithmus bestimmen Sie das erforderliche Motordrehmoment in Bezug auf das vorzeichenbehaftete gebrochene Arbeitszyklus (-1 bis 1). Später werden Sie dem Modell ein Tachometer hinzufügen, um die Winkelgeschwindigkeit des Trägheitsrades zu messen. Beachten Sie, dass wir in den Simulationen die Trägheitsraddrehzahl nicht als Input für den Regelalgorithmus verwendet haben, aber das ist etwas, das nützlich sein könnte, um komplexere PID-Regler herzustellen.
Da wir Änderungen an der Datei vornehmen werden, geben Sie dem Modell einen neuen Namen, z.B. speichern Sie ihn als myIWheel.slx.
Navigieren Sie im Simulink Library Browser zu Simulink Support for Arduino MKR Motor Carrier und suchen Sie den Block M3M4DCMotors:
Ziehen Sie den M3M4DCMotors Block in myIWheel.slx:
Überprüfen Sie die Verkabelung Ihres Trägheitsradmotors und sehen Sie, wo er mit dem Motor Carrier verbunden ist. Diese Informationen benötigen Sie im nächsten Schritt.
Öffnen Sie den Dialog DC Motor Block und stellen Sie die Dropdown-Liste Motor port entsprechend ein:
Der M3M4DCMotors Block hat einen Inport, der sowohl die an den Motorleitungen anzulegende Spannung als auch die Richtung, in der sie anzulegen ist, anzeigt. Ein positiver Inport zwischen 0 und 255 bedeutet, dass ein positives Drehmoment auf den Motor aufgebracht werden soll, während ein negativer Inport von -255 bis 0 ein negatives Drehmoment anzeigt. Der Inportswert wird normiert, gerundet und an den entsprechenden PWM-Kanal für positives oder negatives Motordrehmoment als 8-Bit Integer Zahl ohne Vorzeichen zwischen 0 und 255 übertragen. Um den Torque Command in das richtige Format für den DC Motor Block zu bekommen, gehen Sie zum Simulink Library Browser und fügen Sie einen Gain Block aus Simulink → Math Operations hinzu. Stellen Sie den Verstärkungswert auf -255 und verbinden Sie die Blöcke wie abgebildet:
Führen Sie das Modell auf dem Motorrad aus. Um dies zu tun, müssen Sie zuerst das USB-Kabel zwischen Ihrem Computer und dem MKR1000 anschließen. Schalten Sie dann den MKR Motor Carrier ein und drücken Sie dann die Run Taste aus der Werkzeugleiste in Ihrem Simulink-Modell. Experimentieren Sie mit verschiedenen Torque Command zwischen -0,5 und 0,5.
Hinweis: Achten Sie darauf, dass sich das Trägheitsrad nicht zu schnell oder zu lange dreht, da es den Motor überhitzen oder strukturelle Schäden am Motorrad verursachen kann. Wie Sie dieses Risiko mit dem Tachometerblock minimieren können, erfahren Sie später.
Während Sie das Modell fahren, untersuchen Sie das Motorrad von hinten. Achten Sie auf die Richtung der Winkelbeschleunigung, wenn das Torque Command positiv und negativ ist. Wenn das Torque Command positiv ist, beschleunigt das Trägheitsrad dann im oder gegen den Uhrzeigersinn? Ihre Antwort variiert je nachdem, wie Sie den DC-Motor mit dem Motor Carrier verdrahtet haben. Um die Konsistenz später zu modellieren, sollten Sie sicherstellen, dass das Torque Command und der Neigungswinkel θ mit der gleichen Polarität definiert sind. Das bedeutet, dass θ von hinten gesehen gegen den Uhrzeigersinn zunehmen sollte, und ein positives Torque Command sollte das Trägheitsrad gegen den Uhrzeigersinn antreiben. Wenn dies bei Ihrem Motorrad nicht der Fall ist, ändern Sie den Verstärkungswert auf 255 (alternativ können Sie auch die Verkabelung des Motors ändern, um das gleiche Ergebnis zu erzielen):
Abschließend werden einige Dinge bereinigt, indem ein Subsystem erstellt wird. Wählen Sie den Gain Block und den M3M4DCMotors Block, klicken Sie mit der rechten Maustaste und wählen Sie Create Subsystem from Selection:
Beschriften Sie das neue Trägheitsrad des Subsystems. Sie werden am Ende etwas Ähnliches erhalten, wie es in der nächsten Abbildung dargestellt wird:
Das Modell erneut ausführen, um das korrekte Verhalten zu bestätigen.
Tachometer
Der Gleichstrommotor des Trägheitsrades kann sich extrem schnell drehen, wenn das volle Drehmoment für eine ausreichende Zeit aufgebracht wird. Ein zu langes, zu schnelles Drehen des Trägheitsrades kann jedoch viele Komponenten des Motorrads dauerhaft beschädigen. Dazu gehört der den Gleichstrommotor (Überhitzung und Schmelzen), der Motor Carrier (Überstromschäden und Überhitzung) und die Bauteile (Schwingungsspannungen und Wärmeverformung). Sie wollen das Trägheitsrad schnell genug drehen können, um das Motorrad im Gleichgewicht zu halten, aber nicht zu schnell, um es zu beschädigen. Um dieses Risiko zu minimieren, beinhaltet das Motorrad einen Drehzahlmesser im Kunststoffgehäuse direkt vor dem Trägheitsrad:
Überprüfen Sie die hardwarespecs für die im Lieferumfang enthaltenen omnipolaren digitalen Mikroleistungs-Halleffekt-Sensoren (Tachometer) der Serie SL353. Der Sensor enthält einen Elektromagneten, der mit einer digitalen Schaltung verbunden ist, die einen Wert von 1 hält, wenn ein externes Magnetfeld einer bestimmten Größe angelegt wird, und 0, wenn es nicht angelegt wird. Das Trägheitsrad enthält zwei eingebettete Magnete im Abstand von 180 Grad, die beim Drehen des Trägheitsrades effektiv Magnetfeldimpulse auf den Drehzahlmesser ausüben:
Die digitale Schaltung des Tachos enthält eine Logik, um zu verfolgen, wie viele Magnetfeldimpulse seit dem letzten Zurücksetzen der Stromversorgung stattgefunden haben. Aus diesen Informationen können Sie die ungefähre Winkelgeschwindigkeit des Trägheitsrades über einen bestimmten Zeitraum bestimmen. Sie können dann einen Schwellenwert für die Winkelgeschwindigkeit einstellen bei dem der Trägheitsradmotor abschaltet und bei der ersten Überschreitung des Grenzwertes ausgeschaltet bleibt. Sie sollten die Hardware dann für einige Minuten abkühlen lassen und danach die Anwendung neu starten.
Um den Tachometer einzurichten, öffnen Sie das Modell myIWheel.slx, mit dem Sie zuvor gearbeitet haben:
>> myIWheelHinweis: Wenn myIWheel.slx unvollständig oder nicht verfügbar ist, öffnen Sie stattdessen iWheel1_test.slx und speichern Sie es als myIWheel.slx.
Navigieren Sie im Simulink Library Browser zur Simulink Support for Arduino Sensors Bibliothek, fügen Sie den Tachometer (Geschwindigkeitsmesser) Block innerhalb des Trägheitsradsubsystems (Inertia Wheel subsystem) in myIWheel.slx hinzu und konfigurieren Sie den Block wie abgebildet:
Nach dem Montagevideo müssen Sie den Hall-Effekt-Sensor an den Header IN2 am Motorträger angeschlossen haben. Untersuchen Sie Ihren Motorträger, suchen Sie den Anschluss des Hall-Effekt-Sensors und stellen Sie sicher, dass er an den mit IN2 gekennzeichneten Anschluss angeschlossen ist. Die Pin-Nummer-Eigenschaft gibt hier den verwendeten Low-Level-Pin an, und 16 ist die entsprechende Nummer für den IN2-Anschluss.
Unterbrechbare Pins am Mikrocontroller werden benötigt, um die Tachometerzählung zu aktualisieren, wenn Änderungen am Digitalwert auftreten, unabhängig vom Rest des periodischen Ausführungsplans der Anwendung. Unterbrechbare Pins auf Mikrocontrollern können den gesamten Prozessor anhalten, um eine bestimmte Callback-Routine durchzuführen, wenn sich der Pin ändert. Die Eigenschaft Interrupt Mode gibt an, wann die Tachometerzählung in Bezug auf die Wellenform der digitalen 0 oder 1 erhöht werden muss. Diese die gibt an, ob ein externes Magnetfeld vorhanden ist,. Der Interrupt-Modus RISING bedeutet, dass der Impuls gerade von 0 auf 1 geändert werden sollte; insbesondere würde die Änderung das Ereignis auslösen. Schließlich gibt die Eigenschaft Sample Time an, mit welcher Frequenz (in Sekunden) der Zählerstand aus dem Block ausgegeben und dann auf 0 zurückgesetzt wird. Wenn die Abtastzeit zu niedrig eingestellt ist, kann es zu Perioden kommen, in denen keine Zählungen auftreten, obwohl sich das Trägheitsrad dreht. Wenn die Abtastzeit zu hoch eingestellt ist, können Sie Änderungen der Winkelgeschwindigkeit des Trägheitsrades verpassen, die innerhalb einer Periode auftreten. Für diese Anwendung verwenden Sie 0,1 Sekunden für die Abtastzeit. Ein Wert, den wir theoretisch berechnet - und empirisch getestet - haben.
Für unsere Zwecke sind die Einheiten der Winkelgeschwindigkeit irrelevant, solange der Geschwindigkeitsschwellenwert in den gleichen Einheiten ausgedrückt wird. So werden wir die Geschwindigkeit der Trägheitsräder in Zählungen pro 0,1 Sekunde melden.
Da der Geschwindigkeitsmesser bei 10 Hz (die Periode von 0,1 in der Abtastrate entspricht 10 Hz, und der Rest des Modells bei 100 Hz (0,01 Abtastrate) ausgeführt wird, benötigen Sie einen Rate Transition Block, um den Geschwindigkeitsmesser output für 10 Steuerungsausführungszyklen zu halten. Dazu fügen Sie einen Rate Transition Block aus Simulink → Signal Attributes hinzu:
Fügen Sie schließlich einen Out1 Block von Simulink → Sinks hinzu und beschriften Sie ihn wie abgebildet. Drücken Sie Ctrl + D, um die Farbcodierung der Probenzeit zu sehen:
Kehren Sie zur obersten Ebene des Modells zurück und verbinden und beschriften Sie das Inertia Wheel Speed Signal wie dargestellt:
Nun, lassen Sie es uns ausprobieren! Suchen Sie das aus der Tachometerschaltung stammende Dreileiterbündel und stecken Sie es in den IN2-Anschluss am Motor Carrier:
Setzen Sie die Konstante das Torque Command auf 0, führen Sie das Modell aus und beobachten Sie den Tachooutport im Scope Block. Versuchen Sie es zunächst, indem Sie das Trägheitsrad manuell ohne Motor drehen und sehen, ob eine Tachozahl angezeigt wird. Versuchen Sie dann, einen Befehl mit niedrigem Drehmoment an den Motor zu senden, z.B. 0.2. Achten Sie auf das Verhalten der Trägheitsdrehzahl, wenn das Torque Command für einige Zeit konstant gehalten wird. Senden Sie KEINEN großen Drehmomentwert (mehr als 0,5) für mehr als ein paar Sekunden:
Hinweis: Ihr Plot sieht möglicherweise anders aus, da die Motoren unterschiedlich sind.
Warum steigt die Drehzahl des Trägheitsrades nicht unbegrenzt an, wenn das Drehmoment vom Motor aufgebracht wird? Die Antwort ist Reibung. Die meisten Rückstellkräfte, einschließlich der Festkörperreibung, haben einen Begriff, der mit der Relativgeschwindigkeit der Objekte zunimmt. Mit zunehmender Trägheitsraddrehzahl steigt auch das Reibungsmoment im Motor, bis eine Enddrehzahl erreicht ist und das Reibungsmoment gleich und entgegengesetzt zum aufgebrachten Motordrehmoment ist. So kann man nie eine unendliche Winkelgeschwindigkeit erreichen. Bei hoher Reibungskraft wird jedoch viel Wärme vom Motor erzeugt und kann zu irreversiblen Schäden führen. Beachten Sie, dass sich dies von der Simulation unterscheidet, die wir zuvor durchgeführt haben, als wir von einer Nullreibung am Rad ausgegangen sind.
Führt ein negativer Torque Command zu einer negativen Trägheitsraddrehzahl? Nein. Der Geschwindigkeitsmesser misst nur, wie oft der externe Magnetfeldimpuls angehoben und/oder abgesenkt wurde. Es hat keine Möglichkeit zu wissen, in welche Richtung der externe Magnet ihn passiert. Das bedeutet, dass Sie diese Informationen mit Hilfe von Software verfolgen müssen.
Stellen Sie die Konstante Torque Command auf 0 und stoppen Sie das Modell. Nun fügen wir noch etwas Logik hinzu, um den Trägheitsradmotor auszuschalten, wenn die Drehzahl zu hoch ist (und halten ihn bis zum Neustart der Anwendung fern). Beginnen wir mit dem Vergleich der gemessenen Trägheitsradgeschwindigkeit mit einem Schwellenwert. Fügen Sie einen Compare To Constant Block von Simulink → Logic and Bit Operations hinzu und setzen Sie die Operation auf <= 4000. Verbinden Sie den Block wie abgebildet:
Das Ergebnis dieser Ungleichung bestimmt, ob der Gleichstrommotor des Trägheitsrades aktiviert oder deaktiviert ist. Fügen Sie einen Switch Block von Simulink → Signal Routing und Constant Block von Simulink → Sources hinzu. Stellen Sie den Konstantenwert auf 0, leiten Sie das Torque Command Signal zurück und verbinden Sie die Blöcke wie dargestellt:
Der Switch Block stellt sicher, dass das Torque Command des Benutzers an den Trägheitsradmotor geleitet wird, wenn das Rad nicht zu schnell dreht, oder ein Befehl Null, wenn sich das Trägheitsrad zu schnell dreht.
Halten Sie das Motorrad in senkrechter Position und führen Sie das Modell aus und öffnen Sie das Window Scope. Setzen Sie das Torque Command auf 0,7 und warten Sie, bis die Drehzahl des Trägheitsrades den Schwellenwert von 4000 überschritten hat:
Was passiert mit dem Motor, wenn der Drehzahlschwellenwert überschritten wird? ? Sie werden feststellen, dass der Motor nicht ausgeschaltet wird. Setzen Sie den Drehmomentbefehl auf 0. In der Abbildung oben, wenn die Trägheitsradgeschwindigkeit den Schwellenwert überschreitet, möchten Sie den Motor beim ersten Überschreiten des Schwellenwerts dauerhaft abschalten. Mit "dauerhaft" meinen wir, bis die Anwendung wieder von vorne beginnt. Dadurch kann der Gleichstrommotor und der Motor Carrier abkühlen, bevor er wieder angetrieben wird.
Dazu wird dem Outportssignal aus dem Block Compare To Constant ein Latch hinzugefügt. Sie möchten, dass das Steuersignal des Switch Blocks gleich 1 ist, wenn noch nie eine hohe Trägheitsradgeschwindigkeit erreicht wurde, und 0, wenn eine hohe Trägheitsradgeschwindigkeit stattgefunden hat. Um den Latch zu erstellen, fügen Sie einen Logical Operator Block von Simulink → Logic and Bit Operations und einen Unit Delay Block von Simulink → Discrete hinzu. Stellen Sie den logischen Operator auf AND und den Anfangszustand der Einheitenverzögerung auf 1. Verbinden Sie die Blöcke und beschriften Sie das Outportssignal wie abgebildet:
Hinweis: Sie können die Ausrichtung des Unit Delay Blocks umkehren, indem Sie auf den Block klicken und Ctrl + I drücken.
Stellen Sie sicher, dass Sie verstehen, wie dieser Mechanismus den Outport des Blocks Logical Operator beim ersten Überschreiten des Drehzahlschwellenwerts dauerhaft auf 0 "verriegelt".
Als nächstes erstellen wir ein weiteres Subsystem, um die Schwellenwert- und Latch-Operationen zu bereinigen. Wählen Sie den Block Compare To Constant, den relational Operator Block und den Unit Delay Block. Klicken Sie mit der rechten Maustaste und wählen Sie Create Subsystem From Selection:
Beschriften Sie das Subsystem wie abgebildet:
Führen Sie nun das Modell aus und stellen Sie den Torque Command auf 0,3 ein. Beobachten Sie das Scope window und warten Sie, bis der Schwellenwert für die Trägheitsradgeschwindigkeit überschritten ist. Funktioniert der Sicherheitsmechanismus jetzt wie vorgesehen?
Möglicherweise beobachten Sie etwas Ähnliches an Ihrem Oszilloskop.
Inertialmesssensor - BNO055
Zur Messung des Neigungswinkels $\theta$ und seiner Zeitableitung $\dot\theta$ verwenden Sie ein inertial measurement unit (IMU) (Trägheitsmessgerät). Auf Ihrem Motorrad haben Sie einen 9-achsigen Orientierungssensor BNO055 von Bosch. Die BNO055 erfasst den Gravitationsvektor und das Magnetfeld und kann aus diesen Größen die Dreh- und Translationsbewegung bestimmen. In diesem Projekt messen Sie mit dem BNO055 die Ausrichtung und Winkelgeschwindigkeit des Motorrads um die Bodenradachse.
Die vollständigen Hardware Spezifikation für die BNO055 IMU finden Sie auf dem Datenblatt. Es ist wichtig, sich mit Datenblättern vertraut zu machen, da die Elektronik in dieser Weise beschrieben wird. Aus diesen Dokumenten werden die Modelle der von uns für Sie vorbereiteten Komponenten konstruiert. Auch wenn es außerhalb des Umfangs dieses Kurses liegt, sollten Sie die Möglichkeit beachten, die Informationen aus einem Datenblatt in einen Simulink-Block zu übersetzen, um sie in Ihren Programmen zu verwenden.
Um die BNO055 IMU zu testen, öffnen Sie das folgende Modell:
>> IMU0_startMit diesem Modell können Sie die IMU testen, ihre Ausgänge verstehen und für die Motorradausgleichssteuerung konfigurieren.
Da Sie die Datei ändern werden, speichern Sie das Modell als z.B. myIMU.slx.
Suchen Sie im Simulink Library Browser den BNO055 IMU Sensor Block in der Simulink Support for Arduino Sensors Bibliothek und fügen Sie den Block dem Modell hinzu, wie in der nächsten Abbildung gezeigt:
Öffnen Sie das block dialog window und prüfen Sie die verfügbaren Optionen. Konfigurieren Sie den Block wie abgebildet:
Entsprechend der gewählten Konfiguration gibt der Block seine absolute Ausrichtung in Bezug auf das Magnetfeld und den Gravitationsvektor sowie die Winkelrate entlang der lokalen Koordinaten des IMU-Sensors aus. Die I2C-Adresse gibt an, über welchen Port das MKR1000 BoardIMU-Daten empfangen kann. I2C ist ein Kommunikationsprotokoll, das auf Hardwareebene im Arduino-Controller implementiert ist. I2C ist in einem Busformat implementiert, was bedeutet, dass eine Reihe von Geräten auf den gleichen 2 Pins vom Mikrocontroller angeschlossen werden können. Der I2C-Standard ermöglicht es, bis zu 127 Geräte an 2 Drähten aufzuhängen und Daten mit relativ hoher Geschwindigkeit auszutauschen, während die Drähte zwischen den Geräten relativ kurz gehalten werden (im Bereich von Zentimetern). I2C-Geräte, wie die in diesem Beispiel verwendete IMU, haben spezifische Adressen, die im Werk festgelegt wurden. Wenn Sie mit dem Mikrocontroller verbunden sind, müssen Sie die Adresse verwenden, um die Daten von und zu diesem Gerät zu übertragen. Die Adressen werden im hexadezimalen Format ausgedrückt (in diesem Fall 0x28). Einige Geräte erlauben die Änderung der Adresse, andere nicht. In unserem Fall verwenden die IMU und ein Teil des Motor Carriers I2C zur Kommunikation mit dem MKR1000.
Eine weitere Option aus dem vorherigen dialog window ist die Sample Time. In unserem Fall muss der Block Messungen bei 100 Hz (0,01) durchführen, um auf die physikalische Dynamik des Motorrads zu reagieren, wobei der Motor genügend Zeit hat, um ein korrigierendes Drehmoment zu erzeugen.
Nachdem Sie alles konfiguriert haben, klicken Sie auf OK und kehren Sie zum Modellwindow zurück. Verlegen Sie die Blockausgänge wie dargestellt:
Nun, lassen Sie uns die IMU ausprobieren! Dieses Modell ist so konfiguriert, dass es im externen Modus läuft, was bedeutet, dass es direkt auf Ihrem ArduinoBoard ausgeführt wird, aber es soll Informationen an Simulink zurücksenden und auf dem Bildschirm anzeigen. Klicken Sie auf die Schaltfläche Ausführen und beobachten Sie die Display Blöcke.
Überprüfen Sie die Anzeige des Calibration Vector (Kalibriervektors):
Damit die IMU genaue Ausgänge liefert, muss jeder Sensor initialisiert werden, um den Gravitationsvektor und das Magnetfeld zu lokalisieren und die Koordinaten entsprechend zu verschieben. Die Elemente des Kalibrierstatusvektors repräsentieren jeweils:
- IMU-System
- Gyroskop
- Beschleunigungssensor
- Magnetometer.
Jedes Kalibrierstatusvektorelement hat einen Wert von 0 bis 3 und zeigt damit den Grad der Kalibrierung des Sensors an. Für das Motorrad benötigen Sie den Gyroskop und das Magnetometer, um es vollständig zu kalibrieren (3). Die Kalibrierung der IMU erfordert einige Übung. Lassen Sie das Motorrad zum Starten vollständig im Ruhezustand, während das Modell im externen Modus läuft. Dies sollte jetzt das Gyroskop kalibrieren. Als nächstes nehmen Sie das Motorrad auf und drehen es um mindestens 90 Grad entlang jeder der 3 Raumachsen.
Der vorherige Vorgang sollte das Magnetometer kalibrieren.
Dieser Kalibrierungsprozess muss bei jedem Einschalten der BNO055 IMU durchgeführt werden, was bedeutet, dass Sie in Ihrem Modell Strategien finden müssen, die eine Kalibrierung für den Moment beinhalten, in denen Sie Ihr Motorrad einschalten. Nun lassen Sie uns die Rotationsmessungen betrachten. Überprüfen Sie die Anzeige der Euler-Winkel:
Versuchen Sie, das Motorrad um jede Achse zu drehen und bestimmen Sie, welcher Winkel jeder Motorradachse entspricht. Welches Element des Euler-Winkelvektors repräsentiert den Neigungswinkel θ? Sie sollten beachten, dass der zweite Euler-Winkel am deutlichsten auf Veränderungen des Neigungswinkels reagiert.
Richten Sie das Motorrad so aus, dass Sie auf die Rückseite des Trägheitsrades schauen.
Drehen Sie das Motorrad um die Bodenrad-Achse (rollen). In welche Richtung nimmt θ zu (im oder gegen den Uhrzeigersinn)? Sie sollten sehen, dass θ zunimmt, wenn Sie das Motorrad gegen den Uhrzeigersinn lehnen.
Beobachten Sie nun die Anzeige der Angular Rate (Winkelgeschwindigkeit):
Drehen Sie das Motorrad mit einer gleichmäßigen Bewegung entlang der Bodenrad-Achse. Welches Element des Winkelratenvektors repräsentiert $\dot\theta$? In welche Richtung ist die Drehrate dieses Vektorelements positiv (im oder gegen den Uhrzeigersinn)? Es ist zu beachten, dass das zweite Winkelratenvektorelement die Schräglage darstellt und einen positiven Wert für die Rechtsdrehung um die Bodenradachse aufweist.
Es mag mysteriös erscheinen, dass, wenn $\theta$ zunimmt, $\dot\theta$ negativ zu sein scheint. Der Grund dafür ist, dass die Euler-Winkel eine absolute Orientierung in Bezug auf das feste Trägheitsgefüge (definiert durch den Gravitationsvektor und das Magnetfeld) aufweisen, während das Gyroskop die Drehgeschwindigkeit im Bezugsrahmen der IMU misst. Aus Sicht der IMU ist die Rotationsmessung also das Gegenteil davon, wie Sie sie aus dem festen Trägheitsrahmen betrachten.
Sobald Sie mit den verschiedenen Winkelmessungen vertraut sind, stoppen Sie das Modell und schauen Sie sich an, wie Sie das Modell optimieren können, um die Informationen in dem Format zu extrahieren, das wir für unsere Steuerung benötigen.
Angesichts der Ausgänge des BNO055 Blocks sollten wir sie manipulieren, um die Informationen zu erhalten, die Sie für die Balance-Kontrolle benötigen. Erstens, lassen Sie uns den Prozess der Überprüfung des Kalibrierstatus vereinfachen. Sie können den minimalen Kalibrierungsstatus als 4x1-Vektor definieren: [0;3;0;3]. Im Vergleich zu dem vom Sensor ausgehenden Vektorsignal würde dies eine wesentlich einfachere Antwort auf die Frage "Ist der Sensor kalibriert?" geben. Fügen Sie dem Signal, das die Kalibrierinformationen enthält, einen Compare to Constant Block aus der Bibliothek Simulink → Logic and Bit Operations hinzu. Verbinden und konfigurieren Sie den Block wie abgebildet:
Aktualisieren Sie das Modelldiagramm, indem Sie Ctrl+D drücken. Überprüfen Sie die Größen der Compare to Constant Blockausgabe. Ist es das, was Sie wollen?
Anstatt zu sehen, ob jede der Sensorkomponenten ausreichend kalibriert ist, möchten Sie wissen, ob alle Sensorkomponenten ausreichend kalibriert sind. Fügen Sie einen Block Product of Elements aus Simulink → Math Operations hinzu und fügen Sie ihn zwischen dem Block Compare to Constant und dem Block Display ein:
Führen Sie das Modell aus und bestätigen Sie, dass Sie einen einzelnen wahren oder falschen Wert erhalten, um den Kalibrierungsstatus der IMU anzuzeigen:
Als nächstes isolieren wir die gewünschten Rotationsmessungen für das Motorrad. Um in Simulink in ein Vektorsignal zu indizieren, können Sie den Selector Block verwenden. Suchen Sie den Selector Block unter Simulink → Signal Routing und fügen Sie zwei davon dem Modell hinzu. Suchen Sie dann den Display Block in Simulink → Sinks und fügen Sie zwei davon dem Modell hinzu. Richten Sie die Signale wie abgebildet aus:
Konfigurieren Sie sowohl die Selector Blöcke "Theta Dot" als auch "Theta" mit einem Index von 2, wie im folgenden Screenshot gezeigt:
Führen Sie das Modell aus und bestätigen Sie, dass die Display Blöcke $\theta$ und $\dot\theta$ anzeigen, wie Sie sie definiert haben:
Lassen Sie uns noch ein Detail beachten. Für die Zwecke dieses Projekts möchten Sie, dass $\theta$ und $\dot\theta$ mit der gleichen Polarität definiert werden, aber die BNO055 IMU definiert sie mit entgegengesetzter Polarität. Fügen Sie einen Gain Block entlang des Signalwegs "Theta Dot" hinzu und stellen Sie den Verstärkungswert auf -1 ein:
Führen Sie das Modell noch einmal aus, um das korrekte Verhalten der Signalkonditionierung für $\theta$ und $\dot\theta$ zu bestätigen.
Stoppen Sie das Modell, wenn Sie fertig sind, und lassen Sie uns eine Neuanordnung des Modells vornehmen, damit Sie diese Arbeit leichter in spätere Entwürfe integrieren können.
Erstellen Sie ein IMU Subsystem, das später im Motorradmodell verwendet werden kann. Positionieren Sie die Anzeigeblöcke Theta Dot, Theta, IMU Calibrated und Calibration Status so, dass sie vertikal ganz rechts im Blockdiagramm ausgerichtet sind. Beschriften Sie dann die 4 Outportssignale wie im Bild gezeigt: Theta Punkt, Theta, IMU Calibrated und IMU Status.
Markieren Sie alles im Modell mit Ausnahme der 4 rechten Display Blöcke (die Sie gerade rechts ausgerichtet haben), klicken Sie mit der rechten Maustaste auf einen ausgewählten Block und wählen Sie Create Subsystem from Selection:
Für die spätere Modellierung sollte der erste Outport des Subsystems Theta und der zweite Outport Theta Dot sein. Sie können die Portfolge ändern, indem Sie die Eigenschaft Port number in den Outport-Blöcken des Subsystems anpassen. Gehen Sie in das neue Subsystem und doppelklicken Sie auf den Theta Dot Outport Block. Stellen Sie die Portnummer auf 2 und das folgende Bild hebt den zweiten Teil des Prozesses hervor:
Als nächstes bereinigen Sie das Layout des Modells und beschriften Sie den neuen Subsystem Block IMU:
Wenn Sie ein Modell im externen Modus betreiben, müssen Sie darauf achten, wie viele Signaldaten Sie mit Hilfe von Scopes, Displays oder anderen Funktionen zur Signalüberwachung zur Simulationszeit beobachten. Im externen Modus übertragen alle "beobachteten" Signale seriell von der externen Hardware über das USB-Kabel in Echtzeit zu Ihrem Computer. Es gibt eine inhärente Grenze für die Anzahl der Bits pro Sekunde, die auf diese Weise übertragen werden können, und das Überschreiten dieser Grenze verlangsamt die Simulation. Daher sollten Sie Displays und Scopes nur auf den Signalen aktivieren, die Sie für einen bestimmten Zweck beobachten müssen. Für das aktuelle Modell werden Sie diese Grenze nicht erreichen, aber Sie sollten dieses potenzielle Problem für andere Experimente, die Sie durchführen, im Hinterkopf behalten. Sie können auch Signale, die von Interesse sind, in eine langsamere Abtastrate bringen, um die Einschränkungen der seriellen Kommunikation zu erfüllen, oder Signale über einen alternativen Kommunikationskanal wie Wi-Fi übertragen.
Beenden Sie das Experiment, indem Sie Ihr Modell speichern. Es ist nun bereit, innerhalb des Projekts verwendet zu werden.
LEARN BY DOING
In diesem Abschnitt haben Sie den Tachometer kennengelernt und erfahren, wie man damit die Drehzahl des Trägheitsrades sowie des Trägheitsradmotors selbst begrenzen kann. Darüber hinaus haben Sie mehr über den im Kit enthaltenen IMU-Sensor und dessen Zusammenhang mit den physikalischen Eigenschaften des Motorrads erfahren. Insbesondere haben Sie gelernt, wie die vom Sensor gelieferten Daten verwendet werden können, um die Informationen darzustellen, die wir für die Einspeisung des Regelalgorithmus benötigen.
Anhand einiger erster Modelle der in der Bibliothek des Bausatzes enthaltenen Komponenten haben Sie gelernt, wie man mit den Informationen umgeht und sie in die Art von Signalen umwandelt, die wir benötigen, um den Controller zu speisen, den wir im ersten Abschnitt dieses Kapitels entwickelt haben.
Um weitere Untersuchungen durchzuführen, versuchen Sie, einige der anderen beobachtbaren Größen zu überwachen, die im BNO055 IMU Sensor Block aufgeführt sind, wie z.B. den linearen Beschleunigungs- oder Schwerkraftvektor. Identifizieren Sie die physikalische Bedeutung jeder der Vektorkoordinaten dieser Größe. Für die lineare Beschleunigung können Sie mit Simulink die lineare Geschwindigkeit (als Vektor) und die Position des Motorrads im Raum relativ zu seiner Outportsposition ableiten.
ÜBUNG 3:
6.3 Einstellen des Balancepunktes
In dieser Übung kombinieren Sie das Systemmodell, das Sie in Übung 6.1 abgeschlossen haben, und die Komponentenmodelle, die Sie in Übung 6.2 entwickelt haben, um eine komplette Balance Control-Anwendung zu implementieren, die auf dem MKR1000Board läuft. Dies gibt Ihnen die Möglichkeit, Ihren Algorithmus am Motorrad zu testen und zu verfeinern, um Modellungenauigkeiten und hardwarespezifische Probleme zu berücksichtigen. Am Ende dieser Übung werden Sie ein Motorrad haben, das die Balance hält.
In dieser Übung lernen Sie, wie Sie Folgendes tun können:
- Verknüpfung der Hardware-Sensoren und -Motoren mit dem Algorithmus der Balancesteuerung.
- Implementierung von Sicherheitsfunktionen, um sicherzustellen, dass das Motorrad mit minimaler Belastung der Hardwarekomponenten arbeitet
- Überwachung der physikalischen Reaktionen des Motorrads auf den Regelalgorithmus.
- Abstimmung und Verbesserung des PD-Algorithmus, dass das Motorrad im Gleichgewicht ist.
Erstellen eines Systemmodells für Arduino
Beginnen Sie, indem Sie das Modell öffnen, das Sie in Übung 6.1 abgeschlossen haben:
>> myIMUWenn myIMU.slx nicht verfügbar oder unvollständig ist, verwenden Sie stattdessen das Modell IMU2_subs.slx und speichern es unter myNewMoto.slx.
Jetzt, speichern Sie dieses Modell nun als myNewMoto.slx, indem Sie auf File> Save As unter ... klicken und den Namen eingeben.
Kopieren Sie den Controller-Block aus Ihrem myMoto.slx-Modell oder motoSys1_controller.slx und fügen Sie ihn in dieses Modell ein, wie unten gezeigt:
In der vorherigen Übung wurden Sie mit dem Lesen von Hardwarespezifikationen konfrontiert. Überprüfen Sie die Hardware-Spezifikationen des entsprechenden Trägheitsradmotors ( 6V und 12V). Ermitteln Sie das Blockierdrehmoment des Motors (in Gramm-Zentimetern). Für den 12-V-Motor sind es 200 (für den 6-V-Motor sind es 150).
Gehen Sie zum MATLAB-Kommando Window und konvertieren Sie die Drehmomentkonstante von Gramm-Zentimeter in Newton-Meter (wir sind auf der Erde, also ist die Konstante für die Schwerkraft 9,81):
>> stallTorque = 200 * 9.81/100/1000Sie können diesen Wert etwas als 2e-2 schätzen (als 1.5e-2 für 6V Motor).
Greifen Sie auf das Controller-Subsystem zu und bearbeiten Sie den Gain-block direkt vor dem Ausgang auf einen Verstärkungswert von 2e-2 (oder 1,5e-2 für 6-V-Motor). Ändern Sie den Signal- und Outportnamen in Drehmomentbefehl, wie unten gezeigt:
Hinweis: Kp und Kd wurden durch 2 geteilt, um diese Zunahme des Verstärkungswerts zu berücksichtigen, sodass wir denselben Controller haben, der am Simulationsmodell gearbeitet hat. Teilen Sie diese Werte für den 6-V-Motor durch 1,5.
Löschen Sie die Anzeigen Theta und Theta Dot und benennen Sie die Signale wie unten gezeigt. Verbinden Sie diese Signale wie folgt mit dem Controller:
Fügen Sie einen Scope Block von Simulink → Sinks hinzu. Verzweigen und verbinden Sie das Theta Signal, wie dargestellt:
Verzweigen und verbinden Sie nun das Thetadot Signal mit dem Scope Block unterhalb des Theta-Signals. Ein neuer Port wird automatisch für Sie im Scope Block erstellt:
Als nächstes konfigurieren Sie die Achsen im Scope Block. Klicken Sie im Scope Window auf View → Layout und stellen Sie das Layout auf 4x1 ein (Sie werden die zusätzlichen Achsen später verwenden):
Führen Sie das Modell auf der MKR1000-board aus und doppelklicken Sie auf den Scope-Block, um das Scope-Fenster zu beobachten. Versuchen Sie, das Motorrad um θ = 0 auszurichten und um mehrere Grad in beide Richtungen zu drehen:
Mit der Taste Scale Y-Axis Limits können Sie die vertikalen Achsen ausrichten
damit Sie zu den entsprechend den Daten passen.
Stoppen Sie das Modell.
Als nächstes wollen wir sehen, wie der Steuerungsalgorithmus auf die IMU-Sensordaten reagiert. Denken Sie daran, dass die Steuerung einen Torque Command bestimmt, der an den Trägheitsradmotor zu senden ist, basierend auf θ und $\dot\theta$. Sie werden den Torque Command der Steuerung gleichzeitig mit θ und $\dot\theta$ betrachten wollen. Ziehen Sie in myMoto.slx das Torque Commandssignal in den oberen Teil des Scope Blocks. Es wird automatisch einen neuen INPORT als 3 erzeugen:
Führen Sie das Modell aus. Versuchen Sie, das Motorrad so nah wie möglich an θ = 0 zu halten, während Sie den Torque Command im Scope Window beobachten. Versuchen Sie dann, das Motorrad in kleinen Winkeln zu neigen, während Sie den Torque Command beachten:
Sie sollten einige charakteristische Verhaltensweisen des Steuerungsalgorithmus beachten. Erstens, wenn das Motorrad in einem konstanten Neigungswinkel ungleich Null gehalten wird, wird der Motor im Allgemeinen angewiesen, ein Drehmoment in der gleichen Richtung zu erzeugen. Dies entspricht dem, was Sie vom Proportionalanteil des PD-Reglers erwarten können.
Stoppen Sie das Modell und lassen Sie uns einen Blick darauf werfen, wie Sie den Zusammenhang zwischen den Sensorinformationen und der Reaktion der PD besser verstehen können. Dazu müssen Sie die 3 PD-Begriffe einzeln überwachen. Um auf die PD-Begriffe zuzugreifen, gehen Sie in das Controller Subsystem und fügen Sie einen Mux Block von Simulink → Signal Routing hinzu. Verzweigen und verbinden Sie die Signale pTerm, iTerm und dTerm in dieser Reihenfolge mit dem Mux Block. Eine dritte Eingabe wird für Sie erstellt, wie z.B. das Verhalten des Scope Blocks:
Fügen Sie nun einen Out1 Block hinzu, um die PD-Begriffe zu exportieren. Verbinden und beschriften Sie den Out1 Block wie abgebildet:
Kehrt zur obersten Ebene des Modells zurück und verbinden Sie wie dargestellt das Signal Control Terms an die zweite Position des Scope Blocks:
Beschriften Sie die neuen Signal-PD-Begriffe:
Aktivieren Sie die Legende im Scope Window, indem Sie auf View → Legend klicken:
Führen Sie das Modell aus und untersuchen Sie das Verhalten von 3 PD terms im Scope Window, während Sie den Neigungswinkel einstellen:
P ist PD-Terme: 1 und D ist PD-Terme: 2. Auch wenn Ihre Signale nicht genau gleich aussehen,Sie sollten beachten, dass der Proportional (P)-Term genau die gleiche Form wie Theta hat (aber eine andere Amplitude). Der integrale (I)-Term neigt dazu, in Richtung positiver oder negativer Unendlichkeit zu laufen, wenn der Neigungswinkel über einen längeren Zeitraum in die gleiche Richtung gehalten wird. In dieser Situation dominiert der Integralterm den Torque Command, wie der folgende Auszug aus der Simulation zeigt:
Schauen Sie sich als Nächstes den Drehmomentbefehl im Bereich-Fenster an. Zuvor haben wir besprochen, dass der Drehmomentbefehl betriebsmäßig von -0,7 bis 0,7 laufen muss. Wie Sie sehen, weist die Steuerung derzeit ein Drehmoment an, das weit außerhalb dieses Bereichs liegt. Um sicherzustellen, dass der Regler kein unmögliches Drehmoment anfordert, müssen Sie den Drehmomentbefehl in die Sättigung bringen.
Drücken Sie die Stopp-Taste am Modell. Fügen Sie dem Controller-Subsystem einen Saturation Block hinzu (Simulink → Discontinuities). Stellen Sie es direkt vor den Torque Command Outport-Block und setzen Sie die Sättigungsgrenzen auf 0,7 und -0,7:
Führen Sie das Modell aus und beobachten Sie den Drehmomentbefehl im Oszilloskopfenster, während Sie den Neigungswinkel um einige Grad um θ = 0 (innerhalb von +/- 4) variieren:
Sie werden sehen, dass der Drehmomentbefehl einen großen Teil der Zeit an den Grenzen der Sättigungsbedingung verbringt. Im Allgemeinen sollte der Drehmomentbefehl nur sehr selten gesättigt werden, da er den Motor und die umgebende Hardware beschädigen kann, wenn er zu lange anhält. Deshalb prüfen wir das Verhalten des Reglers sorgfältig, bevor wir den Gleichstrommotor des Trägheitsrads anschließen! Es ist auch nicht gut für das Gleichgewicht, da die Sättigung es dem Motordrehmoment unmöglich macht, auf Änderungen von theta; und theta; zu reagieren. Hier werden sich die Inertia-Radmodelle, an denen wir in der letzten Übung gearbeitet haben, als nützlich erweisen.
Nun fügen wir das Trägheitsrad Subsystem hinzu. Öffnen Sie myIWheel.slx:
>> myIWheelHinweis: Wenn myIWheel.slx nicht verfügbar oder unvollständig ist, verwenden Sie stattdessen iWheel2_tach.slx.
Kopieren Sie das Inertia Wheel Subsystem von myIWheel.slx nach myMoto.slx und verbinden Sie es wie dargestellt mit dem Signal "Torque Command":
Als nächstes fügen wir dem Modell einen Schalter hinzu, damit Sie den Trägheitsradmotor jederzeit aktivieren oder deaktivieren können. Dies ist nützlich, wenn Sie die IMU kalibrieren möchten, bevor Sie versuchen, das Motorrad auszuwuchten, oder wenn das Trägheitsrad zu schnell wird. Fügen Sie der obersten Ebene des Modells einen Manual Switch (von Simulink → Signal Routing) hinzu und routen Sie die Signale wie folgt:
Fügen Sie einen Constant Block von Simulink → Sources hinzu und stellen Sie den Konstanten Wert auf 0 ein. Doppelklicken Sie auf den Block Manual Switch, um die Signalquelle des Trägheitsrades (Inertia Wheel signal source )auf 0 zu setzen:
An dieser Stelle erwarten Sie nicht unbedingt, dass das Motorrad stabil balanciert (es kann geringfügig stabil sein), aber Sie sollten sehen, dass das Trägheitsrad auf die Neigungrichtung reagiert.
Bitte lesen und befolgen Sie die Anweisungen, bevor Sie das Modell in Betrieb nehmen:
- Stellen Sie sicher, dass die Antriebsverstärkung im Controller Subsystem auf 2e-2 eingestellt ist.
- Stellen Sie im Controller Subsystem die PID-Verstärkungen wie folgt ein:
Kp = 25
Kd = 4
- Führen Sie das Modell mit deaktiviertem Trägheitsrad aus (Manual Switch auf 0).
- Öffnen Sie das Scope Window, wenn die Anwendung gestartet wird.
- Halten Sie das Motorrad in der Nähe der vertikalen Ebene, so dass Sie das Theta-Signal nahe Null im Bereich sehen.
- Stellen Sie den Neigungswinkel so ein, dass auch das Drehmoment-Sollwertsignal gegen Null geht. Aktivieren Sie dann den Trägheitsradmotor, während Sie das Motorrad halten.
- Versuchen Sie, das Motorrad ein paar Grad nach links und rechts zu neigen. Das Trägheitsrad sollte in die gleiche Richtung beschleunigen, in der sich das Motorrad neigt.
- Versuchen Sie, das Motorrad unter θ = 0 freizugeben. Sehen Sie, ob Sie ein gewisses Maß an Gleichgewicht erreichen (es ist in Ordnung, wenn es gerade nicht ausbalanciert, aber Sie können überrascht sein!).
- Wenn Sie fertig sind, deaktivieren Sie den Trägheitsradmotor und stoppen Sie das Modell.
Hinweis: Wenn das Trägheitsrad anfängt, zu viel Geschwindigkeit aufzunehmen, bereiten Sie sich darauf vor, auf den Manual Switch im Modell zu doppelklicken oder den Netzschalter am Motor Carrier auf OFF zu stellen.
Unabhängig davon, ob Sie eine marginale Balance erreichen, sollten Sie beachten, dass das Trägheitsrad in die gleiche Richtung wie der Schräglage beschleunigt. Wenn die Antriebsverstärkung niedrig eingestellt ist, sollten Sie sehen, dass das Torque Command selten, wenn überhaupt, die Sättigungsgrenzen bei 0.7 und -0.7 erreicht. When the lean angle is a high value (greater than +/-3 degrees), it makes sense that the torque command is at +/- 0.7 and still the motorcycle cannot reverse its direction. .
Wenn Schwingungen um θ = 0 auftreten, beachten Sie die ähnliche Schwingungsfrequenz der Begriffe P, und D (siehe Screenshot oben, wenn Sie solche Schwingungen nicht beobachtet haben). Die Spitzen des Integral Terms folgen typischerweise den Spitzen des Proportional Terms (der Integralterm ist gegenüber dem Proportionalterm phasenverzögert), während die Spitzen des Derivat Terms vor denen des Proportional Terms liegen. Eine nützliche Möglichkeit, über eine PID-Regelung nachzudenken, ist folgende: Der Proportionalbegriff korrigiert den gerade beobachteten Fehler, der Integralbegriff korrigiert die Fehler der jüngeren Vergangenheit, und der Ableitungsbegriff korrigiert die Fehler, die in naher Zukunft voraussichtlich auftreten werden. Dies erklärt, warum D-Term-Peaks vor denen des proportionalen Terms auftreten.
Stoppen Sie das Modell, wenn Sie es noch nicht getan haben. Spüren Sie den Trägheitsradmotor mit den Fingern. Ist es heiß? Wenn Sie den DC-Motor mehrere Minuten lang mit hohen Torque Command betreiben, werden große Ströme aufgenommen und viel Wärme erzeugt. Während Sie Ihr Systemmodell bauen und auf dem MKR1000 und der Motorradhardware testen, sollten Sie häufig (d.h. alle paar Minuten) den Trägheitsradmotor fühlen, um sicherzustellen, dass er nicht überhitzt wird. Wie bereits beschrieben, kann jeder Motor dauerhaft beschädigt werden, wenn er zu lange zu heiß wird. Darüber hinaus kann der Motor Carrier beschädigt werden, wenn in kurzer Zeit so viel Strom entnommen wird. Obwohl der Motor Carrier mit einer Firmware geliefert wird, die die Motorleitungen unter bestimmten gefährlichen Bedingungen automatisch abschaltet, sollten Sie sich zum Schutz des Motor Carriers nicht vollständig darauf verlassen. Sicherheit sollte Teil Ihres Algorithmus sein!
WICHTIG: Wenn Ihr Trägheitsradmotor bei Berührung unangenehm heiß wird, deaktivieren Sie den Trägheitsradmotor im Modell, stoppen Sie das Modell, schalten Sie den Motor Carrier aus, entfernen Sie die Batterie und lassen Sie das System für mindestens 15 Minuten abkühlen.
Die Einhaltung der obigen Regel ist der sicherste Weg, um zu verhindern, dass ein neuer DC-Motor oder Motor Carrier gekauft werden muss.
Im folgenden Abschnitt werden Sie dem Steuerungsalgorithmus einige Sicherheitsmechanismen hinzufügen, die es sehr unwahrscheinlich (aber dennoch möglich) machen, dass Hardware-Schäden auftreten. Nachdem diese Sicherheitsfunktionen hinzugefügt wurden, verfeinern Sie Ihren Algorithmus zur Steuerung der Waage, was lange Modellläufe mit aktiviertem Trägheitsradmotor erfordert.
Hinzufügen von Sicherheitsfunktionen für Notfälle
Sie haben jetzt eine Steuerung, die das Trägheitsrad entsprechend dem Vorzeichen des Neigungswinkels in die richtige Richtung beschleunigt. Sie haben dem Trägheitsrad einen manuellen Schalter hinzugefügt, mit dem Sie es vor und nach dem Auswuchten abschalten können, wenn ungewöhnliche Bedingungen auftreten, wie z.B. zu schnelles Drehen des Trägheitsrades oder Umkippen des Motorrads. Um die Steuerung robust und autonom zu machen, sollten wir dem Steuerungsalgorithmus einige Sicherheitsfunktionen hinzufügen, um das Trägheitsrad unter den folgenden Bedingungen automatisch abzuschalten:
- Trägheitsrad dreht sich zu schnell (Gefahr der Beschädigung des Motors)
- Das Motorrad "fällt" aus einem Bereich von "normalen" Neigung (Gefahr der Beschädigung des Trägheitsrades oder der Bodenoberfläche)
- IMU ist nicht kalibriert (Gefahr der Destabilisierung des Reglers durch ungenauen Sollwert)
- Die Batterie ist unterladen
Trägheitsrad dreht sich zu schnell
Zunächst fügen wir einen Mechanismus hinzu, um den Trägheitsradmotor automatisch abzuschalten, wenn er zu schnell dreht. Erinnern Sie sich daran, dass Sie in der vorherigen Übung den Drehzahlmesser verwendet haben, um die Winkelgeschwindigkeit des Trägheitsrades zu messen, und haben eine Logik implementiert, um den Trägheitsradmotor abzuschalten, wenn ein Geschwindigkeitsschwellenwert überschritten wird. Der Algorithmus der Balance-Regelung sollte das Gleiche tun.
Erstellen Sie ein neues Outportssignal vom Outport des Inertia Wheel Subsystems und beschriften Sie das Signal Inertia Wheel Speed (Trägheitsradgeschwindigkeit):
Ziehen Sie nun das Signal in die linke Seite des Controller Subsystems und erzeugen Sie einen dritten inport:
Verzweigen Sie das neue Signal in den Scope Block: (Simulink → Sinks). Öffnen Sie den Scope-Block und ändern Sie View → Layout in 3x1:
Als nächstes gehen Sie zu myIWheel.slx (oder iWheel2tach.slx), kopieren das Get iWheel Saturation Subsystem und fügen es in das Controller Subsystem in myMoto.slx ein. Legen Sie die Signale wie abgebildet:
Hinweis: Vergleich mit konstantem Wert ändert sich, wenn der Drehzahlbereich verfügbar wird.
Die Ausgabe des Get iWheel Saturation Subsystems ist ein logischer Wert von 0 oder 1. Wenn der Wert 1 ist, sollte der Trägheitsradmotor entsprechend dem Steuerungsoutport arbeiten. Wenn der Wert 0 ist, sollte der Trägheitsradmotor stoppen. Mit anderen Worten, der ultimative Torque Command sollte das Produkt aus dem Reglerausgang und dem Subsystemausgang sein. Um die Abschaltung der Trägheitsradsättigung zu implementieren, fügen Sie einen Product Block aus Simulink → Math Operations hinzu und routen Sie die Signale wie dargestellt:
Halten Sie nun das Motorrad in senkrechter Position und lassen Sie das Modell auf dem MKR1000-Board laufen. Aktivieren Sie das Trägheitsrad und lehnen Sie das Motorrad in eine Richtung, um 3 Grad zu sagen, und halten Sie es dort. Sie werden sehen, dass das Trägheitsrad kontinuierlich in die Schräglage beschleunigt. Stellen Sie sicher, dass das Trägheitsrad beim ersten Überschreiten der Grenzgeschwindigkeit endgültig ausgeschaltet wird, indem Sie das neue Zielfernrohr überprüfen. Sie nun das Modell auf der MKR1000-Platine aus und neigen Sie das Motorrad in eine Richtung, so dass das Trägheitsrad kontinuierlich in die Leiste beschleunigt. Stellen Sie sicher, dass das Trägheitsrad beim ersten Überschreiten der Schwellengeschwindigkeit dauerhaft abschaltet.
Wenn das Trägheitsrad plötzlich stoppt, während die Anwendung auf der Hardware läuft, ist es nützlich zu wissen, ob es daran lag, dass es gesättigt wurde oder aus einem anderen Grund. Daher sollten Sie den Sättigungsstatus des Trägheitsrades an einen Display Block in der obersten Ebene des Modells ausgeben.
Füge einen Out1 Block von Simulink → Sinks hinzu. Beschriften und verbinden Sie es wie abgebildet:
Denken Sie nun darüber nach, was Sie ausgeben. Der Wert ist 1, wenn sich das Trägheitsrad in akzeptabler Weise dreht, und 0, wenn es gesättigt ist. Das Outport Label ist Inertia Wheel Saturated, was das Gegenteil impliziert. Daher sollten Sie diesen logischen Wert negieren, bevor er den Inertia Wheel Saturated outport Block erreicht. Fügen Sie einen Logical Operator Block aus Simulink → Logic and Bit Operations hinzu und setzen Sie den logischen Operator auf NOT. Schließen Sie den Block wie abgebildet an:
Gehen Sie zur obersten Ebene des Modells, fügen Sie einen Display Block von Simulink → Sinks hinzu und schließen Sie ihn wie abgebildet an. Ändern Sie die Größe des Display Blocks, da Sie später ein paar weitere Zahlen anzeigen werden. Möglicherweise müssen Sie einige Blöcke und Signale verschieben, um Platz für den Display Block zu schaffen:
Führen Sie das Modell erneut aus und beobachten Sie den neuen Display Block. Neigen Sie das Motorrad so, dass die Geschwindigkeit des Trägheitsrades wie bisher ansteigt, und stellen Sie sicher, dass der Display Block bei Erreichen des Schwellenwerts von 0 auf 1 wechselt. Disable the inertia wheel using the manual switch and Stop the model.
Stopp bei extremen Neigungswinkeln an
Als nächstes programmieren wir die Steuerung so, dass sie den Trägheitsradmotor abschaltet, wenn θ weit von Null entfernt ist. Führen Sie das Modell aus, wenn es nicht bereits läuft.
Theta im Scope Window untersuchen. Lehnen Sie das Motorrad auf seinen Ständer und beachten Sie die Reichweite von θ:
Es ist sicher zu sagen, dass sich das Motorrad, wenn der Neigungswinkel eine dieser Extremwerte erreicht, nicht in einem stabilen Auswuchtmodus befindet. Sie sollten das Motorrad als "fallen (gefallen)" betrachten, wenn die Größe des Neigungswinkels 6 Grad überschreitet.
Dazu stoppen Sie das Modell und greifen auf das Controller Subsystem zu. Fügen Sie einen Interval Test Block von Simulink → Logic and Bit Operations hinzu und verzweigen Sie das Theta-Signal, um es zu verbinden. Stellen Sie die Intervall-Testgrenzen wie abgebildet ein:
Der Outport des Interval Test Blocks ist ein logischer Wert von 0 oder 1. Der Trägheitsradmotor sollte nur dann aktiviert werden, wenn sowohl die Trägheitsradgeschwindigkeit unter dem Schwellenwert liegt als auch der Neigungswinkel innerhalb von 10 Grad von θ = 0 liegt. Um das logische AND Gatter zu implementieren, fügen Sie einen Logical Operator Block aus Simulink → Logic and Bit Operations hinzu. Verbinden Sie die Signale wie abgebildet:
Probieren wir es aus. Führen Sie das Modell aus und aktivieren Sie den Trägheitsradmotor. Experimentieren Sie mit verschiedenen Neigung und stellen Sie sicher, dass der Trägheitsradmotor nicht fährt, wenn sich das Motorrad nach außen lehnt +/- 6 Grad aus der Vertikalen.
Deaktivieren Sie den Trägheitsradmotor und stoppen Sie das Modell.
Lassen Sie uns den Status "umgefallen" im Display Block melden, wie Sie es bei der Sättigung des Trägheitsrades getan haben. Die Ausgabe des Interval Test Blocks ist 1, wenn sich der Neigungswinkel in einem akzeptablen Bereich befindet, und 0, wenn er es nicht ist. Da Sie den Out-of-Range-Status als "Fallen - gefallen" bezeichnen, wollen Sie das Gegenteil von diesem Signal. Kopieren und Einfügen des Relational Operator Blocks, der den NOT-Operator enthält, und Hinzufügen eines weiteren Out1 Blocks von Simulink → Sinks. Verbinden und beschriften Sie die Blöcke wie abgebildet:
Kehren Sie nun zur obersten Ebene des Modells zurück. Fügen Sie einen Mux Block von Simulink → Signal Routing hinzu, und verbinden und beschriften Sie die Signale wie abgebildet:
Führen Sie das Modell aus und beobachten Sie den Fallen Status ("umgefallen") im Display Block, wenn der Neigungswinkel a)innerhalb und b) außerhalb von +/-6 Grad liegt.
Stopp, solange IMU nicht kalibriert ist
Für die nächste ausfallsichere Maßnahme möchten Sie sicherstellen, dass der Trägheitsradmotor nicht antreibt, es sei denn, die IMU wurde kalibriert. In der vorherigen Übung haben Sie im IMU Subsystem eine gewisse Logik aufgebaut, um die vier IMUs zu konvertieren.
Die Steuerung kann diese Informationen nutzen, um das Trägheitsrad zu aktivieren oder zu deaktivieren. Zunächst betrachten wir das Verhalten der Kalibrierstatuselemente sowie des IMU-Kalibriersignals. Führen Sie das Modell aus, wenn es nicht bereits läuft, und deaktivieren Sie den Trägheitsradmotor. Beachten Sie die Anzeigen Calibration Status und Calibration Vector. Drehen Sie das Motorrad um seine Hauptachsen, bis die Anzeige des Calibration Status 1 anzeigt:
Die IMU verliert manchmal die Kalibrierung für einen oder mehrere Sensoren, nachdem sie zunächst kalibriert wurde. Aus praktischen Gründen sollten Sie in Betracht ziehen, dass die IMU kalibriert werden soll, wenn sie die Kalibrierschwellen zu einem bestimmten Zeitpunkt in der Vergangenheit innerhalb der aktuellen Power-Session überschritten hat. Daher möchten Sie das IMU Calibrated Signal auf einen Wert von 1 setzen, sobald die Kalibrierschwellen zum ersten Mal erreicht werden, und das Signal auf unbestimmte Zeit auf diesem Wert belassen.
Lassen Sie uns fortfahren, indem wir einen Inport für das IMU Calibrated Signal bereitstellen. Stoppen Sie das Modell. Verzweigen Sie das IMU Calibrated und beschriften Sie es wie abgebildet:
Ziehen Sie nun das Signal in das Controller Subsystem und erstellen Sie einen neuen Inport an der vierten Position:
Um das IMU Calibrated Signal zu setzen, greifen Sie auf das Controller Subsystem zu und fügen Sie einen Unit Delay Block von Simulink → Discrete und einen Logical Operator Block von Simulink → Logic and Bit Operations hinzu. Stellen Sie den Operator auf OR:
Wählen Sie den Unit Delay Block aus und drücken Sie Ctrl + I, um die Ausrichtung umzukehren. Routen und beschriften Sie dann die Signale wie abgebildet:
Überzeugen Sie sich selbst, dass dieser Mechanismus das Outputssignal dauerhaft auf 1 setzt, sobald die IMU-Kalibrierschwellen zum ersten Mal erreicht werden.
Gehen Sie nun zum ursprünglichen Block Logical Operator (AND) und ziehen Sie das gesetzte IMU Calibrated Latched Signal auf Position 1, um inport zu erstellen:
Abschließend fügen wir diesen Status zusammen mit den ersten beiden Failsafe-Modi dem Display hinzu. Fügen Sie im Controller Subsystem einen Out1 Block von Simulink → Sinks hinzu, beschriften und verbinden Sie ihn wie abgebildet:
Kehren Sie zur obersten Ebene des Modells zurück und verbinden Sie den IMU Calibrated Latched Outport mit dem Mux Block, wodurch ein dritter Inport entsteht:
Beschriften Sie das neue Signal IMU Calibrated Latched:
Unterbrechen Sie als nächstes die Stromversorgung der IMU, indem Sie den Motor Carrier ausschalten und das USB-Kabel von Ihrem Computer trennen. Stellen Sie die Stromversorgung des Motor Carriers und das USB-Kabel wieder her.
Führen Sie das Modell aus und aktivieren Sie den Trägheitsradmotor mit dem Handschalter. Stellen Sie sicher, dass der Trägheitsradmotor erst dann zu fahren beginnt, wenn das IMU Calibrated Signal zum ersten Mal auf 1 trifft. Überprüfen Sie die Fehlerstatusanzeigen, um sicherzustellen, dass das IMU Calibrated Latched Signal beim Einrasten dauerhaft bei 1 bleibt. Vergewissern Sie sich, dass die beiden anderen ausfallsicheren Mechanismen (Abschaltung der Trägheitsscheibendrehzahl und "Fall"-Abtastung) weiterhin funktionieren.
Wenn Sie fertig sind, deaktivieren Sie den Trägheitsradmotor und stoppen Sie das Modell.
Abschaltung bei niedrigem Stromverbrauch
Jetzt fügen wir die letzte ausfallsichere Funktion hinzu: das Abschalten des Trägheitsrades, wenn der Batteriestand zu niedrig ist. Der Betrieb des Trägheitsrades mit unzureichender Akkuladung kann die Motorhardware beschädigen, da es nicht in der Lage ist, genügend Drehmoment bereitzustellen, um den Neigungswinkel so zu korrigieren, wie er konzipiert wurde. Während der PID-Regler automatisch Umgebungsvariationen, einschließlich eines leicht verminderten Motordrehmoments, berücksichtigt, liegt ein deutlich niedriger Batteriestand außerhalb des Bereichs, in dem der Regler stabil ist.
Wenn Sie an Ihren Simulink-Modellen zwischen den Läufen auf dem MKR1000 arbeiten (insbesondere wenn Sie Motoren verwenden), ist es eine gute Zeit, den Akku aus dem Motor Carrier zu nehmen und aufzuladen. Es ist wichtig, dass diese Batterien niemals zu viel Ladung verlieren, da sie sonst dauerhaft beschädigt oder nicht wieder aufladbar werden können.
Beginnen wir mit der Überwachung des Batteriestatus. Navigieren Sie im Simulink Library Browser zur Simulink Support for Arduino MKR Motor Carrier Library und ziehen Sie den Battery Read Block in myNewMoto.slx. Konfigurieren Sie den Block wie abgebildet:
Die Ausgabe ist eine ganze Zahl, die direkt von einem Batterieladesensor auf dem Motor Carrier gelesen wird. Diese ganze Zahl entspricht dem 77-fachen der physikalischen Spannung der Batterie in Volt.
Fügen Sie einen Display Block von Simulink → Sinks hinzu und verbinden Sie ihn mit dem Battery Read Block. Beschriften Sie den Display Block wie abgebildet. Deaktivieren Sie dann den Trägheitsradmotor und führen Sie das Modell aus:
Hinweis: Sie sollten bei der Spannungsmessung ein geringes Rauschen beobachten, während der Motor nicht angetrieben wird, was bei jeder elektrischen Messung erwartet wird.
Beachten Sie, dass der Datentyp der Batteriemessung eine 32-Bit unsigned Integer (uint32) ist. Um den Wert in eine reale Spannung umzuwandeln, benötigen Sie einen Fließkomma-Datentyp, der not-integer darstellen kann. Stoppen Sie das Modell und fügen Sie einen Data Type Conversion Block von Simulink → Signal Attribute und einen Gain Block von Simulink → Math Operations hinzu. Stellen Sie den Verstärkungswert auf 1/77 ein. Schließen Sie die Blöcke an und beschriften Sie das Endsignal wie abgebildet. Führen Sie das Modell aus:
Wenn der Akku voll geladen ist, sollten Sie einen Messwert von mindestens 12 V haben. Dies ist optimal für die einwandfreie Funktion des Trägheitsradmotors, aber eine Spannung von nur 11 V ist akzeptabel. Nun sehen Sie, was mit der Spannung passiert, während der Motor angetrieben wird. Wenn das Modell noch läuft und das Trägheitsrad noch deaktiviert ist, kalibrieren Sie die IMU, indem Sie sie um mindestens 90 Grad um jede Achse drehen, bis Sie im Display Block rechts neben dem Controller Subsystem eine 1 für das IMU Calibrated Latched signal sehen:
Aktivieren Sie nun den Trägheitsradmotor und halten Sie das Motorrad in der Nähe von θ = 0, während Sie das Battery Voltage display betrachten. Versuchen Sie, das Motorrad ein paar Grad in beide Richtungen zu neigen, damit der Motor ein gewisses Drehmoment auf das Trägheitsrad ausübt:
Deaktivieren Sie den Trägheitsradmotor und stoppen Sie das Modell.
Was passiert mit der Batteriespannung während sich der Motor dreht? Eine Batterie im Ruhezustand (oder in der Nähe) hat eine höhere Spannung als eine Batterie, die einen Motor aufgrund der rückwärtigen elektromotorischen Kraft (Back EMF), die eine Folge des Lenz-Gesetzes ist, aktiv antreibt.
Aufgrund dieses Phänomens sollten Sie bei der Einstellung des Schwellenwerts für die Failsafe-Funktion der Batterieladung einen erwarteten Spannungsabfall sowie gelegentliche Spannungseinbrüche und -spitzen berücksichtigen. Für die Zwecke dieses Projekts beträgt die niedrigste sichere Spannung für jeden Teil der Nutzungsdauer der Anwendung 10,5 V.
Um diese Logik zu implementieren, verzweigen Sie die umgerechnete Batteriespannung (nach dem Gain Block) in das Controller Subsystem und erzeugen Sie einen fünften Inport:
Als nächstes greifen Sie auf das Controller Subsystem zu, suchen den neuen Battery Read Inport Block und verschieben ihn in die linke untere Ecke. Um die Batteriespannung mit dem zuvor beschriebenen Schwellenwert zu vergleichen, fügen Sie einen Compare To Constant Block von Simulink → Logic and Bit Operations hinzu, konfigurieren und verbinden Sie ihn wie gezeigt:
Der Ausgang des Blocks Compare To Constant zeigt an, ob die Batterie zu jedem Zeitpunkt ausreichend geladen ist. Sie möchten jedoch, dass das Signal "Battery Charged" nach dem ersten Auftreten einer Erkennung eines schwachen Akkus dauerhaft auf Null geht, auch wenn die Ladung wieder über den Spannungsschwellenwert steigt. Aufgrund des Rauschens in der Spannungsmessung schwingt die Spannung zufällig um den Schwellenwert, wenn sie beginnt abzunehmen. Dies kann dazu führen, dass der Trägheitsradmotor beim schnellen Ein- und Ausschalten "stottert", was weder für die Balance noch für den Motor gut ist.
Daher sollten Sie dieses Signal so abschalten (latch off), dass beim ersten Auftreten einer Minderspannung das Signal "Battery Charged" dauerhaft auf 0 gesetzt wird. Wenn das eintritt, sollten Sie die Batterie vom Motor Carrier trennen und voll aufladen.
Um das Signal auf Null zu halten, wenn die Batterie zum ersten Mal eine Minderspannung zur Verfügung stellt, fügen Sie einen Logical Operator Block von Simulink → Logic and Bit Operations hinzu, setzen Sie den Operator auf AND und fügen Sie einen Unit Delay Block von Simulink → Discrete hinzu. Stellen Sie im Unit Delay Block den Anfangszustand (Initial Condition) auf 1. Verbinden Sie die Blöcke wie abgebildet:
Leiten Sie das batteriebetriebene Signal in den zentralen Logical Operator (AND) Block weiter und erzeugen Sie einen vierten Inport:
Fügen Sie einen Out1 Block von Simulink → Sinks hinzu und verbinden und beschriften ihn wie abgebildet:
Abschließend kehren Sie zur obersten Ebene des Modells zurück und ziehen Sie das Battery Charged Signal auf den Mux Block, wodurch ein vierter Inport entsteht:
Beschriften Sie das Signal Battery Charged und verbinden Sie die Batterie mit dem Motorrad (wenn Sie sie entfernt haben) und betreiben Sie das Modell. Überprüfen Sie, ob alle vier ausfallsicheren Mechanismen ordnungsgemäß funktionieren:
Prüfung und Verfeinerung des Steuerungsalgorithmus auf dem MKR1000
Als nächstes versuchen wir, das Motorrad mit dem Trägheitsrad auszubalancieren. Zunächst müssen Sie den Schwerpunkt des Motorrads so verschieben, dass dieser direkt über der Bodenradachse liegt, wenn die IMU θ als Null misst. Dies können Sie z.B. erreichen, indem Sie die Position des LiPo-Akkus auf der Rückseite des Motorrads verschieben
Bei deaktiviertem Trägheitsradmotor versuchen Sie, die Akkuposition von einer Seite zur anderen Seite zu verschieben. Führen Sie das Modell aus, wenn es nicht bereits läuft. Beobachten Sie den Display Block, um sicherzustellen, dass die IMU ausreichend kalibriert ist:
Halten Sie das Motorrad senkrecht, während Sie das Scope Window beobachten. Drücken Sie das Motorrad ein paar Grad in jede Richtung hin und her, so dass es sich frei über den Schwerpunkt bewegt. Verringern Sie die Amplitude der Bewegung, bis Sie den Balancepunkt innerhalb weniger Grad erkennen können:
Wenn Sie feststellen, dass der Balancepunkt eine negative Vorspannung hat, versuchen Sie, die Batterie nach rechts zu verschieben und den Test zu wiederholen. Wenn der Balancepunkt eine positive Vorspannung hat, versuchen Sie, die Batterie nach links zu verschieben und den Test zu wiederholen. Wiederholen Sie diese Schritte, bis Sie den Balancepunkt innerhalb einer Abweichung von 1 Grad von 0 Grad erreichen:
Hinweis: Wenn eine stärkere Verzerrung in Ihrer Balance-Messung vorliegt (d.h. mehr als 4 Grad), stellen Sie sicher, dass der IMU-Schild fest auf die MKR1000-Platine gedrückt wird und die MKR1000-Platine fest auf den Motorträger gedrückt wird. Dieser sollte dann bündig mit der Unterseite des Motorradgerüsts abschließen. Alle drei Komponenten sollten sichtbar parallel zur Bodenoberfläche sein:
Einstellen des Balancepunktes
Als nächstes verwenden wir den Trägheitsradmotor, um den Balancepunkt fein einzustellen. Während Sie das Trägheitsrad mit den Fingern blockieren, aktivieren Sie den Trägheitsradmotor, indem Sie den Manual Switch Block im Modell Window verwenden. Der Motor beginnt, gegen Ihren Haltegriff zu fahren:
Stellen Sie den Neigungswinkel ein, bis Sie den Winkel finden, bei dem das Motordrehmoment Null ist (wo es die Richtung ändert). Noten Sie diesen Neigungswinkel irgendwo, dies ist die Tendenz in Ihrer IMU.
Lösen Sie Ihren Griff, damit sich das Trägheitsrad drehen kann und das Motorrad sanft in beide Hände fallen kann. Siehe Foto unten:
Wiederholen Sie die letzten beiden Schritte mehrmals, bis die Hand, in die der Motor fällt, zufällig wird. Der Durchschnitt dieser Werte ist eine gute Schätzung des Bias.
Lassen Sie uns nun sehen, wie Sie die Abweichung in unserem Modell anpassen. Fügen Sie in myNewMoto einen Bias-Block (Simulink → Math Operations) hinzu, wie unten gezeigt.
Ziehen Sie den Bias-Block wie folgt auf das Theta-Signal:
Fügen Sie Ihrem Modell einen Slider-Block aus der Simulink → Dashboard-Bibliothek hinzu und doppelklicken Sie darauf.
Wählen Sie den Bias-Block im Modell aus, überprüfen Sie den Kreis im Schieberegler und ändern Sie den Minimal- und Maximalwert auf -5 bzw. 5.
So sollte das fertige Modell aussehen:
Wenn Sie das Modell im externen Modus ausführen, sind viele der Blockparameter, wie Verstärkungen und Konstanten, abstimmbar. Das bedeutet, dass ihr Wert geändert werden kann, während das Modell auf der Hardware läuft. Sie können auf einen beliebigen Block doppelklicken, während das Modell läuft, und einen neuen Parameterwert eingeben. Der neue Wert wird wirksam, wenn Sie in irgendeinen Block auf Apply oder OK klicken.
Führen Sie dieses Modell aus und entfernen Sie den ermittelten Bias-Wert, damit der Controller mindestens 10 Sekunden lang balancieren kann.
Hinweis: Wenn Sie bei diesem Test bemerken, dass das Trägheitsrad zu oft gesättigt ist, ohne dass der Motor heiß wird, können Sie die Sättigungsgrenze wie unten gezeigt auf 6000 erhöhen.
Stellen das Controller-gain ein
Jetzt ist es an der Zeit, die Verstärkungsfaktoren der PID-Regelung zu optimieren, um das optimale Regelverhalten für das Balancieren des Motorrads zu finden. Es gibt viele Ansätze zur systematischen Abstimmung von PID-Reglern in der technischen Literatur. Ebenso gibt es viele Software-Tools, einschließlich Simulink Control Design, die versuchen, die optimalen Steuerungsparameter zu ermitteln, indem sie die Zustandsfehler im Laufe der Zeit beobachten und das Verhalten des kontrollierten Systems charakterisieren. Für die anfängliche Abstimmung des PID-Reglers ist es hilfreich, die Abstimmung manuell zu versuchen, um ein Gespür für das Systemverhalten und die Wirkung jeder Regelverstärkung zu erhalten.
In den meisten PID-Abstimmmethoden werden die I- und D-Verstärkungen als proportional zur P-Verstärkung betrachtet, und man sollte P nicht anpassen indem gleichwertige proportionale Änderungen an I und D gleichzeitig erfolgen. Andernfalls wäre es schwierig, die Auswirkungen einer Veränderung von P allein zu beurteilen.
Was wir haben, ist ein ziemlich aggressiver Controller, da Sie sehen können, dass die P- und D-Terme ähnliche Größen haben. Das Wert von Kd ändert. Sie sehen, wie sich das Motorrad verhält, während die Kp-Verstärkung konstant gehalten wird.
Stellen Sie sicher, dass die P- und D-Verstärkungen immer noch auf 25 bzw. 4 und die Verstärkung immer noch auf 2e-2 eingestellt sind (oder Kp = 33,33, Kd = 5,33 und Gain = 1,5e-2 für 6-V-Motoren):
Jetzt, Stellen Sie sicher, dass der Trägheitsradmotor deaktiviert ist und führen Sie das Modell aus. Kalibrieren Sie die IMU. Wenn der Trägheitsradmotor wie bisher im Balancepunkt steht, stellen Sie sicher, dass der Neigungswinkel etwas um 0 schwankt indem Sie die die Akkuposition entsprechend anpassen:
Halten Sie den Trägheitsradmotor fest und schalten Sie ihn ein. Lassen Sie das Motorrad aus der vertikalen Position los und versuchen Sie, es auszubalancieren. Sie können auch beobachten, dass der Theta-dot ein Geräusch um den Gleichgewichtspunkt hat (was bedeutet, dass sich dieser Wert stark ändert, obwohl das Motorrad nicht oszilliert):
Jetzt wollen wir kontrollieren, ob Sie die Stabilität verbessern und Schwingungen reduzieren können.
Reduzieren wir den Einfluss, den D gain auf die Regelung hat, indem wir ihren Wert auf 0,4 reduzieren. Ändern Sie die Kd-Verstärkung, während das Modell noch auf der Hardware ausgeführt wird, und beobachten Sie die Änderung in Theta.
Sie werden auf jeden Fall bemerken, dass das Theta oszillierender ist, was darauf hindeutet, dass der einzige Weg für Kd, die Erhöhung ist. Spielen Sie mit den Kp- und Kd-Werten, um einen guten Controller zu erhalten, der mindestens 20 Sekunden ausbalanciert. Denken Sie daran, wenn bei Ihrem Motorrad ein stationärer Fehler auftritt, können Sie die Kp erhöhen, um diesen zu beseitigen. Wenn Sie die Kd erhöhen, müssen Sie auch die Kp erhöhen.
Betrachten wir die Optimierung Ihres Baseline-Controllers wie folgt:
Wenn Sie mit der Einstellung Ihres PID-Reglers fertig sind, stellen Sie die Reglerverstärkungen (controller gains) auf die obigen Werte zurück, bevor Sie mit der nächsten Übung fortfahren.
Bereitstellen des Algorithmus auf dem Motorrad
Bisher haben wir gesehen, wie der Algorithmus auf der Hardware ausgeführt wird, während das Motorrad noch über USB mit dem PC verbunden ist. Um Ihren gut abgestimmten Regelungsalgorithmus auf der Hardware eigenständig auszuführen, klicken Sie auf die deploy "Auf Hardware bereitstellen" und überprüfen Sie, ob die Motorrad balanciert ist. Auch nach dem Abziehen des USB-Kabels ist. Denken Sie daran, den Motor Carrier ON nach dem Abklemmen einzuschalten.
LEARN BY DOING
In diesem Kapitel haben Sie den Trägheitsradmotor, den IMU-Sensor und den Tachometer in das Hauptsystemmodell integriert, so dass diese korrekt mit dem PID-Regelalgorithmus kommunizieren. Anschließend haben Sie Sicherheitsfunktionen hinzugefügt, um das Risiko einer Beschädigung der Hardware zu minimieren. Schließlich haben Sie den Balance Control Algorithmus auf der realen Hardware getestet und den Regelalgorithmus und seine PID-Gewinne verfeinert, um die Balance an Ort und Stelle zu erreichen.
Um weitere Untersuchungen durchzuführen,
- Versuchen Sie Sättigung auf den D-Term, um den Einfluss des oszillierenden Theta-dot Signal zu verringern
- Wenn Sie beispielsweise einen Ventilator haben, versuchen Sie, das Motorrad dem Wind aus verschiedenen Richtungen auszusetzen.
- Sie können auch versuchen, auf einer nicht ebenen oder vibrierenden Oberfläche zu balancieren.
Wie gut balanciert die Steuerung das Motorrad unter verschiedenen äußeren Umständen?
Eine weitere Herausforderung, die Sie versuchen können, ist eine weitere Sicherheitsfunktion hinzuzufügen, die das Trägheitsrad deaktiviert, wenn das Torque Command auf 0,7 oder -0,7 gesättigt ist. Sie sollten bedenken, dass es akzeptabel ist, dass das Drehmoment des Trägheitsradmotors gelegentlich die Sättigungsgrenzen erreicht, aber es sollte nicht zu lange auf diesem Wert bleiben oder diese Werte sehr häufig erreichen. Sie können entscheiden, wie Sie die Aktivierungs-/Deaktivierungslogik in Bezug auf den Torque Command des Trägheitsradmotors aufbauen. Sie sollten einen Algorithmus finden, der die Abschaltsicherheit des Motors aufgrund des starken Sättigungsverhaltens gegen die Möglichkeit abwägt, den Motor unter relativ sicheren Umständen (wie z.B. sehr sporadische und kurze Sättigungen) in Gang zu halten.
ÜBUNG 4:
6.4 Ausbalancieren bei gerader Bewegung
In dieser Übung erreichen Sie die Balance, während sich das Motorrad geradlinig vorwärts oder rückwärts bewegt. Um dies zu tun, muss der Algorithmus auf dem MKR1000 laufen, ohne dass dieser über den USB-Anschluss mit dem Computer verbunden ist. Technisch gesehen können Sie dies jetzt umsetzen. Aber sobald Sie den MKR1000 vom Computer trennen, haben Sie keine Kenntnis von den Systemzuständen, den Steuerbedingungen oder dem Winkel. Außerdem können Sie im Simulink-Modell die Systemmodi nicht über Handschalter steuern. Daher bauen Sie eine Wi-Fi-Verbindung zwischen dem Motorrad und dem Computer auf, damit Sie den Status und die Signale des Motorrads auf Ihrem Computer drahtlos beobachten können. Anschließend führen Sie die Hinterradkomponente zunächst isoliert und dann in das Systemmodell ein. Sie führen dann den Regelalgorithmus auf dem Motorrad aus, während Sie das Hinterrad über Wi-Fi steuern und dessen Signale aus der Ferne beobachten.
In dieser Übung lernen Sie, wie Sie Folgendes tun können:
- Steuern und Überwachen des Motorrads aus der Ferne über Wi-Fi
- Anwendung der Eigenschaften und relevanten Spezifikationen für des DC-Hinterradgetriebemotor und des Drehgebers.
- Testen und Integrieren des Hinterradmotors, um eine Vorwärts- und Rückwärtsbewegung des Motorrads zu ermöglichen
- Balancieren des Motorrads, während es vorwärts, rückwärts und an Ort und Stelle fahren.
Steuern und Überwachen von Motorrädern über Wi-Fi
Beginnen wir mit der Konfiguration des Systemmodells, um den Steuerungsalgorithmus aus der Ferne auszuführen. Um von diesem Punkt aus mit dem Motorrad-Projekt fortzufahren, benötigen Sie Zugang zu einem Wi-Fi-Netzwerk. Das Netzwerk muss offen (kein Passwort) oder mit WEP- oder WPA-Verschlüsselung sein. Das Netzwerk darf keine zusätzlichen Anmeldeinformationen über die WEP- oder WPA-Sicherheit hinaus benötigen (wie beispielsweise Captive-Portale, die eine Interaktion mit einer Website erfordern). Wenn ein solches Netzwerk nicht verfügbar ist, können Sie einen Wi-Fi-Hotspot auf Ihrem Mobiltelefon einrichten. Sie können Ihren Computer dann mit dem Wi-Fi-Netzwerk Ihres Telefons verbinden. In der Bedienungsanleitung Ihres Telefons finden Sie Anweisungen zur Einrichtung eines Wi-Fi-Hotspots.
Schließen Sie Ihren Computer an ein Wi-Fi-Netzwerk mit den oben genannten Anforderungen an.
Öffnen Sie myMoto.slx:
>> myNewMotoHinweis: Wenn myMoto.slx nicht verfügbar oder unvollständig ist, verwenden Sie stattdessen motoSys2_balance.slx und speichern Sie es unter myMoto.slx.
Öffnen Sie die Configuration Parameters und navigieren Sie zum Ausahl Hardware Implementation. Wählen Sie die Target hardware resources und klicken Sie auf WiFi-Eigenschaften. Geben Sie Ihre Netzwerk-Anmeldeinformationen ein:
Klicken Sie jetzt auf External mode und stellen Sie die Communication interface auf WiFi ein:
Klicken Sie auf OK.
Führen Sie das Modell aus.
Der Build-Prozess dauert etwas länger als üblich, da Simulink Ihr drahtloses Netzwerk scannen und eine freie IP-Adresse für das MKR1000 Board finden muss.
Sobald das Modell läuft, trennen Sie das USB-Kabel von Ihrem Computer. Stellen Sie sicher, dass das Modell weiterhin fehlerfrei läuft. Überprüfen Sie das Scope Window und stellen Sie sicher, dass Sie noch Signaldaten streamen. Kalibrieren Sie den Motor und balanciern Sie das Motorrad wie im vorherigen Abschnitt beschrieben aus:
Versuchen Sie, das Trägheitsrad ein- und auszuschalten. Wie schnell reagiert das Motorrad auf Ihre Befehle?
Vorausgesetzt, Ihre Wi-Fi-Verbindung ist stabil und nicht zu stark mit anderen Daten belastet, sollten Sie eine nahezu sofortige Reaktion beim Umschalten des Handschalters im Modell und der Aktivierung des Trägheitsradmotors beobachten.
Stoppen Sie das Modell.
Antrieb Hinterrad
Nun lassen Sie uns auf den Hinterradmotor schauen. Das Hinterrad wird von einem 100:1-Getriebemotor angetrieben. Siehe die Hardware Spezifikation. Sie werden diesen Motor in Simulink integrieren, ähnlich wie beim Trägheitsradmotor.
Während Sie das Hinterrad isoliert testen, ist es sinnvoll, das Hinterrad von Ihrer Arbeitsfläche anzuheben, damit das Motorrad nicht wegfährt! Entfernen Sie dazu den Kickstand vom Motorrad und schließen Sie ihn in vertikaler Position wieder an:
Schließen Sie das USB-Kabel wieder an Ihren Computer an.
Öffnen Sie das folgende Simulink-Modell:
>> drive0_startSpeichern Sie das Modell als myDrive.slx.
In diesem Modell steuern Sie die Hinterradgeschwindigkeit als gebrochenes Tastverhältnis mit positiven Werten für die Vorwärtsbewegung. Ein Handschalter ist vorgesehen, um den Hinterradmotor zu aktivieren oder zu deaktivieren.
Gehen Sie nun zurück zu myMoto.slx und kopieren Sie das Inertia Wheel subsystem. Fügen Sie das Subsystem in myDrive.slx ein und ändern Sie die Bezeichnung wie abgebildet:
Untersuchen Sie das Motorrad, um zu sehen, wie das Hinterrad mit dem Motor Carrier verbunden ist. Beachten Sie die Bezeichnungen des Motoranschlusses:
Greifen Sie auf das Rear Wheel subsystem zu und doppelklicken Sie dann auf den M3M4DCMotors Block. Stellen Sie den Motor port so, dass er mit Bezeichnung des Motoranschlusses auf Ihrem Motor Carrier übereinstimmt:
Löschen Sie den unteren Teil des Subsystems, bestehend aus dem Tachometer Block, dem Rate Transition Block und dem Inertia Wheel Speed outport. Sie werden diesen später durch den Drehgeber ersetzen, um die Raddrehzahl zu messen:
Schließen Sie das USB-Kabel wieder an den PC und das Motorrad an und schalten Sie den MKR MotorCarrier ein (ON) (falls er OFF ist). Gehen Sie Zurück zur obersten Ebene des Modells und Ausführen Sie es aus. Sobald das Modell läuft, experimentieren Sie mit dem Handschalter und stellen Sie mit dem Schieberegler die Geschwindigkeit auf positive und negative Werte ein (aus Sicherheitsgründen halten Sie diese unter +/- 0,5):
Überprüfen Sie die Bewegung des Rades in Bezug auf das Vorzeichen der Geschwindigkeit.
Führt der positive Geschwindigkeitsbefehl zum Vorwärtsantrieb des Motorrads?
Deaktivieren Sie das Hinterrad und stoppen Sie das Modell.
Wenn Ihr Hinterrad für einen positiven Geschwindigkeitsbefehl keine Vorwärtsbewegung zeigt, ändern Sie den Verstärkungswert innerhalb des Rear Wheel subsystem von 255 auf -255:
Hinweis: Das vorherige Bild soll nur den Fall darstellen für den Sie die Drehrichtung des Motors ändern mussten.
Als nächstes versuchen wir, das Hinterrad über Wi-Fi zu bedienen. Gehen Sie in myDrive.slx zu Configuration Parameters und navigieren Sie zur Auswahl Hardware Implementation. Wählen Sie die Target hardware resources und klicken Sie auf WiFi properties. Geben Sie Ihre Netzwerk-Anmeldeinformationen ein:
Weiter, klicken Sie auf External mode und stellen Sie die Communication interface auf WiFi ein:
Klicken Sie auf OK.
Führen Sie das Modell aus. Wenn das Modell zu laufen beginnt, trennen Sie das USB-Kabel von der Vorderseite des Motorrads (hinter dem Vorderrad). Versuchen Sie, das Hinterrad zu aktivieren und den Geschwindigkeitswert aus der Ferne zu ändern.
Jetzt versuchen Sie, das Motorrad fahren zu lassen! Schalten Sie zunächst den Hinterradmotor mit dem Handschalter aus. Klappen Sie dann den Ständer wieder in die ursprüngliche diagonale Position zurück:
Hinweis: Sie halten Ihr Motorrad an den Seiten, da sich bei diesem Modell kein Trägheitsrad dreht.
Stellen Sie das Motorrad mit viel Platz entlang der Bewegungsstrecke in beide Richtungen auf den Boden. Stellen Sie die Startgeschwindigkeit auf niedrig ein (etwa 0,2) und aktivieren Sie das Hinterrad. Experimentieren Sie mit verschiedenen Drehmomentwerten (torque command values) und versuchen Sie, die lineare Position des Motorrads über den Schieberegler zu steuern.
Stoppen Sie das Modell.
Messung der Motorradgeschwindigkeit
Später werden Sie wissen wollen, wie schnell sich das Motorrad bewegt, damit Sie den idealen Neigungswinkel für eine koordinierte Kurvenfahrt berechnen können. Um die Längsgeschwindigkeit des Motorrads zu messen, verwenden Sie den am Hinterradmotor angebrachten Rotary Encoder:
Erinnern Sie sich an das Einführungsprojekt in Kapitel 2. Da erfasst ein magnetischer Drehgeber (Rotary Encoder) die Drehbewegung einer Motorwelle, indem er das Feld eines Magneten gemessen wird, der sich mit der Motorwelle dreht. Der Motor Carrier verfolgt, wie oft das Magnetfeld aus zwei verschiedenen Drehwinkeln betrachtet, auf- und abgefallen ist und wandelt diese Informationen in einen ganzzahligen Wert um. Dieser ganzzahlige Wert stellt die Winkelverschiebung der Motorwelle seit dem Zurücksetzen des Zählers dar
Zurück zum Modell myDrive.slx.
Hinweis: Wenn myDrive.slx unvollständig oder nicht verfügbar ist, verwenden Sie stattdessen drive2_wifi.slx. Erinnern Sie sich an das Modell als myDrive zu speichern und konfigurieren Sie das Modell mit Ihrem WIFI-Netzwerk.
Gehen Sie in das Rear Wheel subsystem (denken Sie daran, dass der Verstärkungswert in Ihrem Modell aufgrund der Korrektur der Bewegungsrichtung unterschiedlich sein kann):
Sie verwenden den Encoder Block, um auf den Zählerwert sowie die Zählrate (Zählungen/Sekunde) zuzugreifen. Suchen Sie im Simulink Library Browser den Encoder Block im Simulink Support for Arduino MKR Motor Carrier. Fügen Sie den Block dem Rear Wheel subsystem hinzu:
Überprüfen Sie die Verdrahtung Ihres Encoders:
Der Motor Carrier verfügt über 2 Encoderports, die jeweils aus 4 Schraubklemmen bestehen. Die mittleren 2 der 4 Schraubklemmen haben die Bezeichnungen HA1 und HB1 oder HA2 und HB2. Im ersten Fall lesen Sie von Encoder 1, und im zweiten Fall lesen Sie von Encoder 2. Gehen Sie in den Encoder Block und stellen Sie Encoder entsprechend ein. Aktivieren Sie dann den Encoder-Block und tauschen Sie ein mit dem Wert 0,01, wie unten:
Um den Encoder zu testen, fügen Sie einen Display Block von Simulink → Sinks hinzu und verbinden diesen mit den Position outports des Encoderblocks:
Vergewissern Sie sich, dass der Hinterradmotor deaktiviert (disabled) ist und führen Sie das Modell aus. Überprüfen Sie den display Block:
Jetzt , drehen Sie die magnetische Encoderplatte manuell um eine Umdrehung und Sie sollten sehen, dass die Zahlen auf dem Bildschirm ändern:
Beachten Sie das Vorzeichen der Geberzahl. Stoppen Sie das Modell.
Dieser Encoder hat 12 Zählwerte pro Umdrehung der Motorwelle. Der am Hinterrad angebrachte Gleichstrom-Getriebemotor dreht die Abtriebswelle bei 1/100 der Geschwindigkeit der Motorwelle. Das bedeutet, dass wir für jede Vorwärtsumdrehung des Hinterrades eine Erhöhung der Encoderanzahl um 12 x 100 oder etwa 1200 Zählungen erwarten.
Jetzt, versuchen Sie dieselbe Technik für die Encodergeschwindigkeit, wie in Kapitel 2. Löschen Sie den Display-Block und fügen Sie den Block Unit Delay (Simulink → Discrete) und Sum (Simulink → Math Operations) hinzu. Konfigurieren Sie den Block "Delay und Sum" wie folgt:
Fügen Sie als nächstes einen Gain-Block (Simulink → Math Operations) hinzu und ändern Sie den Gain-Wert auf "1/Ts". Schließen Sie sie alle wie unten:
Fügen Sie einen Datenkonvertierung (Simulink → Signal Attributes) zwischen dem Sum- und dem Gain-Block ein und ändern Sie den Ausgabedaten-Typ in "double". Das Subsystem sollte ungefähr so aussehen:
Wir wollen die Geschwindigkeit in Metern pro Sekunde (m/s) ausdrücken. Der Encoder Block gibt uns die Geschwindigkeit in Zählungen pro Sekunde an. Wir wissen, dass es 1200 Zählungen pro Umdrehung des Hinterrades gibt, und der Umfang des Hinterrades ist $2\pi r=2\pi(45mm)=2\pi(0.045m)=0.2827m$. Das bedeutet, dass man, um die Geschwindigkeit des Motorrads in m/s zu erhalten, die Geschwindigkeit in m/s mit 0.2827 m/1200 Zählungen multiplizieren muss. Ändern Sie den Gain-Wert von "1/Ts" in "(1/Ts)*(0,2827/1200)".
Hinweis: Wenn Ihre Encoderzahl beim Drehen der Magnetplatte im Uhrzeigersinn einen negativen Wert ergab, verwenden Sie stattdessen eine Verstärkung von -0,2827/1200.
Fügen Sie Out1 Block von Simulink → Sinks hinzu. Verbinden Geschwindigkeit-Signal an dieses Subsystem. Nennen Sie Rear Wheel subsystem Output.
Gehen Sie zur obersten Ebene des Modells und speisen Sie die neue Ausgabe des Subsystems in den verbleibenden Scope Port ein. Nennen Sie das Signal “Rear Wheel Speed”:
Stellen Sie den Kickstand vor Ausführung des Modells in die vertikale Position, so dass das Hinterrad die Bodenoberfläche nicht mehr berührt:
Führen Sie das Modell aus und stellen Sie die Hinterraddrehzahl ein, indem Sie den Torque Command über den Schieber ändern. Untersuchen Sie das Scope Window und notieren Sie den Zusammenhang zwischen dem Torque Command und der Raddrehzahl:
Hinweis: Die angegebenen Drehmomentwerte und die Hinterraddrehzahl sind in verschiedenen Einheiten angegeben. Es ist rein zufällig, dass sie in diesem Bild ähnlich Magnitude ist.
Deaktivieren Sie das Hinterrad (aber lassen Sie das Modell laufen) und stellen Sie den Kickstand in die diagonale Position. Trennen Sie das USB-Kabel vom Motorrad und versuchen Sie, das Motorrad auf dem Boden zu fahren. Was passiert mit der Geschwindigkeit des Motorrads, wenn das Hinterrad das Motorrad tatsächlich antreibt? Sie sollten beobachten, wie die Geschwindigkeit des Motorrads bei einem gegebenen Motorbefehl sinkt, wenn das Rad ein erhebliches Gewichts antreiben soll.
Balancieren während der Geradeausfahrt
Jetzt integrieren wir das Hinterrad in das Systemmodell und versuchen, das Motorrad mit Vorwärts- und Rückwärtsbewegung auszubalancieren. Kopieren Sie alle Blöcke von myDrive.slx nach myMoto.slx mit Ausnahme des Scope Blocks und legen Sie das Modell ungefähr wie abgebildet aus:
Jetzt verbinden Sie ein Signal vom Rear Wheel subsystem outport mit dem Scope Block und erzeugen Sie einen sechsten Inport am Scope Block:
Stellen Sie sicher, dass sich der Ständer nicht in vertikaler Position ist. Führen Sie das Modell aus und untersuchen Sie das Scope Window. Stellen Sie sicher, dass die IMU kalibriert wird. Aktivieren Sie das Trägheitsrad, wenn es nicht bereits aktiviert ist, und stellen Sie sicher, dass das Motorrad mit den Techniken der vorherigen Übung ausbalanciert ist.
Testen Sie das Hinterrad, während Sie das Motorrad halten (damit es nicht wegfährt).
Wenn das Modell noch läuft, deaktivieren Sie das Hinterrad und stellen Sie den Torque Command mit dem Schieber auf etwa 0,3 ein. Als nächstes trennen Sie das USB-Kabel vom Motorrad und legen es auf den Boden. Balancieren Sie das Motorrad an seinem Platz aus. Sobald das Motorrad stabil und mit geringer Trägheitsbeschleunigung ausbalanciert ist, aktivieren Sie das Hinterrad mit dem Handschalter. Wenn das Motorrad aufrecht bleibt, versuchen Sie, mit Änderung des rear wheel torque command es anzuhalten und rückwärts zu fahren.
Das Aisbalancieren des Motorrads während der Fahrt kann einige Zeit in Anspruch nehmen. Hier sind einige Tipps zur Fehlerbehebung:
- Achten Sie darauf, Stöße in der Hinterradbewegung zu vermeiden, indem Sie den Schieberegler in kleinen Schritten ändern (ohne die Maus zu ziehen).
- Stellen Sie sicher, dass der Zahnriemen, der die Gleichstrommotorwelle mit der Hinterradachse verbindet, genau in den Zähnen an den Führungsrädern aufliegt.
- Achten Sie darauf, dass die Führungsräder fest mit ihren jeweiligen Achsen verbunden sind.
- Stellen Sie sicher, dass das Vorderrad direkt nach vorne zeigt (das Motorrad lenkt nicht nach links oder rechts). Sie können die Lenksäule manuell so drehen, dass sie mit der Karosserie des Motorrads übereinstimmt.
Wie wirkt sich eine gleichmäßige Längsbewegung auf die Stabilität der Balanceregelung aus?
LEARN BY DOING
In diesem Kapitel haben Sie zwei neue Hardware-Geräte getestet und integriert - den Hinterrad-Getriebemotor und den Hinterrad-Encoder. Auf diese Weise können Sie das Motorrad mit unterschiedlicher Geschwindigkeit vorwärts und rückwärts bewegen. Sie haben auch das Hauptsystemmodell konfiguriert, um mit dem MKR1000 über Wi-Fi zu kommunizieren, so dass Sie die Balancesteuerung ausführen und überwachen können, ohne dass das USB-Kabel an das Motorrad angeschlossen ist. Sie haben dann gelernt, wie man das Motorrad ausbalanciert, während es sich in einer geraden Linie bewegt.
Im aktuellen Modell senden Sie einen PWM-Befehl an den Hinterradmotor, um ein bekanntes Drehmoment auf das Hinterrad auszuüben, damit sich das Motorrad vorwärts oder rückwärts bewegt. Die resultierende Geschwindigkeit des Motorrads hängt von vielen Faktoren ab, wie z.B. dem Gewicht des Motorrads, der Neigung der Oberfläche, auf der es fährt, ob das Motorrad ausbalanciert ist oder sich auf seine Stützräder lehnt und der verbleibenden Ladung in der Batterie. Mit anderen Worten, das Einstellen des Motordrehmoments auf einen bestimmten Wert führt nicht dazu, dass sich das Motorrad mit einer genau bekannten Geschwindigkeit bewegt. Sie können dies sehen, indem Sie die Geschwindigkeit des Hinterrades im Scope Window beobachten.
Versuchen Sie als zusätzliche Herausforderung, das Verhältnis zwischen der Vorwärtsgeschwindigkeit des Motorrads und dem angewandten Drehmoment des Hinterradmotors zu finden, wenn das Motorrad auf ebenem, glattem Boden mit voller Batterie und ausbalanciert fährt. Berechnen Sie dann im Simulink-Modell den Torque Command für das Hinterrad in Abhängigkeit von der gewünschten Geschwindigkeit. Ermöglichen Sie dem Benutzer des Modells, die Geschwindigkeit direkt in Metern pro Sekunde einzustellen. Stellen Sie sicher, dass das Torque Command nicht zu lange gesättigt wird oder in der Nähe der Grenzen bleibt (damit der Motor nicht überhitzt).
ÜBUNG 5:
6.5 Ausbalancieren beim Lenken
In dieser Übung führen Sie den Servomotor ein, der das Motorrad nach links und rechts steuert. Sobald Sie das Lenkservo in Betrieb haben, können Sie das Motorrad auf beliebig gekrümmten Linien am Boden fahren lassen. Anschließend testen Sie, ob Ihr Regelalgorithmus beim Lenken des Motorrads die Balance erreichen kann. Sie werden sehen, dass durch die Drehbewegung eine zusätzliche Drehmomentkomponente um die Bodenradachse auf das Motorrad aufgebracht wird, die dann vom Trägheitsrad kompensiert werden muss. In dieser Übung balancieren Sie das Motorrad nur in Kurven mit großem Wendekreis. Wenn Sie nach dieser Übung mit der letzten Aufgabe fortfahren, modifizieren Sie die Steuerung, um das zusätzliche Drehmoment durch Neigen in die Kurve oder in der Kurve zu kompensieren.
In dieser Übung lernen Sie Folgendes:
- Verstehen der Eigenschaften und relevanten Spezifikationen des Lenkservomotors.
- Testen und integrieren des Lenkservomotors in die Motorradanwendung, damit sich das Motorrad auf beliebigen Wegen bewegen kann.
- Das Motorrad während der Fahrt mit einem großen Wenderadius (kleiner Lenkwinkel) auszubalancieren.
Steuerung des Lenkservos
Das Motorrad ist mit einem Servomotor an der Lenksäule ausgestattet. Nehmen Sie sich einen Moment Zeit, um sich die Hardware-Spezifikationen des Servomotors GS-9025MG anzusehen. Dieser Servomotor kann seinen Hebelarm zu jedem beliebigen Winkel zwischen 0 und 180 Grad drehen. Wenn Sie die Lenksäule manuell drehen, werden Sie feststellen, dass der Bewegungsbereich nicht 180 Grad, sondern näher an 60 Grad liegt.
Zuerst testen wir den Servomotor isoliert. Öffnen Sie das Modell myDrive.slx:
Note: Wenn myDrive.slx unvollständig oder nicht verfügbar ist, verwenden Sie das Modell drive3_wifi.slx und speichern es unter myDrive.slx.
Denken Sie daran, dass dieses Modell so konfiguriert ist, dass die Kommunikation im externen Modus über Ihr WLAN-Netzwerk erfolgt. Stellen Sie sicher, dass Ihr Computer mit dem Wi-Fi-Netzwerk verbunden ist, das Sie im vorherigen Abschnitt verwendet haben. Wenn Sie sich mit einem neuen WLAN-Netzwerk verbinden, stellen Sie sicher, dass Sie die WLAN-Anmeldeinformationen in den Konfigurationsparametern ändern, wie Sie es in Abschnitt 6.4 "Steuern und Überwachen des Motorrads über WLAN" getan haben.
Navigieren Sie im Simulink Library Browser zu Simulink Support for Arduino MKR Motor Carrier und suchen Sie den Servo Write Block. Fügen Sie es myDrive.slx hinzu:
Untersuchen Sie Ihren Motor Carrier. Der Servomotor wird in einen von 4 Servo Ports auf dem mit SERVON gekennzeichneten Motor Carrier gesteckt, wobei N zwischen 1 und 4 liegt:
Öffnen Sie den Dialog Servo Write block und stellen Sie 3 in dem Motor-Port entsprechend ein:
Der Servomotor ist Anschlussadern. Der braune (manchmal schwarze) Draht ist mit der elektrischen Erde (Ground) verbunden. Der rote Draht wird mit der Referenzspannung verbunden, die in diesem Fall 5 V beträgt. Die gelbe (manchmal orangefarbene) Leitung ist die Signalleitung und überträgt den gewünschten Servowinkel als PWM-Signal. Die Kabel sollten so ausgerichtet sein, dass das Erdungskabel (braun oder schwarz) am nächsten an der Rückseite des Motorrads und das Signalkabel (gelb oder orange) am nächsten an der Vorderseite des Motorrads liegt. Ist dies nicht der Fall, trennen Sie den Servomotor vom Motor Carrier und kehren Sie die Ausrichtung um:
Hinweis: Wenn Sie das Video genau befolgt haben, müssen Sie die Servomotorverkabelung nicht wechseln.
Nun wollen wir das Lenkservo testen. Fügen Sie einen Constant Block aus Simulink → Sources hinzu und setzen Sie den Wert auf 90. Schließen Sie das Gerät wie abgebildet an:
Der Servo Write Block akzeptiert Eingangswerte zwischen 0 und 180. Das Motorrad ist so konstruiert, dass der "gerade" Winkel etwa 90 Grad beträgt, was jedoch überprüft und kalibriert werden muss.
Führen Sie das Modell aus. Versuchen Sie, den Wert im Constant Block zu ändern, während das Modell im externen Modus läuft. Klicken Sie im Dialog Window des Constant Blocks auf Apply, um neue Servoeingänge zu implementieren:
Beachten Sie, dass es aufgrund des mechanischen Aufbaus des Motorrads physikalische Grenzen gibt, wie weit sich der Servo drehen kann. Finden Sie diese empirisch heraus. Suchen Sie im Dialog Window des Constant Blocks den Winkel, unter dem die Lenksäule links auf einen harten Anschlag trifft (den Wert, bei dem sich der Servo nicht mehr weiter nach links drehen kann). Dies sollte der Maximalwert sein, den Sie jemals an diesen Servomotor anweisen (Sie können höhere Werte anweisen, aber der Servo wird dann versuchen, durch den Motorradrahmen zu fahren. Das kann den Servo und den Rahmen belasten und beschädigen könnte).
Suchen Sie nun den Winkel, in dem die Lenksäule auf den Anschlag nach rechts trifft. Dies ist der Mindestwert, den Sie dem Servo mitteilen sollten.
Stoppen Sie das Modell.
Lassen Sie uns den Lenkbefehl sättigen, um zu verhindern, dass befohlene Lenkwinkel die Motorradhardware beschädigen. Fügen Sie einen Saturation block von Simulink → Discontinuities hinzu und platzieren Sie ihn vor dem Servo Write Block. Stellen Sie die Sättigungsgrenzen entsprechend der minimalen und maximalen Winkeln ein, die Sie zuvor gemessen haben (in unserem Fall 60 bzw. 120):
Finden Sie nun den Winkel, bei dem das Vorderrad des Motorrads gerade steht. Dies erfordert einige Versuche. Der Wert sollte nahe bei 90 liegen, kann aber je nachdem, wie genau die Lenksäule am Servoarm befestigt wurde, auch anders ausfallen.
Wenn Sie möchten, dass das Motorrad geradeaus fährt, ist es intuitiver, diesen Winkel 0 zu nennen, als den beliebigen Wert zu verwenden, den Sie gerade gemessen haben. Sie können sich dann auf den linken und rechten Lenkwinkel mit positiven und negativen Winkeln in Bezug auf den "geraden" Servowinkel beziehen. Dazu fügen Sie einen Bias Block aus Simulink → Math Operations hinzu und stellen den Wert auf den gerade gemessenen "geraden" Servowinkel ein:
Stellen Sie nun den Konstantenwert (Constant Value) auf 0 und beschriften Sie die Signale und Blöcke wie abgebildet:
Führen Sie das Modell aus. Passen Sie den Constant Value an, während das Modell läuft. Stellen Sie sicher, dass ein Wert von 0 die Lenksäule gerade ausrichtet und positive und negative Werte den linken bzw. rechten Lenkwinkel ergeben. Stellen Sie außerdem sicher, dass Ihre Sättigungsgrenzen wirksam geworden sind (Sie sollten nicht über ca. +/- 30 Grad hinaus steuern können).
Als nächstes räumen wir auf. Markieren Sie die Blöcke Bias, Saturation und Servo Write und erstellen Sie ein Subsystem für den Lenkservo:
Beschriften Sie den neuen Subsystem Block wie abgebildet:
Nun stellen wir sicher, dass Sie den Lenkwinkel ändern können, während das Hinterrad läuft. Sie lassen das Modell weiter laufen und stellen den Ständer des Motorrads in die vertikale Position:
Aktivieren Sie das Hinterrad mit dem Handschalter. Während sich das Hinterrad bewegt, probieren Sie mit dem neuen Schieber ein paar verschiedene Lenkwinkel aus. Stoppen Sie dann das Hinterrad.
Stellen Sie den Kickstand wieder in die diagonale Position zurück:
Trennen Sie nun bei laufendem Modell das USB-Kabel vom Motorrad (die Anwendung sollte bereits mit Ihrem Wi-Fi-Netzwerk verbunden sein). Stellen Sie das Motorrad auf den Boden und versuchen Sie, den Lenkwinkel mit dem Schieber einzustellen. Versuchen Sie dann, mit unterschiedlichen Geschwindigkeiten und Lenkwinkeln vorwärts oder rückwärts zu fahren.
Wenn Sie fertig sind, stoppen Sie das Modell.
Balancieren mit kleinem Lenkwinkel
Als nächstes versuchen Sie, das Motorrad beim Wenden auszubalancieren. Um zu beginnen, müssen Sie den Servomotor-Algorithmus in das Systemmodell integrieren. Öffnen Sie myMoto.slx.
Hinweis: Wenn myMoto.slx unvollständig oder nicht verfügbar ist, öffnen Sie motoSys4_rWheel.slx und speichern Sie es unter myMoto.slx.
Kopieren Sie den gesamten Lenkmechanismus, bestehend aus dem Steer Angle slider, dem Steer Angle constant Block und dem Steer Servo subsystem, von myDrive.slx nach myMoto.slx. Möglicherweise müssen Sie einige Signalpfade verschieben, um Platz zu schaffen:
Erstellen Sie nun einen Zweig des Steer Angle signal und speisen Sie es in den Scope Block ein, wodurch ein siebter Inport entsteht
Sie sind nun bereit, die Balance des Motorrads beim Lenken zu testen. Schließen Sie das USB-Kabel zwischen dem Motorrad und Ihrem Computer wieder an. Führen Sie das Modell aus und trennen Sie das USB-Kabel vom Motorrad, sobald das Modell läuft. Kalibrieren Sie die IMU wie zuvor beschrieben und vergewissern Sie sich, dass die Batterie so positioniert ist, dass der Schwerpunkt in der Nähe von θ = 0 liegt. balancieren Sie das Motorrad an Ort und Stelle und stimmen Sie die Batterieposition ab. Sobald Sie das Gleichgewicht erreicht haben, versuchen Sie, den Lenkwinkel mit dem Schieber (ohne Hinterradbewegung) einzustellen. Wenn der Lenkservo dann gerade ausgerichtet ist, geben Sie einen kleinen Befehl an das Hinterrad, damit sich das Motorrad langsam vorwärts bewegt. Sobald Sie das Motorrad bei linearer Vorwärtsbewegung ausbalancieren können, versuchen Sie eine kleine Drehung, z.B. 5 Grad nach links oder rechts.
Das Ausbalancieren bei großen Kurven (kleine Lenkwinkel) kann einige Zeit in Anspruch nehmen. Wenn Sie Probleme beim Ausbalancieren haben, versuchen Sie, den Lenkwinkel zu verringern oder die Hinterradgeschwindigkeit zu verringern. Beide Aktionen reduzieren die auf das Motorrad wirkende Zentrifugalkraft.
Was passiert mit der Drehzahl des Trägheitsrades, wenn Sie das Motorrad während einer Kurve ausbalancieren? Sie werden sehen, dass das Trägheitsrad während der Drehung des Motorrads besonders hart arbeiten muss, um der Trägheit des Motorrads entgegenzuwirken - seiner Tendenz, sich in einer geraden Linie zu bewegen. Sie können die Beschleunigung des Trägheitsrades durch Drehen in die entgegengesetzte Richtung umkehren.
Wie Sie sehen können, kann das Motorrad bei einer großen Wendung kürzer ausbalancieren, aber es kann nicht unbegrenzt weiterdrehen, weil sich das Trägheitsrad weiter beschleunigt das führt zu einer Sättigungsabschaltung. Oder das Motorrad fällt einfach um, wenn das Trägheitsrad nicht genügend Drehmoment erzeugen kann, um es während einer stärkeren Wendung senkrecht zu halten.
Um diesen Effekt zu berücksichtigen, fahren Sie mit der letzten Aufgabe fort, bei der Sie die Steuerung so umgestalten, dass sich das Motorrad in die Kurve lehnt, so dass das Trägheitsrad dieses zusätzliche Drehmoment nicht erzeugen muss.
LEARN BY DOING
Im vorliegenden Kapitel haben Sie den Servomotor kennengelernt, der die Ausrichtung der Lenksäule des Motorrads steuert. Anschließend haben Sie den Servomotor getestet und kalibriert, so dass Benutzereingaben für den Lenkwinkel in Bezug auf die Linearbewegung ausgedrückt werden. Schließlich haben Sie den Lenkservomotor in das Modell des Hauptsystems integriert und versucht, das Motorrad beim Drehen in großen Lenkwinkeln auszubalancieren.
Wenn Sie den Lenkwinkel durch Klicken auf den Schieber ändern, bewegt der Servomotor die Lenksäule abrupt vom Anfangswinkel zum Endwinkel. Für kleine Schritte im Lenkservo-Winkel ist dies akzeptabel. Bei großen Steigerungen des Lenkwinkels kann jedoch eine so schnelle Bewegung der Lenksäule die Stabilität des Balancesteuerung beeinträchtigen. Als zusätzliche Herausforderung fügen Sie dem Steer Servo subsystem eine Logik hinzu, so dass die maximale Geschwindigkeit des Servos begrenzt wird. Wenn Sie beispielsweise den Lenkwinkel von -15 Grad auf +15 Grad ändern, sollte der Servomotor 2 Sekunden brauchen, um diesen Übergang zu vollziehen (15 Grad/Sekunde), anstatt fast sofort in einem Schritt. Es liegt an Ihnen, wie Sie die Logik formulieren und wie die maximale Geschwindigkeit des Lenkservos sein soll.
6.6 Lektionen gelernt
In diesem Kapitel wurden Sie mit diesen folgenden Themen vertraut gemacht:
Mathematische Theorie im Simulink-Modell anwenden
Mit dem Verständnis der Dynamik des Motorradsystems haben Sie gelernt, wie man die Bewegungsgleichungen anwendet, um auf das Trägheitsrad einzuwirken und der Tendenz zum Umfallen entgegenzuwirken. Dazu haben Sie eine Simulation eines 3D-Modells verwendet, dessen Verhalten durch Simulink Blöcke bestimmt wird.
PID-Steuerungsmodellierung basierend auf IMU-Sensordaten
Sie haben auch gelernt, wie Sie Ihr PID Steuerungssystem aufbauen, indem Sie die Positionierungssensordaten zur Einspeisung in den Regelalgorithmus verwenden. Sie haben untersucht, wie der PID-Regler auf verschiedene Zufallsreize reagiert und welche Faktoren (Kp, Ki und Kd) am wichtigsten sind, um das Motorrad auszubalancieren.
Anwendung von Sicherheitsmaßnahmen
Sie haben gelernt, wie Sie verschiedene Sicherheitsmaßnahmen in Ihr System integrieren können, um Ihre Hardware vor Schäden zu schützen. Zu den Sicherheitsmaßnahmen gehören der Batterieschutz, die Deaktivierung des Trägheitsrades wenn das Motorrad die Balance verliert, die Begrenzung der Trägheitsraddrehzahl mit einem Tachometer und die Unterbrechung des Betriebs des Systems bis zur Kalibrierung der IMU.
Drahtlose Kommunikation
Sie haben auch gelernt, wie Sie die Kommunikation mit dem MKR1000 konfigurieren, um Daten über WiFi zu senden. Auf diese Weise sind Sie in der Lage, das Motorrad fern zu steuern, indem Sie Befehle wie Drehen, Lenken, Erhöhen der Geschwindigkeit oder Ändern der Motorrichtung über WiFi senden.
Für die letzte Aufgabe des Motorradprojektes modifizieren Sie den Steuerungsalgorithmus so, dass sich das Motorrad beim Drehen nach innen in die Kurve lehnt. Sie tun dies wahrscheinlich instinktiv, wenn Sie ein Fahrrad fahren (oder ein echtes Motorrad fahren). Bei zweirädrigen Fahrzeugen ist es notwendig, sich beim Wenden nach innen zu lehnen, um die Stabilität zu erhöhen. In dieser letzten Herausforderung lernen Sie die Mechanik eines drehenden Motorrads kennen, identifizieren den optimalen Neigungswinkel für Kurven und stellen den Steuerungsalgorithmus so ein, dass das Motorrad jederzeit zum optimalen Neigungswinkel tendiert.
In dieser Übung lernen Sie Folgendes:
- Verstehen Sie die physikalische Mechanik eines drehenden Motorrads.
- Ableitung des optimalen Neigungswinkels, um das Motordrehmoment bei Kurvenfahrten zu minimieren.
- Konfiguration des Systemmodells, um den optimalen Neigungswinkel aus der Geschwindigkeit des Motorrads und dem Lenkwinkel zu berechnen.
- Neuauslegung des Algorithmus zur Steuerung der Balance, um beim Drehen den optimalen Neigungswinkel einzunehmen.
- Das Motorrad beim Drehen mit beliebigen Geschwindigkeiten und Wenderadien auszubalancieren, ohne ein zu hohes Drehmoment im Trägheitsradmotor aufzuwenden.
Ermittlung des optimalen Neigungswinkels bei Kurvenfahrten
Um zu verstehen, warum sich das Motorrad in Kurven lehnen muss, damit das Trägheitsrad nicht hochfährt, betrachten wir das folgende Diagramm. Das Motorrad wird von hinten betrachtet, während es nach links dreht:
Beachten Sie die Drehmomente, die auf das Motorrad um die Bodenradachse wirken. Wir betrachten den beweglichen Motorradrahmen, in dem alle Kräfte und Momente aus der Sicht des Motorrads dargestellt werden. Wie üblich entsteht ein Gravitationsmoment durch die Schwerkraft, die auf den Massenschwerpunkt des Motorrads wirkt. Dieses Drehmoment wird größer, wenn sich das Motorrad weiter aus der vertikalen Ebene lehnt, da die Kraft weiter von der Drehachse entfernt wirkt. Rufen Sie die Formel für das Gravitationsdrehmoment auf:
$\tau_{g,M} = M_M\cdot g\cdot h_{cm}\cdot\sin(\theta)$
Hier ist $M_M$ die Masse des Motorrads, einschließlich des Trägheitsrades und der Elektronik, g die konstante Gravitationsbeschleunigung, $h_{cm}$ die Höhe des Massenschwerpunkts des Motorrads von der Bodenradachse und θ der Neigungswinkel des Motorrads, wobei ein positiver Wert von hinten gesehen gegen den Uhrzeigersinn definiert ist.
Wenn das Motorrad dreht, erfährt es auch eine Zentrifugalkraft (in Bezug auf den Motorradrahmen), die das Motorrad aus der Drehrichtung nach außen zieht. Sie kennen die Zentrifugalkraft vom Autofahren in Kurven. Wenn das Auto nach links abbiegt, fühlt es sich an, als ob man gegen die rechte Seite des Autos gedrückt wird. Das ist tatsächlich eine Reibungskraft. Was ist passiert: Wen Sie sich in einem abbiegenden Auto befinden, wird Ihr Bezugsrahmen im Verhältnis zum festen Bodenrahmen nach innen beschleunigt. Wenn Sie sich in einem sich beschleunigenden Bezugsrahmen befinden, spüren Sie eine Kraft, die in die entgegengesetzte Richtung dieser Beschleunigung auf Sie wirkt. Es ist jedoch durchaus sinnvoll, die physikalische Mechanik in Bezug auf jeden gewünschten Bezugsrahmen zu berücksichtigen.
Die Zentrifugalkraft wirkt entgegen der Drehrichtung auf den Massenschwerpunkt des Motorrads (d.h. die Zentrifugalkraft zieht nach links, wenn das Motorrad nach rechts dreht). Wenn sich das Motorrad in einem Winkel θ neigt, liegt der Massenschwerpunkt $h_{cm}{\cdot}cos(\theta)$ über der Drehachse. Daher ist das Zentrifugaldrehmoment am Motorrad in Bezug auf die Bodenradachse:
$\tau_{centrifugal,M} = -M_M{\cdot}\frac{V^2}{R_{turn}}{\cdot}h_{cm}{\cdot}\cos(\theta)$
In der obigen Gleichung ist V die Geschwindigkeit des Motorrads (vorwärts oder rückwärts) und $R_{turn}$ der Kurvenradius. Dieser ist definiert als der Radius des Kreises, der vom Motorrad beim Drehen verfolgt wird. Das Zentrifugaldrehmoment steigt, wenn das Motorrad Kurven mit einem größeren Radius (kleinerer $R_{turn}$) oder mit einer höheren Geschwindigkeit fährt. Was passiert, wenn das Motorrad keine Kurve fährt? In diesem Fall geht der Wenderadius auf unendlich, und somit ist das Zentrifugaldrehmoment 0.
Als nächstes betrachten wir das resultierende Gesamtdrehmoment auf dem Motorrad in seinem eigenen Bezugsrahmen. Wir haben bereits zuvor über das Gravitations- und Zentrifugaldrehmoment gesprochen. Es gibt auch das Drehmoment $\tau_{W,M}$ des Trägheitsrades, das gegen die Motorwelle drückt, wie in Abschnitt 6.1, beschrieben. Schließlich werden alle anderen Drehmomente aus der Umgebung, wie z.B. Unebenheiten in der Straße oder Widerstand, in $\tau_{ext,M}$ berücksichtigt. Zusammengefasst ergibt das das resultierende Gesamtdrehmoment am Motorrad in Bezug auf die Bodenradachse:
$\tau_{net,M} = \tau_{g,M} + \tau_{centrifugal,M} + \tau_{IW,M} + \tau_{ext,M}$
Um den Neigungswinkel des Gleichgewichts zu finden, bei dem das Motorrad perfekt ausbalanciert (wenn auch instabil) ist, gehen wir davon aus, dass der Motor ausgeschaltet ist und das Trägheitsrad daher nicht gegen die Motorwelle drückt:
$\tau_{IW,M} = 0$
Wir gehen auch davon aus, dass es kein externes Drehmoment gibt, das über die Gravitations- und Zentrifugalmomente hinausgeht:
$\tau_{ext,M} \approx 0$
Dies ergibt ein unmotorisiertes Nettodrehmoment wie folgt:
$\tau_{net,M,no\ motor} \approx \tau_{g,M} + \tau_{centrifugal,M}$
$= M_M{\cdot}g{\cdot}h_{cm}{\cdot}\sin(\theta) - M_M{\cdot}\frac{V^2}{R_{turn}}{\cdot}h_{cm}{\cdot}\cos(\theta)$
Wenn sich das Motorrad im Gleichgewicht befindet, ist das resultierende unmotorisierte Gesamtdrehmoment gleich Null:
$\tau_{net,M,no\ motor}(\theta_{opt}) \approx M_M{\cdot}g{\cdot}h_{cm}{\cdot}\sin(\theta_{opt}) - M_M{\cdot}\frac{V^2}{R_{turn}}{\cdot}h_{cm}{\cdot}\cos(\theta_{opt}) = 0$
In der obigen Gleichung ist $\theta_{opt}$ der optimale Schräglagewinkel, bei dem das resultierende Gesamtdrehmoment 0 ist. Aufgelöst nach $\theta_{opt}$, ergibt das:
$\theta_{opt} = \tan^{-1}(\frac{V^2}{R_{turn}{\cdot}g})$
Wenn wir der Steuerung sagen, dass sie den Neigungswinkel auf $\theta_{opt}$ verschieben soll, während es sich dreht, anstatt θ = 0 beizubehalten, dann muss der Trägheitsradmotor kein zusätzliches Drehmoment ausüben, um dem Zentrifugaldrehmoment entgegenzuwirken. Dies ermöglicht eine realistischere und leistungsfreundlichere Belastung des Motors.
In der obigen Gleichung wissen wir bereits, wie man die Motoradgeschwindigkeit V vom Hinterrad-Encoder aus misst. Jetzt müssen wir herausfinden, wie wir den Wenderadius $R_{turn}$ ermitteln. Beachten Sie das folgende Diagramm:
Im obigen Bild betrachten wir das Motorrad von oben. Wenn das Vorderrad gedreht wird, können wir uns zwei konzentrische Kreise vorstellen, die tangential zu den Vorder- und Hinterrädern liegen. Lassen Sie uns den Lenkwinkel δ nennen. Wenn sich das Motorrad mit einem konstanten Lenkwinkel dreht, beschreibt das Vorderrad einen größeren Kreis als das Hinterrad. Der Abstand zwischen den Mittelpunkten der Vorder- und Hinterräder ist $L_{FR}$, und die jeweiligen Radien der Kreise sind $R_{F}$ und $R_{R}$.
Die beiden Kreisradien bilden ein rechtwinkliges Dreieck mit der Bodenrad-Achse. Der Winkel zwischen Vorder- und Hinterradradius ist gleich dem Lenkwinkel δ. Mit Hilfe trigonometrischer Beziehungen erhalten Sie:
$R_F = \frac{L_{FR}}{\sin(\delta)}$
$R_R = \frac{L_{FR}}{\tan(\delta)}$
Die Zentrifugalkraft wirkt im Schwerpunkt des Motorrads. Er ist im Allgemeinen irgendwo zwischen $R_F$ und $R_R$. Unter Betrachtung kleiner Lenkwinkel kann man die folgende Annäherung vornehmen:
$R_F \approx R_R \approx R_{cm} \approx \frac{L_{FR}}{\delta}$
Nun, indem Sie diesen Radius durch $R_{turn}$ im Gleichgewichtswinkel $\theta_{opt}$ ersetzen, erhalten Sie:
$\theta_{opt} \approx \tan^{-1}(\frac{V^2{\cdot}\delta}{L_{FR}{\cdot}g})$
Wir haben nun den Soll-Neigungswinkel in Form von messbaren Größen angegeben. Sie haben die Kontrolle über den Lenkwinkel δ durch den Lenkservo und Sie können die Motoradgeschwindigkeit V mit dem Befehl rear wheel torque command (Hinterraddrehmoment) anpassen. Der Hinterrad-Vorderradabstand $L_{FR}$ ist leicht messbar. Und in den meisten Fällen entspricht g $9.81 m/s^2$ (obwohl das Motorrad auf anderen Planeten bei richtiger Einstellung von g genauso gut funktionieren sollte!).
Betrachten wir nun ein Simulink-Modell, das das zentrifugale Drehmoment in die physikalische Dynamik integriert. Öffnen Sie das Modell motoSys1b_centrifugal.slx:
Untersuchen Sie das Modell. Dieses Modell ähnelt demjenigen, das Sie in Übung 6.1 verwendet haben. Das Motorcycle subsystem enthält SimScape Blöcke, die die Differentialgleichungen des physikalischen Systems implementieren. Diesmal gibt es jedoch zusätzliche Eingangsgrößen für den Lenkwinkelbefehl und die Vorwärtsgeschwindigkeit des Motorrads für das Motorcycle subsystem.
Führen Sie nun das Modell aus und sehen Sie sich die Animation im Mechanics Explorers window an, während das Modell läuft:
Versuchen Sie, den Lenkwinkel mit dem Schieberegler im Modell einzustellen und beobachten Sie, was in der Animation passiert. Sie werden folgende beobachten. Wenn Sie das Motorrad drehen, bewegt sich das Motorrad in die entgegengesetzte Richtung und versucht dann, sich wieder auf θ zu = 0 zurückzustellen. Bis jetzt haben wir nichts am Regelalgorithmus geändert. Es versucht immer, sich auf θ = 0 zu stellen, auch wenn es sich dreht und weniger Energie verbrauchen könnte, indem es sich in der Kurve neigt.
Um das Verhalten des Motorrads formal zu beobachten, öffnen Sie den Simulation Data Inspector (SDI) mit der Taste im Modellwindow. Während das Modell läuft, untersuchen Sie den Torque Command (Trägheitsmoment)und die Lenkwinkelsignale (Steer Angle signals) in SDI:
Hier sehen Sie den Motor, der versucht, der Zentrifugalkraft bei Kurvenfahrten entgegenzuwirken.
Als nächstes überprüfen Sie die Signale Torque Command und inertia wheel speed signals (Raddrehzahl):
Sie können sehen, wie das Trägheitsrad in den Zeiten, in denen der Motor eine Zentrifugalkraft korrigiert, kontinuierlich beschleunigt. Nachdem Sie einige Erfahrungen bei der Arbeit mit der Motorradhardware gesammelt haben, können Sie sich voll und ganz vorstellen, wie unrealistisch dieses Verhalten auf dem echten Motorrad sein würde.
Schließlich untersuchen Sie die Steer Angle (Lenkwinkel-) und theta Signale:
Beachten Sie, dass der Neigungswinkel immer auf 0 Grad und nicht auf den optimalen Neigungswinkel für eine bestimmte Drehung abzielt.
Die Aufgabe
Für Ihre letzte Aufgaben versuchen Sie Folgendes:
- Fügen Sie in motoSys1b_centrifugal.slx eine Logik hinzu, um den optimalen Neigungswinkel ($\theta_{opt}$) in Abhängigkeit vom Lenkwinkel und der Geschwindigkeit des Motorrads zu berechnen (verwenden Sie die Gleichungen zu Beginn dieser Übung als Orientierung).
- Modifizieren Sie den Steueralgorithmus in motoSys1b_centrifugal.slx so, dass die Steuerung das Motorrad in Richtung θ = $\theta_{opt}$, schiebt, anstatt θ = 0.
- Simulieren Sie den modifizierten Steueralgorithmus im Normalmodus und verwenden Sie den Mechanics Explorer und den Simulation Data Inspector, um zu bestätigen, dass sich das Motorrad bei Kurvenfahrten korrekt niegt und die Trägheitsradgeschwindigkeit bei Kurvenfahrten niedrig bleibt.
- Starten Sie myMoto.slx (oder motoSys5_steer.slx) und führen Sie die gleichen Änderungen am Steuerungsalgorithmus vor, damit das Motorrad geneigte Kurvenfahrten durchführt. Verwenden Sie das Rear Wheel Speed signal, um die Vorwärtsgeschwindigkeit des Motorrads zu ermitteln, und verwenden Sie das Steer Command signal, um den Drehwinkel zu ermitteln.
- Führen Sie das Modell auf dem MKR1000 Board des Motorrads aus.
- Testen Sie die Balance des Motorrads beim Kurvenfahren mit verschiedenen Geschwindigkeiten und Lenkwinkeln.