Archiv verlassen und diese Seite im Standarddesign anzeigen : unterschiedl. Rotationswinkel bei untersch.Geschwindigkeiten
Hallo Leute!
Habt ihr vielleicht ne Lösung für folgende 2 Probleme!?
Ich habe den Drehzahlgeber so präzise an den Poti's eingestellt wie möglich, sodass mein Robby6 auf 2 Meter weniger als 1 cm schief kommt.
Dann hab ich im Config.h den Rotation-Factor angepasst, sodass bei Geschwindigkeit 100 der Roboter bei rotate(x,x,360,x) exakt eine ganze Umdrehung macht und wieder gerade da steht.
Wenn ich jedoch Geschwindigkeit 50 eingebe macht er nur mehr ca. 340-350 Grad. Ist das normal, bzw. wie kann ich das Problem beheben?
Außerdem ist mir aufgefallen das er bei einer Links-Umdrehung nicht so exakt dreht wie nach rechts. Woran liegt das? Kann man beide Seiten unterschiedlich "feinjustieren"?
Ich hab den Rotation-Factor auf 780 stellen müssen. Was habt ihr bei euch eingestellt?
Abweichungen sind normal:
Das ist erstmal normal und es wurde ja oben bereits erläutert warum! Bei
Raupenantrieben entstehen immer Abweichungen durch Kettenschlupf. Außerdem
müssen die Encoder kalibriert werden bevor das überhaupt richtig
klappen kann. Lesen Sie dazu auch Anhang B.
Irgendwo in der Anleitung steht da auch noch was dazu, das finde ich aber gerade nicht.
Ansich ist es eigentlich normal, dass rechts und links unterschiedlich funktionieren, weil es nie funktionieren wird die Encoder perfekt und vorallem exakt gleich einzustellen.
Dass der Roboter auf 2m nur 1cm von der Geraden abweicht ist eigentlich extrem gut.
Eine Abweichung beim Drehen um 10-20° ist eigentlich auch nicht außergewöhnlich.
Das einzige was man noch versuchen könnte, wäre die ganze Drehung exakt bei einer Geschwindigkeit von 70 einzustellen, denn das ist eigentlich die Standardgeschwindigkeit.
Außerdem hättest du dan sowohl zu 50 als auch 100 nicht so einen großen Unterschied, somit könnte es u.U. exakter sein.
Ich persönlich habe (noch) nichts verändert, denn für mich funktioniert er genau genug, da ich mich sowieso eher mit Aufbauten, Servos, etc. beschäftige.
edit:
Ich an deiner Stelle würde an den Encoder nichts mehr umstellen, diese sind anscheinend schon sehr gut eingestellt.
Das Zitat ist aus der Beschreibung der RP6 Base - Fehlerbehebung
Es ist mir schon klar das Ketten-/Raupenantriebe einen gewissen Schlupf haben.
Da meine Poti's ganz gut eingestellt habe, könnte man meinen, das auch die Rotationswinkel exakt stimmen sollten (nach beiden Seiten, egal welche Geschwindigkeit).
So verstehe ich auch nicht warum die Drehwinkel an beiden Seiten unterschiedlich sind, da sie ja (anscheinend) gut eingestellt wurden, sonst würde er ja nicht geradeaus fahren.
Und das bei verschiedenen Geschwindigkeiten immer exakt gleich verschiedene Winkel gedreht werden hat sicher nichts mit Schlupf zu tun.
Das mit der Geschwindigkeit auf 70 justieren ....
da geb ich dir recht, so hätte ichs jetzt gemacht, aber ich hätte natürlich gerne, das die Drehwinkel immer gleich sind, egal welche Geschwindigkeit. Weiß vielleicht noch wer Rat!?
Hallo,
Wie ich hier schon (sehr oft) geschrieben habe hat das alles NICHTS mit den Potis von den Encodern zu tun.
Sobald die ein Signal im Bereich 60:40 oder 40:60 liefern passt es - ist egal ob das genau 50:50 ist die ANZAHL der Impulse die gezählt werden ändert sich dadurch nicht!
Die Drehgeber messen nur um welchen WINKEL sich die Räder gedreht haben (darüber kann man dann über den exakten Durchmesser und die Zeit die gefahrenen Strecke und die Geschwindigkeit ermitteln).
Die Regelungsroutinen sind relativ langsam (also mit sanftem an und abbremsen) das fügt schonmal eine kleine Softwareabweichung hinzu.
Könnte man durchaus noch einiges bei rausholen.
(Die RP6Lib ist als guter Ausgangspunkt gedacht und keine perfekte Lösung)
Wichtiger ist natürlich die REIBUNG. Die Ketten reiben (Kettenantrieb - Prinzipbedingt) komplett über den Boden während der Rotation - anders als beim Geradeausfahren wo sie fast wie bei einem Rad einfach nur vorwärts rollen.
d.h. beim Geradeausfahren wird die gefahrene Distanz grob mit der gemessenen übereinstimmen.
Beim Rotieren wird es aber immer weniger als gemessen sein - das sind eben Ketten und keine Räder. ;)
Je nach Untergrund(!) mehr oder weniger da sich ja die Reibung verändert (Teppich vs. Laminat z.B.).
Man muss meistens deutlich weiter rotieren damit es grob passt.
Das ist bei *ALLEN* Kettenantrieben so also völlig normal das das nicht genau ist. Es sind externe Sensoren notwendig.
Das steht übrigens auch noch in der normalen Anleitung drin.
> das die Drehwinkel immer gleich sind, egal welche Geschwindigkeit
Da müsstest Du den Korrekturfaktor nochmal je nach geschwindigkeit skalieren. Denn die Reibung ändert sich natürlich auch mit der Geschwindigkeit.
MfG,
SlyD
Ich hab die Beschreibung vom Robby gelesen!
Das kann bei meinem Problem Nr 1 eindeutig kein Reibungsproblem sein, denn...
eine Linksumdrehung dreht fast exakt bei 180 Grad diese 180 Grad und auch bei 360 dreht er sich links seine 360 Grad.
Wenn er sich jedoch nach rechts dreht, dreht er sich bei 180 Grad nur ca 170 Grad und bei 360 nur 340 Grad.
Egal auf welchem Untergrund ich fahre und wie oft ich probiere, links ist immer OK, nur die rechte Seite passt niemals, also kanns eindeutig kein Schlupfproblem sein. Es muss ein anderes Problem sein.
Da die Drehgeber an jeder Seite des Antriebs gleich sind, (36 Segmente)sollte doch auch jede Rotation gleich sein, egal ob sich der Roboter rechts od. links dreht.
Problem 2:
Ich habe folgendes Test-Programm geschrieben (v=Geschwindigkeit):
-) fahre 100mm vorwärts mit v 200
-) dreh 180 grad mit v 200
-) fahre 100mm vorwärts mit v 200
-) dreh 180 grad mit v 200
usw...
Also hier stimmt überhaupt nichts
er dreht sich statt 180 Grad nur um ca 100 dann wieder 140(aber nie 180)
fährt einmal nur 1cm dann wieder ca 10 vorwärs
Jaja, ich weiss man soll nur 160 im Dauerbetrieb fahren. Aber wenn ich v 200 fahren kann, dann sollte auch alles hinhauen.
Liegts vielleicht daran, dass die Drehzahl nur 5 mal pro Sek gemessen wird?
du wirst es sowieso nicht schaffen es noch genauer hinzubekommen ...
deine Einstellungen sind ohnehin schon sehr genau
Wie SlyD kannst du die Library ändern / erweitern etc.
Außerdem mit einer Geschwindkeit von 200 eine Bewegung zu machen, ist ca. vergleichbar wenn du mit einem Auto eine 90° Kurve mit 150 machen willst.
Das Problem ist dass diese Geschwindigkeit für die Sensoren und die motioncontrol funktion viel zu hoch ist um die Bewegung genau durchzuführen.
Die 2 Möglichkeiten das noch zu verfeinern sind
1. Library erweitern, umschreiben usw.
2. Sensoren z.B. an den Ecken der Platine anbringen und diese entweder in die Library oder in das Programm selbst zu integrieren
Meiner Meinung nach ist "weder noch" den Aufwand wert.
Schade, hab ich wohl zu viel erwartet :o(
Trotzdem danke für euren Beitrag!
Die einzige weitere Möglichkeit wäre z.B. ein Fließenboden (oder irgendein Boden mit regelmäßigen Fugen o.ä.).
Es gibt im Forum einen Thread (soweit ich mich erinnern kann), ich finde ihn allerdings zur Zeit nicht, indem man mit dem ACS eine Linie verfolgen kann.
Somit könnte man trixen und bei einer 360° Drehung solange drehen bis man 2mal die Linie "gesehen" hat.
Der einzige Haken: funktioniert nur dann wirklich gut, wenn man vorher genau (gerade) auf der Linie stand :cheesy: :cheesy: :cheesy:
Scherzkeks!
Wenn jemand noch ne Lösung hat, bitte melden!
Wie gesagt - Du könntest noch an der Software ansetzen!
Die Regler sind wirklich noch nicht optimal und die Funktionen in der RP6 Lib versuchen immer etwas die Geschwindigkeit vor dem Ziel runterzuregeln.
Du könntest auch einen Gyro Sensor (Rotationssensor) verwenden - mittlerweile gibts ein paar relativ günstige mit Analogausgang (z.B. LISY300AL - jaja SMD aber es gibt Breakout Boards für um die 20 Euro in diversen Shops). Damit bekommst Du die Winkelgeschwindigkeit wenn der Roboter rotiert.
Es gibt sowas auch zusammen mit Beschleunigungssensoren als komplette sog. IMU und damit kann man dann mehere Freiheitsgrade kombiniert messen und so den Pfad den der Roboter abgefahren ist aufzeichnen - komplett ohne Odometrie.
Super genau wird das natürlich auch nicht aber versuchen könnte man es mal.
(nein ich habe das noch nicht selbst probiert ;) )
MfG,
SlyD
Scherzkeks!
Vielen Dank ... und es stimmt ja sogar.
Es gibt im Forum einen Thread wie man eine Videokamera zur Hinderniserkenung verwenden kann und wie sie vom Prozessor ausgewertet wird.
Mit so einer Kamera müsste es theoretisch doch möglich sein, exakt um 360 Grad zu drehen, denn das Bild sollte ja vorher und nachher das gleiche sein.
Wieso soll dein Roboter eigentlich so genau drehen / fahren können?
Im Endeffekt wird es dir nicht erspart bleiben, externe Sensoren einzubauen oder die Lib umzuändern.
... die Motorsteuerung in der Lib hab ich mir jetzt mal angesehen. Man könnte dort durchaus einiges Verbessern, z.B. rechts links rotation eingens anpassen, auch der Kettenschlupf (ist zwar sehr klein aber was solls) könnte miteinbezogen werden , etc.
Hey Leute,
also das Problem mit den unterschiedlichen Drehwinkeln nach links und rechts habe ich eindämmen, jedoch nicht eliminieren können.
Ich fahre mit dem Roboter alle Bewegungen mit niedriger & konstanter Geschwindigkeit 60.
Damit ist die Abweichung der unterschiedlichen Drehwinkel minimiert.
Sobald ich z.B auf 80 erhöhe dreht er sich bei einer rechts-Drehung wieder 10 Grad mehr als angegeben.
Jedoch wäre da noch ein Problem. Sobald ich die Geschwindigkeit auf z.B. 150 drehe, dreht er statt 90 Grad zwischen 120 und 150 Grad .
Ist das normal? Bzw. habt ihr bei euren Robotern auch einen unterschiedlichen Rotationswinkel beobachtet wenn man schnellere Geschwindigkeit gibt? Wenn ja wie habt ihr dieses Problem behoben?
Wie schon gesagt, das ist das selbe wie wenn du mit einem Auto (besserer Vergleich - eher ein Bus) mit Vollgas ein Kurve fährst.
Die Geschwindigkeit ist so hoch, dass die Sensoren nicht mehr genau genug bzw. nicht mehr schnell genug arbeiten/folgen können.
Nee, diese Antwort laß ich nicht gelten!
Laut Beschreibung sollten die Sensoren eine v von 160 packen.
Außerdem wenn ich statt v 60 eine v von 70 eingebe wird der Drehwinkel auch schon ungenauer.
Und bei einer Steigerung der v um nur 10, sollte nichts ungenau werden, da dies die Sensoren locker packen sollten.
Hey Leute...
das gibts ja nicht das ich der Einzige bin mit diesem Problem!
Dauernd 60 zu fahren ist öde!
Ich glaube du bist nicht der einzige der diese Problem hat, aber ich glaube es spielt für keinen anderen eine Rolle.
Die meisten hier beschäftigen sich mit irgendwelchen Projekten (z.B. Auswertung einer Kamera, Steuerung per Funk, Arm, Anbauten, etc.) und es ist da nicht so wichtig ob der Roboter nun 10° mehr oder weniger dreht.
Außerdem ist das schnelle Fahren mit Aufbauten wie einem Roboterarm sowieso nicht sinnvoll, denn man will seine Ladung ja nicht verlieren.
Hast du schon etwas in der Library geändert.
Hab auch das Problem. Ich habe erstmal eine fixe Rotationsgeschwindigkeit eingesetzt. Die nutze ich aber nur für den Befehl rotate(), Kurvenfahrten um Objekten auszuweichen mache ich nach Sensorsignalen. Vielleicht bau ich nochmal nen geschwindigkeitsabhängigen Rotationskorrekturfaktor ein aber erstmal fährt er so schon recht zuverlässig.
Grüße,
Jan
OK also gebe ich mal noch ein paar Tipps:
Wie ja oben bereits gesagt wurde - die standard Regler sind recht langsam.
Die Regelung (beeinhaltet Rotation und Bewegung um bestimmte Distanzen) wird 5x pro Sekunde aufgerufen. So oft wird auch der Geschwindigkeitswert aktualisiert und auch die gefahrene Distanz!
Max Wert für die Geschwindigkeit ist 200 Segmente (von den Musterscheiben der Drehgeber) pro 200ms.
Diese 200ms sind also schonmal ein Bereich in dem die Motoren weiterlaufen obwohl die Solldistanz erreicht wurde. Kann sogar etwas mehr werden da die Motoren ja langsam abgebremst werden...
Es ist schon ein kleiner korrekturfaktor drin der die Motoren etwas eher stoppt aber das ist nicht sonderlich genau da nicht von der Geschwindigkeit abhängig.
Das Regelintervall könnte man schonmal halbieren (max. Wert für die Geschwindigkeits routinen wäre dann 100 Segmente pro 100ms) oder vierteln (max. Wert ist dann 50 Segmente pro 50ms).
(der Wert ist in der RP6config.h definiert - aber vorsicht wenn das geändert wird sollte man auch noch ein paar andere Sachen in der Lib anpassen z.B. maximalgeschwindigkeit usw. )
Oder eine zweiten unabhängige Auswertung NUR für die Distanz implementieren die die Distanz z.B. 20x pro Sekunde misst und die Motoren schneller stoppt wenn die Solldistanz erreicht wurde.
Dazu muss man natürlich einiges am Code der RP6Lib ändern...
MfG,
SlyD
Endlich eine vernünftige Anwort!
Ja, die Abtastung erhöhen, an das hab ich nicht gedacht, das ist ne Idee!
Danke Mann!
Also bei mir ist es damals durch die Erhöhung der Abtastung nicht wirklich genauer geworden ...
Alleine das hat glaube ich viel Sinn.
Hey Leute ich hab das Problem endgültig gelöst....
1) ich fahre alle Geschwindigkeiten mit Geschwindigkeiten von 60, damit sich keine Unregelmäßigkeiten wie oben genannt ergeben.
2) Beim Problem mit den unterschiedlichen Rotationswinkeln.....hierl lasse ich den Roboter immer nur nach links drehen, da die Linksumdrehung wunderbar passt.
D.h. wenn ich 90 Gerade nach rechts will, lass ich ihn 270 nach links drehen, wenn ich 45 Grad nach rechts will dreh ich 315 nach links usw....
HEY UNGLAUBLICH ABER WAHR:
Mein Roboter ist jetzt so exakt eingestellt, das er 20,6 Meter zurücklegt (mit 9 Drehungen) und um nur 3 mm versetzt auf seinem Ausganspunkt zurückkehrt (ohne Hilfe von Sensoren)!!!
Eine ganze Woche hab ich dafür verkackt!
Er fährt durchs Wohnzimmer, Vorzimmer, bis in die Mitte der Küche, dreht um und kehrt zurück zum Ausgangspunkt, aber seht selbst
Folgendes Test-Programm hab ich dafür geschrieben:
while(true){
task_RP6System(); //4 in 1
move(DRIVE_SPEED,FWD,DIST_MM(1200),true);
rotate(ROTATION_SPEED,LEFT,270,true);
move(DRIVE_SPEED,FWD,DIST_MM(2500),true);
rotate(ROTATION_SPEED,LEFT,315,true);
move(DRIVE_SPEED,FWD,DIST_MM(2000),true);
rotate(ROTATION_SPEED,LEFT,315,true);
move(DRIVE_SPEED,FWD,DIST_MM(2100),true);
rotate(ROTATION_SPEED,LEFT,270,true);
move(DRIVE_SPEED,FWD,DIST_MM(3500),true);
rotate(ROTATION_SPEED,LEFT,180,true);
move(DRIVE_SPEED,FWD,DIST_MM(3500),true);
rotate(ROTATION_SPEED,LEFT,90,true);
move(DRIVE_SPEED,FWD,DIST_MM(2100),true);
rotate(ROTATION_SPEED,LEFT,45,true);
move(DRIVE_SPEED,FWD,DIST_MM(2000),true);
rotate(ROTATION_SPEED,LEFT,45,true);
move(DRIVE_SPEED,FWD,DIST_MM(2500),true);
rotate(ROTATION_SPEED,LEFT,90,true);
move(DRIVE_SPEED,FWD,DIST_MM(1200),true);
}
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.