PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro und Odometrie



Winne
09.09.2005, 17:21
Hallo,

ich mache mir über den AC-Wander (Odemetrie) gedanken. Die Wandlungszeit kann zwischen 65 - 260µs liegen. Wie bekomme ich die ungefähre Wandlungszeit heraus?

Gruss Winne

stochri
09.09.2005, 17:47
Der Wandler braucht im Free Run Modus 13 Takte. Jetzt hängt es davon ab, welches Vorteilerverhältnis Du beim ADC-Takt eingestellt hast.

Gruss,
stochri

Winne
09.09.2005, 18:12
@stochri
Gibt es eine Möglichkeit die Wandlungszeit zu beschleunigen?

Ich habe es gerade selber heraus gefunden.
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS1) ; // clk/128

stochri
09.09.2005, 21:27
Warum willst Du sie denn beschleunigen ?

Winne
10.09.2005, 09:00
Ich dachte eine schnellere Wandlung verbessert die zuverlässigkeit der Odometrie Funktion. Leider hat das so nix gebracht.

stochri
10.09.2005, 12:16
Das größte Problem bei der Odometrie ist die wechselnde Umgebungshelligkeit.
Eine Lösung dazu ist, die Sensoren abzuschirmen ( z.B. wie beim Nivea-Dosen-Asuro ).

Gruss,
stochri

Winne
11.09.2005, 08:57
Ich habe schon darüber nachgedacht. Die Äußeren Seiten der Räder schwarz anzumalen und ein „Dach“ über die Sensoren zu bauen. Die „Nivea-Dosen-Lösung“ finde ich zu laut.

roborookie
11.09.2005, 19:49
Hei Winne/Stochri,

ich experimentiere auch schon seit Tagen mit der Odometrie herum.
Die Werte, die ich bekomme scheinen aber eher zufällig zu sein und auch ariithmetische Mittel - auch gewichtete - helfen nicht weiter.
Auch wenn ich bei fast völliger Dunkelheit den Asuro laufen lasse, sind die Werte nicht zu gebrauchen.
Gibt es überhaupt jemanden, der auf der Basis der Odometrie schonmal eine Geradeausfahrt realisiert hat ?
Mir kommen Zweifel ...

Grüße
Roborookie

Vogon
11.09.2005, 20:35
Ich habe mit einem PI-Regler den ASURO zum geradeaus fahren gebracht. Gegen Fremdlicht haben die Sensoren eine kleine Haube verpasst bekommen. Schenkellänge 7mm.
Dann hatte ich noch ein zweites Problem. Das mittere Zahnrad mit ddem S/W-Sektormuster wandert auf seiner Achse hin und her. Ein dünne Papp-unterlegscheibe auf dem kleine Zahnrad hält es jetzt hinten.

pebisoft
11.09.2005, 20:58
hallo, ich habe den asuro als encoder hinter meinem küchenbrettroboter.
die daten gehen zum avr auf dem robby, der avr läuft mit 8mhz.
ich kann den robby pro encodereinheit ca 3,2 mm fahren lassen.
die helligkeit macht überhaut nichts aus. ich habe avr-daten zum wechseln von 100 und 400 genommen. funktioniert 100%.
mfg pebisoft
bild ist unter "album,persönliche galerie,pebisoft"

Winne
12.09.2005, 06:28
@Vogon
Danke für die Bauanleitung!

@pebisoft
ich kann das garnicht glauben, dass diese Werte so gut funktionieren!

roborookie
12.09.2005, 07:28
@vogon

Danke für die Bauanleitung ! Muss mal gucken, ob ich das so hinkriege. Die Sensoren sitzen ziemlich nah an den Reifen und viel Platz zum Befestigen ist auch nicht ...

@pebisoft

Hast Du eine Liste von Odometriewerten ?
Dann könnte ich das mal mit meinen Ergebnissen vergleichen ...

Vogon
12.09.2005, 13:13
Die Sensoren sitzen ziemlich nah an den Reifen
Du meinst doch sicher: nah an dem Zahnrad ?
Den kleinen Winkel habe ich von hinten an den Photo-Sensor und die LED angeklebt.
Jetzt kann von hinten kein Licht einfallen. Von oben ist jetzt auch zu. Nach vorne (zum Zahnrad) schliest die Abdeckung mit der Kante der Leiterplatte ab - soll ja nicht die Geberscheibe zerkratzen.
Das Fremdlicht das duch das Zahnrad und die Geberscheibe kommt, scheint nicht zu stören.

