PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linienverfolgung



Hansi41
20.01.2008, 18:41
Hallo,
ich wollte mal ein programm schreiben, mit dem ich eine schwarze Linie verfolgen kann.
Könnte mir jemand mal in Stichpunkten aufzählen, welche programmfetzel ich dafür alles im einzelnen benötige?

Ich bin über jeder Antwort dankbar!
Hans

Hansi41
20.01.2008, 18:42
Nur damit keine missverstände aufkommen:
Ich benutze einen ASURO im original zustand, möchte ihn allerdings bald mit Ultraschallsensoren aufrüsten.

JensK
20.01.2008, 18:55
naja ess gibt schon viele gut linienfolgeprogramme... z.b. gibt es eins mit PID-Steuerung.. aber wenn du eins selber basteln mächtest must du eigentlich nur die Sensoren abfragen lassen und "if" anforderungen stellen....

hier einige lininfolgeprogramme:
oder mehr das wichtigste :D

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11818&postdays=0&postorder=asc&start=0

Gerry1973
21.01.2008, 21:04
Hier mal meine Version von heute (habe den Asuro seit Samstag ;) ):

Ist zwar nicht sehr schnell unterwegs, aber dafür recht ruckelfrei.
Geschwindigkeit kann man ja je nach Kurs noch nach oben anpassen.

Grüsse,
Gerry


#include "asuro.h"

int main(void) {
unsigned int data[2];
unsigned char links,rechts;
int diffl,diffr;
Init();
FrontLED(ON);
MotorDir(FWD,FWD);
while(1) {
LineData(data);
diffl=data[0]-data[1];
diffr=data[1]-data[0];
links=120-(diffr*3);
rechts=120-(diffl*3);
if (links>120) {links=120;}
if (rechts>120) {rechts=120;}
MotorSpeed(links,rechts);
}
return 0;
}

Hansi41
22.01.2008, 14:18
Hallo,
das programm ist echt gut:
einfacher aber genialer quellcode!!!
kleiner tipp meine erfahrungen haben geziegt, dass der asuro genauer(allerdings auch leider stockiger) fährt, wenn man den wert auf
links=120-(diffr*4);
rechts=120-(diffl*4);
setzt.
mfg hans

Gerry1973
24.01.2008, 21:01
Ich hab verschiedene Werte ausprobiert und fand *3 eigentlich am idealsten.

Damit folgt er bei mit Radien unter 10cm, und Kreuzungen sind auch kein Problem.

Ich habs mit 10mm breitem schwarzem Isolierband auf Laminat probiert, hab fast ne ganze Rolle verschlissen ;)

Mit Faktor *4 mag er die Kreuzungen nicht bzw. schaukelt sich danach etwas zu stark auf, wenn er nicht 90° kreuzt. Ich wollte ja nur, dass er recht ruhig der Linie folgt.

Mal schaun, was ich dem kleinen noch alles beibringen kann ;)
Mittlerweile turnt er auf dem Wohnzimmertisch rum, helle Fliesen, dunkler Rand...
Hexentanz ist nix dagegen, meine Frau und ich halten immer schon die Hände bereit, weil er sich doch ab und zu auf ner Fliese festbeisst und dann übern Rand purzelt, falls er mal ne Fuge als Rand miterkennt (habs schon einigermassen über eine "Entprellung" ausgeschlossen, aber klappt noch nicht ganz) :D

Aber interessantes Kerlchen isses allemal.

Grüsse,
Gerry

Hansi41
25.01.2008, 13:11
hallo
ja das hatte ich auch schon programmiert^^, nur sollte man diese spielchen nicht allzu oft machen, da der verschleis der zahnräder hierbei enorm hoch ist (habe schon einen neuen satz drauf).
ich werde jetzt wahrscheinlich irgendwann mal meinen asuro mit ultraschall aufrüsten, dafür müssen allerdings die linienfolge led ausgebaut werden, schade schade

