PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Barcode erkennung



12bg
12.06.2008, 09:57
hallo erstmal =)

wir sind 3 leute un müssen für die schule ein projekt erledigen :

un zwar : unser ASURO Roboter muss durch ein labyrinth fahren un an verschiendenen stellen barcode ablesen.

nun ist es aber so das wir leider gar keine ahnung davon haben, diese note aber wichtig für unser abitur sein wird ...

könnte uns vielleicht jemand helfen ; vielleicht sogar das programm schreiben oder zumindest hilfreiche tipps geben ?

an dieser stelle schonma ein herzliches dankeschön an all die jenigen die auf unsere anfrage antworten =)

Ceos
12.06.2008, 13:46
bitte [ c o d e ] -tag um euren code herum benutzen, das kann sonst keiner lesen

also [ c o d e ] quellcode [ / c o d e ]

nur ohne die leerzeichen natürlich!

EDIT: wer issn auf so ne idee gekommen, das ist recht viel für jemand der noch nie mit sowas zu tun hatte .... selbst wir in der studiengruppe haben zu 5t 3 wochen geknobelt und den mega8 bis an seine speichergrenze getrieben, ehe er auf unserem aufgeklebten schachbrett seine pfadsuche hinbekommen hat (inklusive funkkommuniukation mit 2 anderen asuros aufm spielfeld)

Osser
12.06.2008, 15:46
Hi,

vielleicht ist dass ja jetzt ne blöde Frage, aber wie bitte wollt ihr c# code
auf euren ASURO flashen?


Gruss

O.

robo.fr
12.06.2008, 16:06
Hallo Osser,

so weit ich das sehe, war das eher ein Gag. Das erste Codestück ist ja ein Sortieralgorithmus, der hat überhaupt nichts mit Barcode zu tun.
Ich denke, da will sich jemand gegenseitig veräbppeln.

Hallo Ceos


EDIT: wer issn auf so ne idee gekommen, das ist recht viel für jemand der noch nie mit sowas zu tun hatte .... selbst wir in der studiengruppe haben zu 5t 3 wochen geknobelt und den mega8 bis an seine speichergrenze getrieben, ehe er auf unserem aufgeklebten schachbrett seine pfadsuche hinbekommen hat (inklusive funkkommuniukation mit 2 anderen asuros aufm spielfeld)

Gibt es einen Link auf dieses sehr interessant klingende Projekt? So etwas toles solltet Ihr der Welt nicht vorenthalten.


Gruß,
robo

Ceos
12.06.2008, 16:27
lieber nicht, ist am ende am bescshränkten asurohirn gescheitert, zu wenig speicher .... so knappe 500k zu wenig GRUMMEL, ich such eben mal die bilder raus, die module an sich funktionieren aber, also wegfindung durch laby(hier gibts noch die chance auf nen deadlock, in der theorie hatten wir ne lösung in der praxis war uns die zeit ausgegangen), kommunikation und pfadsuche algo ... nur eben alles 3 zusammen überfordert den asuro ....

Ceos
12.06.2008, 16:50
ich bezweifle ARG das die mit "meinem" projekt anfangen könnten, das muss komplett umgeschrieben werden(ohne asurolib würde es wohl aufn meg8 passen), zumal ich nciht glaube dass die mal eben 3x 40€ für funkmodule lockermachen können, geschweigen denn wissen wie man sie anschliesst .... aber deine ausdrucksweise ... ich weis ja nicht ... pass lieber auf dass du nich ne verwarnung wegen spam kassierst

Manf
12.06.2008, 17:06
TRALALALALA ICH BIN WIEDER DAAAAAAAAAAA ICH BIN WIEDER WEG UND BOYE HAUT EUCH WEG

Ja gut, nette Bemerkung, und das mit dem selber machen ist auch verstanden, aber das erkläre lieber ganz einfach im Klartext. Sonst muss man als Moderator so viel löschen.

Manfred

Sternthaler
12.06.2008, 17:53
Hallo 12bg,

willkommen im Forum.

