Lerninhalte finden
Features
Entdecke
© StudySmarter 2024, all rights reserved.
Gegeben sei ein zweigelenkiger Roboterarm, der in der Ebene arbeitet. Der Roboter besteht aus zwei starren Gliedern mit Längen l1 und l2, die durch rotatorische Gelenke miteinander verbunden sind. Die Gelenkwinkel sind θ1 und θ2. Der Endeffektor befindet sich am Ende des zweiten Gliedes.
1. Vorwärtskinematik: Bestimme die Position des Endeffektors in kartesischen Koordinaten (x,y) in Abhängigkeit von den Gelenkwinkeln θ1 und θ2 sowie den Längen l1 und l2. Schreibe die entsprechenden Gleichungen auf.
Lösung:
Vorwärtskinematik eines zweigelenkigen Roboterarms
Um die Position des Endeffektors in kartesischen Koordinaten (\textit{x}, \textit{y}) zu bestimmen, müssen wir die Positionen der einzelnen Gelenke analysieren. Der Roboterarm besteht aus zwei Gliedern mit den Längen l1 und l2 sowie den Gelenkwinkeln θ1 und θ2. Der Endeffektor befindet sich am Ende des zweiten Gliedes.
Die Gleichungen für die Position des Endeffektors in kartesischen Koordinaten lauten daher wie folgt:
Mit diesen Gleichungen kannst Du die Position des Endeffektors in Abhängigkeit von den Gelenkwinkeln θ1, θ2 und den Längen l1, l2 berechnen.
Zusammenfassung:
Damit hast Du nun die grundlegenden Gleichungen der Vorwärtskinematik für einen zweigelenkigen Roboterarm.
2. Rückwärtskinematik: Angenommen, der Endeffektor muss die Position (x,y) erreichen. Bestimme die Gelenkwinkel θ1 und θ2, die erforderlich sind, um diese Position zu erreichen. Sei präzise in deiner Herleitung und benutze trigonometrische Identitäten.
Lösung:
Rückwärtskinematik eines zweigelenkigen Roboterarms
Um die Gelenkwinkel θ1 und θ2 zu bestimmen, die erforderlich sind, um den Endeffektor zu einer gegebenen Position (x, y) zu bewegen, müssen die Vorwärtskinematik-Gleichungen umgekehrt werden. Dazu verwenden wir trigonometrische Identitäten und lösen die Gleichungen schrittweise.
Zur Erinnerung, die Vorwärtskinematik-Gleichungen sind:
Um diese Gleichungen umzudrehen, führen wir die Rückwärtskinematik in zwei Schritten durch: Berechnung von θ2 und anschließend von θ1.
Schritt 1: Berechnung von θ2
Wir verwenden den Kosinussatz für das Dreieck, das durch die Position des Endeffektors und die Armsegmente definiert wird. Zunächst berechnen wir den Abstand r:
Dann verwenden wir den Kosinussatz, um θ2 zu berechnen:
Schritt 2: Berechnung von θ1
Nun berechnen wir θ1 unter Verwendung der Atan2-Funktion:
Damit hast Du nun die grundlegenden Gleichungen zur Bestimmung der Gelenkwinkel θ1 und θ2 basierend auf der gewünschten Endeffektorposition (x, y).
Zusammenfassung:
Diese Herleitungen und Formeln ermöglichen es Dir, die erforderlichen Gelenkwinkel zu bestimmen, um die angegebene Position des Endeffektors zu erreichen.
3. Newton-Euler-Gleichungen: Bestimme die Kräfte und Momente, die auf den Roboterarm wirken, wenn der Endeffektor eine konstante Beschleunigung α in y-Richtung erfährt. Benutze die Newton-Euler-Gleichungen und nimm an, dass die Massen der beiden Glieder m1 und m2 sind, und die Trägheitsmomente I1 und I2.
Lösung:
Bestimmung der Kräfte und Momente mit den Newton-Euler-Gleichungen
Um die Kräfte und Momente zu bestimmen, die auf den zweigelenkigen Roboterarm wirken, wenn der Endeffektor eine konstante Beschleunigung α in der y-Richtung erfährt, verwenden wir die Newton-Euler-Gleichungen. Angenommen, die Massen der beiden Glieder sind m1 und m2, und die Trägheitsmomente sind I1 und I2.
Die Newton-Euler-Gleichungen bestehen aus zwei Teilen: den Newton'schen Bewegungsgleichungen (für die Translation) und den Euler'schen Gleichungen (für die Rotation).
Da der Endeffektor nur in y-Richtung beschleunigt wird, haben wir:
Die Euler-Gleichungen für die Gieder lauten:
Angenommen, die Winkelbeschleunigungen θ1 und θ2 sind α1 und α2, dann haben wir die Drehmomente an den beiden Gelenken:
In diesem Schritt berechnen wir die resultierenden Kräfte und Momente, die aus der konstanten Beschleunigung des Endeffektors resultieren.
Wobei Fj die inneren Kräfte zwischen den Gliedern darstellen.
Die Momentengleichungen sind:
Die vollständige Berechnung hängt stark von der Geometrie und den genauen Dimensionen der Roboterglieder ab, aber die allgemeine Lösungsschritte und Formeln folgen aus den oben aufgeführten Gleichungen.
Zusammenfassung:
Mithilfe dieser Gleichungen kannst Du die Kräfte und Momente berechnen, die auf die einzelnen Glieder wirken, wenn der Endeffektor eine konstante Beschleunigung in der y-Richtung erfährt.
Du entwickelst einen Algorithmus zur Steuerung und Navigation eines LEGO Mindstorms Roboters, der in einem unbekannten Labyrinth den Ausgang finden muss. Dabei soll der Roboter Hindernisse erkennen, umfahren und regelmäßig seine Position anpassen, um sicherzustellen, dass er den effizientesten Weg findet. Du hast Zugang zu einem LEGO Mindstorms EV3 Roboter mit Ultraschallsensor, Lichtsensor und Gyroskopsensor. Die Programmierung erfolgt in der EV3-Entwicklungsumgebung.
Entwickle einen Algorithmus, um den Roboter durch das Labyrinth zu navigieren. Der Roboter soll mit Hilfe seines Ultraschallsensors Hindernisse erkennen und vermeiden sowie mithilfe seines Gyroskopsensors geradeaus fahren. Schreibe den entsprechenden Pseudocode oder EV3-G Programmablauf. Implementiere dabei einen einfachen Regelkreis zur Richtungsjustierung basierend auf den Sensordaten. Zeige in deinem Programmablauf explizit, wie die Sensordaten erfasst und verarbeitet werden, um die Steuerbefehle für den Roboter zu erzeugen.
Lösung:
Um den LEGO Mindstorms EV3 Roboter durch ein Labyrinth zu navigieren, ohne gegen Hindernisse zu stoßen, und um kontinuierlich seine Richtung mittels gyroskopischer Anpassungen zu korrigieren, kann folgender Algorithmus verwendet werden. Dieser Algorithmus ist in Pseudocode geschrieben, aber er kann leicht in die EV3-Entwicklungsumgebung übertragen werden.
setultraschallsensor(EV3_ULTRASONIC_SENSOR)setlichsensor(EV3_COLOR_SENSOR)setgyrosensor(EV3_GYRO_SENSOR)reset_gyro()
while not goal_achieved:\t# Lese die Entfernung von Hindernissen\tentfernung = get_ultraschall_daten()\t\tif entfernung < 20:\t\t# Hindernis erkannt, weiche aus\t\tstop_motor()\t\tdrehe_rechts(90) # Drehe den Roboter um 90 Grad nach rechts\telse:\t\t# Kein Hindernis, fahre geradeaus\t\tfahre_geradeaus(50)
while fahren == True:\t# Lese die neigung vom Gyrosensor\tneigung = lese_gyro_daten()\t\tif neigung > 0:\t\t# Roboter dreht sich nach rechts, korrigiere nach links\t\tkorrigiere_gyro_link(5)\telif neigung < 0:\t\t# Roboter dreht sich nach links, korrigiere nach rechts\t\tkorrigiere_gyro_rechts(5)\t\t# Weiter geradeaus fahren\tfahre_geradeaus()
setultraschallsensor(EV3_ULTRASONIC_SENSOR)setlichsensor(EV3_COLOR_SENSOR)setgyrosensor(EV3_GYRO_SENSOR)reset_gyro()while not goal_achieved:\tentfernung = get_ultraschall_daten()\tneigung = lese_gyro_daten()\t\tif entfernung < 20:\t\tstop_motor()\t\tdrehe_rechts(90)\telse:\t\tif neigung > 0:\t\t\tkorrigiere_gyro_link(5)\t\telif neigung < 0:\t\t\tkorrigiere_gyro_rechts(5)\t\tfahre_geradeaus()
Dieser Algorithmus ermöglicht es dem Roboter, Hindernisse zu erkennen und zu umgehen, während er seine Richtung kontinuierlich anpasst, um sicherzustellen, dass er effizient durch das Labyrinth navigiert.
Simuliere mathematisch die Laufzeitoptimierung Deines Algorithmus. Gegeben sei ein Labyrinth in Form eines Gitters von 10x10 Feldern, wobei jedes Feld eine Größe von 1x1 Metern hat. Der Roboter startet in der linken unteren Ecke (Position (0,0)) und der Ausgang befindet sich in der rechten oberen Ecke (Position (9,9)). Berechne die optimale Laufzeit ohne Hindernisse, wenn der Roboter 1 Meter pro Sekunde fährt. Berechne zusätzlich die Zeit, die bei einer geschätzten Umgehung von durchschnittlich 3 Hindernissen mit einer zusätzlichen Strecke von jeweils 2 Metern hinzukommen würde. Formuliere alle Berechnungen mit den entsprechenden Formeln in LaTeX.
Lösung:
Um die Laufzeitoptimierung des Algorithmus mathematisch zu simulieren, erfolgen die Berechnungen Schritt für Schritt. Wir berechnen zuerst die optimale Zeit ohne Hindernisse und danach die Zeit unter Berücksichtigung von Hindernissen.
Die ideale Strecke führt den Roboter durch 9 horizontale und 9 vertikale Felder:
\begin{equation}\text{Optimale Strecke} = 9 \text{ Meter horizontal} + 9 \text{ Meter vertikal} = 18 \text{ Meter}\end{equation}
Die Zeit ergibt sich aus:
\begin{equation}\text{Optimale Zeit} = \frac{\text{Optimale Strecke}}{\text{Geschwindigkeit}} = \frac{18 \text{ Meter}}{1 \text{ Meter/Sekunde}} = 18 \text{ Sekunden}\end{equation}
Wir gehen davon aus, dass der Roboter durchschnittlich 3 Hindernissen ausweichen muss, wobei jede Umgehung eine zusätzliche Strecke von 2 Metern erfordert:
\begin{equation}\text{Zusätzliche Strecke pro Hindernis} = 2 \text{ Meter}\end{equation}
Insgesamt ergibt sich für 3 Hindernisse:
\begin{equation}\text{Zusätzliche Strecke} = 3 \times 2 \text{ Meter} = 6 \text{ Meter}\end{equation}
Die Gesamtstrecke mit Hindernissen ist daher:
\begin{equation}\text{Gesamtstrecke} = \text{Optimale Strecke} + \text{Zusätzliche Strecke} = 18 \text{ Meter} + 6 \text{ Meter} = 24 \text{ Meter}\end{equation}
Die Laufzeit mit Hindernissen berechnet sich als:
\begin{equation}\text{Gesamtzeit} = \frac{24 \text{ Meter}}{1 \text{ Meter/Sekunde}} = 24 \text{ Sekunden}\end{equation}
Die zusätzliche Zeit durch die Umgehung von Hindernissen ergibt sich aus:
\begin{equation}\text{Zusätzliche Zeit} = \text{Gesamtzeit} - \text{Optimale Zeit} = 24 \text{ Sekunden} - 18 \text{ Sekunden} = 6 \text{ Sekunden}\end{equation}
Zusammengefasst ergeben sich folgende Laufzeiten:
Integration von Sensoren in Roboter: In dieser Aufgabe wirst du Sensoren in deinen Lego Mindstorms-Roboter einbauen und deren Daten nutzen, um spezifische Aufgaben zu lösen. Du musst den Roboter so programmieren, dass er Daten von den Sensoren in Echtzeit verarbeitet und entsprechend reagiert. Du kannst NXT-G, Java oder Python zur Programmierung verwenden. Achte darauf, die Sensoren vor Gebrauch zu kalibrieren, um präzise Messungen zu gewährleisten. Typische Aufgaben könnten die Linienverfolgung oder Hindernisvermeidung umfassen.
Baue einen Roboter, der eine definierte Linie auf dem Boden verfolgen kann. Verwende dazu einen Lichtsensor. Beschreibe Schritt für Schritt, wie du vorgehen würdest, um den Roboter aufzubauen, den Sensor zu kalibrieren und das Programm zu erstellen.
Lösung:
Integration von Sensoren in Roboter: In dieser Aufgabe wirst du Sensoren in deinen Lego Mindstorms-Roboter einbauen und deren Daten nutzen, um spezifische Aufgaben zu lösen. Du musst den Roboter so programmieren, dass er Daten von den Sensoren in Echtzeit verarbeitet und entsprechend reagiert. Du kannst NXT-G, Java oder Python zur Programmierung verwenden. Achte darauf, die Sensoren vor Gebrauch zu kalibrieren, um präzise Messungen zu gewährleisten. Typische Aufgaben könnten die Linienverfolgung oder Hindernisvermeidung umfassen. Aufgabe: Baue einen Roboter, der eine definierte Linie auf dem Boden verfolgen kann. Verwende dazu einen Lichtsensor.
import time from nxt.locator import find_one_brick from nxt.motor import Motor, PORT_B, PORT_C from nxt.sensor import Light, PORT_3 # Initialisierung brick = find_one_brick() light = Light(brick, PORT_3) motor_left = Motor(brick, PORT_B) motor_right = Motor(brick, PORT_C) # Kalibrierungswerte line_value = 40 # Helligkeitswert der Linie (Beispiel) background_value = 60 # Helligkeitswert des Bodens (Beispiel) threshold = (line_value + background_value) / 2 kp = 0.5 # Proportionalitätskonstante while True: light_value = light.get_lightness() # Sensordaten einlesen error = threshold - light_value # Fehlerberechnung correction = kp * error # Proportionalregelung motor_left.run(75 + correction) motor_right.run(75 - correction) time.sleep(0.01)NXT-G Diagramm: Für NXT-G musst du die folgenden Blöcke verwenden:
Erweitere den zuvor gebauten Roboter mit einem Ultraschallsensor, um Hindernisse zu vermeiden. Schreibe ein Programm, das den Roboter dazu bringt, bei Erkennung eines Hindernisses (d.h. wenn der Abstand kleiner als 20 cm ist) anzuhalten und einen Umgehungsmanöver durchzuführen.
Lösung:
Integration von Sensoren in Roboter: In dieser Aufgabe wirst du Sensoren in deinen Lego Mindstorms-Roboter einbauen und deren Daten nutzen, um spezifische Aufgaben zu lösen. Du musst den Roboter so programmieren, dass er Daten von den Sensoren in Echtzeit verarbeitet und entsprechend reagiert. Du kannst NXT-G, Java oder Python zur Programmierung verwenden. Achte darauf, die Sensoren vor Gebrauch zu kalibrieren, um präzise Messungen zu gewährleisten. Typische Aufgaben könnten die Linienverfolgung oder Hindernisvermeidung umfassen. Aufgabe: Erweitere den zuvor gebauten Roboter mit einem Ultraschallsensor, um Hindernisse zu vermeiden.
import time from nxt.locator import find_one_brick from nxt.motor import Motor, PORT_B, PORT_C from nxt.sensor import Ultrasonic, PORT_4 # Initialisierung brick = find_one_brick() ultrasonic = Ultrasonic(brick, PORT_4) motor_left = Motor(brick, PORT_B) motor_right = Motor(brick, PORT_C) # Schwellenwert distance_threshold = 20 # in cm while True: distance = ultrasonic.get_sample() # Ultraschalldaten einlesen if distance < distance_threshold: motor_left.brake() # Anhalten motor_right.brake() time.sleep(1) # Kurz warten motor_left.run(-75) # Rückwärts fahren motor_right.run(-75) time.sleep(1) motor_left.run(75) # Sich drehen motor_right.run(-75) time.sleep(0.5) else: motor_left.run(75) # Weiter fahren motor_right.run(75) time.sleep(0.01)NXT-G Diagramm: Für NXT-G musst du die folgenden Blöcke verwenden:
Steuerung von Aktoren zur Erzeugung von Bewegungen: Die Steuerung von Aktoren zur Bewegungserzeugung abstrahiert die mechanischen Komponenten in programmierbare Einheiten zur Bewegungssteuerung. Du hast Zugriff auf verschiedene Funktionen zur Motorsteuerung wie On
, Off
, SetPower(p)
und RotateBy(degrees)
. Es stehen auch PID-Regler (Proportional, Integral, Derivat) und Methoden zur Synchronisation von Motoren zur Verfügung. Zusätzlich solltest Du Sensordaten integrieren können, um die Bewegungen der Aktoren in Echtzeit anzupassen.
Implementiere eine Funktion in Python für einen LEGO Mindstorms Roboter, um eine gerade Linie von 1 Meter zu fahren. Nutze die Funktion SetPower(p)
, um die Geschwindigkeit der Motoren zu kontrollieren und On
und Off
, um die Motoren zu starten und zu stoppen. Hierbei soll ein PID-Regler verwendet werden, um eine präzise Bewegung sicherzustellen. Kommentiere den Code ausführlich, um jeden Schritt und die Funktionsweise des PID-Reglers zu erklären.
Lösung:
Lösung: Hier ist eine implementierte Funktion in Python für einen LEGO Mindstorms Roboter, der eine gerade Linie von 1 Meter fährt, unter Verwendung eines PID-Reglers zur präzisen Steuerung der Motoren:
import time # PID-Klasse zur Steuerungclass PIDController: def __init__(self, kp, ki, kd): self.kp = kp # Proportionaler Term self.ki = ki # Integraler Term self.kd = kd # Differentieller Term self.pre_error = 0 self.integral = 0 def update(self, target, current): # Fehler berechnen error = target - current # Proportionaler Term P = self.kp * error # Integraler Term self.integral += error I = self.ki * self.integral # Differentieller Term derivative = error - self.pre_error D = self.kd * derivative # PID Ausgabe output = P + I + D # Fehler für den nächsten Zyklus speichern self.pre_error = error return output # Dummy-Funktionen, die Lego Mindstorms Funktionen simulierendef SetPower(p): # Setzt die Leistung des Motors print(f'SetPower: {p}') def On(): # Motoren einschalten print('Motoren eingeschaltet') def Off(): # Motoren ausschalten print('Motoren ausgeschaltet') # Funktion zum Fahren einer geraden Linie von 1 Meterdef drive_straight_1_meter(target_distance=100): motor_diameter = 0.056 # Annahme: Raddurchmesser ist 56mm wheel_circumference = motor_diameter * 3.14159265359 # Umfang des Rades rotations_to_travel = target_distance / wheel_circumference # Ziel-Rotationen pid = PIDController(1.0, 0.1, 0.01) # Initialisierung des PID-Reglers current_rotation = 0 # Aktuelle Rotation tolerance = 0.01 # Toleranzwert On() # Motoren einschalten while abs(current_rotation - rotations_to_travel) > tolerance: power = pid.update(rotations_to_travel, current_rotation) SetPower(power) # Simuliere die tatsächlich zurückgelegte Strecke (hier einfach um 0.01 inkrementiert) time.sleep(0.01) current_rotation += 0.01 Off() # Motoren ausschalten # Hauptfunktion aufrufendrive_straight_1_meter()
SetPower
-Funktion setzt die Geschwindigkeit der Motoren.On
und Off
-Funktion schalten die Motoren ein und aus.drive_straight_1_meter
berechnet die notwendigen Rotationen, um 1 Meter geradeaus zu fahren.Beschreibe ein Szenario, in dem die Synchronisation von Motoren notwendig ist, und entwirf einen Algorithmus, der dies umsetzt. Der Roboter soll einer vorgegebenen Kurve folgen und dabei Metrikdaten der zurückgelegten Strecke basierend auf Sensordaten in Echtzeit speichern und anpassen. Erläutere, wie du die Synchronisation zwischen den Motoren sicherstellst und wie Sensordaten integriert werden, um die Bewegung anzupassen.
Lösung:
Szenario:
Stell Dir vor, Du möchtest, dass Dein LEGO Mindstorms Roboter einer komplexen vorgegebenen Kurve folgt, wie zum Beispiel einem Slalom-Parcours. In diesem Fall ist es notwendig, die Synchronisation der Motoren zu gewährleisten, damit der Roboter sich präzise entlang der Kurve bewegt. Zudem sollen Metrikdaten der zurückgelegten Strecke in Echtzeit basierend auf Sensordaten gespeichert und Anpassungen vorgenommen werden.
Algorithmus zur Motorensynchronisation:Um die Synchronisation der Motoren zu erreichen und Sensordaten zu nutzen, schlage ich den folgenden Algorithmus vor:
import time # Dummy-Funktionen zur Motorsteuerungdef SetPowerLeft(p): print(f'SetPowerLeft: {p}') def SetPowerRight(p): print(f'SetPowerRight: {p}') def On(): print('Motoren eingeschaltet') def Off(): print('Motoren ausgeschaltet') # Sensor-Dummy-Funktiondef getSensorData(): # Hier wird ein Pseudo-Sensordatenwert zurückgegeben return {'distance': 50, 'angle': 0.2} # PID-Klasseclass PIDController: def __init__(self, kp, ki, kd): self.kp = kp self.ki = ki self.kd = kd self.pre_error = 0 self.integral = 0 def update(self, target, current): error = target - current self.integral += error P = self.kp * error I = self.ki * self.integral D = self.kd * (error - self.pre_error) self.pre_error = error return P + I + D # Algorithmus zur Synchronisation und Anpassungdef follow_curve(): On() # Motoren einschalten distance_pid = PIDController(1.0, 0.01, 0.1) angle_pid = PIDController(1.0, 0.01, 0.1) target_distance = 100 # Zielentfernung in cm target_angle = 0 # Zielwinkel in Radiant # Variablen für die tatsächliche Position actual_distance = 0 actual_angle = 0 # Schleife, bis das Ziel erreicht ist while actual_distance < target_distance: sensor_data = getSensorData() # Sensordaten abrufen distance_correction = distance_pid.update(target_distance, sensor_data['distance']) angle_correction = angle_pid.update(target_angle, sensor_data['angle']) # Steuerung der Motoren basierend auf den PID-Korrekturen SetPowerLeft(distance_correction - angle_correction) SetPowerRight(distance_correction + angle_correction) # Aktualisierung der tatsächlichen Position basierend auf den Sensordaten actual_distance += sensor_data['distance'] * time.sleep(0.1) actual_angle += sensor_data['angle'] * time.sleep(0.1) Off() # Motoren ausschalten
Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.
Kostenloses Konto erstellenDu hast bereits ein Konto? Anmelden