PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmierung Bodensensor Crash Bobby



palermo
27.07.2006, 20:18
Hallo!

Ich möchte den Bodensensor am crash bobby so programmieren, dass an einer ersten weißen Linie gestoppt wird und danach weitere weiße Linien überfahren werden können.
Da dies mit einem einfachen If-Befehl nicht möglich ist, suche ich nach einem anderen Befehl.

Wer kann mir helfen!

simonit
27.07.2006, 22:48
Hallo!

Warum sollte das mit einem If-Befehl nicht möglich sein? Kommst du zu einer Linie zählst du eine Zählvariable mit, ist diese 1 (also erste Linie), so soll dein crash bobby stoppen, ansonsten soll er weiterfahren.

Edit: alternativ könnte man das ganze auch mit einer Boolean-Variable erreichen, welche mit 0 initialisiert wird (dann hält der Bot), und nach der ersten Linie auf 1 gesetzt wird (Bot hält nicht mehr).

palermo
28.07.2006, 19:29
Hallo!

Ich habe schon viel mit Variablen rumprobiert (auch schon vorher). Aber es hat noch nie geklappt :(
Kannst du bitte mal auf mein Programm gucken?

#include "qfixBobbyBoard.h"
#include "qfixSlaveBoard.h"

BobbyBoard links;
SlaveBoard rechts;

int main()
{

int white = links.analog(3);

links.motor(0, -255);
rechts.motor(0, 255);

sleep(1);

links.motor(0, 0);
rechts.motor(0, 0);

int black = links.analog(3);

int ground = int((white+black)*0.55);

sleep(10);



while (true) {

int blub = 0;

if (links.analog(3) > ground){

links.motor(0, -255);
rechts.motor(0, 255);

}

else {

if (blub = 0){
links.motor(0, 0);
rechts.motor(0, 0);
blub + 1;
}

else {
links.motor(0, -255);
rechts.motor(0, 255);
}
}
}
}

Mein BOT hält an keiner Linie an.
Er fährt einfach geradeaus mit
links.motor(0, -255);
rechts.motor(0, 255);

simonit
29.07.2006, 00:18
Hallo

Die Überprüfung darf nicht if (blub = 0), sondern if (blub == 0) lauten (Ersteres ist eine Zuweisung, keine Überprüfung).

Und bei blub + 1; würde ich persönlich blub=blub+1; verwenden, da ich mir nicht sicher bin ob es mit deiner Methode in die Variable blub geschrieben wird.

Sollte es das nich gewesen sein schau ich mir den Quellcode nochmal genauer an ;) und eventuell zu einer anderen Tageszeit ;)

palermo
29.07.2006, 10:10
Danke für die Antwort. Auf dass mit der Zuweisung hätte ich auch selber kommen können ](*,) Nun hällt er aber an jeder Linie an :(

#include "qfixBobbyBoard.h"
#include "qfixSlaveBoard.h"

BobbyBoard links;
SlaveBoard rechts;

int main()
{

int white = links.analog(3);

links.motor(0, -255);
rechts.motor(0, 255);

sleep(1);

links.motor(0, 0);
rechts.motor(0, 0);

int black = links.analog(3);

int ground = int((white+black)*0.55);

sleep(10);



while (true) {

int blub = 0;

if (links.analog(3) > ground){

links.motor(0, -255);
rechts.motor(0, 255);

}

else {

if (blub == 0){
links.motor(0, 0);
rechts.motor(0, 0);
blub = blub + 1;
}

else {
links.motor(0, -255);
rechts.motor(0, 255);
}
}
}
}

simonit
29.07.2006, 11:23
int blub = 0; aus der schleife raus ;)

Lunarman
29.07.2006, 11:31
(ich kenn jetzt den "Dialekt" vom Crash Bobby net, is c, oder? ich glaub init blub = 0 dürfte blub wieder auf null gesetzt werden - weshalb an jder Linie ne 0 steht.

simonit
29.07.2006, 11:46
meinte ich eh... ;) nur die erklärung fehlte :P

