Como ya sabemos, el aprendizaje es la clave en un sistema de IA. En nuestro caso apostaremos por un sistema supervisado lo más sencillo posible. Aplicaremos un mecanismo de machine learning, como es la regresión lineal que hemos estudiado en el aprendizaje previo con el lenguaje de programación Python.
Para ello he programado un fichero al que he llamado model.py y que está en la misma carpeta que linefollower.csv:
from pandas import read_csv
from sklearn.linear_model import LinearRegression
from microlearn.offloader import Offload
dataset = read_csv('linefollower.csv', sep=',', header=0)
X_train = dataset.loc[:, 'SensorIzq':'SensorDch'].to_numpy()
Y_train = dataset.loc[:, 'Robot'].to_numpy()
predictor = LinearRegression(n_jobs=-1)
predictor.fit(X=X_train, y=Y_train)
off = Offload(predictor)
off.export_to_arduino('linefollower.ino')
He optado por quitar de este fichero todo lo que viene siendo la representación gráfica de los datos, y dejado sólo la parte de aprendizaje para la obtención de los coeficientes de la regresión lineal. El código en si es bastante sencillo, pues se basa en la lectura del fichero linefollower.csv que creamos en la unidad anterior mediante el bloque representación. A continuación definimos dos variables; X_train e Y_train cada una con la información correspondiente de los sensores y por otro lado del robot.
Una vez realizada la predicción, usamos una librería nueva llamada Offload que nos va a permitir crear una plantilla para Arduino con el modelo de aprendizaje creado. Veamos el código de ese programa:
//This code was autogenerated using micro-learn.
//Use the dummy variable array 'data' to interact with the ML inference.
double w[] = {2.0, 0.9999999999999996};
double c = 2.220446049250313e-16;
void setup() {
Serial.begin(9600);
}
void loop() {
//Data Section: To Be Coded Manually
float data[2]; //This is your feature vector. Retrive your data into this array.
//ML Inference Section
double prediction = 0.0;
for(int i=0; i<2; i++)
{
prediction += data[i]*w[i];
}
prediction += c;
//Do something with the prediction.
Serial.println(prediction);
delay(1000);
}
En la parte superior nuestro script Python nos ha puesto los coeficientes de la Regresión Lineal para luego, dentro del loop poder usarlos.
De este modo hemos finalizado el estudio de las 3 unidades planteadas; Percepción/Actuación, Representación/Razonamiento y Aprendizaje. En el apartado siguiente de Conclusión, veremos cómo mediante el trabajo realizado en las 3 unidades tendremos el seguidor de línea listo para su puesta en marcha.