Hola a todos, sobre este nuevo post vamos a documentar la construcción de un robot que estamos implementando el cual por medio de un sistema de control sera capas de realizar una búsqueda de objetos en el ambiente "definidos como pelotas" que podrá recoger en su trayecto.

Este robot lo construimos con estudiantes de la universidad el valle, es un robot totalmente libre el cual podrán seguir su construcción y replicarlos.
Fue utilizado para concursar sobre el evento que realiza la universidad del valle llamado "Jornada Regional de Electronica".

Si se desea colaborar con el proyecto o descargar las fuentes de este, pueden realizarlo directamente desde su repositorio en GitHub "PiBotBalls"

Entorno de desarrollo

Con estas herramientas estamos desarrollando nuestro proyecto, el código es creado con herramientas libres.

  • Laptop LG 13Z940
  • Debian GNU/Linux con Desktop Deepin
  • Red Wifi LAN con Servidor DHCP automático
  • GitHub
  • Git/Gitkraken

Componentes del robot

Hardware:
  • System On Chip Raspberry pi 3
  • Memoria MicroSD Clase 10 8GB
  • 5 Sonares HC SR04
  • 4 Moto reductores
  • 1 Servo Motor paso completo
  • 2 Controladores L298n
  • Alimentación del sistema: Batería Lipo 3S 10C (12.6Vfl) / sistema de regulación de voltaje 5V fijos a 15A con LM7805 y Transistor Toshiba de potencia
  • Camara Full HD SJCam M10
Software:
  • Deepin 15.4 "Debian GNU/Linux"
  • Raspbian GNU/Linux
  • Python 2.7
  • Python RPI GPIO
  • SimpleCV

El Robot

"Misión"


La misión de cada uno de los robots que se enfrentan en una misma arena como la mostrada en la figura es recolectar el máximo número de pelotas, considerando que la partida tiene un tiempo de duración de 3 minutos y 30 segundos. Al mismo tiempo que los robots recolectan las pelotas, éstos deben evadir los obstáculos presentes en el área a saber: Muros, Obstáculos estáticos ubicados al inicio de cada partida y el Robot oponente.

Descripción

Existen una serie de reglas básicas y otras específicas. Las reglas básicas en relación al robot son:

  • El robot debe caber completamente en un cubo de 0.3m x 0.3m x 0.3m.
  • El robot no debe tener ningún tipo de material como cola, aceite o cualquier otro que dañe la arena, o impida a su oponente realizar su trabajo.
  • El robot no debe tener ningún objeto punzante que dañe la integridad del otro robot.
  • El robot del oponente se considera un obstáculo móvil, y como obstáculo es obligatorio evadirlo.
  • Solo se permite el uso de un solo robot por partida, no es permitido remplazarlo por otro en la misma partida.
  • El sistema de movimiento, sensores y CPU pueden ser libremente seleccionados por los participantes.
  • La estructura mecánica, los componentes electrónicos y eléctricos del robot serán los mismos desde el inicio hasta el final de la partida. No se permite la adición de ningún componente mecánico, electrónico o eléctrico durante la partida.

Autonomía

Cada partida en esta competencia de robótica se realiza usando robots autónomos, lo que significa:

  • El robot en su estado “Activo” realiza la tarea sin ninguna influencia o ayuda humana.
  • No se permite la presencia de aparatos eléctricos o electrónicos o de control remoto en la zona de competición.
  • El robot posee su propia energía para poder operar en la arena, no se permite ningún tipo de alimentación externa al robot.
  • El algoritmo usado para la partida debe estar grabado en el robot. Y este algoritmo es el único encargado de censar, calcular y actuar en el ambiente para completar la misión.

Cargamento

  • El único cargamento que debe llevar el robot son las pelotas que recoja en la arena.
  • Las pelotas recogidas de la arena permanecen dentro del robot.
  • Si alguna pelota se cae por alguna razón, no cuenta para el equipo dueño del robot.
  • Al terminar la partida, las pelotas que suman puntos son aquellas dentro de cada robot en el momento de terminar los 3 minutos y 30 segundos.

