PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zur erweiterten Asuro-Lib



Stallion
30.12.2006, 17:46
Hab mich schon ne Weile mit Asuro und der erweiterten Bibliothek beschäftigt. Also ich bin von neuen Funktionen echt überrascht, die funktionieren richtig gut. Ein Lob an alle, die daran mitgemacht haben!

Aber ich hab da noch ein paar Fragen zu den Funktionen:

Go-Funktion in der asuro.c (http://asuro.cvs.sourceforge.net/asuro/asuro/lib/src/asuro.c?revision=1.7&view=markup)

00491 enc_count=distance*10000;
00492 enc_count/=12823;
Diese zwei Zeilen sind auskommentiert, warum? Kann man mit diesen Zeilen eine Umrechnung auf Meter durchführen oder welche Funktion haben/hatten die Zeilen?

Go und Turn:

00513 Msleep(1);
Wäre es nicht besser direkt Sleep(36) aufzurufen? Denn so muss erst Msleep aufgerufen werden, dann ne Schleife durchlaufen werden, wo dann erst Sleep ausgeführt wird.

irobot_22587
30.12.2006, 18:26
Moin,

ich wuerde auch gerne diese neuen Funktionen nutzen. Ich kriege jedoch folgende Compiler Fehlermeldungen, wenn ich asuro.c und asuro.h von der 2.61 LIB verwende:
C195 asuor.c warning: return type defaults to "int"
C195 asuor.c warning: function declaration isn't a prototype
C195 asuro.c error: redifinition of 'SIGNAL'
C184 asuro.c error: 'SIGNAL' previously defined here
C212 asuor.c warning: return type defaults to "int"
C212 asuor.c warning: function declaration isn't a prototype
C212 asuro.c error: redifinition of 'SIGNAL'
C195 asuro.c error: 'SIGNAL' previously defined here

Any ideas?

EDH
30.12.2006, 22:28
yes there are any ideas.
the searching machine of our forum.

damaltor
30.12.2006, 22:53
offensichtlich hast du mit den interrupts rumgespielt. suchen hilft =)

in der erweiteren lib ist SIGNAL(INTERRUPT0[oder 1?]) schon definiert. in der asuro.c darf es deshalb nicht nochmal drin sein. du kannst nur in der lib die definitieon auskommentieren.

Stallion
30.12.2006, 23:01
Go-Funktion in der asuro.c (http://asuro.cvs.sourceforge.net/asuro/asuro/lib/src/asuro.c?revision=1.7&view=markup)

00491 enc_count=distance*10000;
00492 enc_count/=12823;
Diese zwei Zeilen sind auskommentiert, warum? Kann man mit diesen Zeilen eine Umrechnung auf Meter durchführen oder welche Funktion haben/hatten die Zeilen?
Dann antworte ich mir halt selber. Aus den Untiefen des Forum hab ich herausgefunden:
Diese zwei Zeilen haben früher dafür gesorgt, dass man die Entfernung, die abgefahren werden soll, in Millimetern angeben konnte. Aufgrund von Modifikationen in der Funktion und Ungenauigkeiten, wurden die Zeilen einfach auskommentiert.

damaltor
30.12.2006, 23:12
Wunderbar, er hat die suchfunktion gefunden...
=)

aber danke nochmal für die erläuterung xD

Stallion
31.12.2006, 11:35
Jetzt aber mal ne Frage, wo mir keine Suche weiterhilft (bzw. ich weiß nicht, wonach ich da suchen müsste):

enc_count=abs(degree)*0166L;
enc_count /= 0360L;
Was macht das große L hinter den Zahlen?

Hans Z
31.12.2006, 12:02
Das L bedeutet , dass der Compiler die Zahl als "Long"integerzahl behandeln soll.
Eine Longinteger deckt einen größeren Wertebereich als z.B. eine normale Integerzahl ab.

Grüße, Hans

linux_80
31.12.2006, 12:03
Hallo,

