robodriver
09.06.2008, 10:35
Hallo Leute,
ich sitze momentan an der Umsetzung der Odometrie meines Roboters und habe folgendes Problem:
Testen tu ich die Odometrie wie folgt:
Winkelberechnung:
- 3 volle umdrehungen nach rechts oder links drehen und dann den berechneten Winkel mit dem reellen Winkel vergleichen.
Dabei komme ich auf eine Abweichung von etwa einem Grad (recht konstant)
Koordinatenberechnung:
- 4 Meter geradeaus fahren und dann den real zurück gelegten Weg nach messen. Dabei komme ich auf eine Abweichung von 0-2,5 cm.
Also alles in allem könnte man ja sagen, dass die Odometrie recht genau ist.
Mein Problem ist aber:
Wenn ich den Bot normal geradeaus fahren lasse, dann läuft mir der Winkel weg. Nach 2 Metern verfahrweg bin ich teils schon bei knapp 40 Grad Abweichung.
Nun habe ich überall schon gelesen, dass eine Odometrie recht ungenau ist. Aber leider steht nirgens was man unter "recht ungenau" versteht.
Desshalb mal meine Frage:
Ist ein Fehler von 40 Grad auf 2 Metern ein "normaler" Odometrie-Typischer Fehler oder liegt das vielleicht doch an was anderem noch?
Mal ein paar Daten:
Mein Radumfang: 21,5 cm
Auflösung: 256 Incremente pro Radumdrehung
Radabstand: 28cm
Berechnet wird immer, sobald ein Rad 20 Incremente erreicht hat (nach der Vorherigen Messung), der Counter wird dann für beide Räder wieder auf 0 gesetzt.
Berechnung tu ich alles als Single (32 Bit Gleitkommazahl)
Und für die die es noch interessiert, bzw. die vielleicht was damit anfangen können, meine Formel zur Berechnung:
Sub Refresh_koordinaten
Statusbit.calc_koordinaten = 0
Tmp_winkel = Winkel
'Wenn Rückwärts gefahren wird:
If Raddrehung.rechts_zuruck = 1 And Raddrehung.links_zuruck = 1 Then
Tmp_winkel = Winkel + 180
A = Links
Links = Rechts
Rechts = A
End If
If Tmp_winkel < 0 Then Tmp_winkel = 360 + Tmp_winkel
If Tmp_winkel > 360 Then Tmp_winkel = Tmp_winkel - 360
Tmp_single = Links + Rechts
Tmp_single = Tmp_single / 2 'Mittelwert
Tmp_single = Tmp_single * 0.898 'Umrechnung Incr. in Millimeter
'neue X-Koordinate berechnen:
Tmp_single2 = Deg2rad(tmp_winkel)
Tmp_single2 = Tmp_single * Sin(tmp_single2)
X = X + Tmp_single2
'neue Y-Koordinate berechnen:
Tmp_single2 = Deg2rad(tmp_winkel)
Tmp_single2 = Tmp_single * Cos(tmp_single2)
Y = Y + Tmp_single2
'neuen Winkel berechnen:
If Links > Rechts Then
Tmp_single = Links - Rechts
Tmp_single = Tmp_single * 0.898 'Umrechnung Incr. in Millimeter
Tmp_single2 = 360 / 1583.3626974 '1583,... ist der Wendekreis des Bots
Tmp_single2 = Tmp_single2 * Tmp_single
Tmp_winkel = Tmp_winkel + Tmp_single2
Else
Tmp_single = Rechts - Links
Tmp_single = Tmp_single * 0.898
Tmp_single2 = 360 / 1583.3626974
Tmp_single2 = Tmp_single2 * Tmp_single
Tmp_winkel = Tmp_winkel - Tmp_single2
End If
Winkel = Tmp_winkel
If Raddrehung.rechts_zuruck = 1 And Raddrehung.links_zuruck = 1 Then
Winkel = Tmp_winkel - 180
End If
If Winkel < 0 Then Winkel = 360 + Winkel
If Winkel > 360 Then Winkel = Winkel - 360
Return
End Sub
Wäre toll wenn mir irgendwer, der sich damit auskennt, vielleicht einen Tipp geben könnte.
danke und Gruß Robodriver
ich sitze momentan an der Umsetzung der Odometrie meines Roboters und habe folgendes Problem:
Testen tu ich die Odometrie wie folgt:
Winkelberechnung:
- 3 volle umdrehungen nach rechts oder links drehen und dann den berechneten Winkel mit dem reellen Winkel vergleichen.
Dabei komme ich auf eine Abweichung von etwa einem Grad (recht konstant)
Koordinatenberechnung:
- 4 Meter geradeaus fahren und dann den real zurück gelegten Weg nach messen. Dabei komme ich auf eine Abweichung von 0-2,5 cm.
Also alles in allem könnte man ja sagen, dass die Odometrie recht genau ist.
Mein Problem ist aber:
Wenn ich den Bot normal geradeaus fahren lasse, dann läuft mir der Winkel weg. Nach 2 Metern verfahrweg bin ich teils schon bei knapp 40 Grad Abweichung.
Nun habe ich überall schon gelesen, dass eine Odometrie recht ungenau ist. Aber leider steht nirgens was man unter "recht ungenau" versteht.
Desshalb mal meine Frage:
Ist ein Fehler von 40 Grad auf 2 Metern ein "normaler" Odometrie-Typischer Fehler oder liegt das vielleicht doch an was anderem noch?
Mal ein paar Daten:
Mein Radumfang: 21,5 cm
Auflösung: 256 Incremente pro Radumdrehung
Radabstand: 28cm
Berechnet wird immer, sobald ein Rad 20 Incremente erreicht hat (nach der Vorherigen Messung), der Counter wird dann für beide Räder wieder auf 0 gesetzt.
Berechnung tu ich alles als Single (32 Bit Gleitkommazahl)
Und für die die es noch interessiert, bzw. die vielleicht was damit anfangen können, meine Formel zur Berechnung:
Sub Refresh_koordinaten
Statusbit.calc_koordinaten = 0
Tmp_winkel = Winkel
'Wenn Rückwärts gefahren wird:
If Raddrehung.rechts_zuruck = 1 And Raddrehung.links_zuruck = 1 Then
Tmp_winkel = Winkel + 180
A = Links
Links = Rechts
Rechts = A
End If
If Tmp_winkel < 0 Then Tmp_winkel = 360 + Tmp_winkel
If Tmp_winkel > 360 Then Tmp_winkel = Tmp_winkel - 360
Tmp_single = Links + Rechts
Tmp_single = Tmp_single / 2 'Mittelwert
Tmp_single = Tmp_single * 0.898 'Umrechnung Incr. in Millimeter
'neue X-Koordinate berechnen:
Tmp_single2 = Deg2rad(tmp_winkel)
Tmp_single2 = Tmp_single * Sin(tmp_single2)
X = X + Tmp_single2
'neue Y-Koordinate berechnen:
Tmp_single2 = Deg2rad(tmp_winkel)
Tmp_single2 = Tmp_single * Cos(tmp_single2)
Y = Y + Tmp_single2
'neuen Winkel berechnen:
If Links > Rechts Then
Tmp_single = Links - Rechts
Tmp_single = Tmp_single * 0.898 'Umrechnung Incr. in Millimeter
Tmp_single2 = 360 / 1583.3626974 '1583,... ist der Wendekreis des Bots
Tmp_single2 = Tmp_single2 * Tmp_single
Tmp_winkel = Tmp_winkel + Tmp_single2
Else
Tmp_single = Rechts - Links
Tmp_single = Tmp_single * 0.898
Tmp_single2 = 360 / 1583.3626974
Tmp_single2 = Tmp_single2 * Tmp_single
Tmp_winkel = Tmp_winkel - Tmp_single2
End If
Winkel = Tmp_winkel
If Raddrehung.rechts_zuruck = 1 And Raddrehung.links_zuruck = 1 Then
Winkel = Tmp_winkel - 180
End If
If Winkel < 0 Then Winkel = 360 + Winkel
If Winkel > 360 Then Winkel = Winkel - 360
Return
End Sub
Wäre toll wenn mir irgendwer, der sich damit auskennt, vielleicht einen Tipp geben könnte.
danke und Gruß Robodriver