Phil23
25.01.2008, 16:36
Hi Leute,
Ich steh ganz am Anfang der Softwar des Asuros.
Ich schaffe es nicht die test.c Datei in eine test.hex Datei umzuwandeln, vermutlich liegt es daran, dass ich das ,,Schreibgeschützt nicht weg bekomme. Kann mir jm. helfen ?
Der selbst Test des Asuros hat einwandfrei geklappt und jetzt scheitert es an einer blöden Windows Einstellung.
Danke

Hansi41
25.01.2008, 22:33
hallo,
einmal könnte es an deinem schreibschutz liegen, aber auch könnte es daran liegen, dass du deine test.c nicht speichert bevor du den make- befehl ausführst, du solltest mal genau die fehlermeldung beschreiben, dann kan ich dir zielgenauere anweisungen geben.

m.a.r.v.i.n
25.01.2008, 23:03
Hi Phil23,

ein paar mehr Infos wären schon hilfreich.
Welche Windows Version XP, oder Vista?
Welche WinAVR Version?

Btw. beim nächsten mal dieselbe Frage vielleicht nur in einem Thread stellen, oder einen neuen Thread öffen. Sonst machst du dir hier im Forum nicht sehr beliebt :wink:

damaltor
25.01.2008, 23:56
Wie gesagt, keine Doppelposts bitte. Ich werde die Posts jetzt nicht löschen, aber bitte lass das in zukunft sein.

Hansi41
26.01.2008, 12:21
und hat es funktioniert?
naja, aber jetzt habe ich noch eine frage zu euch:
was meint iht mit einem thread oder einem neuen thread?
ich dachte das wär das gleiche?^^

damaltor
27.01.2008, 00:29
du schreibst die frage in 3 threads, also 3 themen. das solltest du nciht machen. entweder du schreibst es in einen (!!) vorhandenen thread, oder wenn du wirklcih nichts zum thema gefunden hast, eröffnest du einen neuen thread um deine frage zu stellen. aber nicht überall reinschreiben! danke

luckylukas92
17.11.2008, 22:14
Hallo ich bin noch ziemlich am anfang mit c++(komme aus der php welt :D)

und hätte folgende frage....
was genau passiert hier
links=120-(diffr*3);
rechts=120-(diffl*3);
if (links>120) {links=120;}
if (rechts>120) {rechts=120;}
kannst du bitte ne genauere erläuterung schreiben was dieser teil deines scriptes bringt?
mfg lukas

nil.at
18.11.2008, 13:27
Hi,

bitte nicht verwechseln, das ist das C Programm und kein C++ Script.
Zum Programm selbst (ähnelt sich die Syntax nicht sowieso?):

"links" und "rechts" sind Variablen, die die Geschwindigkeit der Motoren angeben.
120 ist dabei ein guter Wert, der einfach eine bestimmte Geschwindigkeit definiert.
Und in dem von dir geposteten Teil, wird eben diese Geschwindikeit anhand der Abweichungen der Sensoren eingestellt.
Angenommen der linke Fototransistor hat den Wert 100, der rechte 150. (rein fiktive Werte)
diffl wäre dann -50, diffr wäre 50.
Die Geschwindigkeit des linken Motors wäre dann:
120-(50*3)=-30.
Rechts wäre: 120-(-50*3)=270.
Danach wird allerdings abgefragt: Falls einer der beiden Werte größer als 120 ist, wird er auf 120 gesetzt.
Der rechte Motor dreht also mit "120", der linke mit "-30".
Achtung! Diese Werte werden wahrscheinlich NIE erreicht, die beiden Transistoren haben fast immer dieselben Werte (sie liegen ja direkt nebeneinander) und sobald ein Wert abweicht wird sofort korrigiert.
Dennoch, die Motoren werden jetzt demnach eingestellt, der rechte Motor dreht also schneller als der linke, was eine Linkskurve zur Folge hätte. Das muss auch so sein, immerhin war der Wert des linken Transistors kleiner als der des rechten. Und wie du aus meiner Befehlsliste entnehmen kannst (siehe Signatur) bedeutet ein kleiner Wert gleich "mehr schwarz", was bedeutet das der Asuro von der Linie abkommt und demnach nach links korrigieren muss.

