PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Odometriesensoren



-Bob-
26.10.2012, 17:24
Moin zusammen,

mein Asuro funktioniert super, nur fährt er leider nicht geradeaus :(.

Ich hab versucht selbst Regelungssoftware zu schreiben, die auch funktionierte. Leider nur ab und zu.
Asuro beginnt mit im Kreis fahren, bricht ab und zu aus und fährt dann wieder links herum im Kreis.
Zur überprüfung habe ich die Funktion Go der erweiterten Lib verwendet, wo er allerdings leider auch nur im Kreis fährt.

Der Odometriesensor Rechts funktioniert super (lasse eine LED bei übergang zu Weiß aufleuchten).
Der auf der Linken Seite funktioniert nur ab und zu...

Fremdlicht kann eigentlich nicht die Ursache sein, auch in völliger Dunkelheit fährt er nur im Kreis...

Habt ihr eine Idee?
Viele Grüße

Bob

EDIT:

Auch beim Beispielprogramm "Rechteck" fährt Asuro nur Kreise...

i_make_it
26.10.2012, 19:34
1234567890

-Bob-
26.10.2012, 19:43
Dank für die Antwort :)

Beide Motoren laufen einwandfrei.
Kalte Lötstellen bzw. kaputte Leiterbahnen können wigentlich nicht in Frage kommen, da ich permanent Messwerte von dem IR Sensor erhalte. Die Schwanken allerdings extrem stark, sodass man nicht zwischen SChwarz und Weiß unterscheiden kann...

oberallgeier
26.10.2012, 19:59
... Fremdlicht kann eigentlich nicht die Ursache sein, auch in völliger Dunkelheit ...Vielleicht hilft dieser Trick (klick hier)? (https://www.roboternetz.de/community/threads/47889-Odometrie-Problem?p=461184&viewfull=1#post461184) Das war bei vielen Kollegen die Ursache für schlechte Odometrieergebnisse.

-Bob-
27.10.2012, 00:10
Unglaublich, aber wahr - nachdem ich eine kleine Unterlegscheibe eingebracht habe, fährt er geradeaus.

Vielen, vielen, vielen Dank :)

Valen
27.10.2012, 16:58
Ok, das Problem ist offensichtlich gelöst. Aber bei die neue Lib sollte im Prinzip auch die Schwell-werten in die Datei myasuro.h angepasst werden.:

MY_ODO_LIGHT_VALUE_L
MY_ODO_DARK_VALUE_L
MY_ODO_LIGHT_VALUE_R
MY_ODO_DARK_VALUE_R

Und danach auch die Lib neu Compilieren. Nicht nur dein eigene Programm. Es könnte sein das es einige Schwarz/Weiß übergangen ich bemerkt hat.

-Bob-
28.10.2012, 13:15
Habe ich bereits angepasst, danke :)

Ich bräuchte evtl noch Hilfe bei folgendem Wert:
MY_GO_ENC_COUNT_VALUE

Momentan ist der Wert 29750L

Wie muss ich den für eine 8-Segmente Encoderscheibe anpassen?
nach welcher Formel wird der Wert berechnet?

Valen
28.10.2012, 18:11
Diese Wert ist die Strecke einer Tick Multipliziert mit 10000. Das Rad macht in einer Rundgang ein Weg von ungefähr 120mm. (Durchmesser * Pi) Mit ein Übertragung von 4,8 [EDIT: könnte auch 5 sein, muss mal nach zahlen] zwischen das letzte Zahnrad, und die kleine von die Encoderscheibe, kommt man auf 25 mm pro Encoderscheibe Rundgang. Dann durch 8 Teilen und das sollte in die Nähe von 3.125 mm/ Tick sein. Die Wert Sollte dann 312500 werden.

Aber man wurde es genauer bekommen wenn Asuro eine Strecke von 1 oder den Kompleten 10 Meter fahrt, und die Tick Anzahl aus den Globale Variabele Encoder zuruck sendet an dich.

Aber mit diesen Program können alle diesen Persönliche Werten bewertet werden:

https://www.roboternetz.de/community/threads/27943-ASURO-emittelt-Werte-für-Lib-V2-70-myasuro-h-selber

-Bob-
29.10.2012, 16:54
Danke ich probier das mit dem Testprogramm mal aus :)

ich stehe gerade vor dem Problem, dass Asuro sich nach einigen malen Turn aufhängt:



int g_iTurnVal = 90;
...
void MoveOn(void)
{
if(g_iFieldCounter % 7 == 0)
{
Turn(g_iTurnVal, 100);
Go(FIELDSIZE, 100);
g_iFieldCounter++;
AnalyseField();
SerWrite("Turning: ", 9);
PrintInt(g_iTurnVal);
Turn(g_iTurnVal, 100); //HIER hängt er sich auf und dreht sich ununterbrochen
SerWrite("Got It", 6);
g_iTurnVal *= (-1);
}
Go(FIELDSIZE, 100);
g_iFieldCounter++;
}


Das Problem kommt immer nur vor, wenn eine andere Variable g_iRow der wert 7 annimmt. g_iRow wird auch benutzt um ein Array als Index anzusprechen.
g_iRow hat jedoch überhaupt nichts mit Turn(g_iTurnval, 100) zu tun, oder liege ich da falsch?

können Zugriffsverletzungen an anderen Stellen im Program dazu führen, dass Asuro bei Turn() "durchdreht"?

Ich bin ratlos
Habt ihr eine Idee?

markusj
29.10.2012, 17:06
können Zugriffsverletzungen an anderen Stellen im Program dazu führen, dass Asuro bei Turn() "durchdreht"?

Wenn du "zufällig" Speicher beschreibst (Lesen ist, von Fehlern durch inkorrekte Werte mal abgesehen, kein Problem), kann alles mögliche passieren.

mfG
Markus

Valen
29.10.2012, 17:23
Ich wurde diese Werten g_iRow und g_iFieldCounter auch Zurück senden, damit du kontrollieren kannst was er genau an das Moment im Kopf hat. Könnte aber zu viel Daten werden mit 2400 B/sek.

-Bob-
29.10.2012, 18:26
Problem Solved.

Ich Idiot hab nen Anfängerfehler gemacht und ein 7-Stelliges Array mit dem Index 7 angesprochen.
Interressant dass Asuro so komsich reagiert, wenn Zugriffsverletzungen gemacht werden...

Vielen Dank

markusj
30.10.2012, 08:00
Interressant dass Asuro so komsich reagiert, wenn Zugriffsverletzungen gemacht werden...

Das ganze ist relativ einfach. Wie schon gesagt: Ungewollte schreibende Zugriffe auf Speicher/Register können undefiniertes Verhalten verursachen. Und undefiniertes Verhalten ist per definition "komisch". Du änderst damit mit hoher Wahrscheinlichkeit irgend eine andere Variable auf einen ungewollten Wert - Und der kann die weitere Ausführung des Programmes beliebig falsch ablaufen lassen.

mfG
Markus