CAPÍTULO 5:
PROGRAMAS PARA EL NXT
DESDE MSRS
5.1 - PROGRAMA DE TRIBOT EXPLORADOR POR
ULTRASONIDOS
Ahora podemos pasar a comentar cómo realizar un programa mediante el cual, nuestro
robot se moverá de forma autónoma esquivando obstáculos11
.
Al igual que el programa anterior (de control mediante joystick), podemos ejecutarlo en
simulación o sobre un robot real. Puesto que vamos a ir enfocando cada vez más nuestro
trabajo al diseño del Lego NXT, partiremos del módulo específico que MSRS posee
para este robot: el NxtBrick Service.
Es muy importante notar que en función de que usemos un manifiesto real o de
simulación deberemos configurar las propiedades iniciales del módulo. En concreto, el
puerto serie por el que se debería conectar mediante Bluetooth con el robot real.
En principio, trataremos el problema como si fuera una conexión de este tipo con
nuestro propio tribot NXT.
Paso uno: Añadir un módulo de ultrasonidos.
El módulo en cuestión se denomina "Lego NXT Ultrasonic Sensor (v2)" e irá conectado
al puerto de sensores número 4 (esta especificación viene dada por el manual adjunto al
brick del NXT).
Le daremos al sensor un nombre y dejaremos la frecuencia de sondeo (Polling
Frequency) ajustada a 0, valor por defecto.
Paso dos: Diferenciación de situaciones y toma de decisión.
La señal que emita el sensor de ultrasonidos será recibida por el programa, que deberá
distinguir entre tres casos: si tenemos un obstáculo a corta distancia, a media distancia o
si el terreno aparece despejado.
Para ello, seleccionamos un bloque “if” y diferenciamos entre una distancia inferior a 50
cm (corta), inferior a 90 cm (media) o superior a 90 cm (terreno despejado).
La orden mandada a los motores estará condicionada por la señal que se reciba desde el
sensor según el paso tres.
Seleccionaremos el nodo de notificaciones redondo del sensor de ultrasonidos y lo
arrastraremos para conectarlo al bloque “if”. Esto indica que capturaremos
notificaciones del sensor para su evaluación.
Al realizar la conexión se abrirá el cuadro correspondiente a las opciones de la misma.
Seleccionamos “From SonarSensorUpdate” y pulsamos OK.
En el cuadro “if” escribiremos un espacio. Eso hará aparecer un menú desplegable que
indica los valores que están disponibles desde el sensor. Seleccionaremos “Distance <
50”, lo que significa “cuando la distancia sea inferior a 50 cm”.
Si presionamos el signo “+” en la esquina superior izquierda del bloque “if” podemos
añadir las otras dos condiciones: "Distance < 90" y "Else"
Paso tres: Órdenes enviadas a los motores.
Usaremos tres módulos NxtDrive (uno para cada caso descrito anteriormente).
Obsérvese cómo se configuran las propiedades iniciales de estos módulos para hacerlos
compatibles con el diseño del tribot NXT: se conectará el motor izquierdo al puerto C y
el motor derecho al puerto B. Se ajustará la distancia entre ruedas
(DistanceBetweenWheels) a 0.112 y ambos diámetros de rueda (WheelDiameters) a
0.055. Se mantendrá el PollingFrequencyMs a 0 (valor que aparece por defecto).
Obviamente, si el diseño del robot es otro, habrá que tener en cuenta la nueva distancia
entre ruedas.
Ahora, para el caso de obstáculo a corta distancia, haremos que el robot gire 45 grados
para esquivarlo. Para ello, introducimos un valor entero de 45 como “RotateDegrees”.
Para ello, al conectar el bloque “if” con el motor seleccionaremos la siguiente opción en
el cuadro de diálogo:
De esta forma, accederemos al menú de Data Connections, donde seleccionaremos
“Edit values directly”, 45 grados y media potencia (0.5)
Para el caso de obstáculo a media distancia, se dará un valor del 30% de potencia al
motor izquierdo y otro del 60% al derecho (haciendo así que el tribot gire a la
izquierda). La conexión entre estos módulos será realizada como “SetDrivePower”.
Por último, en ausencia de nada que interfiera con el avance, se dará una potencia del
80% a los motores para que la marcha sea veloz en línea recta.
El esquema general se puede ver a continuación para una mayor claridad del conjunto:
Está claro que el diseño está abierto a múltiples modificaciones. Por ejemplo, si
quisiéramos que el robot girase a la derecha en lugar de la izquierda, no habría más que
intercambiar los valores otorgados a los motores izquierdo y derecho en el caso de
obstáculos situados a distancias entre 50 y 90 cm.
5.2 - CONTROL MEDIANTE PID
Es obvio que podemos realizar cualquier tipo de control sobre nuestro robot desde un
programa realizado en MSRS. Un ejemplo típico sería el control PID.
Las tres componentes de un controlador PID son: parte Proporcional, acción Integral y
acción Derivativa. El peso de la influencia que cada una de estas partes tiene en la suma
final, viene dado por la constante proporcional, el tiempo integral y el tiempo
derivativo, respectivamente.
La parte proporcional consiste en el producto entre la señal de error y la constante,
constante proporcional como para que hagan que el error permanente sea casi nulo
pero, en la mayoría de los casos, estos valores solo serán óptimos en una determinada
porción del rango total de control, siendo distintos los valores óptimos para cada
porción del rango. Sin embargo, existe también un valor límite en la constante
proporcional a partir del cual, en algunos casos, el sistema alcanza valores superiores a
los deseados.
El modo de control Integral tiene como propósito disminuir y eliminar el error en estado
estacionario, provocado por el modo proporcional. El error es integrado, lo cual tiene la
función de promediarlo o sumarlo por un periodo de tiempo determinado; luego es
multiplicado por una constante I. I representa la constante de integración.
Posteriormente, la respuesta integral es adicionada al módulo Proporcional para formar
el control P+I con el propósito de obtener una respuesta estable del sistema sin error
estacionario.
La acción derivativa se manifiesta cuando hay un cambio en el valor absoluto del error;
(si el error es constante, solamente actúan los modos proporcional e integral). El error
es la desviación existente entre el punto de medida y el valor consigna, o "Set Point". La
función de la acción derivativa es mantener el error al mínimo corrigiéndolo
proporcionalmente con la velocidad misma que se produce; de esta manera evita que el
error se incremente.
Se deriva con respecto al tiempo y se multiplica por una constante D y luego se suma a
las señales anteriores (P+I).
Puesto que existen multitud de proyectos de este tipo detallados en internet, no es objeto
de este trabajo desarrollar uno aparte. No obstante, comentaremos uno para dar una idea
de las posibilidades en este campo.
El robot APRIL (A Pid Robot Implemented with Lego)12
está compuesto por los
elementos típicos del tribot descrito anteriormente, incluyendo el sensor de ultrasonidos.
Este robot se ha programado con NXC13
, un lenguaje muy parecido a C, orientado a la
programación concurrente del NXT.
El objetivo del robot APRIL es mantener su posición relativa respecto a un objeto. Para
ajustar los parámetros que determinan el comportamiento del sistema, se realizaron
cambios basados en la observación del comportamiento en diversas pruebas.
Una vez iniciado el programa, el sensor mide la distancia inicial hasta el objeto de
referencia (setpoint). Cada vez que se ejecuta el bucle de programación, se mide la
distancia actual, se compara con el setpoint y se calcula el error con respecto al mismo.
El término proporcional se calcula multiplicando este error por la constante de ganancia
proporcional. El término integral viene dado por la suma de los errores de cada
ejecución del bucle, lo que nos da una suma creciente y continua de errores que será
multiplicada por la constante de la ganancia integral. Por último, el término derivativo
se calcula usando la diferencia entre el error actual y el error del bucle previamente
ejecutado, multiplicado por su correspondiente constante.
Una vez que estos tres términos han sido generados, se suman y dividen por una cuarta
constante. Esta constante extra es requerida porque NXC no soporta valores flotantes.
La salida combinada representa el nivel de potencia al que será usado el motor. Por
tanto, este valor puede estar tanto por encima del 100% como ser negativo. Así pues, es
necesario el uso de una función de escalado que nos devuelva un valor positivo truncado
a un máximo del 100% y con un mínimo del 20%. Este mínimo del 20% es debido a
que un nivel de potencia inferior no permite mover el robot.
Finalmente, como conclusiones obtenidas de la experimentación con este robot, se
obtuvo un tiempo de reacción al error inicial bastante elevado. Aunque en un principio
se confió en que el término derivativo ayudase a reducirlo, resultó muy complicado
ajustar su valor (quizás debido al breve espacio de tiempo en que se ejecuta el bucle).
Finalmente, el valor óptimo de tiempo para el bucle parece haberse hallado entre 5Hz y
20Hz.
El código de programación con el que se realizaron estos experimentos14
es libre de ser
usado y modificado. Del mismo modo, su autor (Kevin McLeod) se muestra interesado
en cualquier uso que se le dé a su trabajo y ofrece su ayuda a través de su página.
5.3 - TRIBOT QUE ENCARE EL NORTE MEDIANTE BRÚJULA
HITECHNIK15
Este programa tiene como objetivo hacer que nuestro robot se encuentre siempre
apuntando hacia el Norte, mediante el uso de una brújula de la marca HiTechnic16
.
La señal que devuelve la brújula es la notificación CompassSensorUpdate, que retorna
la desviación en grados del sensor respecto del Polo Norte magnético. Si no encaramos
el Norte, calcularemos la velocidad de las ruedas en correlación a cómo de desviados
estamos del Norte y giraremos el Tribot hacia la dirección deseada.
Como se puede observar, el tipo de control ejercido es proporcional (mayor velocidad
en las ruedas para mayor desviación).
Si estamos en movimiento, y ahora apuntamos al Norte, mostraremos un mensaje,
sonará un tono, y las ruedas se pararán. Después, actualizaremos el estado Moving a
false.
Es importante precisar que para poder ejecutar este archivo es necesario haber
actualizado el firmware del NXT a una versión 1.03 o superior.