Instalar OpenCV en Raspbian Jessie

OpenCV (Open Source Computer Vision) es una librería software de código abierto sobre visión artificial.

OpenCV_Logo_with_text
Logo OpenCV

Es multiplataforma por lo que existen distintas versiones en C/C++, Java, Python y distintos soportes para cada sistema operativo (Linux, Mac, Windows …).

Contiene más de 500 funciones que abarcan una gran gama de áreas en el proceso de visión, como reconocimiento de objetos o reconocimientos facial, calibración de cámaras, visión estérea y visión robótica.

2016-08-18-171351_1824x984_scrot - copia
Reconocimiento Facial con OpenCV

Siguiendo los pasos que vamos a enumerar a continuación podemos instalar OpenCV en nuestra Raspberry Pi con Raspbian Jessie instalado, en unas dos horas. (25 minutos que tardaremos en preparar todo, y luego algo más de hora y media para dejar que se compile y se instale).

Lo primero de todo será comprobar que la Raspberry está actualizada:

sudo apt-get update

sudo apt-get upgrade

sudo rpi-update

sudo reboot

Una vez actualizada y reiniciada, seguimos con los siguientes pasos, para instalar las dependencias:

sudo apt-get install build-essential git cmake pkg-config

1

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

2

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

3

sudo apt-get install libxvidcore-dev libx264-dev

4

sudo apt-get install libgtk2.0-dev

5

sudo apt-get install libatlas-base-dev gfortran

6

sudo apt-get install python2.7-dev python3-dev

7

Descargamos y descomprimimos el código fuente de Open CV:

cd ~

8

wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.0.0.zip

9

unzip opencv.zip

10

wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.0.0.zip

11

unzip opencv_contrib.zip

12

Configuramos Python, puesto que en nuestro caso será con el que utilizaremos OpenCV en la Raspberry Pi.

wget https://bootstrap.pypa.io/get-pip.py

13

sudo python get-pip.py

14

Virtual Enviroment:

sudo pip install virtualenv virtualenvwrapper

15

sudo rm -rf ~/.cache/pip

16

sudo nano ~/.profile

profile

El archivo debe quedar con el aspecto anterior, guardamos con Ctrl+X  y ejecutamos lo siguiente:

source ~/.profile

18

mkvirtualenv cv

20

Siempre que cerremos sesión o apaguemos la Raspberry, si queremos trabajar en el entorno virtual tenemos que ejecutar lo siguiente:

source ~/.profile

workon cv

Y ya nos aparecerán las letras (cv), indicando que estamos en el entorno virtual

20 - copia

pip install numpy

21

cd ~/opencv-3.0.0/

22

mkdir build

23

cd build

Compilamos e instalamos OpenCV:

24

cmake -D CMAKE_BUILD_TYPE=RELEASE \

-D CMAKE_INSTALL_PREFIX=/usr/local \

-D INSTALL_C_EXAMPLES=ON \

-D INSTALL_PYTHON_EXAMPLES=ON \

-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.0.0/modules \

-D BUILD_EXAMPLES=ON ..

25

Aseguramos que en el apartado de Python 2,  tanto el intérprete , como numpy apuntan al entorno virtual.

26

27

Compilamos:

make -j4

(Si queremos compilar utilizando 4 núcleos)

o make simplemente (compilación más lenta)

28

Empezará la compilación que puede durar hora y media si se usan los 4 núcleos, o más si sólo se utiliza uno.

Si todo sale bien, una vez que llegue al 100 % de la compilación y si no se han recibido mensajes de error, ya tendremos casi listo nuestro Open CV.

29

En caso de recibir error, puedes probar a borrar la compilación con el comando make clean

y una vez eliminada, volver a probar ejecutando make.

Una vez compilado sin errores, seguimos con el siguiente paso:

sudo make install

30

sudo ldconfig

31

cd ~/.virtualenvs/cv/lib/python2.7/site-packages/

32

ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

33

Y ya tenemos listo nuestro OpenCV en la Raspberry Pi.

Para verificar que todo ha ido correctamente podemos hacer la siguiente comprobación:

python

34

cv2.__version__

35

En entradas posteriores veremos diferentes usos de OpenCV con la cámara de la Raspberry Pi.

Gracias a http://www.pyimagesearch.com/2015/10/26/how-to-install-opencv-3-on-raspbian-jessie/