Test Odometer
L: 210 R: 422 Lmax: 105 Lmin: 617 Rmax: 211 Rmin: 723
L: 230 R: 687 Lmax: 167 Lmin: 424 Rmax: 449 Rmin: 705
L: 367 R: 511 Lmax: 267 Lmin: 396 Rmax: 480 Rmin: 608
L: 795 R: 534 Lmax: 531 Lmin: 396 Rmax: 507 Rmin: 571
L: 355 R: 503 Lmax: 531 Lmin: 376 Rmax: 507 Rmin: 537
L: 457 R: 700 Lmax: 531 Lmin: 376 Rmax: 603 Rmin: 537
L: 743 R: 788 Lmax: 637 Lmin: 376 Rmax: 695 Rmin: 537
L: 293 R: 798 Lmax: 637 Lmin: 335 Rmax: 746 Rmin: 537
L: 675 R: 806 Lmax: 656 Lmin: 335 Rmax: 776 Rmin: 537
L: 437 R: 637 Lmax: 656 Lmin: 335 Rmax: 776 Rmin: 537
L: 606 R: 563 Lmax: 656 Lmin: 335 Rmax: 776 Rmin: 537
L: 372 R: 539 Lmax: 656 Lmin: 335 Rmax: 776 Rmin: 537
L: 558 R: 489 Lmax: 656 Lmin: 335 Rmax: 776 Rmin: 513
L: 769 R: 743 Lmax: 712 Lmin: 335 Rmax: 776 Rmin: 513
L: 749 R: 763 Lmax: 730 Lmin: 335 Rmax: 776 Rmin: 513
L: 402 R: 673 Lmax: 730 Lmin: 335 Rmax: 776 Rmin: 513

roborookie
12.09.2005, 20:23
Hallo Vogon,

vielen Dank für das Testprogramm und die Beispielwerte.
Ich hab's mal probiert und meine Werte schwanken etwa so wie Deine ...
Wenn man nach Standardabweichung geht, dann liegen meine sogar noch ein bisschen besser ;-)) Interessanterweise schwankt bei Dir der linke Motor offenbar auch etwas stärker ...
Also misst mein Asuro dann doch nicht sooo viel schlechter als andere.
Das ist beruhigend und das wollte ich erstmal wissen.

Aber - nun der nächste Schritt - was mache ich nun damit ???
Bei den Zahlen (max/min) die Dein Testprogramm liefert sieht man, dass sie sich nach einigen Werten stabilisieren ... Was ist das ?

Danke !
(ach ja - hier meine Messwerte)

Test Odometer
L:220 R:522 Lmax:110 Lmin:622 Rmax:261 Rmin:773
L:674 R:548 Lmax:392 Lmin:622 Rmax:404 Rmin:661
L:218 R:751 Lmax:392 Lmin:420 Rmax:577 Rmin:661
L:247 R:454 Lmax:392 Lmin:334 Rmax:577 Rmin:558
L:555 R:529 Lmax:473 Lmin:334 Rmax:577 Rmin:544
L:630 R:784 Lmax:551 Lmin:334 Rmax:680 Rmin:544
L:243 R:614 Lmax:551 Lmin:289 Rmax:680 Rmin:544
L:329 R:729 Lmax:551 Lmin:289 Rmax:704 Rmin:544
L:575 R:691 Lmax:563 Lmin:289 Rmax:704 Rmin:544
L:399 R:685 Lmax:563 Lmin:289 Rmax:704 Rmin:544
L:272 R:789 Lmax:563 Lmin:281 Rmax:746 Rmin:544
L:409 R:753 Lmax:563 Lmin:281 Rmax:749 Rmin:544
L:473 R:669 Lmax:563 Lmin:281 Rmax:749 Rmin:544
L:543 R:527 Lmax:563 Lmin:281 Rmax:749 Rmin:536
L:674 R:787 Lmax:618 Lmin:281 Rmax:768 Rmin:536
L:428 R:646 Lmax:618 Lmin:281 Rmax:768 Rmin:536
L:730 R:492 Lmax:674 Lmin:281 Rmax:768 Rmin:514
L:338 R:551 Lmax:674 Lmin:281 Rmax:768 Rmin:514
L:389 R:523 Lmax:674 Lmin:281 Rmax:768 Rmin:514
L:397 R:576 Lmax:674 Lmin:281 Rmax:768 Rmin:514
L:388 R:644 Lmax:674 Lmin:281 Rmax:768 Rmin:514
L:484 R:563 Lmax:674 Lmin:281 Rmax:768 Rmin:514
L:569 R:786 Lmax:674 Lmin:281 Rmax:777 Rmin:514
L:375 R:694 Lmax:674 Lmin:281 Rmax:777 Rmin:514
L:518 R:598 Lmax:674 Lmin:281 Rmax:777 Rmin:514
L:720 R:595 Lmax:697 Lmin:281 Rmax:777 Rmin:514

