Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose19:mapbotpublic:start

Inhaltsverzeichnis

MAPBot

The little robot that could…more or less

Einleitung

Nach einiger Überlegung hat sich unsere Gruppe entschlossen einen Roboter zu konstruieren, der selbstständig navigieren kann.

Unser Roboter soll einen ihm unbekannten Raum durchfahren, vermessen und eine Karte davon zeichnen. Dazu wird er an einem beliebigen Ort im Raum ausgesetzt und soll autonom eine Wand finden. An dieser soll der Roboter entlang fahren, bis er die Außenwände komplett erfasst hat. Dieselbe Prozedur soll er nun für alle weiteren Hindernisse (Säulen, Schränke, .. alles, was herumsteht.) ausführen. Dabei muss er die Hindernisse erkennen und umfahren.

Anhand der Bewegungsdaten der Motoren soll dann eine zweidimensionale Karte des Raumes erstellt werden.

Mögliche Anwendungen für unseren Roboter wären:

  • Vermessen von Räumen für Planung/innenarchitekturische Anwendungen
  • Optimierung von Workflow/Aufteilung des Raumes in Bereiche in denen verschiedenen Tätigkeiten durchgeführt werden
  • Finden von kürzesten Wegen im Raum z. B. für die Auszeichnung von Fluchtwegen

Ein ähnliches Projekt wurde zuvor unter dem Namen "Kartograph" im Rahmen des Robotikkurses bearbeitet. Von diesem Projekt übernahmen wir die gut passende, 3d-gedruckte Grundplatte. Jedoch anders als der Karthograph sollte der Map-Bot die Raumvermessung mithilfe seiner eigenenen Bewegungsdaten realisieren. Die Anweisungen, wie sich der Roboter zu bewegen hat, hängen von den gemessenen Daten der verwendeten Ultraschallsensoren ab, die sich in einigen Punkten von den vom Karthographen verwendeten Infrarotsensoren unterscheiden.

Umsetzung

Überblick

Abbildung 1: Draufsicht des MAPBots

Der Hardware Aspekt ist aufzuteilen in:

  • Sensorik: Ultraschallsensoren
  • Motorik: Stepper-Motoren

Der Softwareteil besteht aus:

  • Arduino IDE Programm (Steuerung des Roboters)
  • Processing Programm (Zeichnen der Karte)

Aufgaben

Die Handlungsstrategie des Roboters sieht so aus, dass er an einer beliebigen Stelle ausgesetzt wird. In erster Instanz gibt es nun zwei Szenarien:

  • Es wird ein Hindernis direkt vor dem Roboter detektiert; dann soll er sich um 90 Grad nach links drehen und eine Bewegung parallel der Wand entlang ausführen, wobei der Abstand zur Wand stetig durch die Ultraschallsensoren kontrolliert und gegebenenfalls durch die entsprechende Ansteuerung der Motoren korrigiert wird.
  • Es befindet sich kein Hindernis vor dem Roboter und:
    • Die seitlichen Sensoren liefern einen Wert, der auf ein Hindernis neben dem Roboter schließen lässt.
      • Ist dieser Wert über einem Schwellwert, soll der Roboter sich dem Hindernis frontal zudrehen und bis zu einem gewissen Abstand auf die Wand zufahren, sich dann wieder 90 Grad nach links drehen und wie im ersten Szenario die Wand entlang fahren und vermessen.
      • Ist dieser Schwellwert unterschritten, so führt der Roboter die oben beschriebene Parallelfahrt der Wand entlang aus.
    • Die seitlichen Sensoren detektieren kein Hindernis seitlich des Roboters; dann soll einfach geradeaus gefahren werden, bis der vordere Sensor ein Hindernis detektiert und die entsprechende Prozedur angesprochen werden, um dieses Hindernis zu vermessen.
Abbildung 2: Flowchart der Algorithmusstruktur

Ziel hierbei ist eine möglichst präzise Erfassung der Wandkontur, sodass der Roboter den Raum möglichst präzise abfährt und sich daraus die räumlichen Daten des Raumes erfassen lassen. Aufgrund der Dreiecksungleichung muss man hier den Fehler beachten, den man macht, wenn man eine parallele Wand in Zickzack- oder Wellenform entlang fährt und die gefahrene Strecke mit der Länge der Wand gleichsetzt. Diese Fehlerquelle gilt es softwareseitig zu beheben oder zu korrigieren. Weiterhin ist es nötig zu speichern und effizient abrufen zu können, welche Orte des Raumes schon vermessen wurden.

Die Aufgaben, die sich zunächst stellten und derer wir uns die meiste der recht kurzen Projektzeit widmeten, waren:

  1. Montieren der Motoren, Sensoren, Rädern auf Grundplatte
  2. Schaltplan erstellen und bauen
  3. Roboter zum Fahren und Drehen befähigen
  4. Sensoren kalibrieren
  5. Roboter befähigen, parallel zu einer Wand zu fahren
  6. Roboter befähigen, Hindernisse zu erkennen und diese zu umfahren