Sistema de vigilancia con Raspberry Pi

Para seguir con las dos entradas anteriores, y con nuestro proyecto de domótica con Raspberry Pi vamos a explicar como hacer que cuando el sensor PIR detecte movimiento mande una foto capturada por la cámara de la Raspberry Pi al correo de gmail.

admin.schema

Partiendo del programa en python que teníamos para controlar el sensor PIR, vamos a modificar el código de tal forma que cuando se detecte movimiento en vez de escribir por pantalla “movimiento detectado”, ejecute en segundo plano otro programa en python que toma una foto con la cámara oficial de Raspberry Pi.

41vGRDyVq6L._SX425_
Raspberry Pi Camera

Para ello lo primero que tenemos que hacer es conectar la Cámara al CSI de la Raspberry Pi

Raspberry_Pi_CSI_Camera_Module_from_Mobile_Phone
Conexión cámara CSI Raspberry Pi

Y ejecutando en la Raspberry el comando

sudo raspi-config 

Habilitamos la cámara

EnableCamera
Enable Camera comando raspi-config

Instalamos la librería “picamera” con el siguiente comando

 sudo apt-get install python-picamera
Y ya podemos ejecutar el siguiente programa:
#!/usr/bin/env python
import os
from time import sleep
import picamera
import smtplib

ruta = ‘/home/pi/raispi/fotos/pic.jpg’
with picamera.PiCamera() as camera:
camera.start_preview()
#Hacer foto
camera.capture(ruta, format= ‘jpeg’, use_video_port=True)
camera.stop_preview()
camera.close()

#Mandarla como archivo adjunto al correo de gmail
os.system(“./mail.sh &”)

Que a su vez ejecuta en segundo plano lo siguiente:
echo “Imagen por persona detectada” | mutt -s “Movimiento detectado” destinatario@gmail.com -a /home/pi/raispi/fotos/pic.jpg
Dando permiso al programa anterior así como al .sh, con el comando
sudo chmod 777 foto_sensor.py
sudo chmod 777 mail.sh
dejamos la Raspberry Pi un poco oculta cerca de la entrada de casa, y ejecutamos el programa del sensor PIR y cada vez que detecte que alguien entra, tomará una foto y la mandara por correo.
ImagenPersonaDetectada

Enviar un correo desde la Raspberry Pi

Siguiendo con nuestro proyecto de domótica con la Raspberry Pi, en esta entrada vamos a explicar como mandar correos desde la Raspberry Pi que nos puedan servir como aviso de ciertas situaciones que pasan en casa cuando no estamos.

admin.schema

Lo primero que hemos hecho ha sido crear una cuenta de gmail, puesto que necesitábamos otra desde la que mandar los correos.

A continuación instalaremos Mutt, un cliente correo que se puede utilizar desde Terminal.

Para ello ejecutamos desde la Raspberry Pi el siguiente comando:

sudo apt-get install mutt

Después, dentro del directorio /root creamos el  fichero .muttrc y escribimos las siguientes líneas:

File_muttrc
Contenido Fichero /root/muttrc

Donde sustituimos la palabra contraseña por nuestra contraseña real del correo, y guardamos su contenido.

A continuación creamos el siguiente directorio:

mkdir – p /root/.mutt/cache

Ejecutando desde nuestro terminal mutt, ya nos aparecerá nuestra bandeja de entrada y ya podremos enviar y recibir correos.

BandejaCorreo
Bandeja de Correo desde Terminal

Para enviar algún correo sólo tenemos que ejecutar lo siguiente:

echo “Contenido del correo” | mutt –s “Asunto del mensaje” destinatario@gmail.com

CorreoSinAdjuntoFotoCorreoSinAdjuntoCorreoConAdjuntoFtoCorreoConAdjunto

 

Transductores usados en el robot: Encoders

Esquema

En esta entrada vamos a explicar los encoders utilizados en el robot.

Encoders:

A ambos lados, junto a dos de las ruedas del robot se encuentran dos encoders:

Encoder
Encoders del robot

Un encoder es un dispositivo que convierte la posición angular de un eje a código digital. Existen varios tipos de encoders.

El encoder óptico es el más utilizado comúnmente y es el empleado en este caso. Está formado por 3 bloques básicos:

  • una fuente emisora de luz
  • un disco giratorio
  • un detector de luz o “foto detector”.

