Lego Mindstorms Volver
Versión 1
El primer programa que se va a realizar servirá para tener un primer contacto con el robot y todos sus componentes. Este primer programa tiene como objetivo final que el robot pueda seguir una línea negra, de unos 2 centímetros de ancho.
Además, con este primer programa, se pretende hacer una investigación que permita conocer el comportamiento de los distintos elementos que componen el robot, como son los sensores y los actuadores.
Además, con este primer programa, se pretende hacer una investigación que permita conocer el comportamiento de los distintos elementos que componen el robot, como son los sensores y los actuadores.
Introducción
Como se dijo anteriormente, el programa consistirá en conseguir que el robot sea capaz de seguir una línea de manera autónoma. Pero se tratará de conseguir este objetivo de la manera más simple posible, para luego ir complicándolo, añadiendo nuevos retos.
Objetivo
Buscamos un objeto sencillo, conseguir que el robot avance un tiempo determinado y se pare. Una vez ha realizado esto, debe detectar si está en la posición correcta, y corregirla en caso de que no sea así.
Desarrollo
Para empezar, el trabajo se divide en tres partes fundamentales, localizar la posición correcta, el desplazamiento del robot y la conexión Robot-PC vía Bluetooth.
En lo relacionado a localizar la posición correcta, se presentaban dos opciones, o bien se buscaba que el robot se situara siempre sobre el color negro o bien se buscaba que el robot se situara el borde entre la línea negra y el fondo blanco.
El primer caso presentaba un problema, y era el de localizar por qué lado se salía el robot. Viendo que se trataba de un problema bastante complejo de atender, se optó por desecharlo y atacar el problema desde el punto de vista de la segunda opción, localizar el límite entre la línea y el fondo.
Para este caso había dos posibles soluciones, mantener el robot sobre el límite y que el robot corrigiera su posición cada vez que se desviara, o bien mantener el robot sobre un rango y que éste corrigiera su posición de acuerdo con unos criterios determinados.
Gráficamente el resultado de las dos soluciones sería la siguiente:
1ª Opcion:
En lo relacionado a localizar la posición correcta, se presentaban dos opciones, o bien se buscaba que el robot se situara siempre sobre el color negro o bien se buscaba que el robot se situara el borde entre la línea negra y el fondo blanco.
El primer caso presentaba un problema, y era el de localizar por qué lado se salía el robot. Viendo que se trataba de un problema bastante complejo de atender, se optó por desecharlo y atacar el problema desde el punto de vista de la segunda opción, localizar el límite entre la línea y el fondo.
Para este caso había dos posibles soluciones, mantener el robot sobre el límite y que el robot corrigiera su posición cada vez que se desviara, o bien mantener el robot sobre un rango y que éste corrigiera su posición de acuerdo con unos criterios determinados.
Gráficamente el resultado de las dos soluciones sería la siguiente:
1ª Opcion:
Como se puede apreciar en el esquema, cualquier movimiento del robot fuera del punto de control implicaría un proceso de corrección. Esto quiere decir que el robot va a carecer de fluidez en su movimiento.
2ª Opción:
2ª Opción:
Tal y como se observa en este nuevo esquema, el robot tiene más margen de maniobra, con lo que, mientras el robot se sitúe entre el valor máximo y mínimo, no hará falta corregirlo. Esto hará que el robot se mueva con mayor fluidez que con el sistema anterior. Es por ello que, para este primer objetivo de seguir la línea, se ha optado por la opción número 2.
Diagramas de flujo
El primer diagrama de flujo que se presenta, es el diagrama de flujo del programa principal. El ciclo comienza al producirse una condición de inicio, que puede ser al pulsar un botón por ejemplo.
Tras esto, se ejecuta la función de avance del robot que, en este caso, consiste en dar una orden de avance rectilíneo a una velocidad constante y durante un tiempo determinado. Transcurrido ese tiempo, el robot detiene su movimiento. Una vez parado, el programa entraría en la función dedicada a la corrección del movimiento del robot. Esta función se detallará a continuación. Para terminar se comprueba la condición de parada, en caso de que sea correcta, el robot para, sino continúa con el proceso anterior. La condición de parada podría darse al pulsar un botón, al detectar un determinado color, al detectar un objeto, etc. El diagrama que se presenta a continuación, es el de la función de corrección. |
Esta función es la encargada de devolver al robot a la posición correcta. Primero se activa el sensor, o se crea la variable. Tras esto último, se realiza una lectura del sensor y se envía, mediante la conexión Bluetooth, un mensaje al PC con dicho valor.
El siguiente paso será calcular si el valor se encuentra entre los márgenes que previamente se han marcado. Si el valor está dentro de ese margen, no se realiza ninguna corrección. De lo contrario, se analiza si el valor se encuentra por debajo del mínimo o por encima del máximo, actuando en consecuencia.
Como se puede observar en el esquema, si el valor se encuentra por debajo de mínimo, el robot entrará en la función girar a la derecha y, tras girar un número determinado de grados, enviará un mensaje al PC para advertir de dicho acto. En caso de que el valor sea mayor que el máximo determinado con anterioridad, el robot girará a la izquierda y enviará otro mensaje al PC informando sobre este giro. Para terminar, se vuelve a leer el valor del sensor y se comprueba si el robot está dentro del rango determinado. Si la respuesta es que no, la función volverá a ejecutarse y volverá a corregir la posición. Si la respuesta es que si, entonces el programa saldrá de la función corregir. |
A continuación, se puede ver el funcionamiento del robot empleando el sistema descrito anteriormente.
|
Versión 2
Para el segundo programa se pretende que el robot siga una línea, al igual que el objetivo marcado para el primer programa, pero incorporando una serie de mejoras que afecten a la fluidez del movimiento y a la optimización de los recursos.
Introducción
Tal y como se dice en las líneas anteriores, el objetivo del programa vuelve a ser que el robot siga una línea, pero con un cambio importante en el planteamiento de cómo alcanzar dicha meta.
Objetivo
Se pretende alcanzar el objetivo marcado empleando las clases que se crearon para el primer programa, con algunas pequeñas modificaciones que se detallarán en la documentación del proyecto, y mediante el uso de nuevas herramientas.
Si bien en el primer programa se actuaba de una manera secuencial, primero se avanzaba un tiempo y luego se comprobaba si el robot estaba en la posición correcta para, a continuación, corregir la posible desviación. Ahora lo que se pretende es que primero el robot identifique automáticamente los límites sobre los que va a trabajar, en lugar de introducirlos a mano como se hacía en el programa anterior. Y además, la otra gran mejora que se pretende introducir es la de que el sistema trabaje por un método parecido a las interrupciones, en las que el programa está a la espera de determinados datos y, dependiendo de dichos datos, ejecute unas rutinas u otras.
De esta manera lo que se pretende es dotar al programa de un sistema de interrupciones que dependen de unas prioridades. Dándole así mayor prioridad a las funciones relacionadas con la corrección de la posición, o las condiciones de parada de los motores, que a las de movimiento de avance, por ejemplo.
El sistema que se va a emplear para este cometido se denomina arbitraje, en el que se distinguen dos partes: el árbitro y los comportamientos. El comportamiento del programa está controlado por el árbitro, que es el encargado de gestionar todo lo relacionado con los comportamientos, lleva el control de todos ellos una vez definidos.
En cuanto a los comportamientos, hay que decir que son unos objetos que se componen de tres elementos: takeControl(), action() y suppress().
El primero de ellos devuelve “TRUE” si se dan las condiciones idóneas para que se ejecute el programa que previamente se le haya programado. Dichas condiciones son determinadas por el programador, con lo que hay determinados procesos que se pueden controlar y dar seguridad a los movimientos del robot. Por ejemplo que no avance si hay algún objeto delante.
El segundo elemento mencionado es “action()”, que serán las líneas de código que se tienen que ejecutar si las condiciones determinadas se cumplen. Para el ejemplo anterior, si se detecta un objeto, en el elemento “action()” se introduciría el código necesario para que se paren las ruedas.
El tercero de los elementos es suppress(), que engloba el código que se quiere ejecutar cuando dicho comportamiento pierde el control, o lo que es lo mismo, las condiciones que se tienen que dar para su activación dejan de cumplirse. Para el ejemplo empleado antes, podría ponerse el código necesario para hacer sonar un “beep”, indicando así que se va a reanudar la marcha, ya que no hay un objeto delante del robot.
Si bien en el primer programa se actuaba de una manera secuencial, primero se avanzaba un tiempo y luego se comprobaba si el robot estaba en la posición correcta para, a continuación, corregir la posible desviación. Ahora lo que se pretende es que primero el robot identifique automáticamente los límites sobre los que va a trabajar, en lugar de introducirlos a mano como se hacía en el programa anterior. Y además, la otra gran mejora que se pretende introducir es la de que el sistema trabaje por un método parecido a las interrupciones, en las que el programa está a la espera de determinados datos y, dependiendo de dichos datos, ejecute unas rutinas u otras.
De esta manera lo que se pretende es dotar al programa de un sistema de interrupciones que dependen de unas prioridades. Dándole así mayor prioridad a las funciones relacionadas con la corrección de la posición, o las condiciones de parada de los motores, que a las de movimiento de avance, por ejemplo.
El sistema que se va a emplear para este cometido se denomina arbitraje, en el que se distinguen dos partes: el árbitro y los comportamientos. El comportamiento del programa está controlado por el árbitro, que es el encargado de gestionar todo lo relacionado con los comportamientos, lleva el control de todos ellos una vez definidos.
En cuanto a los comportamientos, hay que decir que son unos objetos que se componen de tres elementos: takeControl(), action() y suppress().
El primero de ellos devuelve “TRUE” si se dan las condiciones idóneas para que se ejecute el programa que previamente se le haya programado. Dichas condiciones son determinadas por el programador, con lo que hay determinados procesos que se pueden controlar y dar seguridad a los movimientos del robot. Por ejemplo que no avance si hay algún objeto delante.
El segundo elemento mencionado es “action()”, que serán las líneas de código que se tienen que ejecutar si las condiciones determinadas se cumplen. Para el ejemplo anterior, si se detecta un objeto, en el elemento “action()” se introduciría el código necesario para que se paren las ruedas.
El tercero de los elementos es suppress(), que engloba el código que se quiere ejecutar cuando dicho comportamiento pierde el control, o lo que es lo mismo, las condiciones que se tienen que dar para su activación dejan de cumplirse. Para el ejemplo empleado antes, podría ponerse el código necesario para hacer sonar un “beep”, indicando así que se va a reanudar la marcha, ya que no hay un objeto delante del robot.
Desarrollo
Conviene identificar claramente cuáles son los puntos más importantes de este nuevo objetivo y en qué va a afectar al programa anterior. Por un lado se tiene que estudiar el comportamiento del programa (clases y objetos) con los que ya se cuentan para poder hacer funcionar el arbitraje y, por otro lado cómo afecta la corrección progresiva.
Una vez estudiado el control de los procesos por arbitraje, se decide dividir el trabajo en distintos procesos, identificando para cada uno de ellos las condiciones que se tienen que dar para que, por un lado el movimiento sea fluido, y por otro lado sea eficiente.
Se distinguen dos procesos principales, el movimiento del robot y su parada, y las condiciones para cada uno de ellos. Las condiciones para el movimiento consisten en que no haya ningún objeto delante del robot, mientras que la condición de parada es la opuesta. Si se controla este hecho, no es posible un conflicto entre ambos comportamientos, si se diera el caso de la existencia de más comportamientos dentro del mismo programa, habría que dedicar tiempo suficiente para identificar las condiciones de toma de control para evitar conflictos o comportamientos indeseados.
En cuanto a la parte relacionada con el movimiento del robot, se vio la necesidad de incorporar una corrección progresiva, en lugar de aplicar el mismo ángulo de giro una vez que el robot abandonaba el área definida para su
desplazamiento.
Para este tipo de corrección se opta por añadir un factor de corrección lineal que se suma, o se resta, a la potencia de cada rueda, de manera que una se moverá más rápido que la otra, y de manera proporcional a la diferencia entre el valor captado y el que se calcula como idóneo. El siguiente esquema representa el incremento del factor mencionado dependiendo de la posición del robot.
Una vez estudiado el control de los procesos por arbitraje, se decide dividir el trabajo en distintos procesos, identificando para cada uno de ellos las condiciones que se tienen que dar para que, por un lado el movimiento sea fluido, y por otro lado sea eficiente.
Se distinguen dos procesos principales, el movimiento del robot y su parada, y las condiciones para cada uno de ellos. Las condiciones para el movimiento consisten en que no haya ningún objeto delante del robot, mientras que la condición de parada es la opuesta. Si se controla este hecho, no es posible un conflicto entre ambos comportamientos, si se diera el caso de la existencia de más comportamientos dentro del mismo programa, habría que dedicar tiempo suficiente para identificar las condiciones de toma de control para evitar conflictos o comportamientos indeseados.
En cuanto a la parte relacionada con el movimiento del robot, se vio la necesidad de incorporar una corrección progresiva, en lugar de aplicar el mismo ángulo de giro una vez que el robot abandonaba el área definida para su
desplazamiento.
Para este tipo de corrección se opta por añadir un factor de corrección lineal que se suma, o se resta, a la potencia de cada rueda, de manera que una se moverá más rápido que la otra, y de manera proporcional a la diferencia entre el valor captado y el que se calcula como idóneo. El siguiente esquema representa el incremento del factor mencionado dependiendo de la posición del robot.
En la línea de abajo se representa la escala de valores entregado por el sensor según los colores que detecta. Los valores máximo y mínimo serían los calculados automáticamente y el valor idóneo sería la media calculada de ambos.
En la escala de colores, la inmediatamente superior a la explicada en el párrafo anterior, se representa de manera esquemática el área sobre la cual está situado el sensor del robot. Con el color negro se representa la línea a seguir, y con el color blanco el fondo sobre el que se dibuja la línea. Los colores grises representan los valores intermedios que capta el sensor.
En la parte “Factor de corrección” se pretende explicar, de una manera gráfica, como se pretende aplicar dicho factor para corregir la desviación del robot durante su movimiento. Como se puede observar en la imagen, el valor mínimo se corresponde con el cero, lo cual indica que las ruedas se mueven a la misma velocidad, lo que se traduce en un avance rectilíneo, indicado por la flecha superior del apartado “Sentido del movimiento”. A medida que el valor detectado por el sensor se aleja del valor idóneo, el factor de corrección se irá incrementando hasta alcanzar el máximo, valor que se alcanza al llegar al valor máximo o mínimo del rengo establecido. El movimiento del robot se corresponde con el representado por las flechas.
En la escala de colores, la inmediatamente superior a la explicada en el párrafo anterior, se representa de manera esquemática el área sobre la cual está situado el sensor del robot. Con el color negro se representa la línea a seguir, y con el color blanco el fondo sobre el que se dibuja la línea. Los colores grises representan los valores intermedios que capta el sensor.
En la parte “Factor de corrección” se pretende explicar, de una manera gráfica, como se pretende aplicar dicho factor para corregir la desviación del robot durante su movimiento. Como se puede observar en la imagen, el valor mínimo se corresponde con el cero, lo cual indica que las ruedas se mueven a la misma velocidad, lo que se traduce en un avance rectilíneo, indicado por la flecha superior del apartado “Sentido del movimiento”. A medida que el valor detectado por el sensor se aleja del valor idóneo, el factor de corrección se irá incrementando hasta alcanzar el máximo, valor que se alcanza al llegar al valor máximo o mínimo del rengo establecido. El movimiento del robot se corresponde con el representado por las flechas.
Diagramas de flujo
Los diagramas de flujo que se describen en este apartado se corresponden con las novedades incluidas para los nuevos objetivos. Las clases o las funciones empleadas en el este programa, y que se usaban en la versión anterior, no serán expuestas aquí porque ya se explicaron con detenimiento en los apartados anteriores o en la documentación, los correspondientes con el primer siguelíneas.
A continuación se presentan los esquemas correspondientes con la clase “ControBrillo” y el comportamiento “Movimiento”.
Clase ControlBrillo
La clase “ControlBrillo” surge de la necesidad de que el robot, independientemente de cuál sea el lugar en el que se encuentra la línea a seguir, él pueda reconocer el rango en el que se va a mover. Se considerará que el robot está posicionado con la raya a su derecha, en el momento en el que se inicia el proceso.
Con esta función se pretende que el robot busque los márgenes máximo y mínimo de la luz ambiental, una vez éste haya sido colocado a la izquierda de la línea.
A continuación se presenta el esquema general de lo que se pretende que el robot realice al iniciarse el programa sigue líneas.
A continuación se presentan los esquemas correspondientes con la clase “ControBrillo” y el comportamiento “Movimiento”.
Clase ControlBrillo
La clase “ControlBrillo” surge de la necesidad de que el robot, independientemente de cuál sea el lugar en el que se encuentra la línea a seguir, él pueda reconocer el rango en el que se va a mover. Se considerará que el robot está posicionado con la raya a su derecha, en el momento en el que se inicia el proceso.
Con esta función se pretende que el robot busque los márgenes máximo y mínimo de la luz ambiental, una vez éste haya sido colocado a la izquierda de la línea.
A continuación se presenta el esquema general de lo que se pretende que el robot realice al iniciarse el programa sigue líneas.
La función de búsqueda del valor máximo consiste en hacer que el robot se mueva hacia la izquierda sobre su propio eje hasta encontrar el color blanco y, una vez alcanzado siga girando, siempre que el valor detectado sea mayor o igual que el anteriormente registrado, manteniendo un margen que impida, en la medida de lo posible, conflictos con los valores recibidos por el sensor.
La función para la búsqueda del valor mínimo es la que se detalla a continuación. Consiste en hacer girar el robot hacia la derecha hasta encontrar el color negro y, a continuación, seguir girando sobre su propio eje (haciendo girar las ruedas a la misma velocidad, la misma distancia, pero en sentidos opuestos), hasta que el valor leído por el sensor sea menor o igual que el valor registrado con anterioridad, contando con un margen que solvente un posible conflicto con los valores registrados.
Los valores detectados se almacenarán en el objeto creado en el programa principal, destinado a albergar las variables que emplean el resto de los objetos del programa. Se trata de una clase nueva denominada “Contenedor”, y que será el almacén de todas las variables que se van a emplear en todo el programa.
Clase Movimiento
Para este nuevo programa se ha optado por un proceso de corrección proporcional. Cuanto más se aleje el robot de lo que se considera que es la posición correcta, más será el gradiente de corrección aplicado.
El desplazamiento del robot en el primer programa estaba formado por dos procesos diferentes, el que se corresponde con el avance del robot y el que se corresponde con los giros a izquierda y derecha. Para el nuevo programa se ha optado por activar los motores por separado, a través de una función que permite configurar sentido de giro y potencia del motor. Con esto último, todo lo relacionado con el movimiento del robot queda relegado a una sola clase, clase Movimiento, que se encargará de entregar esos datos a la función.
En la siguiente figura se muestra el rango sobre el que se va a mover el robot para que realice la función de “siguelíneas”.
Clase Movimiento
Para este nuevo programa se ha optado por un proceso de corrección proporcional. Cuanto más se aleje el robot de lo que se considera que es la posición correcta, más será el gradiente de corrección aplicado.
El desplazamiento del robot en el primer programa estaba formado por dos procesos diferentes, el que se corresponde con el avance del robot y el que se corresponde con los giros a izquierda y derecha. Para el nuevo programa se ha optado por activar los motores por separado, a través de una función que permite configurar sentido de giro y potencia del motor. Con esto último, todo lo relacionado con el movimiento del robot queda relegado a una sola clase, clase Movimiento, que se encargará de entregar esos datos a la función.
En la siguiente figura se muestra el rango sobre el que se va a mover el robot para que realice la función de “siguelíneas”.
El proceso sería el siguiente, en un primer momento el robot identifica el valor máximo y mínimo que serían los límites sobre los que se va a desplazar. Una vez obtenidos esos valores, el robot calcula la media entre ambos, lo que se considera el valor perfecto, y es en ese punto donde las ruedas se desplazan a la misma velocidad,
para hacer que el robot avance.
En caso de que el valor sea mayor que la media, se calcula cual es la diferencia entre el valor detectado y la media. Cuanto más se aproxime dicha diferencia al valor máximo permitido, mayor será la velocidad con la que la rueda izquierda avanza respecto de la derecha, lo que provoca un giro hacia la derecha.
Si por el contrario, el valor detectado es menor que la media, la velocidad de la rueda derecha avanzará más rápido respecto a la izquierda, también dependerá de la diferencia calculada entre ambos valores, cuanto más cercano esté el valor detectado del mínimo, mayor será la corrección.
El esquema resultante es el siguiente:
para hacer que el robot avance.
En caso de que el valor sea mayor que la media, se calcula cual es la diferencia entre el valor detectado y la media. Cuanto más se aproxime dicha diferencia al valor máximo permitido, mayor será la velocidad con la que la rueda izquierda avanza respecto de la derecha, lo que provoca un giro hacia la derecha.
Si por el contrario, el valor detectado es menor que la media, la velocidad de la rueda derecha avanzará más rápido respecto a la izquierda, también dependerá de la diferencia calculada entre ambos valores, cuanto más cercano esté el valor detectado del mínimo, mayor será la corrección.
El esquema resultante es el siguiente:
Con esto se consigue un movimiento más fluido y rápido, a pesar de que el movimiento del robot es corregido en cada ciclo, no como antes, que si el robot se encontraba dentro del margen no había corrección alguna.
En el siguiente vídeo podrás ver el robot siguiendo una línea con el sistema empleado para la versión 2.
En el siguiente vídeo podrás ver el robot siguiendo una línea con el sistema empleado para la versión 2.
|
Versión 3
Para el tercer programa se pretende que el robot siga una línea, al igual que el objetivo marcado para los anteriores programas, pero incorporando una manera diferente de afrontar el desafio con el uso de hilos y la capacidad de java para el Multithreading.
Introducción
Como se dice en las líneas anteriores, el objetivo del programa vuelve a ser que el robot siga una línea, pero con un cambio importante en el planteamiento de cómo atacar ese objetivo.
Objetivo
Se pretende alcanzar el objetivo marcado empleando las clases que se crearon para el segundo programa, con algunas pequeñas modificaciones que se detallarán más adelante, y mediante el uso de hilos.
Los threads o hilos de ejecución permiten organizar los recursos del ordenador de forma que pueda haber varios programas actuando en paralelo. Un hilo de ejecución puede realizar cualquier tarea que pueda realizar un programa normal y corriente.
Un thread o hilo es un flujo secuencial simple dentro de un proceso, un único proceso puede tener varios hilos ejecutándose. Java es el único lenguaje de uso general en el que la compatibilidad con los hilos forma parte del lenguaje.
Ciclo de vida de un hilo
El hilo pasa por diferentes etapas de su ciclo de vida. Por ejemplo, un hilo que nace, se inicia, funciona, y luego muere. El siguiente diagrama muestra el ciclo de vida completo de un hilo.
Los threads o hilos de ejecución permiten organizar los recursos del ordenador de forma que pueda haber varios programas actuando en paralelo. Un hilo de ejecución puede realizar cualquier tarea que pueda realizar un programa normal y corriente.
Un thread o hilo es un flujo secuencial simple dentro de un proceso, un único proceso puede tener varios hilos ejecutándose. Java es el único lenguaje de uso general en el que la compatibilidad con los hilos forma parte del lenguaje.
Ciclo de vida de un hilo
El hilo pasa por diferentes etapas de su ciclo de vida. Por ejemplo, un hilo que nace, se inicia, funciona, y luego muere. El siguiente diagrama muestra el ciclo de vida completo de un hilo.
Las etapas antes mencionadas se explican a continuación:
• Nuevo: un nuevo hilo comienza su ciclo de vida en el nuevo estado. Permanece en este estado hasta que el programa inicia el hilo.
• Ejecutable: Después de un hilo recién nacido se inicia, el hilo se vuelve ejecutable. Un hilo en este estado es considerado como la ejecución de sus tareas.
• En espera: A veces un hilo de transición al estado de espera mientras el subproceso espera a que otro hilo, para realizar una transición o tarea. El estado ejecutable sólo cuando otro hilo señala que el hilo está a la espera de continuar con la ejecución.
• Tiempo de espera en espera: un subproceso ejecutable puede entrar en el estado de tiempo de espera para un intervalo de tiempo especificado. Un hilo de este estado de transición de vuelta al estado ejecutable en ese intervalo de tiempo de vencimiento o cuando el evento se espera ocurra.
• Terminado: Una hebra ejecutable entra en el estado terminado cuando termina su tarea, o de lo contrario termina.
Prioridades de los subprocesos
Cada hilo de Java tiene una prioridad que ayuda al sistema operativo determinar el orden en que las discusiones se han programado.
Las prioridades de Java están en el rango entre MIN_PRIORITY (una constante de 1) y MAX_PRIORITY (una constante de 10). Por defecto, cada enlace se le da prioridad NORM_PRIORITY (una constante de 5).
Temas de mayor prioridad son más importantes para un programa y debe ser asignado antes de tiempo de procesador de menor prioridad discusiones. Sin embargo, las prioridades de hilo no puede garantizar el orden, dependen de la plataforma mucho.
Creación de un mensaje
Java define dos formas en que esto se puede lograr:
• Se puede implementar la interfaz ejecutable.
• Se puede extender la clase Hilo, sí.
Crear un mensaje privado mediante la implementación de ejecutable:
La forma más fácil de crear un hilo es crear una clase que implementa la interfaz ejecutable.
Para implementar ejecutable, una clase solo necesita implementar un solo método llamado ejecutar ().
Va a definir el código que constituye el hilo nuevo dentro de un método ejecutar (). Es importante entender que el ejecutar () puede llamar a otros métodos, el uso de otras clases, y declarar las variables, puede al igual que el hilo principal.
Después de crear una clase que implementa el ejecutable, se crea un objeto de tipo hilo dentro de esa clase. Define varios constructores. El que vamos a utilizar se muestra aquí:
ThreadOb es una instancia de una clase que implementa la interfaz ejecutable y el nombre del nuevo hilo se especifica threadName.
Se crea un nuevo hilo , que no comenzará a correr hasta que llame a su método start (), que se declara dentro de un mensaje privado. El método start ().
• Nuevo: un nuevo hilo comienza su ciclo de vida en el nuevo estado. Permanece en este estado hasta que el programa inicia el hilo.
• Ejecutable: Después de un hilo recién nacido se inicia, el hilo se vuelve ejecutable. Un hilo en este estado es considerado como la ejecución de sus tareas.
• En espera: A veces un hilo de transición al estado de espera mientras el subproceso espera a que otro hilo, para realizar una transición o tarea. El estado ejecutable sólo cuando otro hilo señala que el hilo está a la espera de continuar con la ejecución.
• Tiempo de espera en espera: un subproceso ejecutable puede entrar en el estado de tiempo de espera para un intervalo de tiempo especificado. Un hilo de este estado de transición de vuelta al estado ejecutable en ese intervalo de tiempo de vencimiento o cuando el evento se espera ocurra.
• Terminado: Una hebra ejecutable entra en el estado terminado cuando termina su tarea, o de lo contrario termina.
Prioridades de los subprocesos
Cada hilo de Java tiene una prioridad que ayuda al sistema operativo determinar el orden en que las discusiones se han programado.
Las prioridades de Java están en el rango entre MIN_PRIORITY (una constante de 1) y MAX_PRIORITY (una constante de 10). Por defecto, cada enlace se le da prioridad NORM_PRIORITY (una constante de 5).
Temas de mayor prioridad son más importantes para un programa y debe ser asignado antes de tiempo de procesador de menor prioridad discusiones. Sin embargo, las prioridades de hilo no puede garantizar el orden, dependen de la plataforma mucho.
Creación de un mensaje
Java define dos formas en que esto se puede lograr:
• Se puede implementar la interfaz ejecutable.
• Se puede extender la clase Hilo, sí.
Crear un mensaje privado mediante la implementación de ejecutable:
La forma más fácil de crear un hilo es crear una clase que implementa la interfaz ejecutable.
Para implementar ejecutable, una clase solo necesita implementar un solo método llamado ejecutar ().
Va a definir el código que constituye el hilo nuevo dentro de un método ejecutar (). Es importante entender que el ejecutar () puede llamar a otros métodos, el uso de otras clases, y declarar las variables, puede al igual que el hilo principal.
Después de crear una clase que implementa el ejecutable, se crea un objeto de tipo hilo dentro de esa clase. Define varios constructores. El que vamos a utilizar se muestra aquí:
ThreadOb es una instancia de una clase que implementa la interfaz ejecutable y el nombre del nuevo hilo se especifica threadName.
Se crea un nuevo hilo , que no comenzará a correr hasta que llame a su método start (), que se declara dentro de un mensaje privado. El método start ().
Desarrollo
Conviene identificar claramente cuáles son los puntos más importantes de este nuevo objetivo y en qué va a afectar al programa anterior. Por un lado se convierten todos los procesos en hilos, es decir los comportamientos también se convierten en hilos.
Las condiciones para el movimiento consisten en que no haya ningún objeto delante del robot, mientras que la condición de parada es la opuesta. En cuanto a la parte relacionada con el movimiento del robot, se intenta que el robot siempre este encima de la línea negra, para ello se realiza una calibración previa.
Las condiciones para el movimiento consisten en que no haya ningún objeto delante del robot, mientras que la condición de parada es la opuesta. En cuanto a la parte relacionada con el movimiento del robot, se intenta que el robot siempre este encima de la línea negra, para ello se realiza una calibración previa.
En el siguiente vídeo podrás ver como se defiende el robot en un circuito realizado para probar esta versión del programa. En el vídeo podrás ver cómo sigue el circuito desde un punto de vista cenital o desde el punto de vista de un robot.
|