Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose2016:luxopublic:start

Gliederung

  1. Startseite
  2. Zitate
  3. Hauptseite
    • Zusammenfassung
    • Einleitung
    • Methodik und Umsetzung
    • Ergebnisse
    • Fazit

Projekt LUXO

Pixar für's Wohnzimmer

Das ist LUXO.
Das sind zwei Servos, zwei Getriebemotoren, eine Webcam und ein Arduino an einer Schreibtischlampe.
Das sind 739 Zeilen Code, die dein Gesicht suchen und erkennen können und die die nötige Geometrie berechnen, um seine Arme auf das Grad genau zu bewegen.
Das ist ein Roboter, der dir auf kurze Distanz zuverlässig direkt in die Augen leuchtet.
Die ideale Lösung für Befragungen, Drogentests und als mutige Vorbereitung für Sonnenfinsternisse in deiner Umgebung.

Von und mit:
Jens Freudenthal
Franz de la Torre Westphal
Kilian Recher
Samuel Bien
Marius Sott
und Leo Biegert

Mit besonderem Dank an
(bzw. Abgabe bei)

Corvin Jaedicke
Felix Bonowski


Hauptseite

„Ich ändere hier mal wahllos ein paar Plus und Minus und guck', was es bringt.“ - Kilian


Themenbeschreibung/Einleitung

Aufgabenstellung des Robots (1/2 Seite) [Wird noch ausformuliert]

  • Freiheitsgrade(Bewegung): Kopf(rotieren, kippen), Arme(kippenx2)
  • Gesichtsverfolgung
  • (Blenden: Lampe ein/ausschalten können)
  • Aktive Gesichtssuche
  • Mehrere Gesichter?
  • (Gesten, Charakter)

Referenz zu anderen, ähnlichen Arbeiten

Kleines Video von Luxos kleine Schwester Luci: https://youtu.be/dPnp3uZqJPc
Paar Artikel zur Gestaltung und infos zur Luci : http://www.kobalt-it.de/Luci und http://makezine.com/2015/08/25/pixar-robotic-desk-lamp/


Methoden/Umsetzung

Baugruppen

  • Lampenkopf: Webcam, (Lampe)
  • Nacken (Dualservo-Gelenk == Pan-Tilt-Servos)
  • Ober- und Unterarm (Bowdenzüge) → Getriebemotoren der Bodenplatte
  • Dort auch: Platinen (Arduino) zur Ansteuerung
  • Laptop für Bildverarbeitung

Teilprobleme anführen [knapp]

  • Ermittlung der benötigten Motorkraft
  • Einrichtung&Anpassung der Gesichtserkennungsbibliothek (Processing)
  • Festschreibung der Kommunikationsform Arduino - Laptop(Processing)
  • Motoransteuerung bzw. -Kontrolle
  • Self-Awareness: Berechnung der Motorgeschwindigkeit und Position/Winkel

Übersprungene Teilprobleme

  • Freiheitsgrad Schultergelenk (Armrotation)

[Platzhalter]

Skizzen/Fotos des Gesamtsystems + Beschriftungen

[Platzhalter] [!!!]


Detaillösungen

[Hinweis zum Inhalt:]

[Welche besonderen technischen, mathematischen oder programmiererischen Anforderungen standen
bei der Arbeit im Vordergrund und wie wurden sie gelöst?
Sprache: Technisch detailliert, präzise und eindeutig, aber knapp formuliert.
Abbildungen: Oft sagt eine Skizze oder ein Schaltplan mehr als tausend Worte! Sie sollte aber
einen Bezug zum Text haben und aus sich heraus verständlich sein.
Hierher gehören auch Grafiken mit Ergebnissen von Probemessungen, mathematische Herleitungen
oder bemaßte Pläne des Aufbaus]

Aufgabenteile

Ermittlung der benötigten Kraft

[ausstehend]

Self-Awareness: Luxo wird selbstbewusst

Grundsätzlich gibt es zwei Gründe, weshalb Luxo selbst wissen muss, wo er sich im Raum befindet:

1. Um sich nicht über seine mechanischen Grenzen zu bewegen,

2. Um seine Haltung entsprechend der Position des Gesichts zu korrigieren.

Die mechanischen Begrenzungen sind zunächst die maximalen und minimalen Anstellwinkel beider Armsegmente. Beim oberen Armsegment haben wir diese nicht weiter modifiziert, sie sind also noch identisch mit denen auf dem Datenblatt des Herstellers. Beim unteren Segment haben wir an beiden Enden Einschränkungen vorgenommen: Der Arm steht maximal fast senkrecht zum Boden, kann aber nicht in eine „Rückenlage“ gelangen. Grund dafür ist, dass der Arm nur durch die Schwerkraft und eine kleine Feder nach unten gezogen wird, während die Getriebemotoren den Arm nur nach oben ziehen können (nicht aber nach unten drücken). Aus der „Rückenlage“ würde Luxo also alleine nicht wieder herauskommen. Nach unten haben wir den Winkel auf etwa 20° zum Boden begrenzt, da die benötigte Motorkraft immer mehr zunimmt, je mehr der Arm waagerecht steht. Theoretisch hätten die Motoren wahrscheinlich genug Kraft, doch sicherheitshalber wollten wir sie nicht überlasten.