El disco está montado sobre un eje giratorio y cuenta con muescas o secciones opacas y transparentes sobre la cara del disco. La luz que emite la fuente es recibida por el foto-detector o interrumpida por el patrón de secciones opacas produciendo como resultado una señal de pulsos. Dicha señal es leída en este caso por la Raspberry Pi, para determinar el ángulo exacto del eje.

 

servo-motor-incremental-encoder
Funcionamiento del encoder utilizado

Un encoder lineal es un dispositivo o sensor que cuenta con una escala graduada para determinar su posición. Los sensores en el encoder leen la escala para después convertir su posición codificada en una señal digital que puede ser interpretada por un controlador de movimiento electrónico.

Los encoders lineales pueden ser absolutos o incrementales y existen diferentes tipos de encoders lineales según la tecnología usada en su mecanismo, por ejemplo, tecnología óptica, magnética, inductiva o capacitiva.

Este tipo de encoder es más utilizado en aplicaciones de metrología, sistemas de movimiento y para controlar instrumentos de alta precisión.

Un encoder de cuadratura es un tipo de encoder rotativo incremental el cual tiene la capacidad de indicar tanto la posición como la dirección y la velocidad del movimiento.

Los encoders de cuadratura se encuentran con mucha más frecuencia en muchos productos eléctricos de consumo y en una infinidad de aplicaciones comerciales. Ofrecen una alta resolución, medición con precisión quirúrgica y pueden trabajar en un gran espectro de velocidades.

Este tipo de encoder de cuadratura generalmente utiliza sensores ópticos o magnéticos, lo cual los convierte en dispositivos sencillos de usar y extremadamente duraderos.

Un encoder incremental como su nombre indica, es un encoder que determina el ángulo de posición por medio de realizar cuentas incrementales.

Esto quiere decir que el encoder incremental provee una posición estratégica desde donde siempre comenzará la cuenta.

Un encoder absoluto ofrece un cogido único para cada posición.

Los encoders absolutos se dividen en dos grupos: los encoders de un solo giro y los encoders absolutos de giro múltiple. Su tamaño es pequeño para permitir una integración más simple.

Volviendo al utilizado en este caso, mediante dos transductores infrarrojos de reflectancia en el interior de la rueda, detecta el movimiento de unos dientes incorporados en la llanta de la misma. Ambos transductores están desfasados, lo que permite determinar el sentido del giro. Este transductor, es capaz de proporcionar una resolución de 20 pulsos por vuelta.

EncoderFoto
Encoder

Trabajando con interrupciones en el programa, podemos saber cuando se ha detectado una muesca, y por tanto aplicar las siguientes fórmulas:

Formula1EncodersFormula2Encoders

 

 

 

Transductores usados en el robot: Acelerómetro

Esquema

En esta entrada vamos a explicar el acelerómetro utilizado en este robot.

Acelerómetro:

Un acelerómetro es un dispositivo capaz de detectar dos tipos de aceleración, estática (la gravedad) y la dinámica (movimientos o vibraciones).

Suelen contener placas capacitivas internas, así como otros están unidos a diminutos resortes que se mueven según la aceleración que actúe sobre él. Es gracias a estos cambios en la capacitancia, por lo que puede determinarse la aceleración producida en cada momento.

Cuando se encuentra en reposo, y de manera horizontal al suelo, lo único que detectará será la fuerza de la gravedad sobre el eje Z, refiriéndose a los ejes cada uno en esta dirección:

Ejes
Ejes
Conociendo el valor de la fuerza gravitatoria de los 3 ejes, y aplicando trigonometría podemos obtener, el ángulo de inclinación de los ejes, y por tanto la pendiente del entorno.
CasosAcc
Casos 1 y 2
En el caso 1 tenemos el acelerómetro totalmente paralelo al suelo, por lo que la única
componente donde existe fuerza gravitatoria es la del eje Z, y por tanto las inclinación es
para el Eje X e Y son nulas.
Sin embargo en el caso 2, el acelerómetro está inclinado un cierto ángulo Theta, por lo
que la resultante de la fuerza gravitatoria ahora se reparte sobre el eje Y y sobre el Z, de
tal manera que la fuerza gravitatoria sobre el Y es igual a la fuerza gravitatoria total
sobre el acelerómetro por el seno del ángulo Teta, mientras que la del eje Z será la fuerza
total multiplicada por el coseno del ángulo. Si dividimos una entre la otra, observamos que obtenemos la tangente del ángulo, y por tanto aplicando la arcotangente de la fuerza gravitatoria del eje Y entre la del Z, obtenemos el ángulo de inclinación del acelerómetro respecto al eje Y. Lo mismo pasaría respecto al eje X.

