Stap 10: De gewogen gemiddelde
Dit is een van de meest belangrijke algoritmen we gebruiken voor de krachtige lijn volgeling zo goed als mogelijk te maken. De gewogen gemiddelde (u kunt erover op Wikipediazoeken) is een gemiddelde waar elk deel van hun ambtsperiode heeft een gewicht van de verschillende belang. De leden van de gemiddelde met hogere waarde invloed meer op het resultaat van de vergelijking, terwijl degenen met lagere waarde slechts in geringe mate beïnvloeden. Waarom moeten we dit soort gemiddelde gebruiken? Omdat we niet een volgeling van de eenvoudige regel maken met iets eenvoudigs als dit
if (S1 see black){ Left(); }else if (S2 see black){ Right(); }else{ Front(); }
We maken een krachtige robot, dus we moeten voor de berekening van een nauwkeurige schatting van waar het centrum is van de lijn die wij volgen. Hoe berekenen we dit? Met het gewogen gemiddelde. Zullen we de waarden van de cny70 5 center op elke programmeringscyclus, (elk van deze waarden gaat van 0-zwart 1024-wit), en we moeten transformeren deze 5 waarden een enkele waarde die zegt waar is het centrum van de lijn die we na. Om naar ons doel zullen we een positiewaarde toewijzen aan elke sensor. Deze positiewaarde wordt gedefinieerd als de waarde die de formule geven zou als het midden van de lijn precies op het midden van de sensor gericht is. Natuurlijk is dit theoretische maar elke sensor zal proberen te maken van de positiewaarde in de buurt van de waarde. Als een sensor meer wit dan andere leest, dan is het resultaat van de formule zullen meer in de buurt van de plaats waarde dan de andere.
Dus, van de 5 sensoren, de primeurs sensor krijgt 0 terwijl de vijfde 4000. Dit betekent dat de positiewaarde die we read is gonna be in het bereik 0-4000. 2000 houdt de regel precies in het midden van de sensor-array. Als de robot detecteren dat we net hebben verloren de track vervolgens zal de positiewaarde worden ingesteld op 0 of 4000 dienovereenkomstig naar de laatste waarde die lezen. In dit geval we noemden de eerste sensor-2000 en de vijfde sensor 2000 en vervolgens verlaagd we het bereik van - 2000,2000 tot-200,200
void Ponderado(){ sum = 0; division = 0; nove = 0; char center; for (x = 0;x <= 6;x++){ **This MACRO makes if(T(x)>amax[x]){ w=amax[x]; }else if(T(x) < amin[x]){ w=amin[x]; }else{ w=T(x); }***/ w = ran(T(x),amin[x],amax[x]); w -= amin[x]; w *= (ll)1000; w /= (amax[x]-amin[x]); if (w > TH){ nove = 1; } if (x == 3){ if (w > TH){ center = 1; }else{ center = 0; } ///We store here if the center sensor reads 0 or 1000 } ///A is the weight ///B is the position if (x == 0 or x == 6){ continue; } ///We ignore the sensors 0 and 6 v = (1000) * (x-3);///This variable will be -2000,-1000,0,1000,2000 in each cycle sum += (w*v); division += (w); } if (nove == 0){ ///if we don't see the line POSICION = POSICION > 0 ? 200 : - 200; ///Now we set the value accordingly the last value set. if posicion is > to 0 then posicion equals 200, if not it equals -200 }else{ POSICION = (ll)(sum) / (ll)(division); ///We get the weighted average result POSICION /= 10; ///We change the scale from -2000,2000 to -200,200 } }