Materialien

Teil Stückzahl
Arduino Nano 1
Grundplatte 1
Steckbrett 1
Stepper-Motor 2
Rad für Motor 2
Frei drehbares Rad 1
Motortreiber 2
Ultraschallsensor 3
Kondensator (100 μF) 2
8V Li-Po Akku 1
Batteriehauptschalter 1
Lego Dinosaurier 1

Aufbau und Hardware

Der Map-Bot besteht aus folgenden Komponenten, die auf die runde Grundplatte montiert sind.

Arduino

Der Arduino ist die zentrale Steuereinheit des Roboters. Der gespeicherte ausführbare Programmcode steuert mit LOW-/HIGH- Anweisungen die Eingabe-Ausgabe-Pins, wovon sich 14 Stück am Arduino befinden; 6 davon mit PWM-Funktion (Pulswellenmodulation) und 8 davon als Analogeingänge. Mit diesen E/A-Pins sind die Sensoren und Aktuatoren des Roboters über Drahtbrücken verbunden. Da wir nur insgesamt n Pins benötien, um jede Komponente individuell ansteuern zu können, genügte für unser Projekt der Arduino Nano ATmega328, der uns bereits für die Übungseinheiten zur Verfügung gestellt wurde.

Abbildung 3: Grafische Darstellung der Schaltung inklusive Bauelementen
Ultraschallsensoren

Die Aufgabe der beiden seitlichen Ultraschallsensoren ist vor allem die Korrektur der Bewegung des Roboters, um einer Wand zu folgen, während die des Vorderen die Detektion eines frontalen Hindernisses ist. Die drei Ultraschallsensoren wurden jeweils in 3d-gedruckte Teile eingebettet, sodass man in der Software von einem konstanten Abstand der beiden seitlichen Sensoren ausgehen kann und auch der vordere Sensor eine stabile Halterung besitzt. Der von uns verwendete Typ besitzt vier Anschlüsse: Gnd, Vcc, Trig und Echo. Wird Spannung auf den Triggerpin gelegt, so wird eine Ultraschallwelle ausgesendet, die von einem im Weg stehenden Objekt reflektiert wird und zum Sensor zurückkehrt. Die Zeit, die diese Schallwelle bis zur Rückkehr gebraucht hat, wird vom Echo-Pin erfasst. Trig und Echo sind mit zwei beliebigen Digitalpins des Arduinos verbunden, Gnd mit einem beliebigen Gnd-Pin; Vcc mit 5 V.

Im Programm legt man mithilfe der digitalWrite()-Funktion eine Spannung an den Trigger-Pin an, wartet eine kurze Zeit, schaltet die Spannung wieder ab und liest mit der Funktion pulseIn() die Zeit, die die Schallwelle gebraucht hat, um durch die Reflexion an einem Hindernis zum Ultraschallsensor zurückzukehren. Diese Zeit lässt sich ungefähr mit der Formel (dauer/2) * 0.03432 in die Entfernung in Zentimeter umrechnen. Jedoch mussten wir die seitlichen Sensoren für Ihren Arbeitsbereich genauer kalibrieren. Bei der Kalibrierung ist uns aufgefallen, dass unsere Sensoren leichte Abweichungen zueinander aufweisen. Desweiteren ist eine genaue Kalibrierung nur jeweils für einen bestimmten Abstandsbereich (z.B. 5-25cm) möglich. Daher haben wir separate Kalibrierungsfaktoren für unsere Sensoren. (Vorne: 0.03432, seitlich vorne: 0.03569, seitlich hinten: 0.03259)

Die Ultraschallsensoren sind etwas speziell in der Handhabung. Da man die Schallwellen nicht hört, können Störungen nur durch Trial and Error bekämpft werden. Die erste Lektion war, dass die Sensoren nicht zu schnell hintereinander, also in aufeinanderfolgenden Codezeilen ohne ein delay dazwischen, Schallwelle aussenden und empfangen durften, da sie sonst die Schallwellen des jeweils anderen Sensors erfassten, was zu unbrauchbaren Ergebnissen führte. Weiterhin ist es so, dass die Ultraschallwelle durch ihre hohe Frequenz kleinen Strukturen gegenüber empfindlicher ist. So kann eine variierende Wandstruktur (Aus Sicht unseres Roboters ist alles „Wand“, was ohne Differenzierung von den Entfernungssensoren erfasst wird) die Reflektion der Schallwelle in einem Maße stark beeinflussen, dass die Ergebnisse nicht mehr genau genug sind, um sie für Kurskorrekturen verwenden zu können.

Abbildung 4: Schaltplan für Ultraschallsensor

Um die Ultraschall- Sensoren áuf der Grundplatte zu befestigen wurden zwei Platten Mit dem LED drucker gedruckt. Diese sind so konzipiert, dass die Ultraschallsensoren einfach reingesteckt werden können und halten.

Stepper-Motoren

