IOC Robotic's Lab

Project Description

Kincap is an algoritm that provides a three-dimensional triangular meshed model of an obstacle, captured from a real life environment, using mainly a Kinect Device and an Illusion "Flock of Birds" magnetic tracker. By running the algoritm, the user will be asked to perform several captures from different viewpoints, so as to acquire a good amount of XYZ-points that will be furtherly merged in one and only pointcloud. Once the pointcloud completed, the algoritm will generate a triangular mesh model in the inventor (.iv, .vrml) format which can be then integrated in the IOC's The Kautham Project robotic simulation environment. Full code in C++ language, written with Qtcreator software, and using mainly four libraries: mt library to perform quaternion and transformation conversion, libfob library to communicate with the tracker, pcl library to perform the pointcloud data treatment and libfreenect library for its applets (pointcloud viewer, for instance).


Code Description

The main code works as it follows:

Algoritm

Manage commands;
Initialize Tracker;
Capture Kinect's position and orientation;
Pointcloud1 = Capture (position, orientation) ;
While (!mesh) {
While (!end) {
Capture Kinect's position and orientation;
Pointcloud2 = Capture (position, orientation);
Merge ( *Pointcloud1, Pointcloud2);
end?
}
Mesh Generation (Pointcloud1);
}
Close Tracker communication;

End

The main idea is, as stated in the project description, to capture several obstacle pointclouds from different view points, so as to merge them progressively until the user decides that the model is complete. The tracking device allows to transform every capture pointcloud, from the Kinect reference into a World reference, by continuously applying matrix conversion (Kinect to Transmitter, Transmitter to Sensor, Sensor to World).

Keep reading for a full user guide in spanish.

Installation

En este manual de usuario, en complemento a la memoria del proyecto, se quiere detallar paso a paso el modus operandi para la correcta obtención de un modelo tridimensional a partir del obstáculo o entorno real deseado, reduciendo así el periodo de aprendizaje por parte del usuario final, y al mismo tiempo permitiéndole obtener los mejores resultados posibles.

En esta guía se analizará, en primer lugar, la inicialización de los dispositivos, así como su disposición en el espacio, y se estudiarán una a una las etapas del algoritmo y la información que este transmite a lo largo de su ejecución, comentando cada paso con trucos u observaciones para mejorar los resultados.

Inicialización de los dispositivos

Antes de lanzarse a ejecutar el algoritmo, cabe disponer el material correctamente, y eso incluye haber inicializado todos los dispositivos. En el caso de la cámara Kinect no hay que tomar ninguna precaución, ya que para cada captura el algoritmo se encarga de inicializar la cámara, establecer una comunicación, obtener la información y cortar la comunicación con la cámara. La única comprobación a realizar es que el dispositivo esté conectado a la corriente y a un puerto USB del ordenador, y que una luz verde parpadee en la parte frontal, entre el emisor de rayos infrarrojos y el sensor de color. Limpiar los sensores periódicamente puede ayudar a mejorar los resultados obtenidos.

En el caso del sistema de posicionamiento Flock of Birds, al que se llamará a partir de ahora tracker, sí que existen varias consideraciones a tener en cuenta previa ejecución del algoritmo. El tracker dispone, como se puede apreciar a simple vista, de siete conectores, de los cuales cuatro serán utilizados. En la parte frontal, y bajo el texto XMTR, se deberá conectar el emisor de campos magnéticos.

En la parte posterior, tal y como se puede observar en la figura 1.2, quedarán seis conectores, entre los cuales se ignorarán los situados bajo las siglas FBB (conectores de red) y SYNC. Deberá enchufarse pues, en el lado izquierdo y bajo el texto RECEIVER, el cable que conecta el tracker con el ordenador. Por otro lado, en el enchufe central (POWER) deberá conectarse el cable de alimentación. Finalmente, en el lado derecho y bajo el código RS-232 deberá conectarse el receptor de campos magnéticos.