Lunarman
29.07.2006, 12:57
ah. naja - jetzt hab ich se ergänzt.

palermo
29.07.2006, 20:49
Danke für eure Hilfe. Aber egal wo ich int blub = 0; hinschreibe er weigert sich meistens an irgendeiner Linie anzuhalten :cry:

palermo
29.07.2006, 21:12
Ich habe mein Programm jetzt ein bisschen übersichtlicher gemacht. Irgendwo muss ja der Fehler sitzen!!!

#include "qfixBobbyBoard.h"
#include "qfixSlaveBoard.h"

BobbyBoard links;
SlaveBoard rechts;

int main()
{

while (!links.button(0)) ;
int white = links.analog(3);
while (!links.button(1)) ;
int black = links.analog(3);
int ground = int((white+black)*0.55);
int blub=0;

while (true) {

if (links.analog(3) > ground){
}

else {

if (blub == 0){
links.ledOn(0);
blub = blub + 1;
}

else {
links.ledOn(0);
links.ledOn(1);
}
}
}
}

beide LEDs leuchten sofort bei der ersten Linie. :twisted:

simonit
30.07.2006, 00:57
Die Led 0 leuchtet für einen Moment auf, dann jedoch leuchten beide, das ist da du den Sleep-Befehl vergessen (oder absichtlich entfernt) hast. Dadurch erhält der Controller das Signal einer Linie gleich mehrfach und springt dadurch sofort (ohne sichtbare Verzögerung) in den else-Zweig, da er die Schleife ja sofort wieder ausführt.

Versuchs mal so:

#include "qfixBobbyBoard.h"
#include "qfixSlaveBoard.h"

BobbyBoard links;
SlaveBoard rechts;

int main()
{

while (!links.button(0)) ;
int white = links.analog(3);
while (!links.button(1)) ;
int black = links.analog(3);
int ground = int((white+black)*0.55);
int blub=0;

while (true) {

if (links.analog(3) > ground){
}

else {

if (blub == 0){
links.ledOn(0);
blub = blub + 1;
}

else {
links.ledOn(0);
links.ledOn(1);
}
}
sleep(10); //oder einen anderen, längeren Wert, hängt von der Breite der Linie ab
}
}


Des weiteren würde ich mal schaun ob die Initialisierung der White, Black bzw. Ground-Variable sicher stimmt. Darin könnte ein Fehler liegen den ich nicht überprüfen kann da ich deinen Bot eigentlich nicht kenne (kann nur C programmieren =P~ )

palermo
30.07.2006, 11:26
Es funktioniert !!!!!!!!!!!!!!!!!!!!!!!!
:Strahl
Danke dass du mir geholfen hast.
:cheesy:
Dass mit den zwei Linien war übrigens eigentlich nur ein Beispiel. In Wirklichkeit versuche ich einen Soccer-Bot zu programmieren. Aber dafür muss er manchmal an der Torlinie anhalten und sie manchmal überfahren. Also nochmals Danke.
\:D/

skg-rob
23.02.2007, 16:04
Hey Palermo!

So weit ich weiß gibt es beim Soccer keine Torlinie, sondern der ganze Boden ist schwarz grau

palermo
24.02.2007, 11:50
Hallo,
ja aber das war kein Wetbewerb sondern ich hatte mir selbst die Aufgabe gestellt, das mein Bot soccern soll und mein Spielfeld hatte halt eine Torlinie.
mfg palermo

skg-rob
26.02.2007, 12:04
Das ist natürlich gaaaaaaaaanz was anderes.
Wieso machst du nicht beim RoboCup Ju. nicht micht?

palermo
26.02.2007, 16:10
Habe ich auch vor aber erstmal will ich richtig gut C++ können. Hast du mal teilgenommen?
mfg palermo

skg-rob
27.02.2007, 17:00
Mach ich erst am Freitag in Vöhringen