PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kurven-Fahr-Funktion



HAWK-Matze
24.01.2008, 15:31
Gibt es eine Funktion, die mit hilfe der Odometrie den Asuro eine kurve mit vorgegeben radius fahren lässt? Wenn nicht würde ich mich mal dran machen sowas zu schreiben

damaltor
24.01.2008, 16:23
Nur zu! =)
*textfüller*

JensK
24.01.2008, 17:27
@damaltor: :P sinnvoller beitrag :Haue
es sollte mal in dem forum ein sinnlosen Offtopic spam bereich geben.. ohne postcounter... :)

@topic: ne ich hab grad mal gegoogled und google warf nix aus.. also gibt es sowas auch nicht. Ich weiß auch von keinem. aber wozu soll das gut sein? zum malen?

HAWK-Matze
24.01.2008, 17:34
Ja unter anderem... plane nen paar wettkämpfe gegen einen lego-ich koste 300 euro-mindstorm!!

JensK
24.01.2008, 17:47
Ja unter anderem... plane nen paar wettkämpfe gegen einen lego-ich koste 300 euro-mindstorm!!

muss man den teilsatz verstehen? :)
kostet der mindstorm jez 300€ oder du?

mit dem zeichnen ist das so ein ding... lies dir mal 2 beiträge dazu hier im board durch... findest du schon in der sufu.. einer ist ziemlich aktuell und der andere ein bissl älter..

HAWK-Matze
24.01.2008, 17:47
Ich bin unbezahlbar [-( ;-) , der mindstorm kostet 300 euro.
Hier mein erster nicht funktionierender entwurf.
Asuro dreht sich nur auf der stelle, aber in die richtige Richtung!!!
Wie fügt man einen quellcode und smylies hinzu?


#include "asuro.h"
#include "myasuro.h"

#define pi 3.141592654
#define halberradstand 52

void move(char geschwindigkeit, int strecke, unsigned int radius, int winkel);

void main (void)
{
Init();
EncoderInit();
move(200,200,0,-100);
}

void move(char geschwindigkeit, int strecke, unsigned int radius, int winkel)
{
int odoziellinks, odozielrechts, odolinks=0, odorechts=0;
int vl, vr;

Init();
EncoderInit();

if (strecke == 0) strecke=abs(radius*pi*winkel / 180);
else if (radius == 0) radius=abs(180*strecke / (winkel*pi));
else if (winkel == 0) winkel=abs(180*strecke / (radius*pi));

if(winkel>0) //Rechtskurve
{
odoziellinks=abs((radius+halberradstand)*pi*winkel *10000L / (180*MY_GO_ENC_COUNT_VALUE));
odozielrechts=abs((radius-halberradstand)*pi*winkel*10000L / (180*MY_GO_ENC_COUNT_VALUE));
}
else
{
odoziellinks=abs((radius-halberradstand)*pi*winkel*10000L / (180*MY_GO_ENC_COUNT_VALUE));
odozielrechts=abs((radius+halberradstand)*pi*winke l*10000L / (180*MY_GO_ENC_COUNT_VALUE));
}

vl=geschwindigkeit*odoziellinks/odozielrechts;
vr=geschwindigkeit*odozielrechts/odoziellinks;

if(strecke >= 0) MotorDir(FWD,FWD);
else MotorDir(RWD,RWD);

EncoderSet (0, 0);

while(vl!=0 && vr!=0)
{
MotorSpeed(vl,vr);

odolinks += encoder [LEFT];
odorechts += encoder [RIGHT];

EncoderSet (0, 0);

if(odolinks/odorechts < odoziellinks/odozielrechts) {vl++; vr--;}
else if (odolinks/odorechts > odoziellinks/odozielrechts) {vl--; vr++;}

if(odolinks>=odoziellinks) vl=0;
if(odorechts>=odozielrechts) vr=0;
}
}

JensK
24.01.2008, 17:53
ja smilies haste ja zugefügt.... und quellcode mit dem button "Code"


test

radbruch
24.01.2008, 19:32
Hallo

Hauptsächliches Problem: Du verwendest nur Integervariablen für deine teilweise recht umfangreichen Berechnungen. Scheinbar ist dir nicht klar, das bei allen Ergebnissen (und auch bei den Zwischenwerten auf dem Rechenweg) die Nachkommastellen abgeschnitten werden. Du solltest zumindest den Datentyp "float" verwenden...

Noch ein Tipp zur Optimierung: Wiederkehrende Berechnungen sollte man einmalig ausrechnen, wenn die Berechnung mehrfach vorkommt oder sich das Ergebniss innerhalb der Schleife nicht ändert:

if(odolinks/odorechts < odoziellinks/odozielrechts) {vl++; vr--;}
else if (odolinks/odorechts > odoziellinks/odozielrechts) {vl--; vr++;}

Gruß

mic

HAWK-Matze
25.01.2008, 16:29
das die nachkomma stellen abgeschnitten werden war mir klar... wollte so wenig speicher wie möglich verwenden... aber das macht ja keinen unterschied... werde deine tipps beherzigen... der code ist doch schon recht groß... komme aber erst nächste woche dazu... schreibe noch ne klausur

robo.fr
25.01.2008, 18:22
Hallo HAWK-Matze,

was für Wettkämpfe habt Ihr denn so angedacht? Was habt Ihr für Regeln? Wir sind auch noch auf der Suche nach ein paar Ideen. Einen Linienfolgewettbewerb möchte ich aber nicht veranstalten, davon gibt's schon zu viele. Hier (http://roboterclub-freiburg.pbwiki.com/) ist die Doku für unseren Wettbewerb. ( Noch ein wenig im Aufbau begriffen )

robo.fr
26.01.2008, 07:32
Nach einigem Suchen hier im Forum bin ich auf einen Thread gestoßen, bei dem HansZ schon einmal eine Kurvenfahrfunktion programmiert hat:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=27008