Wenn du in der Suchenfunktion nach 'barcode' im Form 'Asuro' suchst, bekommst du unter anderem diesen Link: Asuro und Barcodes (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32905)
Dort wird diese Idee bis zu einem funktionierenden Programm gebracht.
Die Randbedingung ist der Barcode. Es ist dort ein eigenes Format entwickelt worden, dass dann aber tatsächlich lesbar ist. Die Striche auf der Milchtüte sind einfach zu schmal.

Viel Erfolg und auch jede Menge Spaß mit dem Asuro wünscht
Sternthaler

P.S.: Ich habe auch den Eindruck, dass manche Lehrer überhaupt nicht wissen was sie da verlangen. Diese 'Anforderungen' häufen sich ja in letzter Zeit gerade zu.

Ceos
12.06.2008, 18:12
So, hier reich ich mal meine bilder nach, den quellcode hab ich auch noch irgendwo rumgammeln, leider ist der noch nicht so ganz stimmig zusammengefügt

grummel .... in der falschen reihenfolge geadded ... bitte bilder von unten nach oben betrachten

wir haben hier einfach mit odometrie und den liniensensoren gearbeitet, da wir probleme hatten wenn der asuro gegen ein hinderniss gefahren ist und völlig quer stand(anfangs sollten es kisten werden danach haben wir einfach abgeklebt und odometrie gemessen, halber weg = blockiert, ganzer weg = zellenwechsel)

robo.fr
12.06.2008, 20:51
Hallo Ceos,

sind doch schöne Bilder. Wäre ja schade gewesen, wenn Du uns die vorenthalten hättest. Vielleicht inspiriert das ja jemand zu neuen Ideen ...

Gruß,
robo

damaltor
12.06.2008, 23:48
so, ich habe den thread mal ausgemüllt. bitte nur beiträge zum thema!

Ceos, ein kleiner tip: das upload volumen zu www.roboternetz.de ist auf 3mb begrenzt, und zwar auf 3mb insgesamt. evtl solltest du deine fotos bei imageshack.us hosten, da bekommst du dann direkt "IMG"zeilen, die du hier einfügen kannst. da erscheint dann ein klickbares thumbnail, ohne dass du deinen upload platz dafür verbrätst. und ausserdem ist der thread etwas lesbarer (was aber bei deinen bildern noch nicht so schlimm ist, da gabs schon andere....)

trapperjohn
13.06.2008, 08:50
als zweitens
habe hier ein lauffähiges Programm für euch
falls der andere nicht funktioniert (arb)
den hier habe ich von einer Uni -Seite also sehr zuverlässig.
den thread müsst ihr auf 1/10 der normalschrittgeschwindigkeit setzen.
Die Bytes müsst ihr jedoch selber maskieren und den Robocode mit einer Klasse instanzieren. Vorher müsst ihr noch mit den richtigen Variablen, es gibt keine festen Variablen, die ändern sich je nach Roboter, deklarieren.
Habt ihr keine direkten Codes mit denen ihr den Roboter direkt Befehle senden könnt, fragt euren Lehrer.

Von was für Threads und Klassen sprichst du denn da? Und dein Programm ist ein Beispiel für eine Linienverfolgung - wie soll das helfen, durch ein Labyrinth zu fahren und Barcodes zu lesen?

12bg
13.06.2008, 09:04
leute kann man diesen spammer nicht mal langsam beruhigen? wir sind hier am verzweifeln und das verwirrt einen noch mehr...

Manf
13.06.2008, 09:12
Genau, erzähle doch mal etwas über das Projekt und das Umfeld, an welcher Schule ist das denn?
Wenn die Störungen aus dem Umfeld kommen, dann gehen sie danach meistens etwas zurück.

12bg
13.06.2008, 09:15
also wir sollen eine art servierroboter programmieren... der asuro soll auf einem tisch mit einem (imaginären) glas oder sowas langfahren und den empfängerplatz anhand eines barcodes erkennen und stoppen. wir haben jedoch wirklich null ahnung und sind hier echt am verzweifeln... dieses projekt ist völlig übertrieben und zählt stark in die note. wir sind von einem beruflichen gymnasium in frankfurt

python_rocks
13.06.2008, 09:34
den empfängerplatz anhand eines barcodes erkennen und stoppen
Hallo 12bg!

