Gute Nachrichten:
Ich hab dein Programm mal auf meinen RP6 geladen. Hindernisse erkent er ja schon ganz gut. Einfach wie er weiterfahre soll ist ihm nicht ganz klar.
in deiner fahrenFunction() hast du nur gesagt, dass die geschwindigkeit beider Raupen 90 sein soll, nich aber in welche Richtung. Deshalb nimmt er dieselbe Richtung, die er gerade zuletzt hatte.
Folglich dreht er sich immer im Kreis!
mit changeDirection(FWD) kannst du das Problem beheben.
Zudem habe ich dir bei den Bumern noch eine kleine änderung gemacht.
Mir wurde beigebracht, dass man denselben Code möglichst nur einmal verwenden soll.
So bleibt es übersichtlicher.
Code:
#include "RP6RobotBaseLib.h"
void acsStateChanged(void) //ACS
{
// Hindernis links
if(obstacle_left){
rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen
}
// Hindernis rechts
if(obstacle_right){
rotate(50, LEFT, 45, true); // um 45° nach links drehen
}
// Mitte?
if(obstacle_left && obstacle_right) {
rotate(50, LEFT, 188, true); // um 180° nach links drehen
}
statusLEDs.LED6 = obstacle_left && obstacle_right;
statusLEDs.LED3 = statusLEDs.LED6;
statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);
updateStatusLEDs();
}
//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)
rotate(50, LEFT, 188, true); // um 180° nach links drehen
else if(bumper_left)
rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen
else if(bumper_right)
rotate(50, LEFT, 45, true); // um 45° nach links drehen
}
void fahrenFunction(void){
// Geschwindigkeit einstellen !!Richtung nicht vergessen!!
changeDirection(FWD);
moveAtSpeed(90,90);
}
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();
//Fahren
fahrenFunction();
}
return 0;
}
Hoffe, bei dir klappts,
Viel Erfolg,
MfG
Filou
Lesezeichen