Table of Contents

WEBCAM

Detección Webcam

Para poder llegar a usar ar_pose que es el objetivo del trabajo, primero ocupamos poner a funcionar la camara web, ya sea que se trabaje con la cámara integrada de una laptop o una webcam, entonces para observar que la cámara está siendo detectada, por lo que nos vamos al directorio /dev que contiene los archivos de dispositivos especiales para todos los dispositivos hardware, por tanto si el kernel de linux ya reconoció el dispositivo se va a haber creado el nodo virtual para accesar y controlar el dispositivo en cuestión, escribimos en consola lo siguiente:

$ ls /dev/video*
  /dev/video0   #La cámara integrada se añade generalmente a video0

Gscam

Una vez que tenemos detectada la cámara, debemos instalar gscam, que es un driver de cámaras de ROS, este usa gstreamer (framework que permite crear aplicaciones audiovisuales) para conectarse a dispositivos como webcams.

Pero no usaremos la versión que está disponible, sino una versión experimental, ya que esta si publica el marco de transformaciones, esto nos permitirá visualizar la orientación de los marcadores en rviz.

   sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good
  env_ros_fuerte
  rosws set gscam --svn http://brown-ros-pkg.googlecode.com/svn/trunk/experimental/gscam
  rosws update gscam
   env_ros_fuerte
   rosmake gscam
   CMake Error: The source directory "/home/chriscrick/brown-ros-pkg/experimental/gscam" does not exist

En la siguiente imagen se muestra el error

 env_ros_fuerte
 roscd gscam
 nano Makefile #Puede usar el editor de su preferencia

En esta foto se observa el Makefile sin modificar:

Y en esta foto se observa el Makefile ya modificado:

   rosmake gscam

En la siguiente imagen se observa que se realizó la compilación sin problemas:

Ahora ya podemos correr gscam

  roscd gscam
  cd bin #Gscam espera arrancar en su directorio bin
   export GSCAM_CONFIG="v4l2src device=/dev/video0 ! video/x-raw-rgb,framerate=30/1 ! ffmpegcolorspace" 
  rosrun gscam gscam

Nota(Por el momento se debe realizar obligatoriamente)

Aparentemente el repositorio tuvo ciertas modificaciones, y al intentar correr gscam no encuentra el nodo, por lo tanto se requiere una versión anterior, para ello se deben realizar lo pasos anteriores, y seguidamente actualizar a una versión estable del paquete, para esto utilizamos subvesion.

    env_ros_fuerte
    roscd gscam
    svn log|less #nos despliega la revisión del repositorio que tenemos.
    env_ros_fuerte
    roscd gscam
    svn info #nos despliega la revisión del repositorio que tenemos.     
    env_ros_fuerte
    roscd gscam
    svn up -r 2863 # esta revisión está corriendo de manera correcta.
    tc  #Aparece un conflicto en el archivo Makefile, escoger (tc) theirs-conflict
    make #Una vez que compile ya podemos correr gscam!

Gscam topics

Gscam publica dos topics:

Además como se mencionó anteriormente esta versión de gscam publica tf, utilizando frame_id, esto se verá más adelante cuando se explique la forma de utilizar ar_pose.

Una vez que gscam esté corriendo podemos ver los topics que estén activos y que nodos están suscritos a estos, para ellos en otra terminal podemos escribir los siguiente:

   env_ros_fuerte
   rostopic list #me da una lista de los topics activos
   rostopic info <topic_name> #puedo obtener información de un topic específico (como que suscriptores tiene)

Image_view

   image_view image:=<image topic> [image transport type]
   rosrun image_view image_view image:=/gscam/image_raw #Primero se debe correr gscam

Al correr esto se abre una ventana como la siguiente:

Además podemos ver como es la comunicación entre los diferentes nodos utilizado rxgraph:

Calibración de la cámara

Es importante realizar la calibración de la cámara, en especial cuando se trata de las cámaras de los robots que tienen un visor más amplio, la imágen suele estar un poco redondeada, y dado que necesitamos detectar los markers de artoolkit, requerimos líneas bien definidas, para ello utilizamos camera_calibration, en este caso se trabajará con una cámara monocular, para su calibración se requiere una hoja con una tablero de ajedrez como este: monocularcalibration.pdf

    sudo apt-get install python-opencv
   env_ros_fuerte
   rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.02522 image:=/gscam/image_raw camera:=/gscam

En la última línea se observa que se le deben ingresar una serie de parámetros, el primero representa el número de de esquinas (columnasxfilas) que se van a detectar, el siguiente representa la medida de cada cuadro de la tabla, en este caso medían 2.522cm, y finalmente se coloca el topic al que se subscribe.

Los primeros dos parámetros son de vital importancia, ya que a la hora de calibrar esto va a determinar la precisión del resultado, al correr camera_calibrator se abre la siguiente ventana:

En la siguiente imagen se ve la comunicación gráfica de ROS, se observan los nodos que están corriendo así como los topics que los comunican entre si:

Camera_calibrator va tomando imágenes, para lograr la calibración se debe mover el tablero lentamente de izquiera-derecha, arriba-abajo, adelante-atrás y muy importante girar el tablero de forma horizontal y vertical para obtener mayor información, cuando las barras de la derecha se encuentren llenas (verdes), se debe oprimir el botón de calibrate, el cual debe estar resaltado.

Luego de darle clic a calibrar se observa en la terminal el resultado de la calibración, como se observa en la siguiente imagen:

Seguidamente se guarda la calibración y se da clic en commit para mandar permanentemente la calibración, el archivo de calibración se guarda en /tmp , ahí se observa un archivo comprimido que contiene las fotos que el programa consideró necesarios para la calibración y el archivo.txt con los parámetros, es importante revisar dichas imágenes para poder decidir si la calibración está bueno, ya que algunas veces escoge imágenes borrosas, las cuales afectan la calibración, algunas de las imágenes que obtuve se muestran a continuación:

Finalmente teniendo la cámara detectada y calibrada podemos detectar los marcadores utilizando ar_pose

Regresar a INDICE