Llegados a este punto, cabe destacar un aspecto importante del dispositivo, y este es que al finalizar la ejecución del algoritmo, la conexión con el tracker se corta, pero este queda en modo activo esperando para transmitir más información a su antiguo usuario, con lo que, si volvemos a ejecutar el código, considerará que un nuevo usuario quiere acceder a la información y dará un error de transmisión. Es preciso pues, al final de cada ejecución del código, apagar y encender el tracker para que la lectura de los datos se realice correctamente.

Disposición de los dispositivos

Como se ha comentado a lo largo de la memoria del proyecto, las limitaciones del material imponen ciertas condiciones de uso que deben ser respetadas para la obtención de resultados pertinentes. Se quiere recordar en este apartado esas limitaciones a la hora de posicionar todos los dispositivos previamente a la ejecución del algoritmo.

Empezando por el tracker, el alcance de la recepción de campos magnéticos por el sensor es de aproximadamente un metro y veinte centímetros, por lo que la cámara deberá permanecer en el interior de una esfera donde el radio sea la distancia mencionada previamente y el centro corresponda a la posición del transmisor del tracker (cubo de mayores dimensiones). Se recomienda pues posicionar el transmisor del tracker en un lugar cómodo para la captura de imágenes, a elección del usuario, dentro de esta esfera.

Siguiendo con el tracker, se recuerda que, desgraciadamente, los campos magnéticos ajenos al transmisor influyen de todas maneras en el receptor del tracker, por lo que los valores de posicionamiento se pueden ver alterados en un ambiente muy poblado en elementos electrónicos.

Por otro lado, se recuerda que el objetivo del posicionamiento de la cámara es el de obtener una buena cantidad de correspondencias entre dos imágenes consecutivas, y por lo tanto corresponde al usuario evaluar que variación de posición es adecuada, sabiendo que es preferible hacer muchas capturas con pequeñas variaciones que pocas capturas con excesiva variación de posición.

Como nota importante, no es necesario que la cámara esté colocada en un sitio fijo, como encima de una mesa o en el suelo, entre otros, y puede estar sujeta por el usuario (con las manos) siempre y cuando el usuario no cambie la posición y orientación de la cámara de forma excesiva, ya que la adquisición de la posición y orientación de la cámara y la captura de la imagen no son instantáneas. Se estudiará cuando se podrá manipular la cámara en la sección 3, al mismo tiempo que se analizaran las informaciones visibles en la consola para el seguimiento del algoritmo.

Ejecución del algoritmo

Paso previo a la ejecución del algoritmo, se ha de comprobar que el interruptor de la centralita del tracker se encuentra en la posición stand-by (STBY). Se procede a encenderla poniendo el interruptor en posición FLY, con lo que la luz roja cercana al interruptor parpadeará brevemente. Seguidamente, ejecutaremos el código ya sea mediante el software Qtcreator o directamente en la consola. El ejemplo a continuación corresponde a la ejecución mediante Qtcreator. La primera información que se podrá observar en la consola corresponde a la lista de comandos admitidos. Solo se ha establecido una opción de ayuda, que se puede activar si añadimos “-h” o “–help” como argumentos al ejecutar el código, por ejemplo mediante el comando “./main –h”. Se puede especificar el nombre de base de los ficheros que se crearán, aunque de manera predeterminada se ha establecido pointcloud.pcd como nombre de base. En tal caso, el comando a ejecutar seria “./main nube_de_puntos.pcd” si se quiere que los ficheros tengan el nombre nube_de_puntos.

Seguidamente, el algoritmo procede con la inicialización del dispositivo Flock of birds, y configura el transmisor (flock) según la activación de los switches posteriores de la centralita. Estos switches, como se ha mencionado en la memoria del proyecto, se dejarán en la configuración 1110001, configuración estándar, que significa que los switches 1, 2, 3 y 7 están en posición ON, y los demás en posición OFF. Si todo está correctamente configurado, tal y como se puede apreciar en la figura 3.2.2, el usuario podrá observar el mensaje de la figura 3.2.1 donde se ha detectado un sensor (number of birds) con la configuración flock status 0 citada anteriormente.