Vogon
12.09.2005, 21:32
Das sind die Min und Max-Werte die der Analogwandler als Sensordaten liefert. Wenn du mit einer Lampe die Sensoren störst, kannst du das sofort sehen.
Die ersten beiden Werte L: und R: sind ja zufällige Werte. Je nach dem welches Segment gerade vor dem Sensor steht.
Du kannst ja die Motoren stoppen (speed=0). Die Sensoren messen dann den Lichteinfall von rechts und links.

Wenn du mit den Encoderdaten arbeiten möchtest, werden im Interupt-Programm SIGNAL(SIG_ADC) die gemessenen Lichtwechsel als Fahrtstrecke aufaddiert. Aber Vorsicht, die Mess-Werte lassen sich nicht direkt vergleichen da unterschiedliche Messbereiche benutzt werden.

roborookie
13.09.2005, 06:40
AHA !
Laut Beschreibung liefert das odometrie-Kommando einen Helligkeitswert. Bislang hatte ich angenommen, dass der Wert um so niedriger (heller) liegt je schneller das Rad dreht. Aber mit der Interpretation habe ich wohl gründlich daneben gelegen. Dass der Wert das jeweils vor dem Sensor liegende Feld anzeigt hätte ich nicht gedacht.
Wenn das so ist hilft ja eigentlich nur eine Anfangsmessung mit zwei oder drei Messpunkten und im Anschluss dann laufend zu messen und es mit den Anfangswerten zu vergleichen.

Oder das SIGNAL-Kommando mit Interrupts. Wo ist denn das Kommando beschrieben ??? In der Asuro-CD habe ich es nicht gefunden ...

RCO
13.09.2005, 20:38
Du könntest zwei Schwellwerte nehmen die unter bzw. überschirtten werden müssen und dann entsprechend eine andere Variable erhöhen.
Am besten ist es natürlich noch Anfangswerte zu nehmen, oder besser die Odometer gegen Fremdlich zu schützen, denn auch das Fremdlicht ist ja nicht konstant und eine IR-Fernbedienung könnte die Sensoren unter Umständen stören.

Andun
14.09.2005, 09:11
Nur mal so als Hinweis: Ein Programm zur Feststellung des Wechsels von Schwarz zu weiß ... gibt es schon und das ist auch sehr brauchbar. Einfach mal nach erweiterter Bibliothek suchen.

Ich geh mal davon aus, dass die meisten das hier wissen, aber das hört sich grad nicht so an. :D

roborookie
16.09.2005, 09:29
Hallo Andun,

Ich hatte es nicht gewusst aber mich nach dem Hinweis dann auf die Suche gemacht - deshalb danke für den Hinweis.
Es ist ziemlich verwirrend, welche Libraries es nun schon wo gibt und wenn, zu welchem Zweck und in welcher Version.
Die aktuellste die ich finden konnte, liegt auf Deiner Homepage (sehr gut gemacht im übrigen ... bist Du WIRKLICH erst 17 ???).
Daneben gibt es "FirstTry" und "Wettbewerb1_2", die aber beide schon älter zu sein scheinen.

Es gibt auch diverse Linksammlungen, die versuchen den Überblick etwas zu verbessern.

Andun
16.09.2005, 13:15
Moin

Ja, ich bin wirklich leider erst 17. . . . (schon frustrierend wenn alle anderen anfagen mit dem Auto rumzudüsen . . . )

Also zu den Libraries nochmal: Ich habe versucht in der Version auf meiner HP alles gute zusammen zu packen was ich hier finden konnte.

Und bei der Linksammlung versuche ich auch indirekt mit zu werkeln indem ich RCO immer mal wieder Tipps gebe. :D

Andun

roborookie
18.09.2005, 09:27
Ich habe mir die Funktionen "Go" und "Turn" mal ein bisschen angesehen. ("Go" geht bei mir nicht ganz geradeaus, aber das kann durchaus am Umgebungslicht liegen. Gelegentlich muss ich es mal bei Dunkelheit probieren.)

Zwei Fragen habe ich zu "Go"
1. Wie weit fährt "Go" überhaupt ?
Egal was ich in "distance" übergebe: Asuro fährt bei mir endlos geradeaus ...
Anders gefragt, in welcher Einheit wird "distance" angegeben ? Oder dient es nur zur Angabe vorwärts bzw. rückwärts ?

2. Interrupts für Berührungsschalter ?
"Go" verwendet offenbar eine Interrupt-Steuerung für die Odometriewerte, die man dann der Variablen encoder[2] entnehmen kann.
Nun beschäftigt "Go" den Prozessor die ganze Zeit mit dem Geradehalten der Strecke (ständiges Abgleichen der Geschwindigkeiten) und prüft nicht, ob in der Zwischenzeit irgendwelche Schalter gedrückt sind.
Wenn man also annimmt, dass der Asuro während "Go" vor eine Wand laufen könnte, muss man eine Abfrage in die Funktion einbauen, oder einen weiteren Interrupt (zusätzlich zur Odometrie) verwenden.
Wie macht Ihr das ? Die Interrupt-Lösung ist die elegantere. Kann man überhaupt zwei Interrupts verwenden ? Falls ja - wie sieht ein Beispiel aus ?