En este caso se utiliza el ADLX345, que se trata de un acelerómetro digital de 3 ejes de la marca Analog Devices. Dispone de sensibilidad ajustable  y una resolución de 13 bits. Se puede conectar mediante SPI o I2C. Posee una resolución de 3,9mg / LSB permitiendo detectar cambios de inclinación menores a 1º.

Otras características:

  • Rango de medición seleccionable +/- 2, 4, 8 y 16 g
  • El módulo o tarjeta de interconexión incluye un circuito regulador de voltaje
  • Pines configurables para generar interrupciones
  • Voltaje de operación de  a 3.6 V
Acelerometro
ADXL345

Calibración:

Para calibrar correctamente el transductor, hay que tener en cuenta el offset que hay que corregir a cada eje, y escribirlo en los registros: 0x1E, 0x1F, 0x20 para el eje x, y, z respectivamente.

Para saber que offset aplicar en cada uno de los ejes, se coloca el transductor horizontal al suelo, de tal manera que la gravedad se encuentre en el eje Z. Se toman varias medidas y se hace una media de las correspondientes a cada eje. Se obtiene así el offset real correspondiente a cada uno.

Además hay que indicar el rango de medición y la resolución deseados en el registro 0x31, así como el ancho de banda y la velocidad de salida de datos en el registro 0x2C.

Transductores usados en el robot: Ultrasonidos

Esquema
Módulos del robot

En esta entrada vamos a explicar los transductores (sensores) ultrasónicos que hemos utilizado en el robot.

Transductores Ultrasónicos

Un transductor ultrasónico es un detector de proximidad de objetos, con distancias que van desde pocos centímetros hasta varios metros. El transductor emite un ultrasonido, es decir, una onda acústica con frecuencia por encima del límite perceptible del ser humano (20 KHz),  que rebotará sobre el objeto más cercano en esa dirección. Estos transductores sólo trabajan en el aire, y pueden detectar objetos con diferentes formas, colores, superficies y materiales. Los materiales pueden ser sólidos, líquidos o polvorientos, sin embargo han de ser deflectores de sonido.

Imagen 38
Generación Onda Ultrasónica

Funcionamiento:

El funcionamiento básico de los transductores de ultrasonidos para la medición de distancia se muestra en el siguiente esquema, donde se tiene un receptor que emite un pulso de ultrasonido que rebota sobre un determinado objeto y la reflexión de ese pulso es detectada por un receptor de ultrasonidos, tal como se muestra en la figura.

Imagen 39
medida de distancia por ultrasonidos

El transmisor genera ráfagas de impulsos de una frecuencia y duración concretas, y al detectar la onda reflejada se genera una interrupción la cual detiene un timer.

Midiendo el tiempo que el eco tarda en regresar desde que se emitió el pulso, puede saberse a que distancia estaba el objeto que produce la reflexión de la onda.

La siguiente fórmula calcula la distancia  según el tiempo de recepción del eco en el transductor ultrasónico.

formula

Donde V es la velocidad del sonido en el aire, (unos 340 m/s) y t es el tiempo transcurrido entre la emisión y recepción del pulso medido en segundos.

Cosas a tener en cuenta:

Los transductores ultrasónicos presentan  una zona ciega, que depende de la frecuencia del transductor. Los objetos ubicados dentro de la zona ciega no se pueden detectar de manera fiable.
Aun no estando un objeto dentro de la zona ciega, y aunque el funcionamiento de estos transductores es sencillo, hay que saber que las mediciones pueden ser erróneas en ciertas circunstancias puesto que las ondas de ultrasonido obedecen a las leyes de reflexión de las ondas, por lo que tienen el mismo ángulo de incidencia y reflexión respecto a la normal a la superficie. Esto puede generar diversos errores:

  • Si la orientación relativa de la superficie reflectora con respecto al eje del transductor de ultrasonido es mayor que un cierto umbral, el transductor nunca reciba el pulso de sonido que emitió.

