Erstes Proggi: Quadratisch abhängiger Linienfolger
Hi!
Also, den Asuro hab ich jetzt seit ca. 4 Tagen. MANMANMAN macht das Teil Böcke! \:D/
Ich hab jetzt Verschiedenes ausprobiert und bin ein wenig an der Linienverfolgung hängen geblieben. Was mir nicht gefallen hat: Bisherige Lösungen sind entweder linear abhänging (und neigen damit zum "Wackeln" auf geraden Strecken) oder "schalten" praktisch gesehen einfach nur die Geschwindigkeit einer Seite auf Null (wie das Beispielproggi im Lieferumfang). Was ich gesucht habe ist eine kontinuierliche Regelung, die bei leichten Abweichungen auch nur leicht reagiert, bei stärkeren entsprechend auch stärker (auch mit negativen Geschwindigkeiten!).
Nach einigem probieren, hier jetzt eine meiner Meinung nach sehr passable Lösung: Quadratisch abhängige Regelung. Sprich: Die Differenz des Liniensensors wird zunächst quadriert und anschließend als Korrektur für beide Motoren verwendet. Dies verträgt sich ganz gut mit den Motoren, deren Anlaufverhalten ist ja auch alles andere als linear. Das Ergebniss: Auf geraden Strecken wackelt der Asuro deutlich weniger, gleichzeitig werden aber sehr viel engere Kurven genommen!
Hier der Code:
Code:
#include "asuro.h"
#include <stdlib.h>
#define maxspeed 130 /* gibt sowohl die maximal positive als auch die maximal negative
Geschwindigkeit an, guter Mittelwert etwa 140 */
#define medspeed 120 /* gibt die den Durchschnitt der Geschwindigkeit beider Seiten an,
guter Mittelwert etwa maxspeed-20 */
#define quadteiler 30 /* Quotient des Liniensensors. Umso niedriger desto mehr neigt der
Asuro zum "Wackeln" auf geraden Strecken, aber er nimmt auch engere Kurven. Umgekehrt umso
höher dieser Wert, desto schneller fährt der Asuro die Strecke ab (ohne Wackeln), aber es
werden zu enge Kurven "überfahren" Gute Werte zwischen etwa 10-100, guter Mittelwert 30 */
int speedLeft,speedRight, sR, sL, i;
unsigned int lineData[2];
void Line (void)
{
speedRight = medspeed - ((i*abs(i))/quadteiler);
speedLeft = medspeed + ((i*abs(i))/quadteiler);
if (speedRight > maxspeed) speedRight = maxspeed;
if (speedLeft > maxspeed) speedLeft = maxspeed;
if (speedRight < -maxspeed) speedRight = -maxspeed;
if (speedLeft < -maxspeed) speedLeft = -maxspeed;
if (speedRight < 0) {MotorDir (FWD,RWD); sR=-speedRight;sL=speedLeft;}
else if (speedLeft < 0) {MotorDir (RWD,FWD); sL=-speedLeft;sR=speedRight;}
else {MotorDir(FWD,FWD);sL=speedLeft;sR=speedRight;}
}
int main(void)
{
Init();
FrontLED(ON);
for (i = 0; i < 0xFF; i++) LineData(lineData);
speedLeft = speedRight = 120;
for(;;) {
LineData(lineData);
i = lineData[0] - lineData[1];
if (i > 0) {
StatusLED(GREEN);
Line();
}
else if (i < 0) {
StatusLED(RED);
Line();
}
else {
StatusLED(OFF);
speedLeft = speedRight = medspeed;
MotorDir(FWD,FWD);
sL=speedLeft;sR=speedRight;
}
MotorSpeed(sL,sR);
}
}
Würde mich natürlich freuen, wenn hier mal ein paar Leute bei Interesse eine Art "Review" geben würden, da das ja mein erstes "richtiges" Proggi ist. Es kann sein das die ersten drei definierten Werte deutlich angepasst werden, da ich meinen Liniensensor etwas aufgemotzt hab (siehe Bilder hier: https://www.roboternetz.de/phpBB2/vi...5bbb8386cc6d7d)
Für "normale" Asuros empfehl ich aus dem Bauch bspw. einen quadteiler von ca. 10-30, bin mir aber nicht sicher.
Nojo, wie auch immer, hoffe euch gefällts. Gruß payce.
Liste der Anhänge anzeigen (Anzahl: 2)
So. Moin erstmal. (Ihc musste grade eben schon in die Schule um meinen Stundenplan zusammen zustellen, damit es dann morgen shcon losgehen kann ;( Naja, B2T)
Also ich hab dein Programm von oben jetzt einfach mal direkt kompiliert und ausprobiert. Also wenn ich den Asuro ohne Abschirmung (also im normal Zustand) im Licht (von vorne) fahren lasse, dann geht dies nur zuverlässig mit K1, also "sw > 16" , also "quadteiler=quadinit*4;" Es funktioniert bei mir also mit einem quadteiler von 120 gut. Wenn ihc ihn in dem Zustand (120) auf die Kante(weiß, schwarz) setzte kommt er von dieser auch weg, ohne sich zu verhaken. Bei jedem anderen (also kleineren) Wert hängt er sich an der Kante auf.
Ich denke, dann hätten wir das geklärt. :D Achja, wie viele Pages in den Asuro passen wüsste ich auch gern. (Ich bin zu faul ins Datenblatt zu gucken, da ich dann ja immer noch nicht weiß, wie viel Platz durch den Bootloader belegt ist) Weiß das jemand?
So, jetzt noch als kleine Anekdote:
Ich bin mir durchaus bewusst, dass ich hier das maximum simuliert habe. Denn ich habe keine Abschirmung verwendet und die Sensoren haben von Vorne Licht bekommen. Sie wurden also ziemlich geblendet. Mit meiner schlechten Strohhalm-Abdeck Variante hab ich es noch nicht versucht, aber damit sollte es gleich ein wenig besser sein. Dass werde ich noch ausprobieren.
Also kann man eigentlich sagen, dass man bei direktem ungeschütztem Frontlich einen sehr hohen Quadteiler braucht und bei geschützen Sensoren (wie bei dir) und wohl kein direktes Front Licht (oder?) eher einen kleinen.
So, jetzt probier ich noch die Abschirmung aus.
Andun
Nachtrag: Wenn ich es mit der Abschirmung benutze, dann geht es schon fast gut im normalen Zustand. Gut läuft es bei K2 und perfekt läuft es dann auch bei K1. Ich weiß aber auch nicht so genau, wie viel Licht die nun eigentlich absorbieren. Ich hab nochmal 2 Photos angehängt wo man sieht wie es bei mir aussieht.