Wenn es sich um einen "richtigen" Barcode handelt, dann empfehle ich euch, einen Barcode-Handscanner für den Anschluss an einen "Seriellen Port" (mit D-Sub 9 Buchse) zu kaufen.

In diesem Scanner ist alles drinnen, um den Barcode zu erkennen. Diese Information wird als RS-232-Signal weiter gegeben. Am Mikrocontroller schließt du den Scanner über einen MAX232 an. So kannst du im Mikrocontroller den fertig entschlüsselten Barcode als Text empfangen. Schwieriger wird es wahrscheinlich, den Standort des Barcodes zu finden.

So einen Handscanner kannst du nicht einfach so auf so einen kleinen Asuro montieren. Du musst die Elektronik aus dem Barcodescanner ausbauen.

http://www.tauris.com/index.php?zeige=Handscanner

mfg
Gerold
:-)

12bg
13.06.2008, 09:36
das ist nicht mal unser asuro und wir haben auch kein budget... wir müssen diese sensoren benutzen mit denen er auch den linien folgt...

Manf
13.06.2008, 09:46
Sicher muss man noch ein bisschen sortieren, es gibt Aussagen über Prüfungsleistungen und Hilfen bis zum Programm. Das ist etwas hoch gegriffen. Dann das Barcodelesen mit Liniensensoren, da ist die Gestaltung des Barcodes zu klären, vorgegeben oder Eigenkostruktion.
Am Anfang steht das Betreiben eines Ausros und dem Folgen einer Linie mit einem Programm das verstanden wurde und das modifiziert und erweitert werden kann.

12bg
13.06.2008, 09:49
das können wir uns selbst überlegen wie der barcode aussehen muss

Manf
13.06.2008, 10:10
Dann würde ich mal die Leute fragen die sich schon mit ASURO und Barcode beschäftigt haben, wie sie sich eine besonders einfache Codierung vorstellen, die gerade mal 4 Zeichen unterscheiden kann, und worin besteht die Schwierigkeit einen Barcode zu lesen während (?) man einer Linie folgt.
Wie sollte man es grundsätzlich machen, mit dem Folgen und dem Lesen?

PicNick
13.06.2008, 12:27
Darf ich mir das so vorstellen: Es wird einer Linie gefolgt, gewissermassen "normal".
An bestimmten Stellen ist die Linie aber in einem (barcode) Muster unterbrochen, und solche Stellen sind
1 zu erkennen
2 zu interpretiern
3 ggf. stehenzubleiben
??

robo.fr
13.06.2008, 15:35
Das Ganze erinnert mich doch stark an dieses Porjekt (http://www.informatik.fh-wiesbaden.de/~linn/vpdv05/asuro/projektdokumentation/projektdokumentation/node1.html) einer FH.

Wenn Ihr es also erfolgreich hingekriegt habt, könnt Ihr nachher gleich zur Uni. :Ostern

Aber Scherz beiseite, vor kurzem habe ich mir sagen lassen, dass in der Schule heute sehr stark der Umgang mit dem Intenet gelehrt wird. Die Schüler bekommen relativ frei gestellte Aufgaben und sollen sich dann die Materiallien im Internet zusammensuchen.
Und da viele Dinge in der Asuro Forschung schon einmal behandelt wurden und durch wissenschaftliche Arbeiten ;-) beschrieben wurden, könntet Ihr Glück haben und müsst das Rad nicht zu oft neu erfinden, sondern könnt am Stand der Forschung weiterarbeiten.

Wenn Ihr die notwendigen Fähigkeiten im Umgang mit dem Internet erworben habt, könnt Ihr derem Ausprägung an der Suchfuntktion dieses Forums erbroben und werdet auf diesen Thread (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32905) stoßen, in dem das Thema Asuro und Barcode relativ ausführlich behandelt wurde.

O:)

Vieleicht lindert das euren Prüfungsstreß etwas,

robo.fr

Sternthaler
13.06.2008, 16:12
Hallo robo.fr und vor allem auch 12bg,

genau den Thread hatte ich schon vor einiger Zeit vorgeschlagen.
Da ist alles vorhanden!!!!