Estados

  • Al inicio de la partida, cuando el robot se encuentra en la zona de arranque el robot está en estado “Inactivo”.
  • Al iniciar la partida y al estar fuera de la zona de arranque, el robot se encuentra en estado “Activo”.
  • En el momento que algún miembro del equipo toque el robot, éste cambia su estado a “Inactivo” y debe ser ubicado de nuevo en la zona de arranque con una orientación hacia la zona de arranque del otro oponente.

Construcción del robot

Instalando Raspbian en Raspberrypi3.

Raspbian es un sistema operativo basado en GNU/Linux el cual ha sido compilado para arquitecturas ARM es mantenido por una de las comunidades mas fuertes "Debian el Sistema Operativo Universal".

desde la pagina principal, podemos ver las versiones actuales disponibles
Raspbian escoger la versión mas reciente del sistema.

Para nuestro ambiente de trabajo, tenemos Deepin GNU/Linux Basado en Debian instalado sobre la Laptop 13Z940.
Descargamos el Sistema Operativo
# wget https://downloads.raspberrypi.org/raspbian_lite_latest

Descomprimimos el archivo que ha sido descargado previamente como zip.
# unzip 2017-04-10-raspbian-jessie.zip

Confirmamos que se ha desempaquetado correctamente el archivo de imagen sobre el directorio actual
# ls -lh | grep raspbian

-rw-r--r-- 1 heberth heberth 1,3G abr 10 10:58 2017-04-10-raspbian-jessie-lite.img

Montando el Sistema Operativo

Asumimos que tenemos una MicroSD que ha sido formateada con anterioridad en el formato FAT32, si no se tiene es necesario hacerlo para poder continuar

Conectamos la MicroSD físicamente a nuestro Computador
Confirmamos que la MicroSD ha sido reconocida como dispositivo y ha sido montada sobre el Sistema Operativo
# dmesg
[19074.892402] mmc0: new high speed SDHC card at address 0001 [19074.892787] mmcblk0: mmc0:0001 7.50 GiB [19074.894089] mmcblk0: p1

Confirmamos el dispositivo sobre el cual se ha montado la MicroSD sobre el Sistema Operativo
# df -h
/dev/mmcblk0p1 7,5G 4,0K 7,5G 1% /media/heberth/MEM

El dispositivo ha sido montado sobre la unidad /dev/mmcblk0p1 el cual no es la primera partición del dispositivo, es una partición que se crea como secundaria al instante en el que se ha formateado la MicroSD, cuando se monta la memoria y se corre el comando dmesg este me indica cual es la primera partición que hace referencia al dispositivo, el cual sera la partición sobre la cual montaremos el Sistema Operativo.
confirmamos la existencia de la partición primaria.
ls -l /dev/mmcblk0

brw-rw---- 1 root disk 179, 0 abr 26 12:19 /dev/mmcblk0

Desmontamos la partición que ha sido montada sobre el sistema operativo
sudo umount /dev/mmcblk0p1

Accedemos al directorio sobre el cual descargamos y descomprimimos la Imagen del Sistema Operativo.
# cd Descargas/

Montamos La imagen descargada con anterioridad sobre la partición principal de la memoria
# sudo dd bs=4M if=2017-04-10-raspbian-jessie-lite.img of=/dev/mmcblk0 && sync

309+1 registros leídos

309+1 registros escritos

1297862656 bytes (1,3 GB, 1,2 GiB) copied, 249,949 s, 5,2 MB/s

real 4m9.958s

user 0m0.008s

sys 0m1.516s

Extraemos la MicroSD de nuestro Computador, la conectamos a la raspberry a un monitor vía HDMI y confirmamos que el Sistema Operativo arranca adecuadamente.

Configurando la distribución de teclado

Al momento de ingresar al sistema, normalmente la distribución de teclado no es la adecuada, en nuestro caso la distribución que debemos de configurar es español "es"

editamos el archivo de configuración /etc/default/keyboard y agregamos el tipo de teclado
# sudo nano /etc/default/keyboard

