Hier mal ein kleines Video meines Asuros: http://www.zippyvideos.com/5870203996486466/video3/

Die main-Funktion ist nicht besonders interessant, da nur eine Aneinanderreihung von Go und Turn...

Und hier poste ich mal die modifizierten Go und Turn Funktionen der asuro.c. Im Großen und Ganzen entsprechen diese den originalen aus der erweiterten Asuro-Lib auf Sourceforge. Aber vor allem bei der Turn habe ich einiges an den Parametern geändert (mit Abbremsfunktion). Ansonsten habe ich meist noch die Variablentypen und die Reihenfolge angepasst.
Code:
void Go(int distance, unsigned char speed)
{
	unsigned int enc_count = abs(distance);
	unsigned int tot_count = 0;
	signed char diff = 0;
	unsigned char l_speed = speed, r_speed = speed;

	// mm -> ticks
	enc_count /= 2;			// only for 12 fields gearwheel
	
	// set direction
	if(distance < 0) MotorDir(RWD,RWD);
	else MotorDir(FWD,FWD);
	
	// reset encoder
	Encoder_Set(0,0);
	
	// set speed 
	MotorSpeed(l_speed,r_speed);
	
	// do until destination reached
	while(tot_count < enc_count) 
	{
		tot_count += encoder[LEFT];
		
		// calculate speed difference
		diff = encoder[LEFT] - encoder[RIGHT];
		
		// reset encoder
		Encoder_Set(0,0);
		
		if (diff > 0) 		//Left faster than right
		{ 
			if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
			else r_speed += 10;
		}
		if (diff < 0)		//Right faster than left
		{ 
			if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
			else l_speed += 10;
		}
		
		// set new speeds
		MotorSpeed(l_speed,r_speed);
		Sleep(36);
	}
	// Stop
	MotorSpeed(0,0);
	MotorDir(BREAK,BREAK);
	Msleep(200);
}


void Turn(int degree, unsigned char speed)
{
	unsigned int enc_count;
	unsigned int tot_count = 0;
	int diff = 0;
	unsigned char l_speed = speed, r_speed = speed;
	
	// degree -> tick
	enc_count = (unsigned int) (((long)abs(degree) * (long)4080) / (long)10000);
	
	// set direction
	if(degree < 0) MotorDir(RWD,FWD);
	else MotorDir(FWD,RWD);
	
	// reset encoder
	Encoder_Set(0,0);
	
	// set speed
	MotorSpeed(l_speed,r_speed);

	// do until angel reached
	while(tot_count < enc_count) 
	{
		tot_count += encoder[LEFT];
		
		// calculate speed difference
		diff = encoder[LEFT] - encoder[RIGHT];
		
		// reset encoder
		Encoder_Set(0,0);
		
		// calculate new speed
		if (diff > 0)					//Left faster than right
		{ 
			if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
			else r_speed += 10;
		}
		if (diff < 0)					//Right faster than left
		{ 
			if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
			else l_speed += 10;
		}
		
		// set new speed, with slow down
		MotorSpeed(l_speed - (unsigned char) ((unsigned int)(l_speed) / enc_count),r_speed - (unsigned char) ((unsigned int)(r_speed) / enc_count));
		Sleep(36);
	}
	// stop
	MotorSpeed(0,0);
	MotorDir(BREAK,BREAK);
	Msleep(200);
}
Ist zwar noch immer nicht ganz 100%, aber das liegt wohl an der Ungenauigkeit der Odometrie. Ich werde versuchen es noch etwas zu verbessern; mal schauen, was ich noch erreichen kann.