Otro factor de error muy común es el conocido como falsos ecos. Estos falsos ecos se pueden producir por razones diferentes:

  • Puede darse el caso en que la onda emitida por el transductor se refleje varias veces en diversas superficies antes de que vuelva a incidir en el transductor (si es que incide). Este fenómeno, conocido como reflexiones múltiples, implica que la lectura del transductor evidencia la presencia de un obstáculo a una distancia proporcional al tiempo transcurrido en el viaje de la onda; es decir, una distancia mucho mayor que a la que está en realidad el obstáculo más cercano, que pudo producir la primera reflexión de la onda.
Imagen 43
Reflexión de la onda en dos superficies
  • Otra fuente más común de falsos ecos, se produce cuando se emplean varios transductores ultrasónicos simultáneamente. En este caso ocurre con frecuencia que un transductor emita un pulso y este es recibido por otro transductor que estuviese esperando el eco del pulso que él había enviado con anterioridad.
Imagen 44
Recepción de una onda generada por otro ultrasónico.

Como transductores ultrasónicos se ha utilizado el srf08 y el sfr10:

SRF08:

SRF08
SRF08

SRF10:

SRF10
SRF10

Ambos transductores ultrasónicos son de la misma familia, SRF, con un alcance que va desde los 3cm hasta los 6m en ambos, por lo que son usados para detector de objetos, o medición de largas distancias. Además otra de las ventajas que presentan es que es muy fácil comunicarse con ellos mediante I2C, pudiendo conectarse todos ellos al mismo bus.

Todos ellos tienen una alimentación de 5V, y un consumo de 15 mA en funcionamiento, viéndose reducido hasta los 3mA en reposo. Lo que supone una gran ventaja en este caso, puesto que al alimentar al robot por pilas, hay que tener muy en cuenta el consumo.

Margen de detección:

Imagen 47

Sus dimensiones son 43 x 20 x 17 mm para el SRF08 y de 32 x 15 x 10 mm para el SRF10

Otra de las diferencias entre ambos transductores es que el SRF08 presenta un transductor de luz que no presenta el otro, pero que en este caso no es relevante, puesto que con que uno de ellos proporcione la información de la luz que hay en el entorno es suficiente.

Por simetría, puesto que tenemos dos transductores SRF10 y un SRF08, y por utilidad, se decidió poner el SFR08 delante, para que la información de la luz se reciba desde la parte frontal del robot, que también es donde va ubicada la cámara. Mientras que a cado lado se tiene un SRF10.

Conexión del transductor:

Ambos transductores poseen 5 pines. Uno de ellos no se conecta, mientras que del resto, dos de ellos son de alimentación (Vcc, y GND),  y los otros dos son los de la comunicación I2C (el de datos (SDA) y el del reloj (SCL)).

SRF08_2
Pines de conexión SRF08

Funcionamiento de los transductores ultrasónicos:

Cada uno de los transductores posee un microcontrolador en la placa, en este caso un pic16F, con el que establecer la comunicación I2C, así como 4 registros:

Ubicación Lectura Escritura
0 Revisión de software Registro de comando
1 Sin uso (lee 0x80) en el SRF10, y registro de luminosidad en el SRF08 Registro de ganancia máxima (por defecto 16)
2 Byte alto del valor medido Registro de alcance de distancia (por defecto 255)
3 Byte bajo del valor medido No disponible

Para iniciar la primera medida existen distintos comandos a utilizar, según las unidades en las que se quiera que el transductor devuelva la medida. (En hexadecimal los comandos a utilizar son los siguientes)

  • 0x50: Calculo de la distancia, con resultado en pulgadas
  • 0x51: Calculo de la distancia, con resultado en centímetros
  • 0x52: Calculo de la distancia, con resultado en microsegundos

Se escribe el comando decidido en el registro 0, y tras unos 65 us, es posible leer el valor de vuelta en las unidades correspondientes.

Otro modo de saber cuándo el dato de vuelta está listo, es hacer lecturas continuadas al registro 0, puesto que mientras el valor leído, sea 0xFF, significa que está realizándose la medida y aún no ha terminado.

Vehículo Robótico con Raspberry Pi

Estamos desarrollando un vehículo robótico con la plataforma Raspberry Pi.

