Download Implementación de una API para la interacción del guante P5 con

Document related concepts
no text concepts found
Transcript
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: [email protected], [email protected]
Andrés Navarro
Pontificia Universidad Javeriana
E-mail: [email protected]
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