- Beschreibung der auftretenden Probleme
- Wie dagegen angegangen wird
- Barcodedefinition
- Druckvorlage für die Barcodes
- Fertiges ASURO-Program

12bg, nutzt das doch einfach: Asuro und Barcodes (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32905) (Ist nochmal der Link, für den Fall, dass er erst beim 3.ten mal gesehen wird ;-))

Gruß Sternthaler

damaltor
16.06.2008, 01:57
hallo Blombe,
wir haben keinerlei interesse an irgendwelchen codes, die du hier völlig zusammenhanglos postest, sondern versuchen ein problem zu lösen. bitte trage etwas zu diesem problem bei, oder halte dich zurück.
dein beitrag wurde erneut gelöscht.

123home
16.06.2008, 08:29
:-b

1 PID Regler
Bei meinem Asuro brauchen die Motoren unterschiedlich Power für den Gleichlauf bzw. Geradeauslauf. Es ist dann relativ mühsam die richtigen Werte der
MotorSpeed(left_speed, right_speed)
Funktion für den Geradeauslauf zu finden. Darüber hinaus ändert sich dieses Verhalten mit schwächer werdender Batterie.

Das motivierte mich, hierzu einen PID Regler zu programmieren.
1.1 Konstantes Zeitintervall

Zuerst habe ich einen PID Regler implementiert für ein konstantes Zeitintervall Ta=150ms (Stellungsalgorithmus Quelle: https://www.roboternetz.de/wissen/index.php/Regelungstechnik#PID-Regler).
//Stellungsalgorithmus für links: e = leftSpeed - l_ticks; //Vergleich l_speed = l_yalt + q0*e + q1*l_ealt + q2*l_ealt2; //Reglergleichung l_ealt2 = l_ealt; l_ealt = e; l_yalt = l_speed;
Dabei habe ich die vierer Odometriescheibe verwendet.
1.1.1 Automatisch Finden der Konstanten q0, q1 und q2

Es war mir zu mühsam die Werte für q0, q1 und q2 per Hand aus zu pingeln. Deshalb habe ich ein Programm für Asuro geschrieben, welches ihn die besten Konstanten selbst heraus finden läßt (trial and error). Als leftSpeed und rightSpeed habe ich 20 Ticks pro Sekunde vorgegeben (das ist langsam). Ich habe keinen Unterschied zwischen links und rechts gemacht. D.h. für beide Seiten habe ich erst mal die gleichen q0, q1 und q2 Werte genutzt. Jeder Fehler vom Vorgabewert (20 Ticks pro Sekunde) wurde registriert, quadriert und über die Zeit summiert. Das Programm ist damit auf der Suche nach q0, q1 und q2 mit dem kleinsten Fehlerquadrat.

Um hier (16Bit integer statt double) klar zu kommen habe ich die Werte für q0, q1 und q2 mit 100 multipliziert. Das mußte ich bei der Anwendung im Code korrigieren:
//Stellungsalgorithmus für links: e = leftSpeed - l_ticks; //Vergleich l_speed = l_yalt + (q0*e + q1*l_ealt + q2*l_ealt2)/100; //Reglergleichung l_ealt2 = l_ealt; l_ealt = e; l_yalt = l_speed;

Nach ca. 20 Minuten rumprobieren wurden schließlich folgende Werte von und für meinen Asuro gefunden:
q0=171
q1=-20
q2=-10

1.2 Variables Zeitintervall

Durch einfaches Umrechnen aus
q0=Kp+Ki*Ta+Kd/Ta
q1=-Kp-2*Kd/Ta
q2=Kd/Ta
ergibt sich dann ein PID Regler für ein variables Zeitintervall Ta.
Kp=-(q1+2*q2) Ki=(q0+q1+q2)/Ta Kd=q2*Ta
Für die q0, q1 und q2 Werte aus 1.1 ergibt sich bei Ta=150ms:
Kp=40
Ki=1 (eigentlich Ki=0.94)
Kd=-1500

Und hier die Zuweisungen von (Kp, Ki, Kd, Ta) -> (q0, q1, q2):
q0=Kp+Ki*Ta+Kd/Ta; q1=-Kp-2*Kd/Ta; q2=Kd/Ta;
Stimmts? Quelle: https://www.roboternetz.de/wissen/index.php/Regelungstechnik#PID-Regler

Hier ist das Programm asuroAutoPID1.zip.

__________________________________________________ ______________

Fight till you die for your life

damaltor
16.06.2008, 17:06
thread wieder gesäubert... was ist denn heir nur los...

hab ne runde schreibsperren verteilt. die spammer gehen mir auf den keks...

harry3
16.06.2008, 17:16
@Threadersteller: Durch das ganze Chaos hier weiß ich nicht inwieweit das Problem noch aktuell ist. Wenn du Fragen hast kann ich dir helfen da ich das letztes Jahr ausprogrammiert habe.

Übrigens: Der Post von "123home" ist von der Seite http://home.arcor.de/Wolfgang.Rossner/roboter/asuro/asuro.html geklaut.

12bg
17.06.2008, 07:34
Erst mal danke für das beseitigen der nervigen spamer!!

und ebenfalls ein riesen großes dankeschön für die zahlreichen beiträge von euch und die angebotene hife =)

