Construyendo y Programando RoboTitos

Documentación de "Frankestito", construido en nuestra facultad. Departamento Ingenieria de Computadoras .-

Este trabajo es parte del Proyecto de Investigación "Identificación, Evaluación y Adapatación de Componentes de Hardware y Software para Sistemas Embebidos".

http://labti.fi.uncoma.edu.ar/trac/chrome/site/fran5.png

Introducción

En la Facultad de Informática estamos desarrollando prototipos de robots educativo con visión autónomos, compatibles con  Myro. Además, a diferencia de la mayoría de los robots de bajo costo existentes compatibles con Myro, nuestra implementación cuenta con Linux embebido dentro del robot. Esto posibilita ejecutar, por ejemplo, python o prolog directamente dentro del robot.

Myro (My Robotics), es un proyecto open source que tiene como objetivo enseñar ciencias de la computación a través de la programación de robots con Python. Mas información en  Introduction to Computer Science via Robots

La metas principales son :

  • Construir Robots Educativos adaptables
  • Publicar el Software (firmware, software embebido, software de control, etc) como Software Libre
  • Publicar la documentación de la electrónica como Open Hardware
  • Enseñar la arquitectura y la programación de los Robots
  • Difundir las experiencias

Los Robots Educativos son muy utilizados actualmente, ya que se utilizan como recurso en varias disciplinas y proyectos :

  • Como recurso en la difusión de la computación en las escuelas medias;
  • De incentivo en el aprendizaje de la programación;
  • Como recurso para ayudar a revertir la deserción universitaria;
  • Como recurso para verificar en ambientes reales los desarrollos de los Grupos de Investigación en Inteligencia Artificial.
  • Como elemento académico para el aprendizaje de temas de los Sistemas Embebidos.

Caraterísticas del Robot Educativo :

  • Primitivas de Movimiento básicas que permiten construir movimientos mas complejos. Utilizando Myro se potencia la libertad de movimiento con programación en alto nivel.
  • Visión (sensado) del mundo a través de una Camara. Puede Hacer streaming de Video y procesar la Vision.
  • Feedback a través de leds y parlante.

Arquitectura del Hardware

La arquitectura del prototipo actual del Robot Educativo está compuesto por :

  • Una placa Easyduino (construidas en la Facultad, compatibles con arduino uno), la cual controla un L293D que tiene conectado ambos motores. Los motores son antiguos motores de robots Legos, o los disponibles universalmente en los kits de "Hong Kong" para robotitos.
  • La placa Easyduino se comunica con una placa TL-MR3020 de 5.7cm x 5.7cm con Linux embebido, a traves de una conexion serial. La board Linux utiliza wireless para comunicarse con Myro, y el usb host para la conexion con la camara de visión.
  • La vision actual es a traves de una Camara controlada por Linux. Actualmente el robot distingue objetos con colores uniformes, ideal para hacer practicas de vision basica.
  • Para comunicarse con el mundo, el robot cuenta con dos leds y parlante. Desde Myro se puede "encender" o "apagar" estas salidas para realizar acciones de comunicacion visual y sonora.

Al comunicarse a través de conexiones TCP/IP, el robot puede ser fácilmente controlado. Utilizamos el protocolo de Myro por estar implementado en muchos lenguajes (Python, C, C++, Java), pero también puede ser fácilmente utilizado desde cualquier lenguaje de programación que permita la programación de sockets.

Hardware Linux embebido

http://labti.fi.uncoma.edu.ar/trac/chrome/site/fran.png Utilizamos la board TP Link 3020. Con uboot, kernel Linux, y OpenWRT instalado. Documentación de referencia :  http://wiki.openwrt.org/toh/tp-link/tl-mr3020

Wireless

Nos comunicamos con Myro a traves de una conexion TCP. Myro, nativamente, intenta utilizar un dispositivo serial (que en los robots importados es un BT). Nosotros modificamos levemente Myro, para que en vez de utilizar un dispositivo serial utilice una conexion TCP/IP via la wireless del Linux embebido en el robot.


Software

Hay varios niveles de software.

http://labti.fi.uncoma.edu.ar/trac/chrome/site/myro.png

El software del robot (firmware para el Atmega8 y programas embebidos en Linux) está escrito mayoritariamente en C. Utilizamos el ambiente arduino para crosscompilar y flashear el AVR ATMEGA8. Tambien, utilizamos GCC-mips, para crosscompilar el software embebido en la board Linux.

Utilizar un AVR Atmega, como microcontrolador para controlar los motores y sensores, permite desarrollar todo el software del robot utilizando las herramientas GNU GCC (the GNU Compiler Collection).

El software en el Linux embebido son varios programas (ser2net, mjpeg_stream, firmware para comunicaciones, scripts, etc), configurados de diferentes maneras para diferentes experimentos.

Flashing via Wireless

A través del Linux embebido con el que cuenta el robot podemos transferir el firmware desarrollado para el Atmega8 via wireless. Se logra a través de ser2net en el LInux embebido, y a través de socat en la PC origen.

En tplink:
# cat /etc/ser2net.conf
2000:raw:0:/dev/ttyATH0:19200 8DATABITS NONE -XONXOFF -RTSCTS
Iniciar ser2net.

Desde la PC :
socat pty,raw,echo=0 tcp:192.168.1.201:2000

Reiniciar el atmega8, y rapidamente desde PC (antes que el bootloader finalice la espera):
avrdude -C/etc/avrdude.conf -v -v -v -v -patmega8 -carduino -P/dev/pts/5 -b19200 -D -Uflash:w:eco_serial.hex:i

Flash the Bootloader en Atmega8 Usando Arduino UNO como ISP

Seguir las instrucciones en :  http://arduino.cc/en/Tutorial/ArduinoISP Y utilizar el IDE ARDUINO 1.0.1 o superior (OJO: si se utiliza el IDE Arduino 1.0 FALLA!!!. Intenté mil veces :) )

Controlando el Robot

Hay varias maneras posibles de controlar al robot por software (todas ellas via wireless o bluetooth). Tres formas que hemos testeado son :

  • a través de Myro y cualquier lenguaje en que Myro esté implementado. Acualmente puede ser Python, C, C++, Java.
  • a través de sockets y un programa en cualquier lenguaje (se necesita ser2net),
  • utilizando un Gamepad y Myro

Ejemplo utilizando Python-Myro, C, y Gamepad

  • El software Myro es utilizado desde la PC y controla el robot de forma remota a través de programas escritos en Python, Java o C++.

Nuestro prototipo actual es compatible con Myro y robot Scribbler. Esto significa que con solo 3 líneas de código de programación en lenguaje Python ya puede controlar el robot.

# python
>> from robofai import *
>> init()
>> adelante(1, 3)
>> atras(1, 3)

En el ejemplo anterior el robot avanzaría a máxima velocidad durante tres segundos hacia adelante, luego avanzaría a máxima velocidad durante 3 segundos hacia atrás.

  • Si no queremos utilizar Myro y Python podemos utilizar simplemente ser2net con

un programa que envie mensajes al robot a traves de sockets. El siguiente [Programa Ejemplo en lenguaje C] mueve el robot via sockets. Download : http://labti.fi.uncoma.edu.ar/trac/chrome/site/getname-socket.c

  • A traves de Myro y Python tambien se puede manejar el robot con un control de videojuegos (gamepad).
import time
from robofai import *

init()
time.sleep(5)
parar()
while 1: robotito.move(*getGamepad("robot"))

Como usar una PC para controlar el robot

  • Instalar Myro
  • Encender el robot.
    • Esperar a que Linux inicie el hardware del robot (nos damos cuenta cuando cuatro de los leds de la placa Linux esten encendidos (algunos titilando).
    • Esperar a que las luces superiores del robot titilen 10 veces, y los motores realicen un test hacia atras y adelante. (indicacion de que inició correctamente el firmware del AVR).
      • Si las luces superiores no titilan 10 veces y el robot no hace marcha atrás y adelante entonces hay que resetear solo la placa easyduino (tiene un botoncito). Si el problema persiste o puede tener excesiva carga de baterias, o demasiado poca. Tambien se puede reinstalar (reflash) del firmware del easyduino para estar seguro de las comunicaciones y demas.

  • Configurar la wireless en nuestra PC para conectarnos al robot :
    # /etc/init.d/network-manager stop
    # iwconfig wlan0 essid robotsfai
    # ifconfig wlan0 10.0.20.5
    
  • Compilar alguno de los programas ejemplos y testear. Ej:
    gcc -o detectar-bordes-rojos -L/usr/local/lib -lmyro-cpp /usr/local/lib/MyroC.o -lfaivision detectar-bordes-rojos.c 
    ./detectar-bordes-rojos
    
  • Si se utiliza Python :
>>> import robofai import *
>>> init()
>>> detectar_objetos()
>>> cuanto_color(BLANCO)      # Consultamos color blanco
83                      # 83% de color blanco
>>> buscar_color(BLANCO)      # Consultamos en el eje X el "centro" del color blanco
120                     # El centro en X es el pixel 120 (de 0 a 160) 

>>> # Moviendo el robot
>>> from robofai import *
>>> init()
>>> adelante(2, .5)
>>> quit()

Vision

El prototipo cuenta con una camara. Utilizando una biblioteca que hemos llamado "faivision" contamos con primitivas graficas, que permite detectar objetos de colores uniformes. Con esta visión, el robot puede detectar muros, encontrar objetos, hacer el famoso "seguimiento de linea", etc.

Existen muchisimos ejemplos de como programar el robot para "ver" y actuar en consecuencia (leer los libros de Myro!).

Ejemplo utilizando Python y nuestra biblioteca de Vision :

# En este ejemplo el robot observa objetos color blanco 
# y trata de girar e ir hacia otro lado cuando los detecta.

from robotito import *


movimiento = 0
while(1):
	detectar_objetos ()
	a = cuantocolor(BLANCO)
	if a > 25 :             # Si el robot "observa" mas de 25% de color blanco
		stop()
		esperar(1)
		atras(.3, .2)
		esperar(1)
		izquierda(.3, .2)
		movimiento = 0
		esperar(3)
	elif movimiento == 0:
		movimiento = 1
		adelante(.1)
		
	esperar(.5)

Instalacion y Utilizacion de la Biblioteca de Vision Basica

# Tener instalado libsdl libsdl libsdl-image y libcurl. 
# Tambien los archivos para programacion de esas bibliotecas (cabeceras, etc).
# En mi sistema tengo instalado :
#    libcurl3, libcurl3-gnutls, libcurl3-nss, libcurl4-nss-dev
#    libsdl1.2-dev, libsdl1.2debian, libsdl-image1.2 libsdl-image1.2-dev
#

git clone https://github.com/zrafa/se_uncoma.git
cd se_uncoma/robotitos/faivision
make
sudo make install

# Listo, ya podemos utilizar la biblioteca como en el ejemplo de python
# Funciones
void detectar_objetos(int x1, int y1, int x2, int y2);
void faivision_init(void);
int objeto_x(int c);
int objeto_y(int c);
int objeto_porc(int c);
  • El robot puede toma fotos de 160x120 pixels.
  • En primer lugar inicializamos SDL con faiviosion_init()
  • Luego, tomamos una imagen de la camara y detectamos los objetos con : detectar_objetos(x1, y1, x2, y2) # x1, y1, x2, y2 es la seccion de una foto que queremos analizar.
  • Luego, una vez detectado los objetos (los colores), podemos consultar :
    • la posicion central en X de un color con : objeto_x(color)
    • la posicion central en Y de un color con : objeto_y(color)
    • el porcentaje que ocupa un color en la vision actual : objeto_porc(color)
    • rojo=0, verde=1, azul=2, blanco=3, negro=3
    • Los colores que "mejor" observa el robot son el blanco, negro y el rojo
# Ejemplo en python
>>> import ctypes
>>> l = ctypes.CDLL('/usr/local/lib/libfaivision.so')
>>> l.faivision_init()

>>> l.detectar_objetos (1, 1, 160, 120)  # Tomamos una foto y detectamos los colores en los 160x120 pixels
>>> l.objeto_porc(3)       # Consultamos el porcentaje que ocupa el color blanco
83                         # 83% de color blanco
>>> l.objeto_x(3)          # Consultamos el "centro" del color blanco
120                        # El centro en X es el pixel 120 

Downloads

Nuevo! : El código fuente en desarrollo, para todas las capas de Hardware y Software, se encuentra ahora versionado en github :  https://github.com/zrafa/se_uncoma/tree/master/robotitos

Documentación y Libros para Leer

Wireless

Wifi del tplink : "robotsfai" ip de la red : 10.0.20.0

Habilitamos la wifi con

root@OpenWrt:~# cat /etc/config/network
config interface 'wifi'
	option proto 'static'
	option ipaddr '192.168.2.100'
	option netmask '255.255.255.0'

root@OpenWrt:~# vi /etc/config/wireless
# option disabled 0
config wifi-iface
	option device   radio0
	option network  wifi
	option mode     ap
	option ssid     OpenWrt
	option encryption none

Serial con la placa Atmega8

# cat /etc/ser2net.conf
2000:raw:0:/dev/ttyATH0:9600 8DATABITS NONE -XONXOFF -RTSCTS
# 2000:raw:0:/dev/ttyATH0:19200 8DATABITS NONE -XONXOFF -RTSCTS

EL arduino quiere 8DATABITS sin control de flujo de ningun tipo. Ademas es importante el raw:0: porque el 0 hace que nunca libere el serial.

Iniciar el generador de fotos via web

Iniciar ambas placas pero sin iniciar el mjpg-streamer y ser2net. Luego, una vez que la red Linux esté funcionando, iniciamos mjpg-streamer y ser2net.

ssh -l root 192.168.2.100 /root/mjpg-streamer.sh
ssh -l root 192.168.2.100 /usr/sbin/ser2net
# cat /root/mjpg-streamer.sh
mjpg_streamer -b -i "input_uvc.so -f 1 -r 160x120" -o "output_http.so -p 8080"

Tomar una foto desde la PC :

http://192.168.2.100:8080/?action=snapshot

Año 2013 - Notas recordatorias

  • NUNCA! utilizar o encender el robot encima de una mesa.
  • EL piso debe ser completamente llano.
  • El robot tiene menos peso este año. Con lo cual admite avanzar mas despacio, y ver paredes!''' (antes las veía, pero tarde; y se estampaba contra la pared pobre)
  • Las baterías y la conexion serial no deben ser manipuladas de manera brusca. Son lo mas delicado del robot.
  • Siempre tomar el robot desde la base. No aplastar.
  • Cuando no haya sincronizacion, o el robot se comporte de manera muuy extraña, es porque seguramente hay que recargar baterias.
  • Se configuró una wifi especial para la red de robots. Se llama (essid) : robotsfai (10.0.20.0/24)

Fotos y Videos

Estos modelos fueron nuestros primeros prototipos. Se mantienen aquí como una manera de recordar la historia.

http://labti.fi.uncoma.edu.ar/trac/chrome/site/IMG_9734.JPG http://labti.fi.uncoma.edu.ar/trac/chrome/site/IMG_9735.JPG http://labti.fi.uncoma.edu.ar/trac/chrome/site/version2.jpg http://labti.fi.uncoma.edu.ar/trac/chrome/site/version22.jpg

Anteriores :  http://www.youtube.com/watch?v=kn4rZZxcDi0  http://www.youtube.com/watch?v=5xkeqvugC2Y

Próximas Tareas

Algunas tareas se dividiran en tareas mas pequeñas obviamente.

  • Gamepad : Funcionando
  • Placa MR3020 con Linux Embebido : Funcionando
  • Portar python a mips (mips: arquitectura de la board embebida) : Realizado
  • Portar prolog o ciao prolog : Hecho
  • Documentar el prototipo y realizar esquematicos y boards finales : Pendiente
  • Sensores : Sólamente contamos con camara en la board con Linux embebido (funcionando). Faltarian sensores IR y de ultrasonidos?
  • Firmware del robot : En marcha (Tenemos implementado el control de los motores, leds y parlante). Tambien una vision minima con primitivas graficas en C.
  • Ejemplos de código en Myro Python, C, C++ y Java para controlar el robot : Hecho. En esta wiki mostramos muchos ejemplos de todo tipo.
  • Portar ser2net y mjpg-stream a la board Linux embebida : Hecho
  • Documentar como logramos que Myro pueda aceptar un dispositivo serial virtual (/dev/pts/#). Hecho.
  • Entrega 2013
    • Falta bajar el consumo de bateria via reduccion del txpower de a wifi
    • Fijar el cableado de energia desde el pack de baterias
    • Fijar la plaquita con leds y parlante

Enlaces de Interes

 http://www.ludep.com/blog/  http://ludep.com/wp-content/uploads/links/20110831_MasterProject_FinalReport_Depoyant_Ludmann.pdf