PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lightfollowing + Weg merken



SH-Robotics
03.03.2008, 19:44
Guten Tag,
ich habe mir vor kurzem ein RP6 Robotersystem gekauft, und versuche nun ein C programm zu schreiben, damit der RP6 einer Taschenlampe folgt, den zurückgelegten weg merkt und wieder zum Ausgangspunkt zurückfindet.

Den Teil mit Lightfollowing gibts ja schon als Beispielprogramm, aber hätte irgendjemand eine Idee wie ich den Weg speichern und zurückfahren könnte?
Ich hab mir das so gedacht: Ich definiere ein globales dreidimensionales Array in dem jeweils die Geschwindigkeit des linken und rechten Antriebs und die Zeit die er so verblieben ist, gespeichert werden. Bei Berührung eines Bumpers soll er dan genau diese gespeicherten Abfolgen von unten nach oben ausführen.

Wäre diese Idee realisierbar? Oder gibt es bessere Vorschläge?
Hätte vielleicht jemand Tipps?

mfg

Besserwessi
03.03.2008, 21:48
Für kürzere Strecken könnte man das so machen. Zum glück braucht man dazu auch kein 3 D Array sondern nur 3 eindimensionale. Man hat aber trotzdem recht wenig Speicher, sodass man eventuell eine sparsamere Methode wählen müßte. Statt 2 Geschwindigkeiten und der Zeit könnte man ja auch 2 mal Geschwindigkeit mal Zeit gleich Strecke speichern. Man verliert die Geschwindigkeitsinformation, aber die braucht man ja nicht unbedingt. Dabei könnte man dann eventuell längere Strecken zusammenfassen als im Format oben. Noch kürzer wären Punkte im Rechtwinkligen Koordinaten, aber das braucht einiges an Mathematik.

Nach einiger Zeit/Strecke hat man dann aber ein typisches Odometireproblem: Die Fehler summieren sich auf und man kennt die genaue Richtung nicht mehr. Wie gut man wieder zurückfindet hängt dann von der Hardware und dem Untergrund ab.

radbruch
03.03.2008, 21:58
Hallo

So etwas in der Richtung hatten wir mal mit dem asuro besprochen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=31262

Ich denke, dein Vorhaben ist realisierbar, allerdings ist es nicht einfach.

Gruß

mic

damaltor
03.03.2008, 23:45
muss die zeit überhaupt gespeichrt werden? bei gleichbleibenden messabständen nicht... es reicht doch, z.B. alle 0,5 sek die gefahrene strecke zu speichern, und man bräuchte nur 2 arrays: strecke_links und strecke_rechts

radbruch
04.03.2008, 09:13
Hallo

Bringt das Speichern der Wegstrecken echt einen Vorteil? Auch hierbei fliesen sehr viele Fehler ein, die nachgefahrene Strecke wird sicher von der orginalen Fahrt abweichen. Zumal wir ja zurückfinden wollen, dass erschwert es noch mehr.

Hier mal ein anderer Ansatz: Der RP6 fährt mit halbwegs konstanter Geschwindigkeit durch die Gegend (MoveatSpeed()) und untersucht in festen Intervallen ob sich die Lichtverhältnisse verändert haben und er seinen Kurs ändern muss. Wenn ja, wird die Änderung und der Zeitpunkt (absolut seid dem Start oder relativ seid der letzen Änderung) gespeichert.

Noch einfacher: Man speichert z.B. alle Sekunde die Helligkeitswerte der Sensoren die man zuvor zur Änderung der Route verwendet hat. Zum Nachfahren des Weges prüft man dann nicht die Sensoren sondern die gespeicherten Werte, so dass der RP6 meint, er würde wieder der Lampe folgen. Um den Weg zurück zu finden, legt man den Rückwärtsgang ein und prüft die gespeicherten Werte vom letzten bis zum ersten Wert zurück. Diesmal muss man aber die getroffenen Wegentscheidungen spiegeln, denn wir fahren ja rückwärts. So werden eventuell sogar die Antriebsunterschiede kompensiert.

Gruß

mic

KayH
04.03.2008, 12:18
Hi,

ich wuerde das Problem in mindestens drei Unteraufgaben zerlegen.
1) einer Befehlsliste folgen -> automatisiert eine bestimmte Strecke abfahren
2) die Befehlsliste rueckwaerts abarbeiten -> falls die Befehle einfach strukturiert sind ist das nicht so kompliziert
3) Erstellen der Befehlsliste auf verschiedenem Input (z.B. Lernen waehrend des Fahrens, von einem Weggenerator auf dem PC, eine selbsterstellte Karte,...)

Fuer 1) reichen Befehle der Art "Drehen auf der Stelle um einen bestimmten Winkel" und Fahren einer bestimmten Strecke (oder alternativ mit best. Geschwindigkeit eine bestimmte Zeit). Damit kann ich jeden Punkt erreichen. Der Speicherverbrauch dieser Liste ist nicht gross.
2) das Invertieren dieser Liste ist nicht schwer (nur die Winkel muessen angepasst werden)
3) das ist komplexer ... Wenn wir uns auf eine bestimmte Geschwindigkeit festlegen und in bestimmten Zeitabstaenden folgende Taetigkeiten vornehmen, ist die Befehls-Liste gut zu erstellen.
- Sensorwerte pruefen: bei Bedarf Drehen auf der Stelle, bis Ziel mittig, gerade Fahrt vorwaerts.
- ein Drehbefehl wird direkt abgelegt
- ein Geradefahrt-Befehl wird erstellt, wenn der naechste Drehbefehl anliegt. Das kumuliert die Anzahl der Geradefahrt-Befehle auf ein Minimum

hth
Kay

SH-Robotics
04.03.2008, 17:23
Danke schonmal für die Tipps,
ich suche derzeit eine Funktion zum Zeitnehmen, aber ich kann in der Standartbibliothek nichts finden.
Kann mir hierbei jemand weiterhelfen?

thietho
04.03.2008, 19:24
Zeit nehmen kannst Du doch über die Stopwatch!
Gruß thietho