• No se han encontrado resultados

CAPÍTULO 3: DISEÑO E IMPLEMENTACIÓN DEL SOFTWARE PARA EL

3.2. ELEMENTOS DE SOFTWARE DEL CARLIKE DESARROLLADO EN

DESARROLLADO EN ENTORNO VIRTUAL

Para la ejecución de este proyecto se usó Unity 3D para desarrollar el modelo simulado del carlike. Unity es un motor gráfico utilizado para crear video juegos, aplicaciones y animaciones para plataformas de Windows, Android, iOS, XBOX, etc.

Unity ofrece un editor visual muy completo que provee de herramientas para el desarrollo de las aplicaciones. El entorno virtual se desarrolla en el editor, mientras que los comandos se ejecutan desde scripts, estos scripts pueden ser implementados en tres lenguajes: JavaScript, C# o Boo.

En este proyecto se usó una versión estudiantil de Unity, que es menos completa que la versión profesional, pero tiene las herramientas necesarias para llevar a cabo el mismo.

Las partes del entorno virtual que se creó son el carlike, el terreno, luces direccionales, una cámara, y una ciudad virtual como se muestra en la Figura 3.9. La programación de los objetos que componen el entorno virtual se la realizó en scripts en lenguaje C# en el compilador mono Developer propio de Unity.

Figura 3.9 Carlike simulado en el entorno virtual

Unity provee de varias herramientas que facilitan el trabajar en el entorno para que se comporte de una manera muy realista. La herramienta que hace posible esto es la tecnología Nvidia Physx que posee Unity la cual incluye consideraciones de aceleración, masa, gravedad, fuerzas externas, inercia, torques, etc. Esta herramienta incluye motores de física incluidos que realizan todos los cálculos físicos para la simulación. Por lo cual al crear cada objeto se le debe asignar las características adecuadas de tamaños y masa, por ejemplo.

En la Figura 3.10 se muestra las herramientas del módulo de física que provee Unity, para este proyecto solo se usaron los componentes de RigidBody y los Colliders.

· Rigidbody. Esta herramienta permite que los GameObjects sean afectados

por la física, es decir que puede aplicárseles fuerzas y torques para crear movimientos realistas. Además, permite que el objeto sea influenciado por la gravedad o por fuerzas agregadas vía script. Esta herramienta permite configurar la masa del objeto, el detector de colisiones, la gravedad, etc.

· Colliders. Son componentes que se incluyen en los GameObjects y lo

delimitan para que el programa reconozca colisiones con otros colliders. Los colliders son invisibles y no es necesario que tenga la misma forma que el objeto, sino que sea lo más aproximado posible. Unity incorpora cuatro geometrías básicas que son el box collider (caja), sphere collider (esfera), capsule collider (cápsula), mesh collider y Wheel collider. En este proyecto se usó el box collider para recubrir el carlike y Wheel colliders en las ruedas del automóvil.

DESARROLLO DEL ENTORNO VIRTUAL

Como se mencionó anteriormente, el entorno virtual desarrollado se compone de varios objetos como el carlike, el terreno, luces direccionales, la cámara, y una ciudad. A continuación, se explican el desarrollo y configuración de estos objetos.

El Terreno

El terreno es la base sobre la que se sostiene todas las estructuras que se monten en el entorno virtual como se muestra en la Figura 3.11. El terreno puede ser añadido en la barra de menú en la pestaña GameObject, submenú 3D Object y en la opción Terrain. En este caso el terreno tiene como dimensiones 1000 m de ancho y 2000 m de largo.

Figura 3.11 Terreno Unity 3D La Ciudad

La ciudad es el medio por el cual el operador debe conducir el carlike con el objetivo de llegar a un punto específico sin chocar. El modelo de la ciudad fue obtenido de manera gratuita en el asset store de Unity 3D como se muestra en la Figura 3.12.

Figura 3.12 Asset store - modelos de ciudades gratuitas

Al elegir una ciudad se la selecciona, luego el Asset Store pedirá que el usuario ingrese su cuenta y el modelo se descargará automáticamente. Luego de eso el modelo se importa a la escena y se la puede utilizar. El modelo de la ciudad elegida se muestra en la Figura 3.13.

Figura 3.13 Modelo de la ciudad utilizada.

El Carlike Jeep

El carlike es el robot que se maneja desde la estación local, desde la cual se puede direccionar las llantas delanteras, acelerar o frenar las llantas traseras e ir hacia delante o hacia atrás. El carlike simulado en el entorno virtual se muestra en la Figura 3.14.

Figura 3.14 Modelo de Carlike en el entorno virtual.

El carlike se comporta como un auto normal y el objetivo es manejarlo en la ciudad y llegar a un punto específico. El peso asignado al carlike es de 600 kg, tiene activado el método de detección de colisiones continuo para evitar que el mismo choque con cualquier obstáculo utilizando el “Cube Collider” de la Figura 3.15.

