Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmierung Bodensensor Crash Bobby
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!
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).
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);
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 ;)
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);
}
}
}
}
int blub = 0; aus der schleife raus ;)
Lunarman
29.07.2006, 12: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.
meinte ich eh... ;) nur die erklärung fehlte :P
Lunarman
29.07.2006, 13:57
ah. naja - jetzt hab ich se ergänzt.
Danke für eure Hilfe. Aber egal wo ich int blub = 0; hinschreibe er weigert sich meistens an irgendeiner Linie anzuhalten :cry:
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:
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~ )
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/
Hey Palermo!
So weit ich weiß gibt es beim Soccer keine Torlinie, sondern der ganze Boden ist schwarz grau
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
Das ist natürlich gaaaaaaaaanz was anderes.
Wieso machst du nicht beim RoboCup Ju. nicht micht?
Habe ich auch vor aber erstmal will ich richtig gut C++ können. Hast du mal teilgenommen?
mfg palermo
Mach ich erst am Freitag in Vöhringen
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.