Con este proyecto busco construir y programar un pequeño carro robot de propósito general que sirva de base para futuros experimentos. La intención es que tenga la suficiente capacidad de movilidad y tracción como para funcionar de manera autónoma en una variedad de terrenos, así como la capacidad de incorporar nuevos sensores que le permitan incorporar la detección de obstáculos, visión artificial, etc.
Un subsistema importante en la construcción de robot son los sistemas de dirección. En principio nos deben permitir controlar el giro del robot con un solo motor. Para nuestro pequeño modelo utilice un sistema modificado basado en el “Compact pendular steered suspension” que utiliza engranajes de palanca y sin amortiguación (dado que aun no tengo amortiguadores). Aquí podemos ver una demostración en video del funcionamiento de este sistema:
Con respecto al sistema de tracción, podría haber utilizado dos motores, como lo hace muchos modelos parecidos a este, pero he preferido restringir el uso de los motores para poder disponer de ellos en otros experimentos, de hecho, uno de los posibles usos de este modelo sera llevar consigo un brazo robot. Una de las cosas a tomar en cuenta cuando utilizamos un solo motor en el sistema de tracción de nuestro vehículos, es que cuando el mismo gira, las ruedas traseras derecha e izquierda llevan velocidades diferentes. Eso podría ocasionar el rompimiento del eje o de alguno de los engranajes. Para evitar esto utilizamos un diferencial.
A continuación podemos ver los sistemas de dirección y de tracción funcionando en un breve vídeo de pruebas:
Algunos de los inconvenientes del sistema NXT son su capacidad de procesamiento y que no trabaja con números punto flotante, al menos al utilizar el firmware original. Esto es especialmente malo si queremos experimentar con redes neuronales o procesamiento digital de imágenes en visión artificial para el control de nuestro robot. Una manera se superar estos problemas es controlar el robot desde un computador y es así precisamente como funciona el nxt-python. Los programas hechos con esta librería corren en el computador y no en el NXT, por tanto aprovechan todas las capacidades de nuestro PC, pero además pueden leer el valor de los sensores así como activar los motores. Aquí podemos revisar algunas referencias sobre el nxt-python:
Para nuestro primer programa con nxt-python hice un sistema de control, por teclado, desde el computador. Dado que las operaciones estándar de entrada por teclado en el python requieren presionar la tecla Enter, me apoyo en la librería console_io para poder accionar las funciones del robot instantáneamente al presionar ciertas teclas. La operaciones implementadas son Cruce a la derecha (“k”) y a la izquierda (“h”), avanzar (“j”) y retroceder (“m”). Para detener se puede utilizar la tecla ESC o “s” y el “espacio” para mostrar el menú de nuevo:
#!/usr/bin/env python
import nxt.locator
from nxt.motor import *
import consola_io
def menu():
print """
Menu de opciones
\----------------
1.- Derecha k
2.- Izquierda h
3.- Avanzar j
4.- Retroceder m
SP.- Mostrar menu
ESC.- Terminar s
"""
def derecha(b):
= Motor(b, PORT_B)
motor_direccion if Direc[0] - Direc[1] >= -180:
0] = Direc[0] - Direc[1]
Direc[-80, Direc[1])
motor_direccion.turn(print "Derecha", Direc[0]
def izquierda(b):
= Motor(b, PORT_B)
motor_direccion if Direc[0] + Direc[1] <= 180:
0] = Direc[0] + Direc[1]
Direc[80, Direc[1])
motor_direccion.turn(print "Izquierda", Direc[0]
def avanzar(b):
= Motor(b, PORT_C)
motor_traccion if Trac[0] + Trac[1] <= 100:
0] = Trac[0] + Trac[1]
Trac[if Trac[0] != 0:
0])
motor_traccion.run(Trac[else:
motor_traccion.idle()print "Avanzar", Trac[0]
def retroceder(b):
= Motor(b, PORT_C)
motor_traccion if Trac[0] - Trac[1] >= 0:
0] = Trac[0] - Trac[1]
Trac[if Trac[0] != 0:
0])
motor_traccion.run(Trac[else:
motor_traccion.idle()
print "Retroceder", Trac[0]
def detener(b):
= Motor(b, PORT_C)
motor_traccion 0] = 0
Trac[
motor_traccion.idle()print "Detener", Trac
#---------------------
#- Comienzo programa
#---------------------
# thread.start_new_thread(thread_direction,("Thread No:1",2))
# thread.start_new_thread(thread_traction,("Thread No:1",2))
= [0, 60]
Direc = [0, 50]
Trac = nxt.locator.find_one_brick()
b #-- Sacar menu
menu()#-- bucle principal
while 1:
#-- Leer tecla
= consola_io.getkey()
c #-- Procesar tecla
if c=='k':
derecha(b)elif c=='h':
izquierda(b)elif c=='j':
avanzar(b)elif c=='m':
retroceder(b)elif c=='n':
retroceder(b)elif c==' ':
detener(b)
menu()elif c=='s':
detener(b)break #-- Salir del bucle
#-- Terminar
print "-- FIN --"
En teoría la librería nxt-python permite que le computador se conecte con el NXT vía USB o Bluetooth, pero esta segunda opción no me ha funcionado hasta ahora. Aquí les dejo un ejemplo del funcionamiento del programa de control por teclado:
If you see mistakes or want to suggest changes, please create an issue on the source repository.
For attribution, please cite this work as
Sosa (2012, April 8). Blog de José R Sosa: Carro robot de proposito general. Retrieved from https://josersosa.github.io/personalweb/posts/2021-06-13-carro-robot-de-proposito-general/
BibTeX citation
@misc{sosa2012carro, author = {Sosa, José R}, title = {Blog de José R Sosa: Carro robot de proposito general}, url = {https://josersosa.github.io/personalweb/posts/2021-06-13-carro-robot-de-proposito-general/}, year = {2012} }