Högpresterande rad efterföljare Robot (10 / 12 steg)
Steg 10: De vägda genomsnittliga
Detta är en av de viktigaste algoritmer som vi använder för att göra den högpresterande rad efterföljaren så bra som möjligt. Den vägda genomsnittliga (du kan söka om det på Wikipedia) är ett genomsnitt där varje del av deras villkor har en annan betydelse vikt. Medlemmarna i den genomsnittliga med högre värde påverka mer resultatet av ekvationen, medan de med lägre värde påverkar det bara något. Varför måste vi använda denna typ av genomsnittet? Eftersom vi inte kommer att göra en enkel linje anhängare med något så enkelt som detta
om (S1 se svart) {
Left();
} else om (S2 se svart) {
Right();
} annat {
Front();
}
Vi gör en högpresterande robot, så vi behöver att beräkna en exakt uppskattning av där är centrera av den linje vi följer. Hur beräknar vi det? Med det vägda genomsnittliga. Vi får 5 center cny70 värdena på varje programplaneringscykeln, (vart och ett av dessa värden går från 0-svart till 1024-vit), och vi måste omvandla dessa 5 värden till ett enda värde som säger att där är centrera av den linje vi efter. För att komma till vårt mål kommer vi tilldela ett position värde till varje sensor. Denna ståndpunkt värde definieras som det värde formeln skulle ge om mitten av raden är exakt fokuserad på mitten av sensorn. Detta är naturligtvis teoretiskt men varje sensor kommer att försöka göra positionsvärdet för nära dess värde. Om en sensor läser mer vita än andra, då blir formelresultatet mer nära dess Placera värde än den andra.
Så, av de 5 sensorerna, firsts sensorn kommer att tilldelas 0 medan de femte 4000. Detta innebär att positionsvärdet vi ska läsa kommer att vara i intervallet 0-4000. 2000 innebär linjen exakt i mitten av sensorn matrisen. Om roboten upptäcker vi har just förlorat spåret kommer att sedan positionsvärdet fastställas till 0 eller 4000 till sista värdet läsa. I detta fall vi kallat den första sensorn-2000 och femte sensorn 2000 och sedan vi minskar intervallet från - 2000,2000 till-200,200
void Ponderado() {summan = 0;
Division = 0;
Nove = 0;
char center;
för (x = 0; x < = 6; x ++) {
** Detta makro gör
IF(T(x) > amax[x]) {
w = amax [x];
} annat if(T(x) < amin[x]) {
w = amin [x];
} annat {
w=T(x);
}***/
w = ran(T(x),amin[x],amax[x]);
w-= amin [x];
w * = (ll) 1000;
w = (amax[x]-amin[x]);
om (w > TH) {
Nove = 1;
}
om (x == 3) {
om (w > TH) {center = 1;} annat {center = 0;} ///We lagra här om center sensorn läser 0 eller 1000
}
A är vikten
B är ståndpunkten
om (x == 0 eller x == 6) {fortsätta;} ///We ignorera sensorerna 0 och 6
v = (1000) * (x-3); ///This variabeln att vara-2000,-1000,0,1000,2000 i varje cykel
summa += (w * v);
Division += (w);
}
om (nove == 0) {///if vi inte ser linjen POSICION = POSICION > 0? 200: - 200; ///Now vi ange värdet därmed den sista värdet set. om posicion är > 0 sedan posicion är lika med 200, om inte det är lika med -200
} annat {
POSICION = (ll)(sum) / (ll)(division); Vi får det vägda genomsnittliga resultatet
POSICION = 10. Vi ändrar skalan från - 2000,2000 till-200,200
}
}