harry3
03.07.2007, 23:58
Hallo!
Das ist mein erster Beitrag hier. Kurz zu meiner Person: Bin 20J., habe mich zwar schon längers für Elektronik, Computer usw. interessiert, asuro ist aber mein erster Roboter. Dieser ist nun 5 Tage alt.
Mein erstes Ziel war es, dem asuro das Geradeausfahren beizubringen. Gar nicht so einfach, wie ich anfangs dachte. Inzwischen klappts relativ gut. Allerdings hat er manchmal einen kurzzeitigen Ausrutscher was die Geradeausfahrt betrifft, scheinbar misst er falsche Geschwindigkeiten, sprich, da hats was mit der Odometrie. Soweit ich es testen konnte sind meine Funktionen aber OK, also scheints an der Hardware zu liegen. Kann es sein dass hin und herutschende Zahnräder mit dem Hell Dunkel Muster zu dem Problem führen?
Oder bringt es was wenn man mit schwarzem Stift den Außenrand des Zahnrades anmalt, welches nicht mit dem Aufkleber bedeckt ist. Oder gibt es sonst irgendwelche Tricks wie man die Odometrie verbessern könnte?
Andere Frage: Wie genau habt ihr mit Euren Programmen das Geradeausfahren hinbekommen? Also ich mein jetzt nicht empirisch den Unterschied von linken und rechtem Motor messen und dann als Korrekturwert eintragen, sondern richtig mit Odometriemesswerten und dementsprechender Regelung?
Bei mir klappts ein paar Meter lang ganz gut, aber ich möchte nicht wissen wo er landet wenn man ihn 1min oder länger fahren lässt.
Anbei noch der zugehörige Programmcode(verwende Asurolib 2.70).
Grüße,
Harri
/*
Erste Experimente mit Asuro.
3.7.2007
von harry3
*/
#define MAX_DIFF 5
#define KORREKTUR 10
#define MSTART_L 140
#define MSTART_R 140
#define ZEITKONST 500
#define TASTER(x) (unsigned char)(1<<(x-1))
#include "asuro.h"
void odometrie_auswertung(int,int*,int*);
int main(void)
{
unsigned char mspeed_l=MSTART_L,mspeed_r=MSTART_R,temp=0;
unsigned int array_l[3]={0},array_r[3]={0},odata[2]={0},timer=0;
signed int counter_l=0,counter_r=0;
Init();
while(temp<5)
{
temp++;
PollSwitch();
}
while(1)
{
temp=PollSwitch();
if(temp==TASTER(2) || temp==TASTER(5))
break;
else
{
MotorDir(FWD,FWD);
MotorSpeed(mspeed_l,mspeed_r);
OdometrieData(odata);
odometrie_auswertung(odata[0],array_l,&counter_l);
odometrie_auswertung(odata[1],array_r,&counter_r);
if(timer>ZEITKONST)
{
if( (counter_l-counter_r) > MAX_DIFF && mspeed_r<=(255-KORREKTUR))
mspeed_r=mspeed_r+KORREKTUR;
else if( (counter_r-counter_l) > MAX_DIFF && mspeed_r>KORREKTUR)
mspeed_r=mspeed_r-KORREKTUR;
counter_l=0;
counter_r=0;
timer=0;
}
timer++;
Msleep(1);
}
}
MotorDir(BREAK,BREAK);
//In Endlosschleife verbleiben
while(1);
return 0;
}
void odometrie_auswertung(int eingabe,int* zwsp,int* counter)
{
zwsp[2]=zwsp[1];
zwsp[1]=zwsp[0];
zwsp[0]=eingabe;
if(zwsp[1]>zwsp[0] && zwsp[1]>zwsp[2])
(*counter)++;
else if(zwsp[1]<zwsp[0] && zwsp[1]<zwsp[2])
(*counter)++;
return;
}
Das ist mein erster Beitrag hier. Kurz zu meiner Person: Bin 20J., habe mich zwar schon längers für Elektronik, Computer usw. interessiert, asuro ist aber mein erster Roboter. Dieser ist nun 5 Tage alt.
Mein erstes Ziel war es, dem asuro das Geradeausfahren beizubringen. Gar nicht so einfach, wie ich anfangs dachte. Inzwischen klappts relativ gut. Allerdings hat er manchmal einen kurzzeitigen Ausrutscher was die Geradeausfahrt betrifft, scheinbar misst er falsche Geschwindigkeiten, sprich, da hats was mit der Odometrie. Soweit ich es testen konnte sind meine Funktionen aber OK, also scheints an der Hardware zu liegen. Kann es sein dass hin und herutschende Zahnräder mit dem Hell Dunkel Muster zu dem Problem führen?
Oder bringt es was wenn man mit schwarzem Stift den Außenrand des Zahnrades anmalt, welches nicht mit dem Aufkleber bedeckt ist. Oder gibt es sonst irgendwelche Tricks wie man die Odometrie verbessern könnte?
Andere Frage: Wie genau habt ihr mit Euren Programmen das Geradeausfahren hinbekommen? Also ich mein jetzt nicht empirisch den Unterschied von linken und rechtem Motor messen und dann als Korrekturwert eintragen, sondern richtig mit Odometriemesswerten und dementsprechender Regelung?
Bei mir klappts ein paar Meter lang ganz gut, aber ich möchte nicht wissen wo er landet wenn man ihn 1min oder länger fahren lässt.
Anbei noch der zugehörige Programmcode(verwende Asurolib 2.70).
Grüße,
Harri
/*
Erste Experimente mit Asuro.
3.7.2007
von harry3
*/
#define MAX_DIFF 5
#define KORREKTUR 10
#define MSTART_L 140
#define MSTART_R 140
#define ZEITKONST 500
#define TASTER(x) (unsigned char)(1<<(x-1))
#include "asuro.h"
void odometrie_auswertung(int,int*,int*);
int main(void)
{
unsigned char mspeed_l=MSTART_L,mspeed_r=MSTART_R,temp=0;
unsigned int array_l[3]={0},array_r[3]={0},odata[2]={0},timer=0;
signed int counter_l=0,counter_r=0;
Init();
while(temp<5)
{
temp++;
PollSwitch();
}
while(1)
{
temp=PollSwitch();
if(temp==TASTER(2) || temp==TASTER(5))
break;
else
{
MotorDir(FWD,FWD);
MotorSpeed(mspeed_l,mspeed_r);
OdometrieData(odata);
odometrie_auswertung(odata[0],array_l,&counter_l);
odometrie_auswertung(odata[1],array_r,&counter_r);
if(timer>ZEITKONST)
{
if( (counter_l-counter_r) > MAX_DIFF && mspeed_r<=(255-KORREKTUR))
mspeed_r=mspeed_r+KORREKTUR;
else if( (counter_r-counter_l) > MAX_DIFF && mspeed_r>KORREKTUR)
mspeed_r=mspeed_r-KORREKTUR;
counter_l=0;
counter_r=0;
timer=0;
}
timer++;
Msleep(1);
}
}
MotorDir(BREAK,BREAK);
//In Endlosschleife verbleiben
while(1);
return 0;
}
void odometrie_auswertung(int eingabe,int* zwsp,int* counter)
{
zwsp[2]=zwsp[1];
zwsp[1]=zwsp[0];
zwsp[0]=eingabe;
if(zwsp[1]>zwsp[0] && zwsp[1]>zwsp[2])
(*counter)++;
else if(zwsp[1]<zwsp[0] && zwsp[1]<zwsp[2])
(*counter)++;
return;
}