Projekte.ctBot2_OberlaenderLi.unterseite8 (Struktur)


Problem 8: Test der Kollisionserkennung

Die Kollisionserkennung funktionierte an und für sich recht gut. Hin und wieder ist der Roboter jedoch gegen ein Hindernis gefahren.

kollisionserkennung.c

void kollisionserkennung(void){

int left_speed=40,right_speed=40,minus_speed=-40;
	
	if (abs(entfernung(adc_wert[1]))> 17 && abs(entfernung(adc_wert[0]))> 17){
	 
	    led_aus(LED_ALL);  
		CTMotor(left_speed,right_speed);
	}

    else if (abs(entfernung(adc_wert[0])) <= 17 && abs(entfernung(adc_wert[1]))<= 17){
	    
		CTMotor(left_speed,minus_speed);
		led_set(LED_LINKS);               // wieso links ?
			
		if (abs(entfernung(adc_wert[1]))< 17 && abs(entfernung(adc_wert[0]))< 17 && abs(entfernung(adc_wert[0]))==abs(entfernung(adc_wert[1]))){
		
	        led_aus(LED_ALL);
		    CTMotor(left_speed,right_speed); // vorwaerts
	    }
	}	 	
	
	else if ( abs(entfernung(adc_wert[0]))<= 17 &&  abs(entfernung(adc_wert[1]))> 17){
	
		CTMotor(left_speed,minus_speed);
		led_set(LED_RECHTS);
		
		if (abs(entfernung(adc_wert[1]))< 17 && abs(entfernung(adc_wert[0]))< 17 && abs(entfernung(adc_wert[0]))==abs(entfernung(adc_wert[1]))){
		
	        led_aus(LED_ALL);
	        CTMotor(left_speed,right_speed); // vorwaerts
	    }
	}
		
	else if (abs(entfernung(adc_wert[1])) <= 17 && abs(entfernung(adc_wert[0]))> 17){
	    
		CTMotor(minus_speed,right_speed);
		led_set(LED_LINKS);
		
		if (abs(entfernung(adc_wert[1]))< 17 && abs(entfernung(adc_wert[0]))< 17 && abs(entfernung(adc_wert[0]))==abs(entfernung(adc_wert[1]))){
		
	        led_aus(LED_ALL);
		    CTMotor(left_speed,right_speed); // vorwaerts
	    }
	}	
}

Da der c't-Bot aufgrund der Überlänge der Kabel keinen schlanken Umfang besitzt, war es ratsam, die Distanz bis zum Hindernis zu vergrößern. Der neue Grenzwert wurde auf 20 cm festgelegt. Auf diese Weise eckt der Roboter nicht mehr so leicht an einer Wand an. Außerdem wird jetzt für den Fall, dass der c't-Bot eine geringere Distanz als 20 cm zu einem Hindernis aufweist, vorgeschrieben, dass er rückwärts fahren soll. Im alten Code sollte er in diesem Fall genau das Gegenteil tun.

kollisionserkennung_neu.c

void kollisionserkennung(void)
{
int left_speed=40,right_speed=40,minus_speed=-40;   

	if (abs(entfernung(adc_wert[1]))> 20 && abs(entfernung(adc_wert[0]))> 20) //wenn rechter u. linker Distanzsensor > 20
	{

	    led_aus(LED_ALL);
		CTMotor(left_speed,right_speed);   // geradeaus (kein wirkliches geradeaus, eher eine Kurve)
	}

    	else if (abs(entfernung(adc_wert[0])) <= 20 && abs(entfernung(adc_wert[1]))<= 20)// wenn beide <= 20
	{

		CTMotor(left_speed,minus_speed);   // flotte Rechtsdrehung

		led_set(LED_RECHTS);               // Rechtssblinker LED an  (das ist neu, vorher LED_LINKS)

		if (abs(entfernung(adc_wert[1]))< 20 && abs(entfernung(adc_wert[0]))< 20 && abs(entfernung(adc_wert[0]))==abs(entfernung(adc_wert[1])))
		                                     // wenn beide Distanzsensoren < 20 & Distanz bei beiden gleich
                {
            	led_aus(LED_ALL);
		CTMotor(minus_speed,minus_speed);   // rueckwaerts (das ist neu)
	    	}
	}

	else if ( abs(entfernung(adc_wert[0]))<= 20 &&  abs(entfernung(adc_wert[1]))> 20) // wenn linker Sens. <= 20  &  rechter > 20
       {
		CTMotor(left_speed,minus_speed);    // flotte Rechtsdrehung (logisch)
		led_set(LED_RECHTS);                // Rechtsblinker LED an

		if (abs(entfernung(adc_wert[1]))< 20 && abs(entfernung(adc_wert[0]))< 20 && abs(entfernung(adc_wert[0]))==abs(entfernung(adc_wert[1])))
						             // wenn beide Sensoren < 20 &  Distanz bei beiden gleich
		{	        
		led_aus(LED_ALL);
	        CTMotor(minus_speed,minus_speed); // rueckwaerts (das ist neu)
	        }
	}

	else if (abs(entfernung(adc_wert[1])) <= 20 && abs(entfernung(adc_wert[0]))> 20)// wenn rechter Sens. <= 20  &  linker Sens. > 20
	{
		CTMotor(minus_speed,right_speed);   // flotte Linksdrehung (logisch)
		led_set(LED_LINKS);                 // Linksblinker LED an

		if (abs(entfernung(adc_wert[1]))< 20 && abs(entfernung(adc_wert[0]))< 20 && abs(entfernung(adc_wert[0]))==abs(entfernung(adc_wert[1])))
							    // wenn beide Sensoren < 20  &  Distanz bei beiden gleich
		{		                            
	        led_aus(LED_ALL);
		    CTMotor(minus_speed,minus_speed); // rueckwaerts (das ist neu)
	        }
	}
}


Autor: ifko, Letzte Änderung: 19.09.2008 19:44:13


 TU Clausthal 2020  Impressum