Figura 3.15 Cube collider en el Carlike. En la Figura 3.16 se muestran algunas configuraciones del carlike.

Figura 3.16 Configuración del rigidbody del Carlike

Para poder comandar cada par de llantas se le incluyen un Wheel colliders a cada llanta como se muestra en la Figura 3.17. Estos Wheel collider tienen propiedades que se pueden manejar como el “motor torque” para generar tracción desde las llantas traseras, “motor break” para frenar las llantas y “steerAngle” para girar las llantas según las indicaciones del volante hacia la izquierda o hacia la derecha. Estas propiedades se modifican desde el script donde se ejecutan los comandos en el carlike.

Figura 3.17 Wheel colliders en las llantas del carlike.

Algunas de las características de los Wheel colliders son el radio de 0.33m, tienen masa de 20Kg y sus propiedades son modificadas desde el script de C# “Movimiento”.

Luces Direccionales

Las luces direccionales mostradas en la Figura 3.18 proveen de iluminación natural al entorno simulado para poder iluminar toda la escena y sus componentes. En este caso se usaron 4 luces direccionales para iluminar la escena completamente y poder tener buena visualización dentro de la misma.

La Cámara

La cámara mostrada en la Figura 3.19 es una de las partes más importantes ya que provee la posibilidad de mirar el entorno del carlike y saber por dónde está movilizándose. La cámara está programada para seguir al carlike en todo momento y proveer de realimentación visual al operador para que pueda tomar las decisiones más convenientes. La cámara actúa bajo la influencia de un script programado en C# llamado “cámara”.

Figura 3.19 Cámara montada en el Carlike. TeamViewer

En la arquitectura de comunicación entre la estación local, donde se generan los comandos, y la aplicación de Unity 3D, la comunicación de datos entre ambos clientes se la realiza usando el protocolo MQTT específicamente. Este protocolo es utilizado ya que envía mensajes cortos y es muy liviano, pero no fue diseñado para datos grandes y pesados como imágenes, es por lo que se hace presente la necesidad de utilizar otra aplicación para poder realizar la realimentación visual desde el entorno simulado en Unity 3D y la estación local. Para esto se ha decidido usar una licencia gratuita de TeamViewer.

TeamViewer es una aplicación multiplataforma que soporta conexiones entre dispositivos Windows, macOS, Linux, Chrome, Android, etc. No necesita configuraciones y funciona detrás de cualquier firewall. Usa eficientemente el ancho de banda de la red, transmite con una velocidad de hasta 60fps lo cual permite una experiencia optimizada. La interfaz de usuario es muy amigable y fácil de usar. En

el ámbito de la seguridad emplea codificaciones punto a punto, contraseñas aleatorias, etc que lo hacen muy seguro. Y provee de licencias gratuitas para usuarios no comerciales. [43]

Todas las características anteriores hacen que TeamViewer sea la mejor opción para llevar acabo la realimentación visual del entorno simulado en Unity 3D y su interfaz de usuario se muestra en la Figura 3.20.

Figura 3.20 Interfaz de usuario TeamViewer. PROGRAMAS PARA COMANDAR EL CARLIKE.

En los anteriores apartados se mencionaron todas las partes que componen el carlike y del entorno virtual. En este apartado se menciona la lógica que se utilizó para manejar cada objeto según se necesite y de acuerdo con los comandos enviados desde la estación local.

Para controlar las propiedades de cada objeto del entorno simulado se usan los scripts. En este caso se ha elegido el lenguaje C# que provee Unity 3D. La estructura del programa empieza definiendo todas las variables y configuraciones en la función Start () que se ejecuta una sola vez en el programa. La función Update () se ejecuta una vez cada cuadro de imagen y las instrucciones que se programen se realizaran en forma cíclica. También existe la función FixedUpdate () que se ejecuta en cada periodo de actualización del módulo de física, lo cual hace que se ejecute varias veces en cada cuadro de imagen, por lo cual es mejor programar los

comportamientos físicos en esta función. El diagrama de flujo general se muestra en la Figura 3.21.

Función Start INICIO

FIN

Función Update Función Fixed Update Función Guide Evento de mensaje MQTT

Figura 3.21 Diagrama de flujo general de la lógica de programación del carlike simulado en Unity 3D

Para la lógica de todo el sistema se usan dos scripts, uno de ellos gestiona la comunicación y maneja el carlike, mientras que el otro gestiona las acciones de la cámara.

Script de la lógica del Carlike

Como se mencionó anteriormente los objetos que se deben manejar del modelo del carlike son los que se relacionan con las Wheel colliders de las llantas delanteras y traseras, además de las variables que se reciben desde la estación local y las variables odométricos que se calculan en transcurso de la simulación, estas se muestran en la Figura 3.22.

Para empezar el programa se cargan todas las librerías necesarias para poder llevar a cabo las tareas requeridas como son: Trabajar sobre el Internet usando MQTT, crear el cliente MQTT y poder suscribirse a información de otros clientes, y publicar información para que sea leído por otros clientes, además se carga la librería JSON para manejar un formato de texto para poder intercambiar datos.