das hat weniger mit Asuro zu tun, als mit der Sprache C selber,

da die Zahlen hier als Konstanten auftreten, sollte man den Datentyp angeben wenn damit gerechnet wird, damit am Ende ein bestimmter Datentyp als Ergebnis rauskommt.
Das L oder auch l steht für long, man könnte da auch noch ein U für unsigned dazumachen falls mans braucht.

m.a.r.v.i.n
31.12.2006, 12:14
Hi,

Das L hinter einer Zahl bedeutet, dass der Compiler die Zahl als Long interpretieren soll (32bit beim AVR).
Wenn ich mich nicht irre, bedeutet eine führende Null vor einer Zahl, diese als Oktal-Zahl zu interpetieren. Das ist sicher nicht so gedacht, oder?

Stallion
31.12.2006, 12:32
Ich habs bisher immer nur mit (long) gecastet. Von daher war mir diese Schreibweise nicht bekannt.

Ich hab jetzt die Go-Funktion in meiner asuro.c so angepasst, dass man jetzt die Entfernung in Zentimetern angeben kann (veränderte Zeilen sind mit Pfeilen markiert):

int enc_count = abs(distance); // <-------
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;

// cm -> ticks
enc_count *= 5; // only for 12 fields gearwheel <--------

// reset encoder
Encoder_Set(0,0);
...

Mein Asuro hält sich auch ganz gut daran. :)

irobot_22587
31.12.2006, 22:13
yes there are any ideas.
the searching machine of our forum.

ich kann nichts weiteres im forum finden.

nach meinem verstaendnis sollte es ausreichen in einem project die alte version asuro.c und asuro.h die die neue 2.61 ver zu ersetzen. wenn ich das jedoch mache, bekomme ich die untem im thread beschriebenen fehlermeldungen bzgl. der SIGNAL definitionen.

wer kann helfen?

damaltor
01.01.2007, 05:24
in der erweiteren lib ist SIGNAL(INTERRUPT0[oder 1?]) schon definiert. in der asuro.c darf es deshalb nicht nochmal drin sein. du kannst nur in der lib die definitieon auskommentieren.

m.a.r.v.i.n
01.01.2007, 14:32
Hi,