Wir haben probleme von dem geposteten Code aus dem anderen. Er Funktioniert nicht bei uns es erscheinen nur viele fehler beim umwandeln in eine hex Datei.


/*/*Einstellungen um Asuro fit für die Barcode-Funktion zu machen.*/
/*Geschwindigkeit links/rechts definieren=>damit Asuro geradeausfährt*/
#define BC_SPEED 90
/*Hell/Dunkel Schwelle für Odometrie.
Linke Odometrie wird als Referenz verwendet*/

#define BC_OLSCHWELLE 600
#define BC_ORSCHWELLE 730
/*Hell/Dunkel Schwelle für Barcode*/
#define BC_LSCHWELLE 45


/*Einstellungen um das Barcode zu ändern.*/
/*ACHTUNG: Bei Veränderungen von BC_STRICH_ANZAHL müssen in der Funktion
2 Anpassungen vorgenommen werden! Näheres siehe in der Funktion!*/
/*Anzahl der Datenbits*/
#define BC_DATENBITS_ANZAHL 3
/*Anzahl der Striche(Startbit+Datenbits+Prüfbit inklusive Stoppbit)*/
#define BC_STRICH_ANZAHL 5
/*Wie oft pro Strich der Helligkeitswert gemessen werden soll
ACHTUNG: dafür muss die Strichbreite angepasst werden*/
#define BC_ABTASTUNGEN_PRO_STRICH 5
/*Um im bin_erg[] eine 1 auszulösen, müssen pro Strich mindestens
BC_ABTASTUNGEN_PRO_STRICH-2 Messwerte 1 sein. */
#define BC_LOGIKSCHWELLE 3
/*Anzahl der Werte im daten[] Array*/
#define BC_MAX_WERTE 55
/*Fehlercodes*/
#define BC_FEHLER_PARITY 255
#define BC_FEHLER_RICHTUNG 254