Llegados a este punto, el usuario debe ahora mantener la cámara en la posición fija que haya elegido, puesto que automáticamente el programa capturará la primera imagen y almacenará la posición y orientación de la cámara.

Como se puede ver en la figura 3.3, el algoritmo escribirá por pantalla las coordenadas del sensor respecto al transmisor del tracker, así como el cuaternión de rotación. Acto seguido se capturará la primera nube de puntos, se almacenará, y se realizará un tratamiento de reducción de densidad de puntos. Es muy importante no mover la cámara entre la fase de medición de la posición del sensor y la fase de captura de la imagen, ya que estas etapas no son instantáneas y cualquier error puede suponer un error mayor más adelante. Una vez acabada la captura se puede depositar la cámara sobre cualquier superficie.

Seguidamente viene una etapa de comprobación. Esta se explica dado que el transmisor dispone de dos hemisferios (UP, DOWN) y según el hemisferio en el que se encuentre el sensor en el momento de calcular la posición pueden cambiar los signos. Se recomienda pues trabajar en el mismo hemisferio durante toda la captura de imágenes, dicho de otro modo en los cuadrantes de coordenada x positiva. En cualquier caso, al final de la captura se ha de comprobar visualmente si los valores leídos corresponden con la posición real de la cámara (aproximadamente, a partir del cuadrante en el que se encuentre la cámara). Si se observa que los valores leídos de posición aparecen con el signo cambiado respecto a la posición, el usuario ha de escribir n y apretar enter. En caso contrario, se ha de escribir y y apretar luego enter, tal y como se pide en la consola. Estos valores serán utilizados para transformar los puntos a la referencia Mundo.

Uno de los problemas citados en la memoria del proyecto era la presencia de superficies planas en las capturas, ya que podían generar errores de correspondencias, y típicamente los suelos eran un elemento a evitar en las capturas. Aun así, se pueden encontrar partes del suelo en las capturas, y es preciso eliminarlas en algunos casos. Así pues, si se considera que el suelo entorpece el cálculo de correspondencias entre dos imágenes (típicamente en obstáculos de tamaño pequeño y mediano) se puede extraer escribiendo y y apretando luego enter. La nube de puntos en referencia Mundo y tratada será pues almacenada para la unión.

Como se puede apreciar en la figura 3.6, se debe seguidamente desplazar la cámara al siguiente punto de captura, para obtener una segunda nube de puntos, y una vez alcanzado este punto queda apretar la tecla enter. Como podrá observar el usuario, las etapas a realizar son las mismas que para la primera captura, y, por tanto, no se volverán a detallar. Cabe destacar, eso sí, que el usuario debe intentar facilitar el trabajo de unión de capturas, evitando pues realizar capturas con mucha separación las unas de las otras.

En la figura 3.7 observamos el proceso de unión de capturas, momento en el cual el usuario debe dejar al algoritmo trabajar. Esta etapa puede tardar hasta un par de minutos, cada vez mas según el numero de capturas realizadas, ya que cada vez habrá más puntos a analizar. Se pueden observar en este caso dos ceros, que indican que no ha habido ningún problema al abrir los ficheros de las capturas, aunque esta información es prescindible. Acto seguido aparecerá la matriz de transformación que ajustará la segunda captura para que coincida con la primera, y se unirán los puntos obtenidos a los de la primera captura, obteniendo un fichero con las dos nubes de puntos, fichero con el que se trabajará a continuación.

A partir de aquí, el algoritmo preguntará iterativamente si se quiere seguir capturando imágenes, y tratando estas capturas para ir añadiéndolas al fichero principal, repitiendo pues las etapas anteriores. Una vez acabada la fase de captura y unión, el algoritmo generará la malla triangular y exportara los ficheros mesh.vtk (para visualización) y obstacle.iv para introducir en el entorno de simulación The Kautham Project.

FAQ

Included Code snippets and utilities

User Manual (spanish)

Video Tutorial

Code Repository