Hoffe das war enigermaßen verständlich :)

luckylukas92
18.11.2008, 15:37
sry meine frage war doof formuliert...aber super antwort :D

eigentlich wollte ich wissen wie man hier drauf kommt
"Die Geschwindigkeit des linken Motors wäre dann:
120-(50*3)=-30.
Rechts wäre: 120-(-50*3)=270. "

warum wir dieser differenzwert verdreifacht und dann abgezogen?....sinn?
"Danach wird allerdings abgefragt: Falls einer der beiden Werte größer als 120 ist, wird er auf 120 gesetzt. "
wenn die "normal"geschwindigkeit doch bei 120 liegt warum wird dann "Rechts wäre: 120-(-50*3)=270." dieser wert ermittelt :P sry bin warscheinlich nur ein bisschen schwer von begriff

nil.at
19.11.2008, 22:19
Irgendwie musst du ja auf die Wertänderung der Fototransistoren reagieren. Du könntest natürlich auch sagen "sobald sich der der Wert um eine gewisse Spanne ändert, bremse den richten Motor um den Spannwert ab" oder weiss Gott was. Das bleibt alleine dir überlassen.
Da wird sich der Autor des Programmes schon etwas dabei gedacht haben. Du könntest ja mal ein paar Werte durchrechnen, vielleicht ergibt sich mit dieser Formel die Beste Repositionierung.
Lies dir einfach mal den 4. und 5. Beitrag dieses Threads durch ;)

luckylukas92
20.11.2008, 05:38
hm mir is ist eigentlich schon klar was da passiert aber das kann ja garnicht funktionieren(es funtioniert auf meinem asuro auch nicht) die differenz zwischen dem weißen plakat und der schwarzen linie liegt ja schon bei ca 800(bei meinem asuro eigentlich müsste sie ja bei 1000 nochwas leigen) und wenn jetzt diese differenz * 3 genommen -> und von den 120 abgezogen wird bleibt ja zwangsmäßig immer ein motor stehen oder? (bei mir bleiben nach einer weile sogar beide stehen)

nil.at
20.11.2008, 22:01
Du solltest lieber den gesamten Code ansehen und nicht nur einen Bruchteil, denn genau 2 Zeilen davor steht:
diffl=data[0]-data[1];
diffr=data[1]-data[0];
Das heisst es wird immer nur die DIFFERENZ vom linken zum rechten Sensor als Referenz genommen.
Und ausserdem, der Sensor wird nicht von einer Sekunde auf die andere von schwarz auf weiß kommen, sondern die "Beleuchtungsstärke" nimmt kontinuierlich leicht ab/zu. Beispielsweise bei einer leichten Linkskurve, fährt der Asuro gerade aus. Nun wird der Wert des linken Fototransistors niedriger, weil die Led ja (links) auf die schwarze Bahn kommt und weniger Licht reflektiert wird. Der Wert des rechten Fototransistors nimmt zu, weil er langsam auf die weiße Fläche kommt. Somit ist die Änderung der beiden Transistoren PRO Schleifendurchlauf nur äußerst gering. (Vergiss nicht wie oft die Schleife pro Sekunde durchlaufen wird). Ich schätze auf einen maximalen Änderungswert von 10-20. Sagen wir beide Transistorwerte ändern sich um 10 (also der linke um 10 dünkler, der rechte um 10 heller), bei einem Ausgangswert von 100 bei beiden, dank gleichmäßiger Beleuchtung auf einer geraden Strecke. Dann wäre "diffl" gleich 90-110=-20, "diffr" wäre 110-90=20.
Und nun gehts weiter mit:
links=120-(diffr*3);
rechts=120-(diffl*3);
links wäre demnach 120-(20*3)=60
rechts wäre 120-(-20*3)=120 (eigentlich 180)
Daraus resultiert, der linke Motor dreht sich halb so schnell wie der rechte und korrigiert somit die Abdriftung nach RECHTS.
Muss auch so sein, denn immerhin wurde der Wert des linken Transistors ja um den Wert 10 kleiner, was auf einen dunklen Untergrund schließen lässt.
So, hoffe es passt nun ;)