Weiterhin muss Luxo aufpassen, das sein Kopf nicht auf den Boden schlägt. Die mechanischen Grenzen können das nicht verhindern, daher kommt hier etwas Code ins Spiel. Geometrisch gesehen, darf hier – da beide Armsegemente gleich lang sind – der Winkel des oberen Armsegment in negativer Richtung betragsmäßig nicht den Winkel des unteren Segments unterschreiten. Falls dies eintritt, wird ein Not-Stopp initiiert. (Beispiel: das untere Segment hat einen Winkel von 40° zur Horizontalen. Somit darf der Winkel des oberen Segments nicht kleiner als -40° werden.)

Die Berechnung der Winkel erfolgt prinzipiell über die Encoder der Getriebemotoren. Diese zählen ab Programmstart die Umdrehungen der Motorachsen. Die letzte aktuelle Umdrehungsposition wird stets in einer Variable gespeichert. Um diese allerdings zuverlässig verwenden zu können, müssen die Encoder zu Beginn des Programms kalibriert werden, da im ausgeschalteten Zustand der Motor sich gedreht haben könnte. Zur Kalibrierung ziehen beide Motoren mit niedriger Geschwindigkeit die Sehne ein, bis die Arme an ihre mechanische Grenze stoßen. Danach wird die Umdrehungszahl auf Null gesetzt.

Unter der Näherung, dass der Radius der aufgewickelten Sehne konstant bleibt, ist nun die Anzahl der Umdrehungen direkt proportional zur Länge der Sehne. Der letzte Schritt zur Umrechnung in die Winkel ist nun der Kosinussatz. Er stellt in einem beliebigen Dreieck den Bezug zwischen den drei Seitenlängen und einem Winkel her:

Zur Veranschaulichung hier eine Skizze der Dreiecke an Luxos Arm:

Empirisch haben wir bestimmt, dass der Motor für die 16,6 cm Sehnenlängendifferenz 6,705 Umdrehungen benötigt. Wenn man nun c in Abhängigkeit von den Umdrehungen schreibt, erhält man:

Analog gilt für den Winkel α am unteren Armsegment:

(Im Code muss jedoch noch beachtet werden, dass der Arcuscosinus keinen Winkel in Grad liefert, sondern im Bogenmaß.)

Neben den mechanischen Grenzen spielen die Winkel auch eine Rolle bei der Reaktion auf die Position des Gesichts. Um auf Augenhöhe des Gesichts zu gelangen, muss Luxo wissen, ob er seinen Kopf geneigt hält oder nicht. Dabei spielt nicht nur der V-Servo eine Rolle, sondern auch die Winkel am Arm. Denn die Armsegmente sind keine perfekten Parallelogramme, sodass sich die Haltung des Kopfes auch mit der Bewegung des Arms ändert. Empirisch haben wir folgenden Zusammenhang festgestellt:

Montage der Lampe

Servo- und Webcammontage am Kopf

Sehnenmontage (Winkelstück am Ellenbogen für Winkeldifferenz, Befestigung a.d. Motoren)

Endmontage (Bodenplatte, Kabelfixierung, Limit-schrauben, Arduino)

Coding

  • Modifizierung der Gesichtserkennung(-sbibliothek), Tracken des Gesichts
  • Winkelberechnung
  • Ansteuern der Kopfservos
  • Ansteuern/Kontrollieren der Sehnen-Getriebemotoren
  • Kommunikation Processing(Laptop) - Arduino
  • Optimierung der Pinbelegung → Arduinobedarf auf eins senken
  • Encoder verstehen, einarbeiten (self-awareness)

Unser Code

Specsheet

Liste der verwendeten Bauteile

  • Schreibtischlampe incl. Federn(2)
  • Holzlatten und -Bretter für die Bodenplatte und den Standfuß
  • Bowdenzüge (2)
  • Bindfaden und Lysterklemmen
  • Servomotoren (2) Typ [Platzhalter]
  • Pan-Tilt-Halterung für die Servos
  • Getriebemotoren (2) Typ [Platzhalter]
  • Breadboards (2)
  • Zugesägte Stahlplatten (3) (an Ellenbogen und Nacken)
  • Arduino(nur 1!) + Laptop + USB-Kabel
  • Motor-Carrier „H-Brücke“
  • Schaltregler
  • [Platzhalter]
  • Diverse Schrauben, Muttern, Drähte, Tape und Kabelbinder

Pinbelegungstabelle

Arduino-Pin Verbindung zu..
Pin3 Pin A vom Encoder des Motor 1
Pin 4 Pin B vom Encoder des Motor 1
Pin A0 Pin M1IN1 von H-Brücke
Pin 6 Pin M1IN2 von H-Brücke
Pin 2 Pin A vom Encoder des Motor 2
Pin 7 Pin B vom Encoder des Motor 2
Pin A1 Pin M2IN1 von H-Brücke
Pin 5 Pin M2IN2 von H-Brücke
Pin 9 Servo H Pin (Kopf)
Pin 10 Servo V Pin (Kopf)

Fazit

[Platzhalter]


projektesose2016/luxopublic/start.txt · Zuletzt geändert: 2016/10/26 17:18 von c.jaedicke