-
Bewegung anhalten
Hallo,
dies ist mein erster Eintrag in dem Forum, da ich erst letzte Weinachten den RP6 bekommen habe.
Ich habe warscheinlich eine einfache Anfängerfrage. Ich habe meinen Roboter mit dem Befehl moveAtSpeed(100,100) auf die Reise geschickt, jetzt habe ich ein Hinderniss und nun soll er anhalten. Das mit der if-schleife und den Sensoren habe ich schon, ich bin mir auch sicher das er bis dahin kommt, da die Ausgabe geht, aber ich finde keinen Befehl um ihn anzuhalten. Dies habe ich schon ausprobiert:
Code:
moveAtSpeed(0,0)
stop()
beides geht aber nicht. Meine Frage ist nun kurzgefasst:
Wie heist der Befehl um meinen Roboter anzuhalten?
Stratege993
-
Wenn du die von dir eben beschriebenen funktionen verwendest musst du dazu auch "task_motionControl();" in der hauptschleife aufrufen. Wenn du dann "task_motionControl()"; verwedest musst du auch nach "initRobotBase();" "powerON();" aufrufen um die Encoder anzuschalten. Wenn du das alles so machst solltest du mit der Funktion "stop();" den RP6 anhalten können.
mfg
Erik
-
Also ich finde nicht das Problem ich stelle mal den ganze Qulltext rein ist ja nicht so interressant:
Code:
#include "RP6RobotBaseLib.h"
uint8_t ok=0;
void senkrecht (void)
{
writeString_P("achtung");
stop();
task_motionControl();
while(ok == 0) //nicht wundern das die schleife nie endet
{
statusLEDs.LED5 = obstacle_left; //Hinderniss Links
statusLEDs.LED2 = obstacle_right; //Hinderniss rechts
updateStatusLEDs();
}
}
int main(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
moveAtSpeed(100,150); //erste Bewegung
startStopwatch1(); //Zeitnhemer bis andere Richtung
while(true)
{
task_motionControl();
task_ACS();
if (getStopwatch1() >= 3000) //rechts herum
{
stopStopwatch1();
moveAtSpeed(150,100);
setStopwatch1(0);
startStopwatch2();
}
if (getStopwatch2() >= 3000) //links herum
{
stopStopwatch2();
moveAtSpeed(100,150);
setStopwatch2(0);
startStopwatch1();
}
if (obstacle_left || obstacle_right)
{
senkrecht();
}
}
return 0;
}
Also bitte nicht wundern, dass die eine Schleife nie endet, da wird später noch weiter gemacht, dass der Roboter sich senkrecht zur Wand ausrichtet.
Das Schlengellienienfahren bewirkt das ein größerer Bereich gemessen wird.
Stratege993
-
Ich kann jetzt auch keinen Fehler erkennen. Du könntest mal Probieren das task_motionControl aus der senkrecht funktion in die endlosschleife der funktion tun.
mfg
Erik
-
Habe das Problem. Man musss den Befehl initRobotBase() in jede Funktion einzeln reinschreiben.
Jetzt meine Frage, kann man sagen das es für alle Funktionen gild mit blos einer Zeile, damit man es net bei jeder Funktion reinschreiben muss?
mfg Stratege993
-
Also ich habs eben bei mir ausprobiert, wenn ich task_motionControl in die Schleife von senkrecht packe gehts.
mfg
Erik
-
also, dass man in jeder Funktion den Controller neu initialisieren muss wäre mir neu aber wenn es so geht is ja in Ordnung :). Aber wie gesagt ich hab nur die motion control verschoben und es geht auch.
Code:
#include "RP6RobotBaseLib.h"
uint8_t ok=0;
void senkrecht (void)
{
writeString_P("achtung");
stop();
while(ok == 0) //nicht wundern das die schleife nie endet
{
task_motionControl();
statusLEDs.LED5 = obstacle_left; //Hinderniss Links
statusLEDs.LED2 = obstacle_right; //Hinderniss rechts
updateStatusLEDs();
}
}
int main(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
moveAtSpeed(100,150); //erste Bewegung
startStopwatch1(); //Zeitnhemer bis andere Richtung
while(true)
{
task_motionControl();
task_ACS();
if (getStopwatch1() >= 3000) //rechts herum
{
stopStopwatch1();
moveAtSpeed(150,100);
setStopwatch1(0);
startStopwatch2();
}
if (getStopwatch2() >= 3000) //links herum
{
stopStopwatch2();
moveAtSpeed(100,150);
setStopwatch2(0);
startStopwatch1();
}
if (obstacle_left || obstacle_right)
{
senkrecht();
}
}
return 0;
}
-
Hallo Leute,
die Funktion "initRobotBase();" gehört an den Anfang von Main, sollte sonst nirgendwo mehr aufgerufen werden. Das gleiche gilt für "powerON();", damit die Sensoren Strom kriegen.
Die Funktion "task_motionControl();" muss in der Hauptschleife regelmäßig aufgerufen werden. Wenn man auch Sensoren verwenden will, sollte man stattdessen "task_RP6System();" in der Hauptschleife aufrufen. Darin ist dann auch die Motorenkontrolle enthalten.
Die Hauptschleife sollte nicht durch irgendwelche Funktionen aufgehalten werden! Damit kann sie ja nicht mehr regelmäßig ablaufen und die Sensoren und Motoren funktionieren nicht mehr richtig.
Wenn man Bumper o.ä. abfragen will und man warten muss, bis sich da etwas tut oder nicht tut, sollte man nur ein Flag setzen und darauf in der Hauptschleife reagieren (z.B. RP6 anhalten). Die Hauptschleife muss immer durchlaufen.
Gruß Dirk
-
Ok, aber das blöde ist das der robby nicht gleich beim ersten task_motionControl() anhält, obwohl ich schon davor stop() sagte, sondern man braucht viele durchläufe bis er reagiert. Kann man das irgendwie besser machen?
Stratege993
-
Hallo Stratege993,
die Hauptschleife in Main muss möglichst schnell durchlaufen. Gut wäre, wenn alle Tasks etwa alle 20-30ms wieder dran kämen. Dann gibt es auch keine Verzögerungen. Also: Nie die Hauptschleife unterbrechen oder zu lange Pausen machen.
Gruß Dirk