{"id":149,"date":"2016-03-31T16:08:20","date_gmt":"2016-03-31T14:08:20","guid":{"rendered":"http:\/\/www.rtbasics.com\/WP_2\/?p=149"},"modified":"2016-04-16T13:48:39","modified_gmt":"2016-04-16T11:48:39","slug":"sensor-de-profundidad-descubrimiento","status":"publish","type":"post","link":"https:\/\/www.rtbasics.com\/WP_2\/archives\/149","title":{"rendered":"Sensor de profundidad. Descubrimiento."},"content":{"rendered":"<body><p><\/p>Estaba yo pensando\u2026 \u00bfser\u00e1 posible hacer algo parecido?\n<p>El otro d\u00eda estuve volviendo a ver Prometheus, una pel\u00edcula de la saga de Alien que describe el origen del protagonista. Quer\u00eda recordar las escenas en las que unos peque\u00f1os dispositivos voladores trazan un mapa en tres dimensiones de las cuevas que dan acceso a la nave escondida en una construcci\u00f3n piramidal.<\/p>\n<p>Cuando vi la pel\u00edcula por primera vez, debi\u00f3 ser en 2012, pens\u00e9: \u201cEsto ser\u00eda fant\u00e1stico, seguro que hay gente y dinero detr\u00e1s pero, al fin y al cabo, esto es una peli de ciencia ficci\u00f3n\u201d<\/p>\n<p><!--more--><\/p>\n<p>M\u00e1s adelante, comienzos de 2014, en una visita a mis amigos de la Carlos III, me ense\u00f1aron el trabajo que estaba haciendo una estudiante con un sensor Kinect de Microsoft y pens\u00e9 que era m\u00e1s real de lo que yo hab\u00eda imaginado.<\/p>\n<p>Me pareci\u00f3 muy interesante, ten\u00eda que investigar un poquito m\u00e1s sobre el asunto. Se trataba de la primera generaci\u00f3n del sensor Kinect de Microsoft. Estaba orientado a la interacci\u00f3n \u201cnatural\u201d de un humano con una m\u00e1quina. La m\u00e1quina identificar\u00eda gestos del usuario y actuar\u00eda en consecuencia. Las primeras aplicaciones fueron juegos para la Xbox.<\/p>\n<p>El Kinect es un sensor de profundidad basado en la t\u00e9cnica de luz estructurada (<a href=\"http:\/\/www.rtBasics.com\/Downloads\/IEEE_structured_light.pdf\" target=\"_blank\">structured light<\/a>). Se basa en la proyecci\u00f3n de una matriz de puntos de luz infrarroja sobre la escena, que es observada por una c\u00e1mara de infrarrojo. La distorsi\u00f3n en la posici\u00f3n de los puntos sobre la escena respecto a su posici\u00f3n te\u00f3rica sobre una escena plana se convierte en informaci\u00f3n de profundidad en un SoC que genera informaci\u00f3n de posici\u00f3n de 320\u00d7240 puntos sobre un sistema de coordenadas de tres ejes. Como tambi\u00e9n dispone de una c\u00e1mara RGB, incluye informaci\u00f3n de color para cada punto.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/Structured_light.jpg\" rel=\"attachment wp-att-152\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"wp-image-152 alignleft\" src=\"https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/Structured_light.jpg?resize=230%2C199\" alt=\"Structured_light\" width=\"230\" height=\"199\" loading=\"lazy\" srcset=\"https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/Structured_light.jpg?resize=300%2C260&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/Structured_light.jpg?w=500&amp;ssl=1 500w\" sizes=\"auto, (max-width: 230px) 100vw, 230px\" \/><\/a><\/p>\n<p>Estaba basado en un sensor desarrollado por PrimeSense, una empresa de Israel, que, en colaboraci\u00f3n con Microsoft, desarroll\u00f3 el dispositivo. Curiosamente, esta empresa fue comprada por Apple en Noviembre de 2013 y ah\u00ed se acab\u00f3 la cooperaci\u00f3n con Microsoft. La segunda generaci\u00f3n del Kinect est\u00e1 desarrollada internamente por Microsoft y se basa en otra t\u00e9cnica distinta llamada \u201cTime of Flight\u201d.<\/p>\n<p>El sensor desarrollado por PrimeSense, adem\u00e1s de en el Kinect, tambi\u00e9n fue montado en otras dos familias de dispositivos. Fueron los PrimeSense Carmine, que pr\u00e1cticamente eran tarjetas de evaluaci\u00f3n de la tecnolog\u00eda de PrimeSense, y los ASUS Xtion, que eran sus primos hermanos.<\/p>\n<p>Para hacer pruebas ten\u00eda que decidirme por uno de ellos. Tras las siguientes consideraciones:<\/p>\n<ul>\n<li>Los PrimeSense Carmine y los ASUS Xtion eran pr\u00e1cticamente el mismo dispositivo, tanto desde el punto de vista hardware como software.<\/li>\n<li>Mientras que los ASUS se pod\u00edan comprar online f\u00e1cilmente, encontrar los PrimeSense Carmine era bastante complicado, por no decir imposible. Adem\u00e1s, tras la compra de PrimeSense por parte de Apple hab\u00eda desaparecido de la web pr\u00e1cticamente toda la informaci\u00f3n sobre estos dispositivos.<\/li>\n<li>Los ASUS son m\u00e1s ligeros y compactos que los Kinect. Los ASUS se alimentan por el mismo cable USB que se usa para la comunicaci\u00f3n de los datos, lo cual me pareci\u00f3 ventajoso. Los Kinect disponen de una alimentaci\u00f3n separada. Los Kinect incluyen un peque\u00f1o motorcito que les permite hacer movimiento de tilt en un rango reducido. Esto no me pareci\u00f3 una ventaja, sino m\u00e1s bien un inconveniente como explicar\u00e9 m\u00e1s adelante.<\/li>\n<li>Desde el punto de vista software, los Kinect disponen de un lujos\u00edsimo SDK (Software Development Kit) fant\u00e1sticamente documentado pero, claro, s\u00f3lo se puede usar en Windows y no incluye los fuentes.<\/li>\n<li>Sin embargo, los ASUS y los PrimeSense se controlan mediante una librer\u00eda de c\u00f3digo abierto llamada OpenNI que se puede compilar y usar tanto en Windows como en Linux.<\/li>\n<\/ul>\n<p>Me decid\u00ed por comprar un ASUS Xtion Pro Live en Amazon como el que muestro al lado. Este dispositivo incorpora, adem\u00e1s del sensor de profundidad, una c\u00e1mara RGB y un array de dos micr\u00f3fonos dispuestos en los extremos.<a href=\"https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/ASUS-Xtion-live.jpg\" rel=\"attachment wp-att-153\"><img data-recalc-dims=\"1\" decoding=\"async\" class=\"wp-image-153 alignright\" src=\"https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/ASUS-Xtion-live.jpg?resize=216%2C216\" alt=\"ASUS-Xtion-live\" width=\"216\" height=\"216\" loading=\"lazy\" srcset=\"https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/ASUS-Xtion-live.jpg?resize=300%2C300&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/ASUS-Xtion-live.jpg?resize=150%2C150&amp;ssl=1 150w, https:\/\/i0.wp.com\/www.rtbasics.com\/WP_2\/wp-content\/uploads\/2016\/03\/ASUS-Xtion-live.jpg?w=500&amp;ssl=1 500w\" sizes=\"auto, (max-width: 216px) 100vw, 216px\" \/><\/a><\/p>\n<p>Como he dicho antes, la comunicaci\u00f3n con el dispositivo de ASUS y la obtenci\u00f3n de la informaci\u00f3n que genera se hace a trav\u00e9s de la librer\u00eda OpenNI (OpenNI2 en su versi\u00f3n actual). Este software era mantenido por PrimeSense. Tras su compra por Apple la librer\u00eda es mantenida por Occipital Inc (<a href=\"https:\/\/occipital.com\" target=\"_blank\">https:\/\/occipital.com<\/a>) como parte del SDK para su sensor \u201cStructure Sensor\u201d (<a href=\"http:\/\/structure.io\" target=\"_blank\">http:\/\/structure.io<\/a>).<\/p>\n<p>Es especialmente interesante la historia de Occipital y su sensor Structure. Actualmente, acaban de presentar el sensor \u201cStructure Core\u201d dise\u00f1ado para ser f\u00e1cilmente integrable en robots, drones o cualquier otro aparato que se mueva.<\/p>\n<p>Ya tengo el sensor y estoy en condiciones de probarlo. Voy a marcarme un objetivo. Antes de empezar escribo lo que espero conseguir.<\/p>\n<p>Como no tengo a mano una cueva como la de la peli de Alien, me gustar\u00eda hacer una representaci\u00f3n en tres dimensiones de una habitaci\u00f3n en sus 360\u00ba. Es decir, una habitaci\u00f3n vista aproximadamente desde su centro alrededor de 360\u00ba.<\/p>\n<p>Al contrario que en la peli, a\u00fan no me siento capaz, el sensor no se va a mover. Bueno, mejor dicho, no se va a trasladar pero tendr\u00e1 que moverse para tomar medidas alrededor de los 360\u00ba.<\/p>\n<p>Para ponerlo en marcha tendr\u00e9 que trabajar en distintos aspectos del proyecto:<\/p>\n<ul>\n<li><strong>Adquisici\u00f3n de los datos del sensor<\/strong>. Se trata de obtener la informaci\u00f3n de profundidad y de color del escenario. Ser\u00e1 necesario poner en marcha la librer\u00eda OpenNI.<\/li>\n<li><strong>Tratamiento de los datos adquiridos<\/strong>. Para el tratamiento de la informaci\u00f3n de profundidad voy a usar la librer\u00eda PCL (Point Cloud Library. <a href=\"http:\/\/pointclouds.org\/\">http:\/\/pointclouds.org\/<\/a>). De los streams de video RGB y de profundidad se capturan sendos frames que se representan como una nube de puntos en una estructura de la librer\u00eda PCL. Con esta librer\u00eda se puede filtrar, segmentar, reconstruir, componer o representar esta informaci\u00f3n.<\/li>\n<li><strong>Representaci\u00f3n de los datos<\/strong>. Ser\u00e1 necesario disponer de una herramienta que me permita representar en la pantalla de un ordenador las nubes de puntos obtenidas. Una buena herramienta de visualizaci\u00f3n reducir\u00e1 el trabajo de desarrollo ya que me permitir\u00e1 comprobar con facilidad los resultados de los tratamientos efectuados sobre las nubes de puntos adquiridas.<\/li>\n<li><strong>Gesti\u00f3n de la plataforma de pan&amp;tilt<\/strong>. Para generar el movimiento del sensor y poder enfocar la escena a lo largo de 360\u00ba en horizontal y en vertical ser\u00e1 necesario disponer de una plataforma m\u00f3vil que permita el movimiento en estos dos sentidos. Adem\u00e1s, debe estar controlada por el procesador que adquiere la informaci\u00f3n del sensor para poder sincronizar la posici\u00f3n del sensor con la imagen obtenida.<\/li>\n<li><strong>Composici\u00f3n del escenario<\/strong>. Se trata de componer la escena completa en sus 360\u00ba a partir de los distintos frames capturados desde distintas posiciones del sensor. Para \u00e9sto ser\u00e1 necesario tener en cuenta que han sido tomados desde distintos puntos de vista.<\/li>\n<li><strong>Integraci\u00f3n de los distintos ensayos<\/strong>. Inicialmente se van a hacer distintas pruebas de concepto. No van a ser soluciones definitivas, sino distintos experimentos que me van a permitir verificar si es posible, y en qu\u00e9 grado, hacer lo que he descrito en los puntos anteriores a \u00e9ste. En este punto le dar\u00e9 una vuelta a c\u00f3mo se podr\u00eda integrar todo esto en un equipo \u00fanico y compacto.<\/li>\n<\/ul>\n<p>Pues hasta aqu\u00ed el primer post de esta serie. En los siguientes tratar\u00e9 de describir el trabajo que he ido haciendo para poner en marcha estos distintos componentes del proyecto que acabo de describir.<\/p>\n<\/body>","protected":false},"excerpt":{"rendered":"<p>Estaba yo pensando\u2026 \u00bfser\u00e1 posible hacer algo parecido? El otro d\u00eda estuve volviendo a ver Prometheus, una pel\u00edcula de la saga de Alien que describe el origen del protagonista. Quer\u00eda recordar las escenas en las que unos peque\u00f1os dispositivos voladores &hellip; <a href=\"https:\/\/www.rtbasics.com\/WP_2\/archives\/149\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,21],"tags":[23,22,28,24,26,25,27,29],"class_list":["post-149","post","type-post","status-publish","format-standard","hentry","category-broadcasting","category-depth-sensors","tag-asus-xtion","tag-kinect","tag-occipital","tag-openni","tag-pantilt","tag-pcl","tag-primesense","tag-structure-sensor"],"jetpack_featured_media_url":"","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4vaHY-2p","_links":{"self":[{"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/posts\/149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/comments?post=149"}],"version-history":[{"count":16,"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/posts\/149\/revisions"}],"predecessor-version":[{"id":178,"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/posts\/149\/revisions\/178"}],"wp:attachment":[{"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/media?parent=149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/categories?post=149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rtbasics.com\/WP_2\/wp-json\/wp\/v2\/tags?post=149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}