Die Stepper- oder Schrittmotoren sind eine art von Motor die eine feste Anzahl von Schritten für eine Umdrehung brauchen. Diese Schritte können im Programmcode festgelegt werden. Auch sind Stepper-Motoren dazu fähig sich in beide Richtungen zu drehen. Somit können relativ präzise Bewegungen durchgeführt werden. Außerdem gibt es, anders als bei Servo-Motoren, keine Einschränkungen mit Hinblick auf den Bewegungsradius und Drehmoment zumindest in unserer Applikation.

Es befindet sich ein sowohl zu den Steppern als auch zu den Aussparungen der Grundplatte passendes Radpaar an den Wellen der Motoren. Dreht man beide Motorwellen in die selbe Richtung, sodass sich (bei korrekter Montage der Motoren) die Räder in dieselbe Richtung drehen, lässt sich eine Vorwärts- bzw. Rückwärtsbewegung ausführen. Steuert man eines der Räder stärker an als das andere, bewegt sich der Roboter in die Richtung der schwächeren Ansteuerung und eine Drehung auf der Stelle mit minimalem Wendekreis lässt sich durch die gegenläufige Rotation der beiden Räder realisieren.

Um einen Stepper-Motor zu bewegen braucht man sogenannte Schrittmotor-Treiber. Dieser wandelt Signale des Arduinos in eine Form, die den Motor bewegen können und verstärkt diese um die Betriebsspannung der Motoren zu erreichen. Diese Treiber sind bestückt mit einem Potentiometer der die Spannung regelt. Mit Hilfe eines Multimeters muss hier durch Drehen des Potentiometers die richtige Spannung erreicht werden, sodass der Schrittmotor-Treiber nicht überhitzt und der Motor sich bewegt.

Wir haben uns für diese Art von Motor entschieden, da er eine kontinuierliche Fahrt ermöglicht und wir anhand der zurückgelegten Schritten Distanzen bestimmen können. Außerdem kann man relativ zu dem Startpunkt den zurückgelegten Weg inklusive Drehungen aufzeichnen.

Abbildung 5: Schaltplan für Stepper-Motor

Software

Parallelfahrt

Nachdem der Roboter eine Wand gefunden hat, dreht er sich bis er Parallel zur Wand steht. Dann prüft er, ob sich vor ihm ein Hindernis befindet. Falls nicht, beginnt er mit der Geradeausfahrt. Dabei fährt er eine festgelegte Strecke (zurzeit 2cm) und misst dann mit beiden seitlichen Ultraschallsensoren die jeweilige Distanz zur Wand. Dies wird 5 mal durchgeführt. Danach nehmen wir den Mittelwert der Distanzen aus den 5 Messungen, um einen genaueren Messwert zu erhalten.

Die Messwerte werden dann weitergegeben um zu entscheiden, ob:

  1. der Winkel zur Wand korrigiert werden muss
  2. der Roboter zu nah an der Wand ist und Abstand vergrößert werden muss
  3. der Roboter zu fern von der Wand ist und Abstand verringert werden muss

Entschieden wird basierend auf dem Distanzwert des vorderen Sensors und der Differenz zwischen den Messwerten der beiden Sensoren.

Abbildung 6: Winkelkorrektur anhand Messwerten zweier Ultraschallsensoren

Angenommen, der Roboter befindet sich in einer Position, dass die Differenzwert der seitlichen Sensoren größer oder kleiner als festgelegte Schwellwerte (größer als 1,5cm oder kleiner als -1,5cm, wenn Distanz vorne - Distanz Hinten gerechnet wird) ist. Der Roboter nutzt dann die Eigenschaft eines rechtwinkligen Dreiecks, dass tan(α)= Gegenkathete / Ankathete ist. In unserem Fall ist die Gegenkathete der Differenzwert der seitlichen Sensoren und die Ankathete die Distanz zwischen den seitlichen Sensoren. Davon nehmen wir den Arkustangens und rechnen von Radians in Winkel um. Der Roboter soll sich dann zwei mal den Abweichwinkel in die entgegengesetzte Richtung drehen, die Länge der Hypotenuse geradeaus fahren und dann wieder einmal den Abweichwinkel drehen um sich geradezurichten.

Sollte der Roboter vorne seitlich einen Wert außerhalb des Toleranzbereiches von 2cm Abweichung zu unserem Richtdistanzwert messen, wird zunächst dieselbe Winkelkorrektur ausgeführt. Anschließend dreht der Roboter sich entweder 45° in Richtung Wand (wenn zu weit entfernt), oder 45° von Wand weg (wenn zu nah), fährt ein Stückchen geradeaus und dreht sich schlussendlich wieder 45° zurück um sich wieder parallel zur Wand zu richten.

Erstellung der Karte mithilfe von Processing

TODO

Fazit

TODO

Code: mapbot_code.zip
(parMove_test_v2.ino ist die ausgereifteste Version; map.pde der Anfang zur Kartenzeichnung)

projektesose19/mapbotpublic/start.txt · Zuletzt geändert: 2019/09/29 23:27 von d.golovko