Implementación de una API para la interacción del guante P5 con entornos de realidad virtual implementados en Java y Java 3D Antonio José Escallón D., Ricardo Antonio Parra S. Facultad de Ingeniería Pontificia Universidad Javeriana Calle 18 # 118-250 Cali. Colombia E-mail: aescallon@puj.edu.co, rparra@puj.edu.co Andrés Navarro Pontificia Universidad Javeriana E-mail: anavarro@puj.edu.co Se presenta el proceso de implementación de una API, que permite la interacción del guante P5 con entornos virtuales implementados en el lenguaje de programación Java y su librería Java 3D. También se describen dos ejemplos implementados haciendo uso de la API en cuestión. Con base en los ejemplos implementados, se presentan los resultados de la ejecución de pruebas de consumo de los recursos CPU y memoria física. Finalmente se especifican las conclusiones obtenidas. It is presented a specific API’s implementation process, this API allows the interaction of the P5 glove with virtual reality environments implemented in the programming language Java and its tool Java 3D. Also it is described two sample programs implemented by means of the API. Using the examples, it is presented the results of CPU and physical memory consumption tests. Finally the conclusions obtained are specified. Key words: API, P5 glove, programming language, virtual environments, Java, Java 3D. 1. INTRODUCCIÓN La realidad virtual es una interfaz sensorial entre el humano y el computador en la cual el computador genera un ambiente con sentido de inmersión que interactivamente es controlado y responde al comportamiento del usuario. La interacción es un mecanismo para construir un dialogo desde varios dispositivos de control y aplicar ese dialogo a un sistema. Este mecanismo se divide en dos partes: 1. Tomar las entradas de un dispositivo e interpretarlas. 2. Tomar la información significativa para el sistema y filtrar datos que no sirven. Los propósitos de la interacción son: • Traducir las acciones del usuario en cambios dentro del ambiente virtual. • Pasar comandos al ambiente. • Proveer información de entrada. Anteriormente, los cirujanos aprendían nuevos procedimientos quirúrgicos observando, practicando con animales y cadáveres, y después realizando el procedimiento en pacientes bajo la supervisión de un cirujano experimentado. Con los avances en telemedicina y Epiciclos. Cali (Colombia), Febrero de 2006 1 robótica los médicos pueden entrenar en un ambiente virtual en el cual no se pone en riesgo a los pacientes, además de proporcionar una vista remota de lo que un médico pueda estar viendo en otro lugar. Muchas de las investigaciones y trabajos realizados por el ingeniero de sistemas Andrés Navarro, estudiantes de Telemedicina y trabajos de grado, han logrado infundir la importancia que tiene la realidad virtual en el campo de la medicina, fomentando a los estudiantes a incursionar en esta área. 2. HERRAMIENTAS 2.1. Guante P5 El guante P5 es un innovador dispositivo en forma de guante, ver figura 1, con las propiedades de rastreo remoto y censores curvos, que da al usuario la impresión de interactuar en ambientes virtuales y tercera dimensión (3D), tales como juegos, sitios Web y software educacional. Figura 1. Guante P5 (tomada de http://www.vrealities.com/P5.html) El P5 ha sido especialmente diseñado para mejorar la experiencia en los juegos de computador y proveer al usuario con extraordinarias características. Características • Liviano, diseño ergonómico para facilidad de uso. Pesa solo 4.5 onzas. • Posee 6 grados de movimiento (X, Y, Z, yaw, pitch y roll) para asegurar un movimientos reales. • Tecnología de censores de curva y rastreo óptico para proporcionar movilidad real. • Instalación mediante el puerto USB. • Receptor de control infrarrojo con lente resistente antireflectivo. Especificaciones de sensores de los dedos • Medición independiente de los 5 dedos. • Rango de 0 a 90 grados. Especificaciones del sistema de rastreo • Sistema de rastreo óptico. • Rango de recepción de la señal de 3 a 4 pies de distancia (0.92 a 1.23 metros) que permite un rango ilimitado en el monitor. • Taza de refresco de 60 Hz. • 6 grados de libertad ( yaw / pitch / roll / x / y / z ) Especificaciones XYZ • 0.125 pulgadas de resolución @ 3 pies del receptor e ilimitado del monitor. • 0.5 pulgadas de exactitud @ 3 pies del receptor que permite un rango ilimitado del monitor. Especificaciones de Yaw – Pitch – Roll • 1 grado de resolución. • 1 grado de exactitud. 2 Epiciclos. Cali (Colombia), Febrero de 2006 Receptor para colocar sobre el escritorio • No necesita cable eléctrico. • Enciende y apaga con el sistema. Requerimientos • Sistema Operativo Microsoft Windows 95/98/98SE/ME/2000/XP o MAC 9, no es compatible con versiones anteriores a MAC 9. • Procesador Pentium 100 MHz • Memoria RAM 16 MB • 75 MB de espacio disponible en disco duro • Puerto USB (USB 1.1). 2.2. API – Aplication Programming Interface Una API (Aplication Programming Interface - Interfaz de Programación de Aplicaciones) es un conjunto de especificaciones de comunicación entre componentes de software. Representa un método para conseguir abstracción en la programación. Uno de los principales propósitos de una API consiste en proporcionar un conjunto de funciones de uso general. De esta forma, los programadores se benefician de las ventajas de la API haciendo uso de su funcionalidad, evitándose el trabajo de programar todo desde el principio. Las APIs son abstractas: el software que proporciona una cierta API generalmente es llamado la implementación de esa API. Ejemplos de APIs: • • • • API de Microsoft Win32 APIs de SUN J2EE (Java 2 Enterprise Editions) Los APIs Carbon para el sistema operativo Macintosh API Common Object Request Broker Architecture (CORBA). En la actualidad existen especialidades médicas quirúrgicas que necesitan de la práctica para desarrollar necesarias para prevenir los errores. El simulador quirúrgico de otorrinolaringología es un proyecto diseñado para ayudar a tener el entorno necesario que permita sumergir al usuario final en un ambiente virtual, y le provee las herramientas necesarias para desarrollar esta habilidad quirúrgica vía Internet. Dicho proyecto de grado, es una base para diferentes proyectos en la universidad Javeriana. La creación de la API para el uso del guante P5, da un mayor grado de inmersión a proyectos como el Prototipo de Simulador Quirúrgico de otorrinolaringología, permitiendo una interacción entre el usuario final y el ambiente virtual. 2.3. JNI – Java Native Interface La interfaz nativa de Java (JNI por sus siglas en inglés) es una herramienta que provee la plataforma Java. Las aplicaciones que utilizan JNI pueden incorporar código escrito en los lenguajes de programación C y C++, tanto como código escrito en el lenguaje de programación Java, es decir, JNI permite comunicar los lenguajes de programación C y C++ con Java. JNI está diseñado para manejar situaciones donde se necesita combinar aplicaciones Java con código nativo (C y C++). Como una interfaz de doble vía, JNI soporta dos tipos de código nativo: librerías nativas y aplicaciones nativas. • JNI se puede usar para escribir métodos nativos que le permiten a las aplicaciones implementadas en Java llamar funciones implementadas en librerías nativas, estos llamados son iguales a los llamados a métodos implementados en Java, sin embargo los métodos nativos están implementados en un lenguaje de programación diferente y residen en librerías nativas. • JNI soporta una interfaz de invocación que permite incluir una implementación de la máquina virtual de Java en aplicaciones nativas. Las aplicaciones nativas pueden enlazarse con una librería nativa que contiene la implementación de la máquina virtual de Java, y entonces usa la interfaz de invocación para ejecutar componentes de software escritos en el lenguaje de programación Java. Epiciclos. Cali (Colombia), Febrero de 2006 3 3. ANÁLISIS DE REQUERMIENTOS DE LA API 3.1. Descripción del problema Con el ánimo de mejorar la interacción que brindan las aplicaciones implementadas en Java usando Java 3D, y en particular el prototipo del simulador de otorrinolaringología, se pretende integrar un guante como dispositivo de interacción con los ambientes virtuales aumentando así el grado de inmersión que experimentan los usuarios. Para esto, es necesario el desarrollo de una interfaz que permita comunicar el guante con los diferentes ambientes virtuales. Se espera como resultado la implementación de una API compatible con las tecnologías usadas para la implementación de dichos ambientes. 3.2. Requerimientos funcionales y no funcionales 3.2.1. Requerimientos funcionales Inicializar el guante RF-01 Descripción El guante debe ser inicializado antes de comenzar a utilizarlo Precondición El guante está conectado al computador Paso Secuencia Acción 1 Llamado a la función de inicialización 2 Reservación de memoria para las variables utilizadas Poscondición Excepciones El guante ha sido inicializado Paso 1 Acción Si el guante no es detectado, no se reserva memoria y termina este caso de uso Comentarios Se hace el llamado a la función de inicialización una sola vez, cada vez que se vaya a utilizar el guante Tabla 1. Requerimiento funcional Inicializar el guante RF-02 Procesar el movimiento del guante Descripción El sistema debe calcular la posición del guante en el espacio Precondición El guante ha sido inicializado Paso Secuencia 1 Acción Llamado a la función de procesamiento de movimiento 2 Actualización de las variables de posición del guante P5 Poscondición La información sobre la posición del guante está actualizada Comentarios La posición del guante debe ser calculada de forma continua mientras se usa el guante P5 en una aplicación Tabla 2. Requerimiento funcional Procesar el movimiento del guante 4 Epiciclos. Cali (Colombia), Febrero de 2006 RF-03 Procesar el doblamiento de los dedos Descripción El sistema debe calcular y mantener un valor relacionado con el doblamiento de cada dedo Precondición El guante ha sido inicializado Paso Secuencia 1 Acción Llamado a la función de procesamiento del doblamiento de los dedos 2 Actualización de las variables de doblamiento de cada dedo del guante P5 Poscondición La información sobre el doblamiento de los dedos está actualizada Comentarios El doblamiento de los dedos debe ser calculado continuamente mientras se este usando el guante P5 en una aplicación Tabla 3. Requerimiento funcional Procesar el doblamiento de los dedos 3.2.2. Requerimientos no funcionales RNF-01 Lenguaje de programación Descripción La API debe ser desarrollado en Java y debe ser compatible con Java 3D Comentarios Ninguno Tabla 4. Requerimiento no funcional Lenguaje de programación RNF-02 Sistema operativo Descripción La API debe ser probado sobre el sistema operativo Windows XP Comentarios Ninguno Tabla 5. Requerimiento no funcional Sistema operativo 4. DISEÑO DE LA API 4.1. Definición de clases y funciones Con base en la librería dinámica que provee el fabricante del guante P5 (Essential Reality), se diseñó la clase P5DLLw como se ve en la figura 3.1, que actúa como intermediario entre la librería dinámica original y los programas que serán implementados en Java y Java 3D. Epiciclos. Cali (Colombia), Febrero de 2006 5 P5DLLw +m_nNumP5: int +ID: int +m_fx: float +m_fy: float +m_fz: float +m_fyaw: float +m_fpitch: float +m_froll: float +thumbValue: int +indexValue: int +middleValue: int +ringValue: int +pinkyValue: int +lastErrorCode: int +lastErrorDevice: int +P5_Init(): boolean +P5_GetMouseState(in P5Id:int): boolean +P5_SetMouseState(P5Id:int,state:boolean): void +P5_GetLastError(): boolean +P5_BendInit(P5Id:int): void +P5_BendSetClickSensitivity(finger:int,value:char): void +P5_BendProcess(): void +UpdateBendData(): void +P5_MotionInit(P5Id:int): void +P5_MotionSetClipRegion(xstart:int,xend:int, ystart:int,yend:int, zstart:int,zend:int): void +P5_MotionProcess(): void +UpdateMotionData(): void Figura 2. Diagrama de la clase P5DLLw La clase P5DLLw tiene los siguientes atributos: • M_nNumP5, mantiene el número de guantes conectados encontrados. • ID, es el identificador asignado al guante • m_fx, indica la posición en el eje x • m_fy, indica la posición en el eje y • m_fz, indica la posición en el eje z • m_fyaw, indica el ángulo del guante cuando realiza el movimiento de la figura 3 Figura 3. Yaw • m_fpitch, indica el ángulo del guante cuando realiza el movimiento de la figura 4 Figura 4. Pitch • m_froll, indica el ángulo del guante cuando realiza el movimiento de la figura 5 Figura 5. Roll • thumbValue, indexValue, middleValue, ringValue, pinkyValue, indican el nivel de doblamiento de los dedos pulgar, índice, corazón, anular y meñique respectivamente • lastErrorCode, indica el último tipo de error ocurrido 6 Epiciclos. Cali (Colombia), Febrero de 2006 • lastErrorDevice, indica el identificador del guante al que corresponde el último error Con base en los requerimientos funcionales, se decidió implementar los siguientes métodos o funciones: • P5_Init(void) Æ boolean, reserva la memoria requerida por el guante cuando está conectado e inicializa sus variables. Retorna true o false, si se pudo o no inicializar el guante P5. • P5_GetMouseState(int P5Id) Æ boolean, verifica en que estado se encuentra el guante cuyo identificador es P5Id. Retorna true si el guante está funcionando como Mouse y false si el guante está deshabilitado como Mouse. • P5_SetMouseState(int P5Id, boolean state) Æ void, permite especificar el modo del guante con identificador P5Id, enviando el valor de la variable state como true si se quiere usar el guante como Mouse y de lo contrario como false. • P5_GetLastError(void) Æ boolean, permite conocer el último error que ha ocurrido. Retorna true si ha ocurrido un error o false en caso contrario, para conocer el código del error ver la variable lastErrorCode y para saber el identificador del guante que lo genero ver la variable lasErrorDevice. • P5_BendInit(int P5Id) Æ void, Inicia el procesamiento de la información que proviene del doblamiento de los dedos a través del guante identificado con P5Id. • P5_BendSetClickSensitivity(int finger, char value) Æ void, especifica el grado de sensibilidad para el dedo finger, siendo 0: pulgar, 1: índice, 2: corazón, 3: anular y 4: meñique. • P5_BendProcess(void) Æ void, procesa la información del doblamiento de los dedo. • UpdateBendData(void) Æ void, actualiza las variables correspondientes al grado de doblamiento de cada dedo del guante. Normalmente el valor de cada dedo varia entre 0-63, siendo 63 cuando el dedo está totalmente doblado. • P5_MotionInit(int P5Id) Æ void, Inicia el procesamiento de la información que proviene del movimiento del guante identificado con P5Id. • P5_MotionSetClipRegion(int xstart, int xend, int ystart, int yend, int zstart, int zend) Æ void, permite especificar los limites de movimiento del guante en los ejes x, y, z. • P5_MotionProcess(void) Æ void, procesa la información del movimiento del guante. UpdateMotionData(void) Æ void, actualiza las variables correspondientes al movimiento del guante. El valor en cada eje varía entre xstart-xend, ystart-yend y zstartzend. 4.2. Arquitectura planteada Los dos componentes implementados en este proyecto son: • La librería dinámica, que actúa como intermediaria entre la librería original del guante P5 (librería P5dll) y la API implementada en este proyecto (P5DLLw), haciendo uso de la interfaz JNI, que permite comunicar los lenguajes de programación Java y C++, en este caso en particular. • La API implementada en Java como la clase P5DLLw, contiene los métodos o funciones necesarios para el uso del guante en ambientes virtuales implementados en Java y Java 3D. Epiciclos. Cali (Colombia), Febrero de 2006 7 Librería P5dll Drivers C++ Interfaz JNI Librería P5DLLw (Wrapper) API P5DLLw Aplicación Java 3D Figura 6. Arquitectura planteada 5. IMPLEMENTACIÓN DE LA API La API fue implementada en el lenguaje de programación Java. Java fue seleccionado con el fin de asegurar la compatibilidad de la API con la tecnología utilizada en el Simulador de Otorrinolaringología. La API se basa en la librería dinámica que provee el fabricante del guante P5, dicha librería está implementada en el lenguaje de programación C++. Para lograr la comunicación entre Java y C++, se utilizó JNI que es una interfaz de programación que permite la interoperabilidad entre Java y C/C++. Inicialmente se exploro la librería del guante P5, haciendo modificaciones de prueba al código fuente escrito en C/C++, compilándolo y ejecutándolo, para así comprender las funciones que eran proveídas por el fabricante del guante P5. Después se realizo una prueba básica en la que a una librería dinámica implementada en C++ contenía una función que se encarga de imprimir el texto “Hola mundo!” y un pequeño programa escrito en Java llamaba a la función de la librería dinámica, imprimiendo así el texto cuando se ejecutaba el programa implementado en Java. Una vez comprobada la posibilidad de comunicar programas implementados en C/C++ con programas escritos en Java, se procedió a definir la forma de comunicar la librería dinámica original del guante P5 con la API implementado en este proyecto. Para no modificar la librería original (que es propiedad del fabricante del guante), se planteó una librería dinámica adicional que trabajara como intermediaria ente la API y la librería original, recibiendo por un lado los llamados a funciones del guante desde Java y por el otro llamando las funciones de la librería original implementadas en C++. Para utilizar el guante P5 en aplicaciones implementadas en Java y ambientes virtuales implementados en Java 3D solo se requiere ubicar la librería P5DLLw.dll en la misma carpeta de la librería original (que por defecto es la carpeta System32 dentro de la carpeta Windows) o en la misma carpeta de la aplicación que hace llamado a los métodos de la clase Java P5DLLw. 6. PRUEBAS Y RESULTADOS 5.1. Ejemplos implementados Para facilitar la comprensión del funcionamiento de la API, se implementaron dos aplicaciones de ejemplo en los que se utiliza el guante P5. 8 Epiciclos. Cali (Colombia), Febrero de 2006 5.1.1. Ejemplo 1 El primer ejemplo está implementado en Java y pretende ilustrar la capacidad del guante P5 ya que presenta una representación para el nivel de doblamiento de cada dedo, el ángulo de giro en los planos XZ (yaw en inglés), XY (pitch en inglés) y el ángulo de rotación respeto al eje Z (roll en inglés), la posición en los ejes X,Y,Z y el funcionamiento como Mouse activado o desactivado, tal como se ve en la figura 7 Figura 7. Imagen del Ejemplo 1 5.1.2. Ejemplo 2 El segundo ejemplo está implementado en Java utilizando la API de Java 3D, se presenta el guante P5 como alternativa para mejorar el grado de interacción entre el usuario y los ambientes virtuales. Este ejemplo está incluido en las demostraciones que trae el instalador de Java 3D y fue modificado para que funcione con el guante P5 a través de la API implementado en este proyecto. Esta aplicación consiste en manipular una mano de cuatro dedos que tiene tres estados posibles (abierta, cerrada y a medio cerrar) y cambia de forma de acuerdo con el nivel de doblamiento de los dedos a través del guante, ver figura 8 Figura 8. Imagen del Ejemplo 2 5.2. Pruebas de carga Java posee una maquina virtual la cual se encarga de interpretar y ejecutar las instrucciones generadas por el compilador, haciendo que la carga de este cree algún retraso. Además del retardo en renderizar o cargar los objetos tridimensionales en Java 3D. Esta prueba se realizó con el objetivo de tomar datos, para determinar el porcentaje de carga de CPU y de memoria RAM ocasionada por una aplicación implementada en Java y otra en Java utilizando la API de Java 3D que usen el guante P5. Se utilizó Konfabulator versión Epiciclos. Cali (Colombia), Febrero de 2006 9 2.1, un software especializado para determinar la carga de CPU y la carga de memoria física (RAM) del computador. En la tabla 6 se pueden ver los resultados de las pruebas de carga de CPU y memoria física realizadas al Ejemplo 1, una aplicación implementada en Java que permite mostrar la API en funcionamiento, ofreciendo información sobre el estado actualizado del guante P5. El Ejemplo 2 se realizó con base en un ejemplo que provee la instalación de Java 3D llamado Morphing.java, en la tabla 7 se aprecian los resultados de las pruebas de carga del Ejemplo 2 antes de la modificación realizada que permite el uso del guante P5, y en la tabla 8 se observa la misma prueba realizada a la misma aplicación con las modificaciones necesarias para usar el guante P5. Los resultados obtenidos con el ejemplo en Java P5Test.java fueron: Computador A Computador B Especificaciones Carga de CPU Técnicas (%) Windows XP Procesador Athlon 82,37 XP de 2,0 GHz, 512 MB de RAM Windows XP Procesador Pentium 91,21 IV de 1,4 GHz 256 MB de RAM Tabla 6.de carga del ejemplo 1 Carga de Memoria física (%) 59,54 81,42 Los resultados obtenidos con el ejemplo en Java 3D Morphing.java fueron: Especificaciones Carga de CPU Carga de Técnicas (%) Memoria física (%) Windows XP Procesador Athlon Computador A 92,38 50,02 XP de 2,0 GHz, 512 MB de RAM Windows XP Procesador Pentium Computador B 89,12 76,23 IV de 1,4 GHz 256 MB de RAM Tabla 7. Prueba de carga del ejemplo 2 sin usar las funciones de la API Especificaciones Carga de CPU Carga de Técnicas (%) Memoria física (%) Windows XP Procesador Athlon Computador A 94,68 58,21 XP de 2,0 GHz, 512 MB de RAM Windows XP Procesador Pentium Computador B 98,16 80,51 IV de 1,4 GHz 256 MB de RAM Tabla 8. Prueba de carga del ejemplo 2 usando la API Se puede observar que se presenta un aumento significativo en los resultados de las pruebas de carga realizadas antes y después de utilizar la API en el Ejemplo 2. Este aumento en la carga puede ser atribuido al ciclo que se encarga de inspeccionar los cambios en el estado del guante P5 durante la ejecución de la aplicación. Los valores obtenidos fueron tomados poco tiempo después de iniciadas las aplicaciones con el fin de esperar hasta que el sistema se estabilizara. 10 Epiciclos. Cali (Colombia), Febrero de 2006 6. CONCLUSIONES a. El trabajo realizado aporta al mejoramiento del grado de inmersión de aplicaciones en las que se presenten entornos virtuales al usuario final, pues permite la interacción directa de la mano del usuario yendo más allá del ratón y siendo un paso inicial para que a futuro se extienda al sentido del tacto. La API en Java, permite que el desarrollador use Java 3D como lenguaje opcional para la creación de objetos tridimensionales. b. La arquitectura planteada facilita el mejoramiento de la API y la implementación de nuevas librerías dinámicas que soporten el uso del guante P5 en múltiples sistemas operativos. Para esto se debe reemplazar la librería dinámica P5DLLw.dll por una librería dinámica correspondiente de acuerdo al sistema operativo en el que se implementa. c. Los ejemplos implementados facilitan la comprensión del uso de la API en aplicaciones implementadas con Java y Java 3D. En dichos ejemplos se utilizan la mayoría de los métodos o funciones de la API. 7. REFERENCIAS 1. Satava, Richard M. Cybersurgery : advanced technologies for surgical practice. Estados Unidos : John Wiley & Sons, 1998. 2. Larijani, L. Casey. Realidad virtual. España : McGraw-Hill Interamericana, 1994. 3. Gabrilovich, Evgeniy. JNI- C++ Integration made easy: Extremely versatile interfaces like the java jni also tend to be extremely cumbersome, as a rule. The authors have found a way to break that rule. Volumen 19 Número 1, C/C++ Users Journal p10-21, 2001. 4. Huston, Terry L. Huston, Janis L. Is telemedicine a practical reality?. Volume 43 Número 6, Communications of the ACM p91-95, 2000. 5. Liang, Sheng. The Java Native Interface. Programmer’s Guide and Specification. Estados Unidos: Sun Micosystems, 1999. 6. http://java.sun.com/productos/java-media/3D/collateral/, K Computing. Getting Started with Java3D.. 1999. 7. http://www.vrealities.com/P5.html, Virtual Realities, Global Distributor of Quality Virtual Reality Products. Epiciclos. Cali (Colombia), Febrero de 2006 11