calculateError ()

O conjunto de sensores possui cinco sensores posicionados simetricamente em torno da linha central do robô. O objectivo dos sensores é determinar a distância entre o robô e o centro do robô. Dependendo desta distância, o robô pode então corrigir-se para estar de volta aos trilhos. Mas para fazer isso, a magnitude dessa distância precisa ser conhecida. Em outras palavras: o desvio, ou erro , precisa ser calculado.

Decidimos dar uma contribuição positiva para o lado direito da linha central. Essa convenção é mostrada na Figura 1.


Figura 1: Matriz do Sensor.

Quando o robô é o próximo no curso, os sensores detectam uma superfície preta ou branca. Na maioria das vezes, é mais difícil determinar o desvio atual do robô. A figura 2 mostra um conjunto de valores dados pelos sensores.


Figura 2: Exemplo de valores dos sensores.

Quando olhamos para a Figura 2, nós (humanos) podemos estimar que a linha preta está localizada entre o sensor 3 e o sensor 4. Essa é uma estimativa , mas não um número exato . Como não podemos colocar um número infinito de sensores infinitamente pequenos no conjunto de sensores, temos um conjunto discreto de pontos de dados. Felizmente para nós, existe algo chamado ‘interpolação’. Uma definição de acordo com a Wikipedia: “A interpolação é um método de construção de novos pontos de dados dentro da faixa de um conjunto discreto de pontos de dados conhecidos.”  
Existem várias maneiras de interpolar, mas usaremos um método que é (em nossa opinião) o mais simples de todos: o método da média ponderada (também chamado de média aritmética ponderada). Este método é usado às vezes em sistemas de controle de lógica difusa para encontrar o resultado para a saída do controlador (= defuzzification ).
O método da média ponderada é a média da média de um conjunto. Cada ponto de dados tem um certo “peso”. Para o nosso robô, o peso de um ponto de dados no centro do robô (em milímetros!). O resultado, ou a média ponderada, também será uma distância em milímetros. A figura 3 mostra os sensores e seu peso.


Figura 3:  
Sensores e seus pesos (em mm).

O método da média ponderada pode ser calculado matematicamente com a seguinte equação. Já está aplicado nos seis sensores da matriz:

onde i é o peso e i é os dados do sensor.
Aqui está um exemplo de como isso funciona. O exemplo usa os mesmos pontos de dados, como na Figura 2. 

Como já mencionado, o resultado é expresso em milímetros. A Figura 4 mostra o resultado no gráfico da Figura 2.


Figura 4: Valores e resultados do sensor.

O resultado é negativo, o que significa que a linha preta está no lado esquerdo do centro do robô. O erro está entre -5,08 mm e -15,24 mm. Isso significa que a linha preta está localizada entre o sensor 3 e o sensor 4, assim como determinamos anteriormente. Assim, podemos concluir que esse método proporcionará um bom resultado.
Agora vem a matemática no código de programação. Primeiro, vamos dar uma olhada novamente na equação.

Nós dividimos a equação em dois membros: o numerador e o denominador. Isso tornará o código mais legível. Todas as variáveis ​​são números de ponto flutuante, então o código será parecido com:

float calculateError ()
{
float num = (-25.4 * (valores de sensor [0] - valores do sensor [5])) + (-15.24 * (valores do sensor de [1] - valores do sensor [4])) + (-5.08 * (valores de sensor [2] - valores do sensor [3 ]));

float denom = sensorValues ​​[0] + sensorValues ​​[1] + sensorValues ​​[2] + sensorValues ​​[3] + sensorValues ​​[4] + sensorValues ​​[5];

float error = num / denom;

return error ;
} 

Colocamos o código em uma função chamada ‘calculateError ()’, que retorna um float. O programa principal é mais estruturado quando as sub-rotinas são usadas.

Deixe uma resposta