Los vehículos robóticos de exploración nos permiten la adquisición de datos en entornos de imposible o difícil acceso humano, bien por razones de lejanía, de coste o de peligrosidad o incluso la suma de ellos. Algunas de las aplicaciones que desempeñan, son apoyo de misiones de exploración planetarias, robots teleoperados para investigación de materiales peligrosos, derramamientos,  o similares. Sin embargo y dependiendo del fin para el que son construidos, estos robots, tendrán que tener un nivel más alto de autonomía tanto en movimiento y control del robot, como en la propia alimentación del mismo.

Para ello ejemplos de exploración espacial como los Rovers de Marte, o robots como Oberon o Dante II,

mars-rovers-engineers
Curiosity
dante_ii
Dante II
Oberon2
Oberon

Con este proyecto se ha creado un vehículo robótico de exploración de entornos terrestres, principalmente de interiores. Este robot es capaz de captar información sobre el ambiente gracias a distintos transductores de que dispone y enviarla a un ordenador  a través de wifi.

Los transductores que conforman el robot son un acelerómetro, un transductor de temperatura y humedad, dos encoders, uno en cada eje lateral y tres ultrasónicos, uno de ellos incorpora además un sensor de luminosidad.

Desde el ordenador además de las mediciones realizadas por los transductores, pueden visualizarse, simultáneamente las imágenes captadas por una cámara ubicada en la parte delantera del robot, siendo visualizados en una interfaz gráfica ejecutada en dicho ordenador.

Desde la misma interfaz, se manejan los actuadores (motores, servos y un buzzer de aviso) del robot. Este puede ser manejado en dos modos:

  • Funcionamiento manual: Desde el ordenador que recibe los datos y mediante una interfaz de flechas y botones, se podrán dirigir los distintos componentes del robot.
  • Funcionamiento automático: Será el propio robot el que de manera autónoma, y gracias a los datos recibidos de los transductores evite obstáculos, pueda, mediante algoritmos, generar una ruta de recorrido por el entorno, y maneje sus propios componentes.

Además el robot debe ser capaz de dibujar un plano, en dos dimensiones, de la superficie recorrida hasta el momento.

La placa principal que maneja todo el robot, es la Raspberry Pi 3 y los sistemas operativos que vamos a utilizar son dos:

  • Raspbian, sistema operativo oficial para dicha placa
  • Un sistema embebido creado para el propio robot y para esa Raspberry Pi en concreto, que será desarrollado utilizando la herramienta Buildroot.

En cuanto a los lenguajes de programación que se ha decidido emplear son Python y Java. Python para todo lo relacionado con los módulos de la Raspberry, los transductores, los actuadores, así como la cámara, una pantalla LCD y otros componentes del robot, mientras que Java se ha usado para desarrollar el cliente ejecutado en el ordenador mediante una interfaz gráfica generada con el programa Netbeans.

Todo los comandos intercambiados entre ordenador y Raspberry Pi, siguen un protocolo de comunicación definido específicamente por nosotros y quedarán registrados en un fichero almacenado en la Raspberry Pi que permita hacer un seguimiento del funcionamiento del mismo, para poder analizarlo en caso de fallo.

Por ahora el robot tiene el siguiente aspecto:

RobotRaispi

El esquema de los módulos que componen el robot, es el siguiente:

Esquema

 

El módulo de los sensores ultrasónicos mide distancias entre el robot y los objetos más próximos para que este pueda evitarlos, y conozca el entorno. En concreto se han utilizado 3, uno en cada lateral, y otro en la parte delantera del robot.

El acelerómetro se utiliza para calcular la pendiente del entorno.

También hay un módulo que capta la húmedad y la temperatura del ambiente.

Dos encoders que permiten calcular el sentido de giro de cada par de ruedas, así como la velocidad a la que lo hacen.

Una cámara para tomar fotos y grabar el entorno.

Una pantalla LCD para mostrar información del robot.

Y como actuadores, dos motores DC, dos servos, un buzzer y unos leds infrarrojos.

Iremos explicando cada uno de esos módulos en otras entradas.

La ventana principal de la interfaz que maneja el robot, y que se ha diseñado en Java, tiene el siguiente aspecto:

InterfazGrafica

Aquí tenéis  un video de las primeras pruebas hechas con el robot.