Partimos de la base de que me piden si quiero presentar algún proyecto visual y no visto actualmente en un centro educativo para presentar a unas jornadas de informática de nuevas tecnologías en la educación. Investigando un poco encontré información de lo que es una representación de un «mapa topográfico en realidad aumentada en tiempo real», lo que viene siendo un AR SandBox (Aumentaty Reality SandBox).
Ya llevaba tiempo desarrollando un laboratorio de pruebas de un AR Sandbox que vi en algunos lugares, como son el parque de las Ciencias de Granada o en alguna Universidad. Mi idea era montar lo mismo pero en pequeñito, ya que existía algo de información de este sistema que es software libre.
Materiales necesarios
Kinect v1 (conexión USB + Red eléctrica)

Proyector (si es de corto alcance mejor). Por ejemplo el Optoma W316ST
Caja (ver tamaño)
Arena hasta cubrir al menos la mitad de altura de la caja
Ubuntu 18.04LTS: en mi caso en el momento de montar el sistema es la última versión estable.
Nvidia GPU >= 4GB
CPU i7
Instalación
Partimos de la base que tenemos ya instalado y actualizado nuestro sistema Linux (en mi caso utilicé una Ubuntu 18.04LTS)
$ sudo add-apt-repository -ys ppa:system76-dev/weekend-project
$ sudo apt-get update
$ sudo apt-get install arsandbox
$ sudo adduser -aG <usuario> vrui-grp
Calibración Kinect
Iniciar nuestro sistema y una vez dentro, conectar nuestra Kinect a un puerto USB (preferible 3.0) y a la red eléctrica. Abrir una terminal para calibrar: $ KinectUtil getCalib 0
Con este comando descargará los datos del firmware de nuestra Kinect y los guardará en un fichero dentro del directorio: /etc/Vrui-3.1/Kinect-2.8/
Alineación del campo de visión
En este momento podemos echar nuestra arena, si no lo hemos hecho ya.
En un terminal: $ RawKinectViewer -compress 0
Maximizar la imagen para que sea más sencillo cuadrar el campo de visión. El AR solo usa el campo de visión que proporciona la Kinect, pero podemos ayudarnos de la imagen en modo webcam para cuadrarlo con nuestro espacio.

El campo de visión debe cubrir toda el área de forma que se superponga levemente. Pulsamos ESC para cerrar RawKinectViewer
Definir el área sobre el plano base
Delimitar área
En un terminal ejecutar de nuevo: $ RawKinectViewer -compress 0
- Mantener presionado el botón derecho del ratón (se nos abrirá un menú) y seleccionamos la opción Average Frames. Soltamos el botón del ratón.
- Presionamos y mantenemos la tecla numérica “1” y seleccionamos Extract Planes. Soltamos la tecla “1”.
Empezando por la parte superior izquierda, trazamos un cuadro que se ajuste con el interior de nuestra superficie del campo de visión, dejando algo de espacio en los bordes. Pulsar ESC para salir.

Al salir, en nuestra terminal aparecerán dos líneas. Seleccionamos la parte de la segunda línea después del asterisco, que serán 3 coordenadas entre paréntesis, un signo igual y otra coordenada. Copiamos estos valores.
Editamos el fichero BoxLayout.txt: $ gedit /etc/SARndbox-1.6/BoxLayout.txt
Pegamos los valores antes copiados en la primera línea del fichero, sustituyendo el signo “=” (igual) por “,” (coma). Guardamos nuestro fichero.

Definir esquinas en superficie 3D
Este paso requiere que se haya rellenado el cajón con la arena. Hay que mantener el nivel de la arena, lo más plano posible (podemos poner una base sólida como una tabla a nivel si lo preferimos).
En un terminal ejecutar de nuevo: $ RawKinectViewer -compress 0
- Mantener presionado el botón derecho del ratón (se nos abrirá un menú) y seleccionamos la opción Average Frames. Soltamos el botón del ratón.
- Presionamos y mantenemos la tecla numérica “1” y seleccionamos Measure 3D Positions. Soltamos la tecla “1”. Ahora definiremos la extensión de la superficie en el interior del SandBox.

Usaremos el mapa de profundidad de color para ir marcando las esquinas que compone el área de nuestro SandBox. El orden será:
- Esquina inferior izquierda: pulsamos 1
- Esquina inferior derecha: pulsamos 1
- Esquina superior izquierda: pulsamos 1
- Esquina superior derecha: pulsamos 1
Nota: hay que tener en cuenta que no obtendremos ningún mensaje de respuesta cada vez que pulsamos el 1 al marcar.

Pulsaremos ESC para salir de RawKinectViewer.
En el terminal veremos que se muestran cuatro líneas nuevas (si no aparecen repetir el paso anterior de nuevo asegurándonos que marcamos los puntos dentro del área que seleccionamos en el apartado de “Delimitar área”).
Copiamos estos valores:

Editamos el fichero BoxLayout.txt: $ gedit /etc/SARndbox-1.6/BoxLayout.txt
Reemplazamos las cuatro líneas del fichero por las que hemos obtenido antes y guardamos:

