PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bumper problem



Martinius11
24.01.2010, 20:17
Hi ich hab ein Problem mit einem Programm das ich geschrieben habe.
Der Roboter solte Forwärts fahren und wenn der linke bumper gedrückt wir
langsammer fahren bis dieser nicht mehr gedrückt wir.aber er fährt immer
langsamm. kann sich das bitte einmal einer anschauen. Danke


#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
setLEDs(0b111111);

powerON(); // Encoder und Motorstromsensoren anschalten!
moveAtSpeed(170,170);
if(getBmperLeft())
{
moveAtSpeed(60,60);
}


while(true)
{

task_motionControl();
task_ADC();
task_Bumpers();

}
return 0;
}

KingTobi
24.01.2010, 20:34
Dann solltest du


moveAtSpeed(170,170);
if(getBmperLeft())
{
moveAtSpeed(60,60);
}

Mal mit in die while Schleife schreiben...

Außerdem macht die Aufgabenstellung keinen Sinn!
Er soll fahren bis der Bumper gedrückt wird, und dann langsamer bis er nicht mehr gedrückt wird... wie soll das funktionieren, indem sich die Wand gegen die er gefahren ist durch langsames fahren wegbewegt?!

Martinius11
24.01.2010, 21:01
also zur aufgabe es solte nur ein versuch sein um bumper programm sein das
sich mit move - Funktionen abhandelt

Virus
25.01.2010, 07:35
Außerdem macht die Aufgabenstellung keinen Sinn!
Er soll fahren bis der Bumper gedrückt wird, und dann langsamer bis er nicht mehr gedrückt wird... wie soll das funktionieren, indem sich die Wand gegen die er gefahren ist durch langsames fahren wegbewegt?!



so sinnlos finde ich das garnicht, wenn man sich sicher ist, das das ACS alle hindernisse erkennt, kann man mit den Bumpern Bauklötze erkennen und mit einem Greifarm aufheben oder ähnliches.

Xandi11
25.01.2010, 08:58
Es ist aber relativ schwierig, ein Objekt mit dem ACS zu lokalisieren, denn ...

Der Abstand zum Objekt ist glaube ich eher weniger das Problem, denn man kann ihn vom Wert ableiten.
Das Problem ist nur die Position.
Denn aus 2 Lichtwerten den Winkel zu "erschätzen" wird vermutlich nicht einfach.

Mit einem Greifer (ohne Sensor) dann diesen anzuheben könnte ein Problem werden.

Virus
25.01.2010, 09:33
oh da leigt ein Missverständniss vor,

ich würde das ACS weiter zur Hindernissdetektierung benutzen, solange wie keine matt schwarzen Hindernisse stören, reicht das ACS ja aus.

Dann könnte man die Bumper benutzen um kleinere, vom ACS nicht erfasste Gegenstände zu detektieren, diese können ja nicht zu groß sein, sonst würde das ACS sie ja erfassen. Wenn dann einer der Bumper ein Hinderniss meldet, ohne das es das ACS tut, könnte man versuchen dieses mit Einem Greifer zu erfassen.

Xandi11
25.01.2010, 11:18
Der Greiferkopf müsste dann aber relativ weit aufgehen, denn man kann ja nicht sagen, ob das Hinternis ganz außen oder ganz innen den Impuls ausgelöst hat.

Ein Sensor am Greifer wäre trotzdem eine tolle Sache.

Martinius11
25.01.2010, 14:56
ich hätte da noch ne kurze frage wenn in der anleitung steht man soll den loader erst mit dem computer und dann mit den roboter verbinden soll
, dass der roboter vorher nicht eingeschaltet werden soll.

Martinius11
25.01.2010, 16:14
gut ich habe jetzt ein ausweich programm geschrieben, aber die abtastung ist mir noch viel zu langsamm!!!! Was kann ich tun ?

suicide
25.01.2010, 17:32
Du könntest die task_RP6System() öfter aufrufen oder einen bumperStateChangeHandler einbauen oder beides oder mal zeigen wie dein Program zur Zeit aussieht.

Grüße,
Jan

Martinius11
25.01.2010, 17:59
#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
setLEDs(0b111111);

powerON(); // Encoder und Motorstromsensoren anschalten!



while(true)
{
moveAtSpeed(100,100);
if(getBumperLeft())
{
move(60, BWD, DIST_MM(180), true);
rotate(50, RIGHT, 45, true);
changeDirection(FWD);
}
if(getBumperRight())
{
move(60, BWD, DIST_MM(180), true);
rotate(50, LEFT, 45, true);
changeDirection(FWD);
}
task_motionControl();
task_ADC();
task_Bumpers();

}
return 0;
}

suicide
25.01.2010, 19:16
gut ich habe jetzt ein ausweich programm geschrieben, aber die abtastung ist mir noch viel zu langsamm!!!! Was kann ich tun ?

Wie wirkt sich das aus? Dauert es zu lange bis der Roboter mitbekommt das er gegen eine Hindernis gefahren ist oder reagiert er nicht auf den Bumper wenn er grad einem Hindernis ausweicht?

Du kannst

task_motionControl();
task_ADC();
task_Bumpers();

auch durch

task_RP6System();
ersetzen. Macht das selbe wie die drei Aufrufe oben und dazu wird noch task_ACS() aufgerufen.


Fast hätt ichs vergessen, der RP6 braucht natürlich auch etwas Zeit um anzuhalten. Durch die verzögerte Beschleunigung werden Motoren und Getriebe geschont. Bei Geschwindigkeiten von 100 bleibt der dann halt nicht direkt stehen wenn der Bumper gedrückt wird.

Martinius11
25.01.2010, 20:01
also der roboter fahrt gegen einen gegenstand und braucht ca. 1,5 sek um zu reagieren.

suicide
26.01.2010, 07:08
Hast du mal versucht herauszufinden, an welcher Stelle die Verzögerung auftritt? Du könntest in die if(getBumper*()){ } Schleifen einen String auf die Serielle ausgeben lassen und im Terminal vom Loader gucken, ob er ohne Verzögerung den Bumper erkennt.