Danke !

Vogon
18.09.2005, 10:58
Eigendlich soll der Auso nur die angegebene Distanz fahren. Wenn das nicht so ist, muss ein Fehler vorliegen. Vermutlich zählt die Interupt-Routine nicht richtig hoch ?
Probier doch mal die asuro,c von: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11256

In der asuro.c kannst du sogar drei Inerupt programme sehen:
SIGNAL (SIG_OVERFLOW2) - zählt die Zeit weiter.
SIGNAL (SIG_INTERRUPT1) - wenn eine Taste gedrückt wird.
SIGNAL (SIG_ADC) - wenn der Analog-Wandler arbeitet.

Du kannst ja mal versuchen die Hindernisserkennung in di Go-Function mit einzubauen.
Oder du baust deinen Asuro ein wenig um, und benutzt den IR-Sensor. dann rennt dein Asuro nicht an die Möbel oder bleibt mit den Rädern hängen. https://www.roboternetz.de/phpBB2/viewtopic.php?p=88782#88782

Andun
18.09.2005, 12:21
Also was ich am Anfang immer nicht gebacken bekommen habe, war dass ich vergessen habe die encoder zu starten und zu initalisieren. Das habe ich immer vergessen:

Encoder_Init() initializing encoder-counter
Encoder_Start() start autoencoding

Dann fährt er nämlich auch immer gerade aus.

julien
09.10.2005, 10:00
//Dieses Programm dient zum geradeausfahren
//zusammengestellt und umgeschrieben von julien

#include "asuro.h"

int main(void)
{
unsigned int Rmin = 1024, Rmax = 0, Lmin = 1024, Lmax = 0, Rmitte = 512, Lmitte = 512, lspeed=150, rspeed=150, data[2];
unsigned int wegr=0, wegl=0;
unsigned char flagl=FALSE, flagr=FALSE;
Init();
MotorDir(FWD,FWD);
while(1) {
MotorSpeed(lspeed,rspeed);
OdometrieData(data); // 0. links, 1. rechts
// max links
if (data[0] > Lmax)
Lmax += (data[0] - Lmax) / 2;
// min links
if (data[0] < Lmin)
Lmin -= (Lmin - data[0]) / 2;
// max rechts
if (data[1] > Rmax)
Rmax += (data[1] - Rmax) / 2;
// min rechts
if (data[1] < Rmin)
Rmin -= (Rmin - data[1]) / 2;
Rmitte=(Rmax+Rmin)/2;
Lmitte=(Lmin+Lmax)/2;
if ((data[0] < Lmitte) && (flagl == TRUE)) {
flagl = FALSE;
wegl++;
}
if ((data[0] > Lmitte) && (flagl == FALSE)) {
flagl = TRUE;
wegl++;
}
if ((data[1] < Rmitte) && (flagr == TRUE)) {
flagr = FALSE;
wegr++;
}
if ((data[1] > Rmitte) && (flagr == FALSE)) {
flagr = TRUE;
wegr++;
}
if(wegr>wegl){
if(lspeed<=254) lspeed++ else rspeed--;
}
if(wegr<wegl){
if(rspeed<=254) rspeed++ else lspeed--;
}
SerWrite("WL: ",4);
PrintInt(wegl); //Ausgabe Weg linkes Rad
SerWrite("WR: ",4);
PrintInt(wegr); //Ausgabe Weg rechtes Rad);
SerWrite("/r/n",2);
}
return 0;
}


So, das dürfte ziemlich genau laufen. Egal, wie das Umgebungslicht ist.
MfG julien

RedBaron
30.10.2005, 13:55
Gibt es eine Möglichkeit die Wandlungszeit zu beschleunigen?

Ich habe es gerade selber heraus gefunden.
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS1) ; // clk/128


HI,

bei dem o.g. Takt dauert eine Wandlung ca. 0,2 ms. Wenn nur Odometrie gemessen wird, bedeutet das bei einer 12-Sektor-Scheibe (6 weiße und 6 schwarze Flächen auf dem 1. Getrieberad (d.h. Standard)) je nach Geschwindigkeit 10-25 Abtastzyklen (AD-Wandlungen) pro Sektor und pro Rad, d.h. abwechselnd links und rechts gemessen. Das ist mehr als genug um einen Sektorübergang sauber zu erkennen.

RedBaron