Hallo
Ich habe mir jetzt vor paar Tagen den RP6 geholt (hatte anfänglich auch ein defektes USB Interface...) und bin jetzt fleißig am programmieren.
Momentan schreibe ich ein Programm mit einer Statemachine, was den Roboter durch den Raum manövrieren soll, ohne irgendwo anzuecken.
Folgendes Problem habe ich: der Roboter soll, nachdem die Bewegungsroutine abgeschlossen ist prüfen, ob Hindernisse vor ihm liegen - er macht es aber nicht...Code:#include "RP6RobotBaseLib.h" #define STATE_NONE 0 #define STATE_MOVE 1 #define STATE_ROTATE 2 #define STATE_HALT 3 #define STATE_CHANGE_DIRECTION 4 #define STATE_CHECK_FOR_OBSTACLE 5 #define STATE_INITIALIZE 6 uint8_t state; uint8_t velocity; void state_machine(void) { // Statusvariablen int8_t is_moving = false; int8_t is_rotating = false; switch(state) { // Initialisieren case STATE_INITIALIZE: { // Microcontroller initialisieren initRobotBase(); // Motorencoder initialisieren powerON(); // Entfernungssensoren aktivierencv setACSPwrMed(); state = STATE_CHECK_FOR_OBSTACLE; break; } // Fahren case STATE_MOVE: { //move(velocity, FWD, DIST_MM(100), true); //state = STATE_CHECK_FOR_OBSTACLE; // Roboter fährt nicht if(!is_moving) { move(velocity, FWD, DIST_MM(50), false); is_moving = true; state = STATE_MOVE; } // Roboter fährt bereits else { // prüfen, ob Fahrvorgang abgeschlossen ist if(isMovementComplete()) { is_moving = false; state = STATE_CHECK_FOR_OBSTACLE; } } break; } // Rotieren case STATE_ROTATE: { //rotate(velocity, LEFT, 45, true); //state = STATE_CHECK_FOR_OBSTACLE; // Roboter rotiert nicht if(!is_rotating) { rotate(velocity, LEFT, 45, false); is_rotating = true; state = STATE_ROTATE; } // Roboter rotiert bereits else { // Rotation ist abgeschlossen? if(isMovementComplete()) { is_rotating = false; state = STATE_CHECK_FOR_OBSTACLE; } } break; } // Kollision ermittlen case STATE_CHECK_FOR_OBSTACLE: { // Hindernis gefunden? if(obstacle_left || obstacle_right) { // rotieren... setLEDs(0b111111); state = STATE_ROTATE; } else { // fahren... setLEDs(0b000000); state = STATE_MOVE; } break; } } } int main(void) { // Anfangsstate festlegen... state = STATE_INITIALIZE; // Geschwindigkeit setzten velocity = 200; // Hauptschleife while(true) { // gesamtes System updaten... task_RP6System(); // State Machine durchlaufen state_machine(); } return 0; }
Warum kommt es in
Code:case STATE_MOVE: { //move(velocity, FWD, DIST_MM(100), true); //state = STATE_CHECK_FOR_OBSTACLE; // Roboter fährt nicht if(!is_moving) { move(velocity, FWD, DIST_MM(50), false); is_moving = true; state = STATE_MOVE; } // Roboter fährt bereits else { // prüfen, ob Fahrvorgang abgeschlossen ist if(isMovementComplete()) { is_moving = false; state = STATE_CHECK_FOR_OBSTACLE; } } break; }
nie zu
Nochmal kurz die aktuelle (fehlerhafte VErhaltensbeschreibung des Roboters)Code:if(isMovementComplete()) { is_moving = false; state = STATE_CHECK_FOR_OBSTACLE; }
Er fährt einfach nur gerade durch, ohne Rücksicht auf Verluste
(Die Sensoren vernachlässigt er (diese Funktionieren aber einwandfrei!))
mfG TcH







Zitieren

Lesezeichen