Buscar en este blog

lunes, 26 de marzo de 2007

NAVEGACIÓN ROBÓTICA CON FISCHERTECHNIK -rbGetInputs()- (26-Marzo-07)

Una vez armado el prototipo del robot móvil, se ha procedido a la programación de la tarea de navegación que ha de realizar. Esta tarea consiste en la navegación autónoma del robot, utilizando como sensor únicamente el de toque. El algoritmo consiste en realizar la tarea hasta que se oprima la tecla ESC para terminarla. Se comienza avanzando hasta que uno de los tres sensores sea activado (el robot lleva dos sensores enfrente y uno atras), si el sensor de la derecha es activado, el robot retrocederá y girará hacia la izquierda en busca de zonas libres de obstáculos, si el sensor de la izquierda es activado, hará lo contrario. Si el sensor de atras se activa, avanzará hacia adelante. Finalmente, si los dos sensores de enfrente son activados al mismo tiempo, el robot retrocederá.

#include "Windows.h"
#include "iostream.h"
#include "conio.h"
#include "stdio.h"
#include "umFish40VC.H"

void derecha(int interfaz){
rbSetMotorEx(interfaz, 1, 1, 2);
rbSetMotorEx(interfaz, 2, 2, 2);
}

void izquierda(int interfaz){
rbSetMotorEx(interfaz, 1, 2, 2);//rbSetMotorEx permite manipular un motor variando su velocidad
rbSetMotorEx(interfaz, 2, 1, 2);//rbSetMotorEx(iHnadle,motNr, Dir, Vel)
}

void atras(int interfaz){
rbSetMotorEx(interfaz, 1, 2, 2);
rbSetMotorEx(interfaz, 2, 2, 2);
}

void adelante(int interfaz){
rbSetMotorEx(interfaz, 1, 1, 2);
rbSetMotorEx(interfaz, 2, 1, 2);
}

void main() {

char Ende;
cout << "Corriendo Programa" <<>
int iHandle = rbOpenInterfaceUSB(ftROBO_first_USB, 0);//iHandle será el manejador de la interfaz actual

if (iHandle == rbFehler) { //rbFehler es el código de error, es 0 cuando no logra conectar con la interfaz
cout << "Imposible conectar con la interfaz (enter para terminar)" <<>
cin.get(Ende);
return;
}

do{

while( !rbGetInputs(iHandle) )//mientras no se active ningún pulsador
adelante(iHandle);

if( rbGetInput(iHandle, 1) ){ // si el pulsador 1 es activado
atras(iHandle);
Sleep(800);
izquierda(iHandle);
Sleep(500);
}

else if( rbGetInput(iHandle, 2) ){//si el pulsador 2 es activado
atras(iHandle);
Sleep(800);
derecha(iHandle);
Sleep(500);
}

else if( rbGetInput(iHandle, 3) ){//si el pulsador 3 es activado
while( !rbGetInputs(iHandle) )
adelante(iHandle);
}

else if( (rbGetInput(iHandle, 1)) && (rbGetInput(iHandle, 2)) ){
while( !rbGetInputs(iHandle) )
atras(iHandle);
}

}while(!kbhit());

rbCloseInterface(iHandle);//finaliza la conexión con la interfaz
cout <<>
getch();

}


miércoles, 14 de marzo de 2007

CAPTURANDO IMAGENES CON OPENCV (13 de Marzo de 2007)

Busqué en Internet algunos códigos para capturar imágenes desde una cámara, encontré uno en el foro wiki de opencv, que al parecer daba algunos problemas, lo analicé y tomé la parte de código que me serviría para capturar imágenes desde la webcam, el código que generé fue el siguiente:

1- #include "highgui.h"
2- #include "cv.h"
3- #include "stdio.h"
4- #include "iostream.h"
5-
6- int main() {
7-
8- CvCapture* capture = cvCaptureFromCAM(-1);
9- if (!capture){
10- fprintf(stderr, "Error: capture = NULL\n");
11- getchar();
12- return -1;
13- }
14-
15- cvNamedWindow("Ventana", 1);
16-
17- IplImage* frame = cvQueryFrame(capture);
18- if (!frame) {
19- fprintf(stderr, "Error: frame = NULL\n");
20- getchar();
21- return -1;
22- }
23- cvShowImage("Ventana", frame);
24- cvWaitKey(0);
25- cvReleaseCapture(&capture);
26- cvDestroyWindow("Ventana");
27- return(0);
28- }

El programa anterior crea un capture (línea 8) para hacer referencia a la webcam instalada en la máquina, también crea una variable (frame) que apuntará a la imagen que recibe la cámara. Posteriormente se crea una ventana en donde se mostrará lo sensado por la cámara y finalmente se liberará el capture y se destruirá la ventana.
Si se quiere capturar una secuencia de cuadros, es decir un flujo de video, hay que agregar el siguiente código:

while(1){ //mientras sea verdadero
IplImage* frame = cvQueryFrame(capture);//graba un cuadro tomado por la cámara
if (!frame) {
fprintf(stderr, "Error: frame = NULL\n");
getchar();
return -1;
}
cvShowImage("Ventana", frame);//muestra el cuadro tomado por la cámara
if((cvWaitKey(10) & 255)==27) break;//rompe el ciclo while si se oprime la tecla esc
}