-
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:
Code:
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);
}