Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Robotica Manual de Vision en
Robotica Manual de Vision en
Jose M. Ca
nas
Universidad Rey Juan Carlos
jmplaza@gsyc.escet.urjc.es
version 1.5
Resumen
Este manual describe diferentes aspectos relevantes del manejo de im
agenes en
rob
otica, incluyendo su captura, su procesamiento y su visualizaci
on. Est
a orientado a
servir de gua al programador que se enfrenta a estas tareas, y en este sentido se incluye el c
odigo de ejemplos b
asicos que pueden servir de base. En la parte de captura se
describe el estandard que se ha extendido en el mundo linux: la interfaz Video4Linux,
y el m
as reciente v4l2. La hemos probado con una c
amara convencional m
as tarjeta
digitalizadora BT878, y sobre una c
amara USB. En la parte de procesamiento se describe la librera Gandalf, de software libre, que ofrece manejo de matrices. En la parte
de visualizaci
on comentamos Tambien varias herramientas para programar interfaces
gr
aficas: la librera XForms y la librera Qt
Indice
1. Introducci
on
2. Captura de im
agenes
2.1. Dispositivos hardware . . . . . . . . . . .
2.2. Instalacion de video4linux . . . . . . . . .
2.2.1. Digitalizadoras BT878KHF en PC
2.2.2. Utilizar webcams USB en debian .
2.3. Video4linux API . . . . . . . . . . . . . .
.
.
.
.
.
2
2
2
3
3
5
3. Procesamiento de im
agenes
3.1. Librera Gandalf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1. Instalacion en el PC de la librera Gandalf . . . . . . . . . . . . . . .
3.1.2. Compilacion de un programa que usa la librera Gandalf. . . . . . .
7
7
8
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4. Visualizaci
on en interfaces gr
aficas
4.1. X-Window system . . . . . . . . . . . . . . . . . . . . . . . .
4.2. Librera XForms . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1. Elementos graficos de XForms . . . . . . . . . . . . . .
4.2.2. Construccion visual de la interfaz grafica con XForms
4.2.3. Interaccion de XForms con el programa . . . . . . . .
4.3. Librera Qt . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.1. Instalacion de Qt Free en Linux . . . . . . . . . . . . .
4.3.2. Hola mundo . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
12
13
14
15
16
19
19
20
Agradecimientos
Este manual ha sido realizado en parte por los alumnos del grupo de robotica de la
URJC. Contribuciones importantes se deben a ellos: Francisco Valverde, David Lobato y
Marta Martnez.
1.
Introducci
on
La vision es un sensor mas que los robots pueden utilizar para inferir el estado de su
entorno. Es un sensor muy complejo que entrega un flujo continuo de imagenes, pero es
difcil extraer de ese flujo informacion directamente u
til para la accion del robot.
Hoy da hay en el mercado camaras disponibles a precios razonables. Las imagenes que
la camara proporciona se pueden capturar en un ordenador y poner disponibles a los programas de control. En el grupo de robotica1 de la Universidad Rey Juan Carlos tenemos
varios escenarios tpicos donde utilizamos las imagenes capturadas por una camara. En el
primero la camara hace de ojo del robot. Por ejemplo en el robot pioneer esta conectada al
ordenador portatil de a bordo, que toma decisiones de movimiento basandose en las imagenes. Del mismo modo el robot EyeBot desarrolla comportamiento sigue-pelota utilizando
su camara local. En el segundo marco tenemos una camara cenital situada encima de un
tablero de ping pong donde unos robots EyeBot juegan al futbol. En este caso se utiliza
basicamente como sensor de posicion para todos los jugadores.
Normalmente en aplicaciones roboticas ademas de capturar imagenes querremos visualizarlas. Resulta muy u
til por ejemplo para depurar los algoritmos perceptivos o los
programas de control. En esta lnea describimos varias libreras que permiten desarrollar
interfaces graficas en maquinas linux: XForms y Qt.
1
http://gsyc.escet.urjc.es/robotica/
2.
Captura de im
agenes
Para ordenadores personales y portatiles que corren sobre el sistema operativo linux se
ha desarrollado la interfaz video4linux. Esta interfaz homogeneiza el acceso a las imagenes
con independencia de la camara concreta que se trate. Al ser generico los programas o
aplicaciones pueden funcionar sobre camaras o digitalizadoras de distintos fabricantes sin
necesidad de recodificacion. Antes de su existencia cada fabricante entregaba un driver
especfico para su camara o capturadora, que entregaba su imagen de un modo no estandarizado. Por ejemplo si nuestra aplicacion funcionaba sobre una digitalizadora Matrox
Meteor tenamos que instalar el driver correspondiente y utilizar en nuestro codigo sus
funciones especficas para capturar las imagenes.
2.1.
Dispositivos hardware
2.2.
Instalaci
on de video4linux
Como con todos los dispositivos hardware de un ordenador, si queremos que funcione el
kernel del sistema debe incluir soporte para el. Esto se puede conseguir de varias maneras.
Por ejemplo se puede patchear el codigo fuente del kernel para que incluya drivers especficos. En dispositivos con mejor soporte esos drivers vienen con la propia distribucion del
kernel, e incluirlos en el kernel puede ser tan sencillo como activar una opcion al recompilar,
o cargar como modulo en tiempo de ejecucion.
Hemos probado dos configuraciones.
Dos programas muy buenos para probar si la instalacion ha sido buena son xawtv y
vic. Xawtv es un programa muy completo que digitaliza las imagenes de una camara y
las muestra por pantalla, permitiendo una total configuracion del dispositivo de captura.
La pagina de referencia para este programa es http://bytesex.org/xawtv/2 , aunque en
las versiones mas recientes ya viene como paquete debian que se puede instalar por el
procedimiento estandard de debian (sin traerse el fuente comprimido tar.gz y compilarlo
en local). Vic es un programa que se utiliza para transimitir y recibir audio y video desde
otras maquinas remotas. La parte u
til en este entorno es la que configura el dispositivo de
video, captura imagenes y muestra una version reducida en local.
2.2.1.
Digitalizadoras BT878KHF en PC
Esta tarjeta tiene un chipset de la familia BT8x8 de Book Tree. Es con diferencia la
mas difundida en el mundo linux, y por ello tiene amplio soporte software. El modulo con
su driver se llama bttv.
2
http://bytesex.org/xawtv/
2.
3.
CONFIG SOUND=y
4.
5.
2.2.2.
Para que una camara USB funcione sobre linux (1) el kernel debe ofrecer soporte para
el bus USB. Ademas (2) el driver concreto de la camara debe incluirse tambien, bien dentro
del kernel compilado, bien como modulo.
Desde la version 2.2.7 empezo el soporte USB de modo experimental dentro del kernel
y se ha estabilizado en las versiones 2.4.*, ofreciendo ya soporte completo. Los modulos
implicados son usbcore, usb-uhci, usb-ohci.
En cuanto a las distintas camaras del laboratorio, hemos probado las siguientes:
C
amara Terratec : ov511
C
amaras Philips : pwc Una pagina muy u
til para las camaras Philips es http://www.smcc.demon.nl/webcam
Obtener el kernel Lo primero es conseguir un kernel con soporte para USB, los 2.2.x
tienen soporte desde la version 2.2.18, pero es preferible utilizar un 2.4.x, ya que aun teniendo tambien soporte para video4linux en el que estan basados la mayora de los programas
que utilizan los drivers de las camaras USB, tiene ademas muchas mas camaras soportadas
a parte de las compatibles con ov511. Para realizar este documento se ha utilizado el 2.4.14.
Bien, para conseguir un kernel, hay 2 opciones: bien instalar la imagen que vendra en los
CD de la distribucion que tengas, bien bajartela de ftp://ftp.kernel.org/pub/linux/kernel/v2.4.
Si vas a instalar la imagen desde los CDs, abre un terminal y ejecuta dselect (es una
herramienta para instalar paquetes en debian, mucho mas sencillo que hacerlo directamente
con apt-get), selecciona select pulsa space para pasar la introduccion, entraras en un
men
u con todos los paquetes de la distribucion, ahora pulsa /.aparecera en la esquina
inferior izquierda search:pon kernel-source. Cuando encuentres la que buscas pulsa
+e intro, a continuacion volveras al men
u inicial. Ahora selecciona install y dale los
CDs que vaya pidiendo. Esto instala la imagen en el directorio /usr/src.
El u
nico problema es que las fuentes que en mi distribucion (potato r4) son las del 2.2.19
y a no ser que tengas una woody no creo que vengan las 2.4.x por lo tanto recomiendo la
4
y pincha en USB
support.activa support for USB si has activado la opcion video4linux
1.
Si no estas muy convencido de lo que le has metido a tu kernel puedes hacer make
bzdisk, con esto compilaras el kernel y meteras la imagen en un diskette. Una vez
compilado reinicia el sistema con el diskette y si todo ha ido bien prueba con la
siguiente opcion.
2.
Ultimos
retoques Ahora ya tienes soporte para tu webcam, pero si ejecutas cualquiera
de los programas que existen puede suceder que aparezca el siguiente mensaje no such file
or device: /dev/videoesto significa que no se crearon los enlaces en /dev, si esto pasa debemos hacerlo a mano. ejecuta esto: mknod /dev/video0 c 81 0, mknod /dev/video1 c 81
5
2.3.
Video4linux API
Para capturar imagenes utilizando v4l previamente hay que abrir e inicializar el dispositivo correctamente.
Por convenio los dispositivos de video en linux aparecen en los ficheros /dev/video0,
/dev/video1,.... En esta inicializacion se especifican cosas como el tama
no de la imagen
digitalizada, el formato en el que queremos que se entregue (RGB,YUV...), y la configuracion de la propia tarjeta de captura. Por ejemplo es tpico que las tarjetas capturadoras
tengan varias entradas de video analogico (conector S-Video, conector RCA...) y que admita se
nales de entrada en distintos formatos (PAL,SECAM,NTSC,etc). En esta etapa se
puede especificar que nos interesa digitalizar las imagenes que vienen por la entrada RCA,
que vienen en PAL.
Una vez inicializado se pueden leer las imagenes con una simple llamada al sistema
read(). Sin embargo este modo de leer imagenes es relativamente lento. Cuando se desea
capturar a un ritmo mayor es conveniente preparar una zona de la memoria para que el
driver deje ah las imagenes que va capturando. Normalmente estas transferencias se hacen
por DMA desde la tarjeta a la memoria que le indiquemos. Para que nuestra aplicacion
pueda leer de la zona de memoria (del kernel) donde el driver recoge las imagenes es
necesario solicitarlo al kernel con la llamada mmap(). En este u
ltimo caso es necesario
preparar la captura con alguna funcion adicional, tal y como muestra el siguiente ejemplo:
struct video_mmap gb;
static struct video_mbuf gb_buffers;
6
fd = open(video, O_RDWR);
...
gb_buffers.frames=2;
if (cap.type & VID_TYPE_CAPTURE) {
/* map grab buffer */
if (-1 == ioctl(fd,VIDIOCGMBUF,&gb_buffers)) {
perror("ioctl VIDIOCGMBUF");
}
map = mmap(0,gb_buffers.size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if ((char*)-1 != map) printf("Error\n");
else
{perror("mmap");
close(fd);
exit(-1);
}
}
gb.frame=0;
gb.width=win.width;
gb.height=win.height;
gb.format=vpic.palette;
Con ioctl(fd,VIDIOCGMBUF,&gb buffers)) se le pregunta al driver por la configuracion de la tarjeta, tama
no de imagenes, etc, que deja en la variable gb buffers, para luego
pedir la comparticion del tama
no adecuado.
Con map = mmap(0,gb buffers.size,PROT READ|PROT WRITE,MAP SHARED,fd,0); se
le pide al sistema operativo compartir la zona, y este entrega su direccion, si todo va bien.
Una vez configurada la captura por memoria mapeada tenemos al driver que constantemente estara volcando en esa zona las imagenes recien capturadas. En realidad no
estara continuamente, sino que ira volcando imagenes en el buffer hasta que se llene. Una
vez que esta saturado no sigue capturando, sino que espera a que el proceso del usuario lea
alg
un frame. En el ejemplo actual se han configurado memoria para dos cuadros. Mientras
el usuario esta leyendo en uno el driver esta rellenando el otro, de manera que si el lector
es suficientemente rapido no se detiene nunca la captura.
for(;;)
{
gb.frame=(gb.frame+1)%2;
if (-1 == ioctl(fd,VIDIOCMCAPTURE,&gb)) {
perror("VIDIOCMCAPTURE");
7
}
/* "libera" ese frame para que el driver pueda cargar ahi nueva imagen.*/
if (-1 == ioctl(fd,VIDIOCSYNC,&gb.frame)) {
perror("VIDIOCSYNC");
}
3.
Procesamiento de im
agenes
3.1.
Librera Gandalf
Instalaci
on en el PC de la librera Gandalf
2.
Dentro de este directorio habra un fichero INSTALL que contiene los pasos a seguir
para la instalacion, que a continuacion describimos.
3.
4.
5.
3.1.2.
Compilaci
on de un programa que usa la librera Gandalf.
/*********************************************************************/
#include <gandalf/common.h>
#include <gandalf/linalg.h>
#include <stdio.h>
int
main (){
printf ("\n");
/* Sumamos y escribimos por pantalla el resultado */
m33C = gan_mat33_add_s(&m33A, &m33B);
gan_mat33_print (&m33C, "Suma", 3, "%f");
printf ("\n");
/* Restamos y escribimos por pantalla el resultado */
m33C = gan_mat33_sub_s(&m33A, &m33B);
gan_mat33_print(&m33C, "Resta", 3, "%f");
printf ("\n");
/* Multiplicamos y escribimos por pantalla el resultado */
/* C = A*B */
m33C = gan_mat33_rmultm33_s (&m33A, &m33B);
gan_mat33_print(&m33C,"Multiplicaci
on", 3, "%f");
printf ("\n");
/* Hallamos el determinante de A y B y lo sacamos por pantalla */
dDetA = gan_mat33_det_q (&m33A);
printf ("El determinante es: %g\n", dDetA);
dDetB = gan_mat33_det_q (&m33B);
printf ("El determinante es: %g\n", dDetB);
printf ("\n");
/* Tasponemos las matrices A y B y lo sacamos por pantalla */
gan_mat33_tpose_i(&m33A);
gan_mat33_print(&m33A, "Transpuesta de A", 3, "%f");
gan_mat33_tpose_i(&m33B);
gan_mat33_print(&m33B, "Transpuesta de B", 3, "%f");
printf ("\n");
/* Invertimos las matrices A y B (si se pueden invertir, y
sacamos el resultado por pantalla */
gan_mat33_tpose_i(&m33A);
if (dDetA!=0){
gan_mat33_invert_i (&m33A);
gan_mat33_print(&m33A, "Inversa de A", 3, "%f");
} else {
printf ("El determinante de A es 0, por lo que no se puede hallar su inversa. \n");
}
11
gan_mat33_tpose_i(&m33B);
if (dDetB!=0){
gan_mat33_invert_i (&m33B);
gan_mat33_print(&m33B, "Inversa de B", 3, "%f");
} else {
printf ("El determinante de B es 0, por lo que no se puede hallar su inversa. \n");
}
return 0;
}
Pues bien, este programa digamos que esta situado en el directorio ejemplo. Y el directorio gandalf que creamos cuando instalamos la librera esta en /users/pepe, el Makefile
quedara as:
# Generated automatically from Makefile.in by configure.
CC = gcc
PNG_LIBS = -lpng -lz
JPEG_LIB = -ljpeg
TIFF_LIB = -ltiff
LAPACK_LIBS =
OPENGL_LIBS = -lglut -lGLU -lGL -lXmu -lX11
X_LIBS = -L/usr/X11R6/lib
include /users/pepe/gandalf/Make.inc
include /users/pepe/gandalf/config
PACKAGE = ejemplo
TOPLEVEL = /users/pepe/gandalf
EXECUTABLES = prueba
targets: $(EXECUTABLES)
prueba: prueba.c
libtool $(CC) $(INCLUDES) $(CFLAGS) -static prueba.c -o prueba $(LIB) $(EXTERNAL_LI
GARBAGE += $(EXECUTABLES)
include /users/pepe/gandalf/make.targets
12
4.
Visualizaci
on en interfaces gr
aficas
4.1.
X-Window system
donde se trabaja no tienen por que estar en la misma maquina. Se puede utilizar X-Window
en una maquina y conectarse a otra remota, ejecutar un programa en esta maquina remota
y visualizar e interactuar con este programa en la maquina local.
Esta caracterstica de X-Window permite utilizar la interfaz grafica en cualquier maquina que soporte este sistema grafico, consiguiendose as una implementacion adicional a la
perseguida, que es la posibilidad de hacer una teleoperaci
on remota sobre el robot. Esto
implica que el operario de la interfaz grafica no ha de estar obligatoriamente delante del
ordenador donde se ejecuta el programa cliente, sino que puede conectarse a este desde
cualquier ordenador y teleoperar el robot.
En cuanto a la programacion, la librera Xlib ofrece funciones para crear ventanas
sencillas y visualizar en ellas imagenes, siempre que tengan un formato adecuado. Ese
formato debe entenderlo el servidor X, y en el fondo, la tarjeta de video.
4.2.
Librera XForms
14
Elementos gr
aficos de XForms
La librera ofrece un amplio repertorio de objetos graficos con los que confeccionar
el frontal grafico seg
un se desee, cada uno de ellos con un determinado comportamiento
y funcionalidad. Estos elementos son sensibles a la interaccion con el usuario a traves
del raton y del teclado. Por otro lado son accesibles y manipulables desde el codigo del
programa aplicacion. As permiten la comunicacion bidireccional: al usuario comunicar
cosas al programa y al programa mostrar cosas al humano, es decir, la interaccion grafica
entre ambos.
Para la implementacion de la interfaz grafica del teleoperador el programa cliente necesita utilizar los siguientes elementos graficos:
Bot
on que el usuario puede pulsar. De diferentes tipos seg
un su comportamiento cuando
se pulsa con el raton: los hay que notifican el evento al pulsarlo, que lo notifican
cuando se suelta, otros se quedan en estado pulsado hasta que se pulse otra vez y
los hay que vuelven inmediatamente a su estado de reposo.
Dial (slider si no muestra el valor, varslider si lo indica) con los que el usuario puede fijar
un valor dentro de un rango lineal.
Canvas que permite al programa pintar sus propias imagenes, puntos, rectas, etc. Nuestro
programa pinta en este canvas las lneas de los infrarrojos, la silueta del robot,...
dependiendo de lo que el operario quiera visualizar. Tambien permite volcar a pantalla
imagenes reales obtenidas con la camara.
Posicionador que permite conocer la posicion x y que se ha seleccionado con el raton
gracias al movimiento de unas trazas sobre un area. De este modo se especifican 2
valores con un solo click de raton. Este elemento lo utilizaremos para crear el joystick
visual.
15
Construcci
on visual de la interfaz gr
afica con XForms
visual que proporciona XForms. Esta construccion conlleva la seleccion de los distintos
elementos graficos que conforman la interfaz, su tama
no, su posicion y sus atributos.
El propio paquete XForms ofrece una herramienta visual para construir el frontal grafico
de la aplicacion. Esta herramienta se llama fdesign y crea una ventana vaca sobre la cual
permite ir incorporando distintos elementos graficos del repertorio (botones, diales, cuadros
de texto, canvas...), que se van situando rellenando el frontal grafico. Fdesign tambien
permite configurar estos elementos: color, tipo de letra, aspecto, color cuando el raton lo
pulsa, tama
no, forma, etc.
La posicion se decide con el raton, seleccionando dentro del repertorio el elemento que
queremos insertar, arrastrando hasta donde queremos situarlo en el frontal y soltandolo
all. El tama
no tambien se vara visualmente con el raton, del mismo modo que el tama
no
de las ventanas de X-Window. Otro tipo de propiedades como color, etiquetas, etc. se
configuran cambiando las propiedades del objeto, tambien visualmente en gran medida,
pulsando entre las distintas posibilidades.
Una vez acabado el dise
no del frontal la herramienta genera tres ficheros: nombre.fd
en el que guarda todos los elementos con sus atributos y los ficheros nombre.h y nombre.c
que son los equivalentes en lenguaje C. Gracias a estos u
ltimos los programas del usuario
pueden iniciar la visualizacion del frontal, acceder a los distintos elementos del mismo y
manipularlos a voluntad. Los objetos graficos tienen asociadas gran cantidad de funciones
que permiten muestrear y fijar su estado, acceder y cambiar sus valores, hacer un repintado,
etc.
16
Figura 5: Fdesign
17
4.2.3.
Interacci
on de XForms con el programa
18
segmento. Para dibujar puntos se utiliza la funcion XDrawPoints. A esta funcion tambien
hay que indicarle el canvas donde se desea dibujar los puntos, as como las posiciones de
dichos puntos. En el elemento canvas tambien es posible representar una imagen. Para ello
se utiliza la funcion XPutImage, indicandole la imagen que se desea visualizar, el tama
no
de la misma y la posicion que va a ocupar dentro del canvas.
Tambien es posible hacer un repintado de un elemento de un form con la funcion
fl redraw object (fd nombredelForm -> elemento)
La interfaz grafica se inserta en el modelo de programacion multitarea descrito como
dos tareas mas: por un lado muestrea si el usuario ha pulsado alg
un boton o slider y
por otro periodicamente refresca la imagen que se le esta mostrando. Cuanto mas corto
sea el periodo de muestreo de los botones antes se entera el programa de la interaccion
demandada por el usuario y el sistema sera mas reactivo.
Si la tarea de refresco se llama muy frecuentemente la visualizacion sera muy vivaz, pero
puede consumir mucho tiempo y ralentizar al resto de las tareas, lo cual no es deseable.
Se ha decidido hacer un refresco cada segundo y resulta ser un buen compromiso entre la
viveza de presentacion requerida y el ahorro de recursos computacionales que se necesita.
4.3.
Librera Qt
Esta seccion describe el uso basico de la libreria QT. Esta permite el desarrollo de
interfaces graficas muy sencillas y vistosas. El lenguaje de programacion que utiliza es
C++.
Qt es una libreria C++ que proporciona un toolkit para el desarrollo de interfaces
graficas multiplataforma. Qt esta totalmente orientado a objetos, es facilmente extensible, y
proporciona verdadera programacion de componentes mediante el mecanismo SIGNALSSLOTS.
Qt es la libreria nativa de KDE, el popular entorno de escritorio de Linux.
Qt es multiplataforma Una de las principales caracteristicas de Qt, es sin duda, su
orientacion multiplataforma. De esta manera, podemos escribir aplicaciones portables a
MS/Windows, Unix/X11, Mac y sistemas embebidos, con un minimo de restricciones inerentes a las diferencias entre sistemas ( nombres de ficheros, llamadas al sistema, concurrencia, . . . ).
Versiones de Qt Qt es un producto de la compa
nia noruega trolltech (www.trolltech.com),
y se distribuye en diferentes versiones.
Estas son:
Qt Enterprise
Qt Professional
19
Qt Free
Qt/Embedded Free
Las dos primeras, permiten la costruccion de software comercial, e incluyen actualizaciones y soporte tecnico.
La tercera, Qt Free, es la version de Qt para Unix/X11 para el desarrollo de software
gratuito y abierto. Esta version esta bajo licencia GPL.
La u
ltima permite el desarrollo de software gratuito, y tambien se acoge a la GPL.
4.3.1.
Una vez obtenido el paquete qt-free-x11-XXX.tar.gz de la pagina de trolltech lo descomprimiremos en /usr/local/qt-free-x11-XXX, y crearemos el enlace qt-qt-free-x11-XXX. Definiremos las variables de entorno QTDIR=/usr/local/qt, LD LIBRARY PATH=QTDIR/lib,
MAN PATH=QTDIR/doc/man y PATH=QTDIR/bin.
Tras esto, configuraremos la libreria con ./configure ( desde el directorio QTDIR ). En
este punto podremos modificar las opciones por defecto que se aplican a la libreria, para
ver todas las posibles configuraciones ./configure -help.
Y por u
ltimo, compilamos com make, proceso que llevara almenos 20 o 30 minutos.
Probablemente sea necesario actualizar el fichero /etc/ld.conf.so y ejecutar ldconfig
para qu la libreria sea accesible. Para mas indicaciones sobre el proceso de instalacion
debemos mirar el fichero INSTALL del directirio QTDIR.
4.3.2.
Hola mundo
20
12 mylabel->show();
13 return myapp.exec();
14 }
Para compilarlo simplemente ejecutamos:
c++ -I$QTDIR/include -L$QTDIR/lib -lqt -o holamundo holamundo.cpp
El resultado de la ejecucion lo vemos en la figura 7( el marco depende del gestor de
ventanas ).
El hecho de haberlo creado en el heap( usando new ) no es casual, si no, que por norma sera la manera de
crear los widgets.La raz
on es, que cada widget tendra un padre, de manera que cada widget sera destruido
por su padre. De esta manera evitamos el desperdicio de memoria.En nuestro caso particular, el segundo
parametro pasado al constructor QLabel indica que no tiene padre, y la aplicacion se encargara de su
destruccion.
21
A continuacion, debemos mostrar los widgets creados, que por defecto permanecen
ocultos.Para ello basta con llamar al metodo show() comun a todo widget.
Por u
ltimo, lanzamos el bucle de eventos con el metodo exec() del objeto QApplication.De esta manera la aplicacion pasa a procesar los eventos recividos hasta que destruyamos el widget principal( cerrando la ventana ).
Referencias
[Zhao] T.C. Zhao and Mark Overmars, Forms Library: a graphical user interface toolkit
for X,http://world.std.com/ xforms/.
[X.Org] X.Org, X-Window System, http://www.x.org.
[Canas01] Jose M. Ca
nas, Manual del robot m
ovil Hermes, Informe Tecnico, Instituto de
Automatica Industrial, Julio 2001.
22