bei Verwendung der Asuro Lib V2.61 muß auch die aktuelle WinAVR (http://sourceforge.net/projects/winavr/) Version installiert sein.

Wenn man mit der alten WinAVR Version arbeiten will, fügt in die asuro.h wieder folgende Zeile ein.

#include <avr/signal.h>

ein. Diese Header-Datei ist bei der aktuellen WinAVR Version obsolete.

stochri
01.01.2007, 17:03
Go-Funktion in der asuro.c
Code: [View More of this Code] [View Even More of this Code] [View Less of this Code] [Select All of this Code]
00491 enc_count=distance*10000;
00492 enc_count/=12823;

Diese zwei Zeilen sind auskommentiert, warum? Kann man mit diesen Zeilen eine Umrechnung auf Meter durchführen oder welche Funktion haben/hatten die Zeilen?

Hallo Stallion,

die ursprüngliche Version der Go() und Turn() Funktion ist von mir. Dem Hinzufügen der Regelung der Radencoder stand ich kritisch gegenüber, weil es Funktionsprobleme bei Fremdlicht bis zum Programmhänger geben kann. Die beiden Zeilen im Go() sind noch aus der ersten Version. Etwas später habe ich herausgefunden, dass die Ungenauigkeiten der Umrechnung in mm genau daher kamen, dass ich das große "L" hier vergessen hatte. Wenn man das große "L" hinter der 10000 einfügt, dürfte die Umrechnung einigermaßen gut funktionieren.
@m.a.r.v.i.n Bei einem Update der ASURO-Lib fände ich es nicht schlecht, wenn Du die Umrechnung wieder einführen würdest ( noch mal nachkontrollieren, ob der Faktor stimmt ). Dann hat man wenigstens eine vernünftige Maßeinheit für die gefahrene Strecke.

Gruß,
stochri

Oh, edit ...Nachtrag:


Ich habs bisher immer nur mit (long) gecastet. Von daher war mir diese Schreibweise nicht bekannt.

Ich hab jetzt die Go-Funktion in meiner asuro.c so angepasst, dass man jetzt die Entfernung in Zentimetern angeben kann (veränderte Zeilen sind mit Pfeilen markiert): i

Wie ich grad noch übersehen hatte, hast Du es ja bereits herausgefunden. Die Einheiten in mm anzugeben fände ich allerdings besser. Mit den großen Radencoderscheiben kommnt man auf eine Genauigkeit von ca. 2mm, wenn man die Länge nur in cm angibt, verschenkt man etwas Auflösung.

Stallion
01.01.2007, 19:40
Wie ich grad noch übersehen hatte, hast Du es ja bereits herausgefunden. Die Einheiten in mm anzugeben fände ich allerdings besser. Mit den großen Radencoderscheiben kommnt man auf eine Genauigkeit von ca. 2mm, wenn man die Länge nur in cm angibt, verschenkt man etwas Auflösung.
Ich hab ursprünglich gedacht, dass es cm einfacher wäre, da man dann mit kleineren Zahlen hantiert. Aber du hast natürlich recht, dass mm hier wohl eine bessere Lösung ist. Daher hier nochmal der Code für mm:

// mm -> ticks
enc_count /= 2; // only for 12 fields gearwheel

stochri
02.01.2007, 08:40
Hallo Stallion,

es gilt allerdings zu bedenken, dass die Tick Auflösung nur ungefähr 2mm beträgt. Man kann sich also überlegen, ob sich die Einführung eines genaueren Faktors lohnt.

Der noch in der alten Lib enthaltene Faktor stammt aus der Go() Funktion ohne Encodersteuerung in denen die Motoren rein zeitlich gesteuert waren. Der Faktor stellt den Zusammenhang zwischen Zeitdauer der Motoransteuerung und der gefahrenen Wegstrecke dar und muss deshalb für die Encoder gesteuerte Funktion entsprechend geändert werden.

Wenn Du eine Herausforderung für eine genaue Positionssteuerung des ASURO suchst, kannst Du Dich dem Problem des Haus vom Nikolaus zuwenden: https://www.roboternetz.de/phpBB2/viewtopic.php?p=236737#236737

hier gibt es noch einiges an Verbesserungspotential.

Gruss,
stochri

Stallion
02.01.2007, 15:07
es gilt allerdings zu bedenken, dass die Tick Auflösung nur ungefähr 2mm beträgt. Man kann sich also überlegen, ob sich die Einführung eines genaueren Faktors lohnt.
Naja, aber trotzdem, Zentimeter sind zu grob, da eignen sich mm besser.


Wenn Du eine Herausforderung für eine genaue Positionssteuerung des ASURO suchst, kannst Du Dich dem Problem des Haus vom Nikolaus zuwenden: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=236737#236737
hier gibt es noch einiges an Verbesserungspotential.
Ich hab mit meiner modifizierten Asuro-Lib. ein ganz gutes Häuschen hingebracht. Vielleicht poste ich später mal ein paar Bilder und die Modifikationen in dem Thread.

Wobei es aus meinem Standpunkt etwas einfacher ist, da es zum Zeitpunkt des Wettbewerbs ja noch keine Go und Turn gab. Es ist also nicht mehr ganz so schwer sowas zu schaffen.

stochri
02.01.2007, 18:15
Ich hab mit meiner modifizierten Asuro-Lib. ein ganz gutes Häuschen hingebracht. Vielleicht poste ich später mal ein paar Bilder und die Modifikationen in dem Thread.

Es wäre nicht schlecht, wenn Du dasl posten würdest. Vielleicht sind Deine Routinen besser als die alten und man kann sie in einer neuen Lib einbauen. O:)

Gruss,
stochri