GERUNSJ / guardar_imagenes_turtlebot

ROS Indigo node to save rgb and depth images from Turtlebot Kinect
4 stars 1 forks source link

guardar_imagenes_Pioneer_P3-DX #3

Open jluis619 opened 8 years ago

jluis619 commented 8 years ago

Una pregunta, ¿este código también funciona para el poineer p3-DX ?, es que lo intento correr pero no guarda las imágenes, con roswtf me dice: "subscriptions are unconnected"

La cámara esta encendida utilizo opennilaunch, lo que note es que al ingresar la letra 'a' el código se sigue ejecutando y no imprime que : "imagen guardada", sino que me vuelve a pedir que ingrese una opción. Al parecer si estoy suscrito bien a los topics, si encuentro el error lo posteare para ver si a alguien mas le sirve. Gracias

jluis619 commented 8 years ago

Hola, con respecto a la pregunta anterior, el código esta bien, pero para que funcione con el Pioneer p3-DX y el kinect es necesario iniciar la cámara con el comando: roslaunch openni_launch openni.launch depth_registration:=true

si solo se corre el opennilaunch, no funciona ya que hay que activar la camara a profundidad... ahora estoy editando el código para que únicamente me guarde la imagen a profundidad les comentare si logro para futuros usos.

por otro lado tengo una pregunta, ¿no sabrás de algún tutorial o de como hacerle para obtener la imagen a cierta distancia de profundidad?. Lo que pasa es que por ahora el código obtiene la imagen de todo lo que visualiza, pero yo solo quiero una imagen a cierta distancia (p.ej. la imagen de lo que hay a 1 metro de distancia del kinect) . Gracias espero su respuesta.

aguadopd commented 8 years ago

Respuesta al primer mensaje, copiada de https://github.com/GERUNSJ/guardar_imagenes_turtlebot/commit/5132ad26e721acfdf195aa4694590e437f7fc00a

Hola José Luis. Esto está diseñado para un robot Turtlebot con una cámara Kinect. Supongo que también andará en un Pioneer si estás usando ROS y una Kinect o cámara RGB+D similar. En ese caso, tal vez el driver de la cámara esté publicando las imágenes bajo otros topics, no necesariamente los que usamos nosotros que son /camera/depth_registered/image_rect_raw y /camera/rgb/color/image_rect_raw para la imagen de profundidad y la de color respectivamente. Prueba con rostopic list para ver con qué nombre se están publicando las imágenes y luego modificas el código para que se suscriba a esos topics. Otra forma de verlos, tal vez más conveniente, es con rqt_graph (creo que rosrun rqt_graph rqt_graph). Asegurate de que la cámara esté encendida, tal vez hay que iniciar un nodo para eso. Quedo atento a tu respuesta. Pablo

aguadopd commented 8 years ago

Perdón, Jose Luis, por la demora; no se por qué había configurado que no me llegaran las notificaciones al mail, y no estuve metiéndome a Github en estos días. Muchísimas gracias por los comentarios, me alegro de que haya funcionado.

En cuanto a lo de extraer lo que corresponde a una determinada distancia, si es que no lo resolviste ya... La imagen de profundidad es guardada como una imagen de 16 bits y 1 canal. El valor de cada píxel corresponde a la distancia en mm desde la cámara hasta el objeto correspondiente al píxel. Podrías, entonces, seleccionar todos los píxeles con el valor correspondiente a la distancia que quieras; por ej, 1000, que corresponde a 1 metro. Seguramente conseguirás mejores resultados con cierta tolerancia; para el ejemplo, tomar los valores de 900 a 1100, o un rango más acotado.

En https://github.com/GERUNSJ/deteccion-de-personas-con-turtlebot-y-opencv-1 está el informe de un trabajo que hice con la Kinect. Las pruebas que hicimos nos mostraron que es bastante sensible a la luz natural, que contiene gran contenido de radiación infrarroja. O sea, cuidado con las ventanas, la Kinect está diseñada para uso en interiores.

La distancia de trabajo efectiva del sensor Kinect v1 es desde 0 , 8 m a 3 , 5 m , con un error de 1 cm en profundidad y de hasta 3 mm en las mediciones de ancho y alto. Podés encontrar más información en

  1. https://en.wikipedia.org/wiki/Kinect
  2. https://openkinect.org/wiki/Imaging_Information
  3. http://zaguan.unizar.es/record/12845
  4. http://wiki.ros.org/kinect_calibration/technical
  5. http://wiki.ros.org/openni_kinect/kinect_accuracy
jluis619 commented 8 years ago

Hola que tal, utilice la función de openCV threashold, ya que utilizando la escala de grises puedo volver negro los pixeles que están mas lejos de mi umbral y se quedan en blanco los que me interesan, en si es un buen método, ahora estoy trabajando en guardar una sola imagen, el problema que tengo ahora es que me suscribo a un boleano, el cual leo constantemente, me imagino que sabrás que ROS para verificarlos hace un "spinOnce", el problema es que cada que hago eso leo las devoluciones de las llamadas y mi guarda una imagen, es decir si leo el boleano al que me tengo suscrito igual guarda una imagen. Apenas averigüe como poner código aquí, lo subo por completo. Lo que tengo hasta ahora es un código que guarda una imagen a profundidad y después recorta los bordes dejando únicamente la mano. Gracias por los links pude saber un poco mas sobre la calibracion del kinect el cual ya vi que es muy necesario.

aguadopd commented 8 years ago

Buenísimo, me alegro de los progresos. No se me ocurre una buena forma de hacer lo que decís...tal vez podrías utilizar una variable global que sea modificada cuando recibís el mensaje booleano, y luego guardas la imagen o no en función de ese valor. O sea, que tu handler/callback del booleano modifica esta variable (que también puede ser un booleano) y adentro del handler de las imágenes preguntás por esa variable, y decidís guardar o no en función de su valor. Seguramente hay una forma mejor..

Para escribir código en Github, podés encerrar frases con acentos graves o backticks

` 

como aquí o para bloques de código anteceder el bloque con


y terminar con lo mismo. En particular para c++ comenzá con 

Un ejemplo:

int funcion(float x, int i)

O mejor, seleccionas el código y lo formateas con la barra que aparece arriba de la caja de comentario. Más acá: https://guides.github.com/features/mastering-markdown/