luckylukas92
22.11.2008, 11:40
ah ok vielen vielen dank ... sry dassichs o doofe fragen gestellt habe :D
^^das pgrogramm funktioniert jetzt auch super ...hatte wohl nen flash fehler... jetzt kommt gleich meine nächste frage :P .... warum verliert er wennich die geschwindikkeit auf 180 stelle so scnell die bahn?
links wäre 180-(20*3)=120
rechts wäre 180-(-20*3)=180
die differenz der beiden motoren ist ja eigentlich immernoch genausogroß wie bei den werten von 120 ....also 60...demnach müsste er doch die gleichen kurven gleichgut fahren können oder ? -> oder ist der grund:
durch die "schnellere" geschwindigkeit schafft er es nichtmehr die werte schnell genug abzugleichen? <- wenn ja wie ändere ich dass
PS: bei mir berechnet er am anfang noch die reglabweichung der beiden motoren und zieht diese dann links=120-(diffr*3)-rab; ab^^

nil.at
23.11.2008, 11:47
Es gibt keine doofen Fragen, ich bin selbst anfänger und stelle mich genauso an :)

Bezüglich deiner zweiten Frage:
Warum kann ich mit meinem Auto eine enge Kurve nicht mit 130 km/h genausogut fahren wie mit 50 km/h? Der Lenkeinschlag ist doch derselbe?
Ist in etwa vergleichbar :P

Valen
23.11.2008, 16:10
Das obenne program von Gerry1973 is im princip ein P-regler (proportional- regler). Das ist einer vereinfachung der PID-regler das JensK von genennt hat. PID meint die ausgang wirdt berechnet aus der summe von 3 arten von die eingangswert (eingang ist manchmall ist minus soll-wert):

- eine proportionale teil: eingangswert verstarkt mit eine gewissene faktor;

- ein intergrierten teil: jeder durchgang der schleife wirdt die eingangswert addiert auf die vorgehende einganswerte(n). Dieser summe wird auch mit einer gewissene faktor multipliziert.

-ein differenz(iaal) teil: Jeder schleife durchgan wird das letzte und vorgehende eingangs werd voneinander abgezogen. Diese anderung der eingangswert wirdt mit einer gewissene faktor multipliziert un zum ausgang durchgeleitet.

Diese 3 teilen werden summiert und sind im prinzip die ausgang wert.

Die 3 multiplikations faktoren sind sehr wichtig (auch wenn 2 gleich nul sind, wie in einem P-regler). Sie bestimmen das Verhalten des Reglers. Die P-faktor ist einer algemeine verstarkungs faktor. Die I-faktor wird einer 'off-set' korrigieren (beleuchtungsmittelpunkt nicht oben die linie). Die D-faktor wirds einer schnellere wechselung korrigieren (kurven im linie). Eein hohere geschwindigkeit wommit Asuro die linie entlang farht wirdt die beleuchtungswechselungen beschleunigen (wie ein hohere frequenz). Nur ein P-faktor brauchen ist nicht optimal fur gut linienfolgen.

Meiner deutch is sehr slecht. Deswegen hoffe ich die nachtste link wirds besser erklaren:

https://www.roboternetz.de/wissen/index.php/Regelungstechnik

luckylukas92
23.11.2008, 22:02
danke an alle
@valen vielen dank dir auch ich werde mir das mal durchlesen (habe die woche wenig zeit also warscheinlich erst am wochenende

PS: mein deutsch is auch schlecht :P