Figura 3.22 Variables públicas del jeep.

Después el programa reconoce los objetos del carlike que han de ser manejados y guarda los mismos en variables públicas.

En la función Start () que se muestra en la Figura 3.23 se crea un nuevo cliente MQTT para la aplicación y se lo conecta al bróker o servidor central que tiene la IP publica suministrada por la EPN, luego se suscribe al cliente a los tópicos en los que la estación local envía los comandos.

Función Start

Carga librerías de MQTT, JSON y TIME

Cargar variables públicas de objetos del carlike desde el entorno virtual

Crear un nuevo cliente MQTT Conectarse al Bróker en la dirección IP publica

Suscribir el cliente MQTT a los Tópicos en los que la estación local publica la aceleración, desaceleración, la direccion de las ruedas delanteras, el sentido del movimiento y el estado de la conexión

Función Update

Inicia el Timer 1 y el Timer 2

Calcula la velocidad del carlike

Timer 1 >= 1s

Actualizar los valores de posición en x e y del carlike

Crea un objeto JSON con los datos odométricos de posición y velocidad del carlike

Publica el objeto JSON para que se considerado en la estación local

Reinicia el Timer 1

Timer 2 >= 2s

Estado de conexión = desconectado

no si

no si

Figura 3.24 Función update.

En la función Update que se muestra en la Figura 3.24 se inician dos timers, los cuales llevaran la información de tiempo transcurrido, el primero se usará para sincronizar el envío de los datos odométricos de posición y velocidad del carlike hacia la estación local para que sean considerados en la misma. El segundo timer

lleva la información del tiempo transcurrido desde la última vez que se actualizó un dato por un evento de comunicación MQTT. Hay que notar que este timer se reinicia en el evento de un nuevo mensaje MQTT. Cuando este timer2 llega a un valor mayor a 2 segundos se reconoce que no existe comunicación entre la estación local y el carlike simulado y el sistema entra en modo de desconexión.

Por otro lado, se calcula la velocidad en km/h del carlike constantemente de acuerdo con la rotación de las llantas del carlike ya que Unity permite obtener la información de la velocidad rotacional de las mismas.

En la función FixedUpdate que se muestra en la Figura 3.25 se verifica el estado de la comunicación con la estación de operación al inicio, si existe comunicación entonces se ejecutan los comandos enviadas desde la estación de operación, esto se realiza modificando las propiedades de las Wheel collider que fueron añadidas en las cuatro ruedas del carlike. Para acelerar el carlike, se modifica la propiedad “motor torque” de las Wheel collider de las llantas traseras, para frenar el carlike se modifica la propiedad “motorbreak” de las Wheel collider de las llantas traseras, para girar las llantas delanteras se modifica la propiedad “steerAngle” de los Wheel collider de las mismas.

Por otro lado, si se verifica que no existe comunicación, el sistema entra en el modo sleep, donde se enceran las variables y se hace detener el carlike como medida de seguridad.

Función Fixed Update

Estado de conexión==desconectado

Aplica las variables de aceleración o desaceleración,

dirección y sentido en los objetos del carlike Detener el carlike

no si

Cuando el bróker envía la notificación de que existe una nueva publicación en algún tópico. El cliente MQTT de Unity entra en una interrupción o evento como se muestra en la Figura 3.26 en el que se guarda el mensaje recibido y se lo discrimina de acuerdo con el tópico de la publicación para poder actualizar los comandos que corresponda.

Al final se reinicia el timer2 que se maneja en la función Update que era el responsable de llevar la cuenta del tiempo que transcurre desde el último dato recibido para reconocer si existe comunicación o no con la estación local.

Evento. Mensaje MQTT recibido

Guarda el mensaje recibido

Discrimina el mensaje recibido de acuerdo al Tópico y actaliza las varablescomo la aceleracion, desaceleracion,

direccion y sentido

Reinicia el Timer 2

Función Update

Figura 3.26 Evento de mensaje MQTT recibido.

Para poder visualizar el estado de la conexión con la estación local, se incluye una caja en la pantalla del simulador para que el operador pueda conocer el estado de la conexión y además para que el usuario pueda reiniciar la simulación como se muestra en la Figura 3.27.

Función Guide

Mostrar el estado de la conexión con la estación local

¿Se presiono el botón de reinicio?

Reiniciar el simulador

si no

Figura 3.27 Función guide de Unity. Script de la cámara

La cámara fue programada para seguir a un solo objetivo, en este caso es el carlike para poder visualizar por donde se está movilizando. El diagrama de bloques de la programación de la misma se muestra en la Figura 3.28.

Inicio

Guarda el objeto Carlike en una variable publica desde el entorno virtual

Calcula la distancia entre la cámara y el carlike

Ajusta la posición de la cámara según la distancia que mantiene con el carlike

Ajusta la rotación de la cámara según la rotación del carlike

Fin