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
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 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:=<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:
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