unsigned char fkt_barcode_lesen(void)
{
unsigned int ldata[2]={0},odata[2]={0};
unsigned int led_on[2]={0},led_off[2]={0};
unsigned int links=0,rechts=0,ges=0;

unsigned char flag_l=0,flag_r=0,n=0,startbit=0,summe=0,index=0,d ez_erg=0,richtung=0;
unsigned char odo_counter=0,counter_l=0,counter_r=0,speed_l=BC_S PEED,speed_r=BC_SPEED;
unsigned char daten[BC_MAX_WERTE 55]={0},bin_erg[BC_STRICH_ANZAHL-1]={0};
MotorDir(FWD,FWD);
MotorSpeed(BC_SPEED 90,BC_SPEED 90);
StatusLED(OFF);

/*Wegstrecke(odocounter) ab Startbit messen*/
while(odo_counter<BC_MAX_WERTE)
{

OdometrieData(odata);
MotorSpeed(speed_l,speed_r);

/*Bei jedem Tick daten[] Array auffüllen.*/
if( (flag_l==0 && odata[0]>BC_OLSCHWELLE 600) ||
(flag_l==1 && odata[0]<BC_OLSCHWELLE 600) )
{
counter_l++;
FrontLED(ON);
LineData(ldata);
led_on[0]=ldata[0];
led_on[1]=ldata[1];

FrontLED(OFF);
LineData(ldata);
led_off[0]=ldata[0];
led_off[1]=ldata[1];

links=led_on[0]-led_off[0];
rechts=led_on[1]-led_off[1];
ges=(links+rechts)/2;

if(ges<BC_LSCHWELLE 45)
{
daten[odo_counter]=1;
if(startbit==0)
{
StatusLED(GREEN);
startbit=1;
}
}

if(flag_l==0)
flag_l=1;

else
flag_l=0;


if(startbit!=0)
{
odo_counter++;
}
}

if( (flag_r==0 && odata[1]>BC_ORSCHWELLE 730) ||
(flag_r==1 && odata[1]<BC_ORSCHWELLE 730) )
{
counter_r++;

if(flag_r==0)
flag_r=1;

else
flag_r=0;
}

if(Gettime()%75==0 && (counter_l>3 || counter_r>3) )
{
if(counter_l<counter_r)
{
speed_l=speed_l+1;
}
else if(counter_l>counter_r)
{
speed_l=speed_l-1;
}
if( (counter_l>35 || counter_r>35) && startbit==0)
break;
}


}

MotorDir(BREAK,BREAK);
MotorSpeed(0,0);

/*Binärzahl aufbauen + Prüfbit*/
for(n=0;n<BC_MAX_WERTE;n++)
{

summe=summe+daten[n];

/*Wenn BC_STRICH_ANZAHL verändert wird,
muss hier ein entsprechender Eintrag erfolgen*/
if((n+1)%BC_ABTASTUNGEN_PRO_STRICH==0)
{
if((n+1)==(BC_ABTASTUNGEN_PRO_STRICH*3)
||
(n+1)==(BC_ABTASTUNGEN_PRO_STRICH*5)
||
(n+1)==(BC_ABTASTUNGEN_PRO_STRICH*7)
||
(n+1)==(BC_ABTASTUNGEN_PRO_STRICH*9))
{
if(summe>=BC_LOGIKSCHWELLE)
bin_erg[index]=1;
else
bin_erg[index]=0;

index++;

}

summe=0;
}

}

/*Richtung erkennen*/
/*Wenn BC_STRICH_ANZAHL verändert wird,
muss hier der Faktor angepasst werden.*/
summe=0;
for(n=(BC_ABTASTUNGEN_PRO_STRICH*9);n<(BC_ABTASTUNGEN_PRO_STRICH*11);n++)
{
summe=summe+daten[n];
}
if(summe>=(BC_ABTASTUNGEN_PRO_STRICH*2-BC_LOGIKSCHWELLE 3))
richtung=1;


/*Binärzahl umwandeln in Dezimalzahl oder Fehlercode zurückgeben*/

/*alles OK => Dezimalzahl zurückgeben*/
if((bin_erg[0]+bin_erg[1]+bin_erg[2])%2!=bin_erg[3] && richtung==1)
dez_erg=4*bin_erg[0]+2*bin_erg[1]+1*bin_erg[2];

/*Fehlercode BC_FEHLER_RICHTUNG->falsche Richtung*/
else if((bin_erg[0]+bin_erg[1]+bin_erg[2])%2!=bin_erg[3] && richtung==0)
dez_erg=BC_FEHLER_RICHTUNG 254;

/*Prüfbit falsch*/
else
dez_erg=BC_FEHLER_PARITY 255;


StatusLED(OFF);

return dez_erg;
}
schon im vorraus nochmals vielen dank !

12bg
17.06.2008, 08:23
sorry, für das dumme gespamme aber hier halten sich einige klassenmitglieder für witzig.
Bitte überlest diese Posts

damaltor
17.06.2008, 13:06
hallo 12bg, das gespamme geht mir auf die nerven. dein account ist hiermit gesperrt. bite eröffne einen neuen, und achte darauf dass du die seite nicht wieder offenlässt.