Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
projektesose2016:luxo:team:dokumentation [2016/08/11 10:23] fbonowski [Hauptseite] |
projektesose2016:luxo:team:dokumentation [2016/08/25 10:30] (aktuell) fbonowski |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | |||
+ | <note important> | ||
+ | **Abschließende Bewertung Felix** | ||
+ | |||
+ | Die Einleitung und die Herleitung der Winkel mit den entsprechenden Skizzen sind super...\\ | ||
+ | ... allerdings ist das leider nur ein kleiner Teil dessen, was Abgedeckt werden sollte. | ||
+ | |||
+ | Deshalb mit viel Gnade noch ein "**Befriedigend mit Abstrichen**" | ||
+ | |||
+ | </note> | ||
======Projektdokumentation====== | ======Projektdokumentation====== | ||
Zeile 36: | Zeile 46: | ||
- | ==== Startseite ==== | ||
- | === Projekt LUXO === | + | |
+ | ====== Projekt LUXO ====== | ||
//Pixar für's Wohnzimmer// | //Pixar für's Wohnzimmer// | ||
- | [Platzhalter Img] | + | {{:projektesose2016:luxo:luxo_profile.jpg?direct&300 |}} |
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. | 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. | ||
Zeile 50: | Zeile 60: | ||
//**Mit besonderem Dank an**\\ | //**Mit besonderem Dank an**\\ | ||
(bzw. Abgabe bei)//\\ | (bzw. Abgabe bei)//\\ | ||
- | Corvin Jaedicke\\ Felix Bonowski\\ | + | Corvin Jaedicke\\ Felix Bonowski\\ |
+ | |||
+ | ---- | ||
+ | ===== Hauptseite ===== | ||
- | ==== Hauptseite ==== | ||
<note> | <note> | ||
**Kommentar Felix:** | **Kommentar Felix:** | ||
Zeile 67: | Zeile 80: | ||
- Kilian | - Kilian | ||
- | == Themenbeschreibung/Einleitung == | + | ---- |
+ | ==== Themenbeschreibung/Einleitung ==== | ||
- | __Aufgabenstellung des Robots (1/2 Seite)__ [Wird noch ausformuliert] | + | ===Aufgabenstellung des Robots (1/2 Seite) [Wird noch ausformuliert]=== |
* Freiheitsgrade(Bewegung): Kopf(rotieren, kippen), Arme(kippenx2) | * Freiheitsgrade(Bewegung): Kopf(rotieren, kippen), Arme(kippenx2) | ||
* Gesichtsverfolgung | * Gesichtsverfolgung | ||
Zeile 77: | Zeile 91: | ||
* (Gesten, Charakter) | * (Gesten, Charakter) | ||
- | __Referenz zu anderen, ähnlichen Arbeiten:__ \\ | + | ===Referenz zu anderen, ähnlichen Arbeiten=== |
Kleines Video von Luxos kleine Schwester Luci: [[https://youtu.be/dPnp3uZqJPc]]\\ | 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/]] | 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:__ | + | ==== Methoden/Umsetzung ==== |
+ | ===Baugruppen=== | ||
* Lampenkopf: Webcam, (Lampe) | * Lampenkopf: Webcam, (Lampe) | ||
* Nacken (Dualservo-Gelenk == Pan-Tilt-Servos) | * Nacken (Dualservo-Gelenk == Pan-Tilt-Servos) | ||
Zeile 89: | Zeile 104: | ||
* Laptop für Bildverarbeitung | * Laptop für Bildverarbeitung | ||
- | __Teilprobleme anführen [knapp]:__ | + | ===Teilprobleme anführen [knapp]=== |
* Ermittlung der benötigten Motorkraft | * Ermittlung der benötigten Motorkraft | ||
* Einrichtung&Anpassung der Gesichtserkennungsbibliothek (Processing) | * Einrichtung&Anpassung der Gesichtserkennungsbibliothek (Processing) | ||
Zeile 97: | Zeile 112: | ||
- | __Übersprungene Teilprobleme:__\\ | + | ===Übersprungene Teilprobleme=== |
* Freiheitsgrad Schultergelenk (Armrotation) | * Freiheitsgrad Schultergelenk (Armrotation) | ||
[Platzhalter] | [Platzhalter] | ||
- | __Skizzen/Fotos des Gesamtsystems + Beschriftungen:__\\ | + | ===Skizzen/Fotos des Gesamtsystems + Beschriftungen=== |
{{:projektesose2016:luxo:luxo_bowdenzugmechanismus.png?100|}} | {{:projektesose2016:luxo:luxo_bowdenzugmechanismus.png?100|}} | ||
[Platzhalter] [!!!] | [Platzhalter] [!!!] | ||
- | == Detaillösungen ==\\ | + | ---- |
+ | ==== Detaillösungen ==== | ||
[Hinweis zum Inhalt:] | [Hinweis zum Inhalt:] | ||
[Welche besonderen technischen, mathematischen oder programmiererischen Anforderungen standen | [Welche besonderen technischen, mathematischen oder programmiererischen Anforderungen standen | ||
Zeile 115: | Zeile 131: | ||
oder bemaßte Pläne des Aufbaus] | oder bemaßte Pläne des Aufbaus] | ||
- | **Aufgabenteile** | + | ---- |
- | [Bilder und -Beschriftungen ausstehend]\\ | + | ====Aufgabenteile==== |
- | __Konstruktion:__ | + | |
- | * Ermittlung Benötigte Kraft | + | ===Ermittlung der benötigten Kraft=== |
- | * Winkelberechnung (self-awareness) | + | |
+ | [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: | ||
+ | |||
+ | {{ :projektesose2016:luxo:ks.png?direct&400 |}} | ||
+ | |||
+ | Zur Veranschaulichung hier eine Skizze der Dreiecke an Luxos Arm: | ||
+ | |||
+ | {{ :projektesose2016:luxo:luxo_-_winkelskizze.png?direct&600 |}} | ||
+ | |||
+ | 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: | ||
+ | |||
+ | {{ :projektesose2016:luxo:beta.png?direct&500 |}} | ||
+ | |||
+ | Analog gilt für den Winkel α am unteren Armsegment: | ||
+ | |||
+ | {{ :projektesose2016:luxo:alpha.png?direct&400 |}} | ||
+ | |||
+ | (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: | ||
+ | |||
+ | {{ :projektesose2016:luxo:kappa.png?direct&300 |}} | ||
+ | |||
+ | ===Montage der Lampe === | ||
+ | |||
+ | Servo- und Webcammontage am Kopf | ||
- | __Montage der Lampe:__ \\ | + | {{:projektesose2016:luxo:20160622_163056_hdr.jpg?400|}} |
- | * Servo-, Webcammontage am Kopf\\ | + | {{:projektesose2016:luxo:20160622_163121_hdr.jpg?400|}} |
- | {{:projektesose2016:luxo:20160622_163056_hdr.jpg?300|}} {{:projektesose2016:luxo:20160622_163121_hdr.jpg?300|}} {{:projektesose2016:luxo:20160630_135934_hdr.jpg?300|}} {{:projektesose2016:luxo:20160630_135959_hdr.jpg?300|}} | + | {{:projektesose2016:luxo:20160630_135934_hdr.jpg?400|}} |
+ | {{:projektesose2016:luxo:20160630_135959_hdr.jpg?400|}} | ||
- | * Sehnenmontage (Winkelstück am Ellenbogen für Winkeldifferenz, Befestigung a.d. Motoren)\\ | + | Sehnenmontage (Winkelstück am Ellenbogen für Winkeldifferenz, Befestigung a.d. Motoren)\\ |
- | {{:projektesose2016:luxo:20160608_164428_hdr.jpg?300|}} {{:projektesose2016:luxo:20160714_181022_hdr.jpg?300|}} | + | {{:projektesose2016:luxo:20160608_164428_hdr.jpg?400|}} |
+ | {{:projektesose2016:luxo:20160714_181022_hdr.jpg?400|}} | ||
| | ||
- | * Endmontage (Bodenplatte, Kabelfixierung, Limit-schrauben, Arduino)\\ | + | Endmontage (Bodenplatte, Kabelfixierung, Limit-schrauben, Arduino)\\ |
- | {{:projektesose2016:luxo:20160629_160033_hdr.jpg?300|}} {{:projektesose2016:luxo:20160630_135918_hdr.jpg?300|}} | + | {{:projektesose2016:luxo:20160629_160033_hdr.jpg?400|}} |
+ | {{:projektesose2016:luxo:20160630_135918_hdr.jpg?400|}} | ||
- | __Coding:__\\ | + | ===Coding=== |
* Modifizierung der Gesichtserkennung(-sbibliothek), Tracken des Gesichts | * Modifizierung der Gesichtserkennung(-sbibliothek), Tracken des Gesichts | ||
* Winkelberechnung | * Winkelberechnung | ||
Zeile 144: | Zeile 203: | ||
* Encoder verstehen, einarbeiten (self-awareness) | * Encoder verstehen, einarbeiten (self-awareness) | ||
- | == Unser Code ==\\ | + | ---- |
+ | ==== Unser Code ==== | ||
{{:projektesose2016:luxo:team:programmcode.zip|}} | {{:projektesose2016:luxo:team:programmcode.zip|}} | ||
- | == Specsheet ==\\ | + | ---- |
- | __Liste der verwendeten Bauteile__\\ | + | ====Specsheet==== |
+ | ===Liste der verwendeten Bauteile=== | ||
* Schreibtischlampe incl. Federn(2) | * Schreibtischlampe incl. Federn(2) | ||
* Holzlatten und -Bretter für die Bodenplatte und den Standfuß | * Holzlatten und -Bretter für die Bodenplatte und den Standfuß | ||
Zeile 154: | Zeile 215: | ||
* Bindfaden und Lysterklemmen | * Bindfaden und Lysterklemmen | ||
* Servomotoren (2) Typ [Platzhalter] | * Servomotoren (2) Typ [Platzhalter] | ||
+ | * Pan-Tilt-Halterung für die Servos | ||
* Getriebemotoren (2) Typ [Platzhalter] | * Getriebemotoren (2) Typ [Platzhalter] | ||
* Breadboards (2) | * Breadboards (2) | ||
Zeile 162: | Zeile 224: | ||
* [Platzhalter] | * [Platzhalter] | ||
* Diverse Schrauben, Muttern, Drähte, Tape und Kabelbinder | * Diverse Schrauben, Muttern, Drähte, Tape und Kabelbinder | ||
- | __Pinbelegungstabelle__ | + | |
+ | ===Pinbelegungstabelle=== | ||
^ Arduino-Pin ^ Verbindung zu.. ^ | ^ Arduino-Pin ^ Verbindung zu.. ^ | ||
| Pin3 | Pin A vom Encoder des Motor 1 | | | Pin3 | Pin A vom Encoder des Motor 1 | | ||
Zeile 175: | Zeile 239: | ||
| Pin 10 | Servo V Pin (Kopf) | | | Pin 10 | Servo V Pin (Kopf) | | ||
- | + | ---- | |
- | == Fazit == | + | ===== Fazit ===== |
[Platzhalter] | [Platzhalter] | ||
---- | ---- |