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.
- Primero debemos instalar las dependencias debian, para saber que dependencias requiere se puede visitar la página: http://code.google.com/p/brown-ros-pkg/source/browse/trunk/experimental/gscam/rosdep.yaml?r=2863
sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good
- Obtenemos gscam(Esta distribuccion por el momento esta caida, por lo que despues de instalarla se debe ir a la nota para poder obtener la última distribuccion, que funciona correctamente )
env_ros_fuerte rosws set gscam --svn http://brown-ros-pkg.googlecode.com/svn/trunk/experimental/gscam rosws update gscam
- Finalmente nos aseguramos de tener bien las variables de entorno y compilamos gscam
env_ros_fuerte rosmake gscam
- Durante la compilación se da un error, porque hay una pulga en el MakeFile, en el que definieron directamente una dirección a un directorio del creador:
CMake Error: The source directory "/home/chriscrick/brown-ros-pkg/experimental/gscam" does not exist
En la siguiente imagen se muestra el error
- Para corregir el error debemos editar el MakeFile de gscam, para ello se realiza lo siguiente en otra terminal:
env_ros_fuerte roscd gscam nano Makefile #Puede usar el editor de su preferencia
- Una vez ahí buscamos en cada vez todas las veces que aprece /home/chriscrick/brown-ros-pkg/experimental/gscam , dicho directorio no existe, por tanto se elimina el path y se deja en blanco:
En esta foto se observa el Makefile sin modificar:
Y en esta foto se observa el Makefile ya modificado:
- Teniendo el archivo modificado volvemos a realizar la compilación, volvemos a la terminal donde corrimos rosmake:
rosmake gscam
En la siguiente imagen se observa que se realizó la compilación sin problemas:
Ahora ya podemos correr gscam
- Se escribe lo siguiente en una terminal:
roscd gscam cd bin #Gscam espera arrancar en su directorio bin
- Además gscam espera una variable de entorno, la cual se muestra a continuación, aquí se observa lo importante de saber en a que nodo se agregó el dispositivo, en este caso es /dev/video0.
export GSCAM_CONFIG="v4l2src device=/dev/video0 ! video/x-raw-rgb,framerate=30/1 ! ffmpegcolorspace"
- Finalmente podemos correr gscam (se observa que la luz de la cámara web se enciende)
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.
- Si queremos ver que cambios se han dado en repositorio se puede ver lo siguiente:
env_ros_fuerte roscd gscam svn log|less #nos despliega la revisión del repositorio que tenemos.
- Para ver que revisión tenemos podemos escribir en la consola:
env_ros_fuerte roscd gscam svn info #nos despliega la revisión del repositorio que tenemos.
- En caso de tener una revisión con problemas podemos actualizar a otra revisión, para ello:
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:
- image_raw: este nos da información de la imagen no procesada (cruda).
- camera_info: nos da la calibración de la cámara, o información extra.
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
- Si queremos visualizar la imágen podemos utilizar image_view, la forma de obtener la imagen con image_view lleva la siguiente forma:
image_view image:=<image topic> [image transport type]
- En nuestro caso con gscam se escribe lo siguiente:
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
- Para tener python y opencv trabajando en conjunto, requerimos instalar un paquete que tiene los “bindings” de Python para OpenCV
sudo apt-get install python-opencv
- Ahora bien, teniendo gscam corriendo, en otra terminal corremos camera_calibration:
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