La logica difusa o lógica heuristica se basa en lo relativo de lo observado, utiliza expresiones que no son ni totalmente ciertas ni completamente falsas (lógica binaria o booleana), es decir, es la lógica aplicada a conceptos que pueden tomar un valor cualquiera de veracidad dentro de un conjunto de valores que oscilan entre dos extremos, la verdad absoluta y la falsedad total.
Según esta teoría, la función que la represente será una función de transferencia (que tomará cualquiera de los valores reales comprendidos en el intervalo [0,1]) la que determine el grado de pertenencia de un elemento a un conjunto.
Vamos a utilizar la siguiente imagen como explicación
- El rectángulo de la izquierda representaría una lógica binaria (blanco o negro),
- El de la derecha representa logica difusa:
Tenemos todo un conjunto de valores posibles, en este caso una escala de grises. Nuestro intervalo se desplaza del blanco al negro, con todos los valores intermedios.La logica difusa se basa en reglas heurísticas de la formaSI (antecedente) ENTONCES (consecuente)donde el antecedente y el consecuente son también conjuntos difusos, ya sea puros o resultado de operar con ellos. Los métodos de inferencia para esta base de reglas deben ser simples, veloces y eficaces. Los resultados de dichos métodos son un área final, fruto de un conjunto de áreas solapadas entre sí (cada área es resultado de una regla de inferencia).Aplicando esto a la robótica, en concreto a la inteligencia artificial, la logica difusa se utiliza para la resolución de una variedad de problemas, principalmente los relacionados con control de procesos industriales complejos y sistemas de decisión en general, la resolución la compresión de datos. Los sistemas basados en logica difusa imitan la forma en que toman decisiones los humanos, con la ventaja de ser mucho más rápidos. Estos sistemas son generalmente robustos y tolerantes a imprecisiones y ruidos en los datos de entrada.En nuestro caso, vamos a aplicar la logica difusa a un caso clásico de toma de decisiones: ¡robot sigue líneas!
La idea es no trabajar solamente con blanco y negro, si no también con los valores intermedios.
Si el sensor está exactamente en el borde, el valor no será ni blanco ni negro, será un valor entre ambos, de tal manera que, cuanto más entra en sensor en la línea, más próximo al negro es el color que se percibe y viceversa.
De esta manera ya no estamos limitados a girar sólo a la derecha o a la izquierda, si no que podremos girar más o menos hacia la derecha o a la izquierda, en función de lo próximos que estemos al negro o al blanco respectivamente. ¿Y si estamos justo en el borde? -> Seguimos rectos.
Para conseguir esto, debemos poder controlar los motores en función de esas variaciones de luz, para lo cual utilizaremos la siguiente fórmula:
Potencia Motor B=(Valor Sensor-Valor Negro)*Factor de corrección
Potencia Motor C=(Valor Blanco-Valor Sensor)*Factor de correcciónPara unos valores de 30 para negro y 70 para blanco, aplicamos un factor de corrección de 2.5 y obtenemos los siguientes resultados.
Valor del sensor Potencia motor B Potencia motor C 30 0 100 40 25 75 50 50 50 60 75 25 70 100 0 NOTA: ¿De donde sale el factor de conversión?
La medidas del sensor están en el intervalo [0,100], igual que la potencia. Debido a las condiciones específicas de los colores de nuestro experimento, no abarcaremos todo el intervalo posible, sólo los valores comprendidos en el intervalo [30,70] por lo que nos veremos obligados a aplicar una corrección. Es recomendable empezar con valores pequeños e ir aumentando progresivamente la corrección para ganar velocidad.
Logica difusa NXT: Veamos la implementación en NXT-G
- 1 variable donde se guarda la información leída por el sensor : Luminosidad
- 3 constantes para los valores conocidos, a saber: Blanco, Negro y Corrección
- Implementación en RobotC:
#pragma config(Sensor, S3, SensorLuz, sensorLightActive) #pragma config(Motor, motorB, , tmotorNormal, PIDControl, ) #pragma config(Motor, motorC, , tmotorNormal, PIDControl, ) //*!!Code automatically generated by 'ROBOTC' configuration wizard!!*// task main(){ const short Negro= 25; const short Blanco= 65; const float correccion =2.5; int Luminosidad=0; while(true){ Luminosidad=SensorValue[SensorLuz]; motor[motorB]= (Luminosidad -Negro)* correccion; motor[motorC]= (Blanco- Luminosidad)* correccion; } }
Vídeo de los resultados
Como se puede apreciar, la navegación es mucho más fluida, no existe cabeceo. El robot trata, en todo momento, de moverse justo por el borde la línea. Y lo consigue con bastante exactitud.
La implementación para NXT está basada en el trabajo de Stefan’s Robots.
Para saber más:
- Logica difusa y NXT en LeJOS: Proyecto NxtFuzzyLogic
- Wikipedia: Logica difusa
- Conceptos Generales sobre logica difusa (PDF): Extracto de una tesis de la UPC