Posicionar el proyector
Si no hemos encendido el proyector, debemos hacerlo ahora. Si tenemos monitor y proyector podemos duplicar la imagen para verla en ambos dispositivos a la vez.
Ejecutar desde una terminal: $ XBackground
Maximizamos la ventana, pulsando “F11” o “Fn 11” (si es un portátil)
Necesitamos posicionar el proyector, de manera que rellene por completo el interior de nuestro SandBox. Si se superpone un poco en los laterales no hay problema.

Calibración del AR SandBox
Como ya dijimos en el paso anterior, debemos tener rellena con arena el cajón, y lo mejor nivelada posible.
Vamos a calibrar el SandBox dando múltiples niveles de alturas, en este caso daremos 3 niveles de altura diferentes. Las herramientas para nivelar y que nos darán las alturas serán las siguientes:
- Dos rollos de cinta adhesiva ancho (solo necesitamos el cartón), o equivalente
- Un rollo de cinta adhesiva mediana o equivalente
- Un círculo con una cruz de papel (yo he usado un viejo CD)

En cada altura capturamos 12 puntos. Para una calibración relativamente buena podemos realizar 2 alturas (un total de 24 puntos), pero en mi caso para una mejor calibración recomiendo hacer 3 alturas (un total de 36 puntos).
La Kinect v1 por defecto es 4:3 así que una resolución de 1024×768 o 1600×1200 es la mejor. En mi caso utilizo la resolución 1024×768 ya que el proyector que he usado es reciclado y antiguo que no da aspecto panorámico 16:9 y tampoco soporta la resolución 1600×1200.
Usaremos la herramienta CalibrateProjector -s ANCHO ALTO
Ejecutar desde un terminal: $ CalibrateProjector -s 1024 768
Maximizamos la ventana, pulsando “F11” o “Fn 11” (si es un portátil)
- Pulsar «1» y mantener moviendo el cursor sobre «Capture«, entonces soltar la tecla “1”.
Cuando veamos el diálogo “Creating Capture Tool…” pulsar «2»

- Pulsar la tecla “2” de nuevo para capturar la imagen de fondo, que resultará en un fondo rojo proyectado.

Después de esto pasamos a la calibración:

Empezaremos haciendo las capturas desde el punto más bajo hasta el más alto pulsando en cada posición el «1».
Usando el elevador más bajo y con el cuadrante del círculo, alineamos el objetivo debajo de la cruz blanca proyectada sobre la superficie de la arena. Solo hay que colocarlo estable sobre la arena y nivelado.

Al principio veremos un círculo verde que no coincide con nuestro calibrador, pero poco a poco irá coincidiendo, no te preocupes.
Una vez posicionado presionamos la tecla “1” para capturar ese punto a esa altura. Automáticamente la cruz de calibración se moverá a otra posición. Repetiremos este proceso para las 11 posiciones restantes.
Una vez la cruz de calibración vuelva a la posición inicial, elevaremos nuestro calibrador con la segunda altura, y volveremos a repetir los pasos anteriores. Por último subiremos la tercera altura, repitiendo de nuevo las posiciones.

Cuando acabemos la calibración pulsamos ESC. Esto escribirá en el fichero /etc/SARndbox-1.6/ProjectorMatrix.dat
Ajustar el nivel del agua
Inicie la aplicación principal SARndbox buscando «sandbox» en las aplicaciones de Ubuntu. Luego maximice la aplicación para que llene todo su entorno de pruebas.
Si calculaste el plano base con un trozo de cartulina (o una superficie plana similar) encima de tu caja de arena, el nivel del mar será demasiado alto y verás todo azul lleno de agua:

Por otro lado, si calculaste el plano base cuando tu caja de arena estaba vacía, el nivel del mar será muy bajo. De cualquier manera, hay que ajustar el nivel del mar para que sea justo
debajo de la superficie de la arena cuando está más o menos aplanada.
Presionamos Esc para cerrar la aplicación AR Sandbox.
Editamos el fichero BoxLayout.txt: $ gedit /etc/SARndbox-1.6/BoxLayout.txt
El valor fuera de los paréntesis de la primera línea es el que controla el nivel del mar.

Buscamos el número más pequeño que haya y lo sustituimos por el último valor de la primera línea (redondeando hacia abajo).

En nuestro caso el valor más bajo es el -106.927, por lo tanto usaremos el valor de -107

Guardamos el fichero y volvemos a lanzar la aplicación, mostrando que ya está todo correcto.
Podemos probar diferentes valores para ajustar el nivel del mar según nuestro interés o nuestra cantidad de arena. Con esto ya podemos jugar con nuestro ARSandBox.
Cambiando la tasa de evaporación
Por defecto si abrimos la aplicación SARndbox veremos que llama al programa con los siguientes parámetros: $ SARndbox -uhm -fpv -evr -0.01
El parámetro -evr -0.01 es la tasa de evaporación del agua que cae cuando proyectamos la mano sobre el SandBox. Podemos probar diferentes tasas:
-evr -0.005: el agua se evapora más rápido
-evr -0.02: el agua se evapora más lento