Vielen Dank für die viele Information. Ihr seit echt SPITZE!! Ich werde das mir jetzt erstmal alles durchlesen, und dann sehe ich weiter. Evtl. schildere ich Euch dann noch wie ich es vor habe zu bewerkstelligen.
Ich habe heute mal probiert, mein Programm zum Ausweichen von Hindernissen zu optimieren. (Das Video, welches ich weiter oben gepostet habe, war schon gut, jedoch war da einprogrammiert, dass er sich um 45° drehen soll usw.) Jetzt versuche ich es so zu basteln, dass er solange z.B. nach links fährt/rotiert, bis der Gegenstand nicht mehr im Wege ist. Das habe ich auch schon zum Teil recht gut gemacht, wie ich meine. Das Problem ist, dass wenn er in einer Ecke ist, bekommt er Probleme.. Er weiß einfach nicht wie er da raus kommen soll & ich weiß nicht, wie ich es ihm am besten beibringen kann.... Die Beispielcodes verstehe ich nicht ganz, somit hänge ich da gerade.
Wenn Ihr Euch den Code evtl. mal anschauen wollt(?) Bei der Gelegenheit hätte ich noch eine Frage: Warum leuchten die LED´s (die Roten Standard) nicht auf, wenn er ein Hinderniss erkennt? - Habe ich doch ins Programm geschrieben... (Anders machen sie es ja auch nicht in den Beispielen)
Hier der Code:
Code:
#include "RP6RobotBaseLib.h"
void acsStateChanged(void) //ACS
{
// Hindernis links
if(obstacle_left){
rotate(50, RIGHT, (obstacle_left = false), true); // dreht sich so lange bis der linke Sensor kein Hinderniss mehr hat
}
// Hindernis rechts
if(obstacle_right){
rotate(50, LEFT, (obstacle_right = false), true); // dreht sich so lange bis der rechte Sensor kein Hinderniss mehr hat
}
// Mitte?
if(obstacle_left && obstacle_right ){
move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts
rotate(50, LEFT, 180, true); // um 180° nach links drehen
}
//if(getDirection() == LEFT && getDirection() == RIGHT){
//startStopwatch1(); // Stopwatch1 starten
//}
}
//Bumpers
void bumpersStateChanged(void) {
//if(bumper_left || bumper_right){ //Wenn ein Bumper berührt wurde, dann mal das machen, egal welcher.
//moveAtSpeed(0,0); //Nicht unbedingt nötig, aber ich würde die beiden Zeilen zur Sicherheit schreiben.
//mSleep(500);
//move(60, BWD, DIST_CM(25), true); //25 cm Rückwärts
//}
if(bumper_left && bumper_right){
mSleep(500);
move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts
rotate(50, LEFT, 188, true); // um 180° nach links drehen
}
else if(bumper_left){
mSleep(500);
move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts
rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen
}
else if(bumper_right){
mSleep(500);
move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts
rotate(50, LEFT, 45, true); // um 45° nach links drehen
}
}
void fahrenFunction(void){
// Geschwindigkeit einstellen !!Richtung nicht vergessen!!
changeDirection(FWD);
moveAtSpeed(90,90);
if(getStopwatch1() > 3500) // Sind 3500ms (= 3,5s) vergangen?
{
// Bewegungsrichtung ändern:
if(getDirection() == FWD) // Fahren wir vorwärts...
changeDirection(BWD); // dann Rückwärts einstellen!
else if(getDirection() == BWD) //... oder Rückwärts?
changeDirection(FWD); // dann Vorwärts einstellen!
setStopwatch1(0); // Stopwatch1 auf 0 zurücksetzen
}
}
int main(void) {
initRobotBase();
setLEDs(0b111111);
mSleep(2500);
setLEDs(0b001001);
// ACS Event Handler registrieren:
ACS_setStateChangedHandler(acsStateChanged);
// Set Bumpers state changed event handler:
BUMPERS_setStateChangedHandler(bumpersStateChanged);
// ACS Empfänger einschalten (und Encoder etc.)
powerON();
// ACS auf mittlere Sendeleistung stellen.
setACSPwrMed();
// Main loop
while(true){
// Aus der Hauptschleife ständig die motionControl Funktion
// aufrufen – sie regelt die Motorgeschwindigkeiten!
task_motionControl();
// ADC Wird wegen den Motorstromsensoren aufgerufen!
task_ADC();
// Bumper automatisch alle 50ms auswerten
task_Bumpers();
// ständig die task_ACS Funktion aufrufen!
// task_ACS();
task_RP6System();
//Fahren
fahrenFunction();
/////////////////////////Bumper//////////////////////////
statusLEDs.LED6 = bumper_left; // Bumper links gedrückt
statusLEDs.LED4 = !bumper_left; // links nicht gedrückt
statusLEDs.LED3 = bumper_right; // Bumper rechts gedrückt
statusLEDs.LED1 = !bumper_right; // rechts nicht gedrückt
// Beide Bumper gedrückt:
statusLEDs.LED2 = (bumper_left && bumper_right);
statusLEDs.LED5 = statusLEDs.LED2;
updateStatusLEDs(); // LEDs aktualisieren...
/////////////////////////Obstacle////////////////////////////
statusLEDs.LED6 = obstacle_left && obstacle_right; // Mitte?
statusLEDs.LED3 = statusLEDs.LED6;
statusLEDs.LED5 = obstacle_left; // Hindernis links
statusLEDs.LED4 = (!obstacle_left); // LED5 invertiert!
statusLEDs.LED2 = obstacle_right; // Hindernis rechts
statusLEDs.LED1 = (!obstacle_right); // LED2 invertiert!
updateStatusLEDs();
}
return 0;
}
Ist der Code so einigermaßen in Ordnung? Ich hoffe, dass Ihr mir helfen könnt. Könnte mir jemand nochmal auf die Sprünge helfen, wie das mit den prioritäten war? Obwohl ich diese hier nicht beachtet habe, reagiert er trotzdem auf die "Bumper" & die "Obstacles"
Beste Grüße
Crystal Eye
Lesezeichen