buscamos la linea XKBLAYOUT="gb" y cambiamos lo que esta dentro de "" por nuestra distribución de teclado "es", guardamos y reiniciamos el sistema.

Conectando la Pi a una red Wi-Fi

Como el Sistema Operativo que hemos seleccionado para la raspberry no tiene administración gráfica, todas las configuraciones que realicemos sobre esta, serán en modo CLI, es necesario tener unos conocimientos básicos de Sistemas Operativos Basados en Kernels Linux y tener un poco de manejo de BASH para zambullirnos sobre nuestro Sistema.

Accedemos al sistema vía Clic, Buscamos las redes Inalámbricas disponibles cercanas al dispositivo
# sudo iwlist wlan0 scan

Identificamos la red inalámbrica a la cual nos vamos a conectar, para esta prueba nos conectaremos a la siguiente red:
ESSID: "MiWifi"

Password: "MiPass"

Seguridad: WPA2 Version

editamos el archivo de configuración el cual se encarga de asociar el sistema a una red Wi-Fi conocida cuando este se inicia.
# sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

agregamos las lineas de configuración para la red que vamos a asociar a nuestra raspberry y guardamos el archivo.
network={

ssid="MiWifi"

psk="MiPass"

priority=1

id_str="Home"

}

reiniciamos la raspberry, una vez reiniciada confirmamos que se haya conectado a la red Wi-Fi y que el servidor DHCP de la red haya asignado una dirección IP valida para el rango de la red LAN
# sudo ifconfig

Direc. inet:192.168.2.124 Difus.:192.168.2.255 Másc:255.255.255.0

Actualizando Raspbian...

una vez realizada la configuración de la red Wi-Fi podremos actualizar la cache de repositorios y confirmar si existen actualizaciones disponibles sobre el dispositivo.

Actualizamos cache de repositorios
# sudo apt-get update

Actualizamos el Sistema Operativo Completo
# sudo apt-get dist-upgrade

Habilitando conexiones Remotas Via SSH.

El protocolo SSH, es utilizado para comunicaciones remotas seguras, este software puede instalarse fácilmente con un comando, pero en este caso no lo vamos a instalar, ya que viene instalado por defecto sobre la versión de Raspbian que hemos instalado con anterioridad.

Subimos el servicio ssh al inicio del sistema.
# sudo systemctl enable ssh.service

Reiniciamos la raspberry pi, confirmamos que el servicio ssh se haya levantado al inicio del sistema
# sudo systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
Active: active (running) since Wed 2017-04-26 22:35:54 UTC; 1min 42s ago
Main PID: 696 (sshd)
CGroup: /system.slice/ssh.service
├─696 /usr/sbin/sshd -D
├─792 sshd: pi [priv]
├─798 sshd: pi@pts/0
├─800 -bash
├─837 sudo systemctl status ssh.service
└─841 systemctl status ssh.service

Confirmamos el puerto que se ha abierto con la conexión sobre el dispositivo y validamos que en realidad sea el puerto de nuestro servicio ssh.
# netstat -nta

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

tcp6 0 0 :::22 :::* LISTEN

nos conectamos a la IP remota sobre el servicio de ssh desde nuestro computador de pruebas via SSH.
# ssh pi@192.168.2.124

Para desarrolladores: Instalar Control de versiones

Para el control de versiones de software y como herramientas base, estamos implementando Git con GitHub para publicar todo nuestro proyecto, Vi/nano como herramientas editoras de texto ya que estos vienen instalados en nuestro sistema Raspbian, solo intalaramos la herramienta para el control de versiones
# sudo apt-get install git

Configuramos un nombre de usuario y un correo para git sobre la maquina
# git config user.name heberth

# git config user.email heberthardila@gmail.com

Generamos la llave publica SSH para poder subir el repositorio a GitHub
# ssh-keygen

Copiamos la llave publica al servidor GitHub
este comando nos mostrara el contenido de la llave, es necesario copiar ese contenido sobre las llaves permitidas en la herramienta GitHub en el proyecto que se esta realizando
# cat .ssh/id_rsa.pub

Confirmamos que el servidor de GitHub se pueda alcanzar y la conexión sea correcta con nuestra llave publica
# ssh git@github.com

The authenticity of host 'github.com (192.30.253.113)' can't be established.

RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.

PTY allocation request failed on channel 0

Hi UavLabsColombia! You've successfully authenticated, but GitHub does not provide shell access.

Connection to github.com closed.

Le indicamos a Git cual va a ser nuestro repositorio remoto en el cual subiremos todo nuestro proyecto
# git remote add origin git@github.com:UavLabsColombia/pibotballs.git

Confirmamos que podamos subir el proyecto
git push -f -u origin master

Si se desea colaborar con el desarrollo, es necesario hacer un Fork del proyecto y solicitar los Pull a UAVLabs, Recomendamos el uso de la herramienta GitKraken como Frontend para el control de versiones por si no se quiere usar git directamente

Instalando librería de python para el control del puerto GPIO.

sobre esta versión de raspbian, ya vienen pre instaladas las librerías escritas en python para el control del puerto GPIO, pero vamos a mostrar como es el proceso de instalación de estas por si no se encuentran instaladas.
# sudo apt-get install python-rpi.gpio

Confirmamos la correcta instalación de la librería importando desde la CLI de python el modulo correspondiente para el control del puerto GPIO.
accedemos a la clic
# python

Python 2.7.9 (default, Sep 17 2016, 20:26:04)

[GCC 4.9.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

Importamos la libreria
>>>import RPi.GPIO as GPIO

Instalando SImpleCV

SImpleCV es una libreria implementada en python, el cual podemos utilizar para trabajar con Vision Artificial o mas llamada Vision por Computador

Instalamos dependencias para la instalacion de la libreria
# sudo apt-get install ipython python-opencv python-scipy python-numpy python-setuptools python-pip python-pygame
Instalamos el siguiente paquete antes de instalar la libreria principal.
# sudo pip install svgwrite

Instalamos la ultima version disponible de SimpleCV directamente con el comando pip
# sudo pip install https://github.com/sightmachine/SimpleCV/zipball/master

Confirmamos que la instalacion es correcta ingresando a la CLI de python y importando la libreria SimpleCV
# python

Python 2.7.9 (default, Sep 17 2016, 20:26:04)

[GCC 4.9.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

Importamos la libreria
>>> import SimpleCV

Si la Instalación ha sido correcta hasta este punto, podremos empezar a usar las librerías ya escritas.

Construcción Física del robot

Para la versión 0.1 Construida del robot, utilizamos elementos como Madera Triple, Herramientas para cortes y Pegamento para madera.
Se construye un cajo de 30CMX30CM en ejes "X" y "Y" 22CM en "Z"





Para ver la galería de fotografías tomadas durante el proceso, se puede acceder al siguiente directorio en "Google Drive"
https://drive.google.com/drive/folders/0B4DiZMqdnqCDYTM0ZXJHdUk2alU

Lógica de movimiento y actuadores

Se implementa un pequeño diagrama de flujo el cual nos provee una visión rápida del funcionamiento total del sistema, como podemos evidenciar es un código que siempre estará corriendo sobre la maquina y censando su lógica.

Cargando el código sobre el Hardware

Una vez construido el robot, ensamblado y probado uno a uno los sensores y toda la electrónica, estamos disponibles para poder realizar pruebas.

Sobre el repositorio Github se encuentran referenciados uno a uno los archivos utilizados para probar el funcionamiento de la electronica.
https://github.com/UavLabsColombia/pibotballs/tree/master/src/TestingFiles

Para cargar el software principal es necesario descargar y correr el siguiente archivo.
https://github.com/UavLabsColombia/pibotballs/blob/master/src/proyectoLineal/PibotBalls.py

Ejecutamos el codigo sobre raspberry pi
# python PibotBalls.py

Código
Publicamos el código fuente de todo el proyecto sobre nuestro repositorio principal
https://github.com/UavLabsColombia/pibotballs

Referencias: