En el impulso por desarrollar sistemas robóticos que puedan sentir e interactuar con su entorno, se han realizado enormes inversiones en visión artificial. Hemos visto los frutos de estas inversiones en una amplia gama de aplicaciones, desde automóviles autónomos hasta la automatización de robots industriales. Si bien estos esfuerzos han tenido mucho éxito, los sensores ópticos no son la solución ideal para todos los casos de uso. Las tareas de manipulación de objetos, por ejemplo, suelen requerir información táctil para manipular con precisión y seguridad los objetos de interés. Puede imaginar un enfoque híbrido en el que los métodos de visión por computadora localicen el objeto y dirijan un robot a la posición correcta. A partir de ahí, los sensores táctiles dentro de una mano robótica brindan información sobre la fragilidad o robustez del objeto y ayudan a crear un plan para llevar a cabo las intenciones del robot.
En comparación con la visión por computadora, se ha dedicado mucha menos atención al desarrollo de sensores táctiles, lo que los hace generalmente menos sofisticados que sus contrapartes ópticas. Esto ha dificultado el desarrollo de robots que sean capaces de generar una comprensión de alta resolución de su entorno mediante la integración de datos de múltiples tipos de sensores.
En un esfuerzo por comenzar a abordar las deficiencias en la tecnología de detección táctil actual, un equipo de ingenieros de ETH Zürich ha desarrollado un dispositivo que llaman SmartHand .
SmartHand es un sistema integrado de hardware y software creado para recopilar y procesar información táctil de alta resolución de una matriz de sensores múltiples en forma de mano en tiempo real.
Arquitectura del sistema (📷: X. Wang et al.)
El dispositivo SmartHand utiliza una rejilla sensora táctil resistiva de bajo costo, basada en un compuesto de polímero conductor, que se pega a un guante. Se adjunta una unidad de medición inercial (IMU) en la parte posterior del guante para proporcionar información adicional sobre el movimiento. Los datos de los 1024 sensores táctiles (dispuestos en una cuadrícula de 32 por 32) y la IMU se introducen en una placa de descubrimiento STM32F769NI conectada a la muñeca a través de una serie de cables. Esta placa contiene un núcleo Arm Cortex-M7 que funciona a 216 MHz, con 2 MB de memoria flash y 532 kB de RAM.
Para demostrar SmartHand, los investigadores querían poder detectar qué tipo de objeto sostenía la mano. Para ello, se creó y entrenó una red neuronal convolucional, basada en la arquitectura ResNet-18, para reconocer la relación entre los datos de los sensores y un conjunto de dieciséis objetos cotidianos. Se creó un conjunto de datos usando el dispositivo físico para que sirviera como datos de entrenamiento para el modelo. Recopilando mediciones a 100 cuadros por segundo (13,7 veces más rápido que el trabajo anterior), se generó un conjunto de datos táctiles que consta de 340.000 cuadros.
La red de sensores (📷: X. Wang et al.)
Al validar la red neuronal, se encontró que el modelo requiere un orden de magnitud menos de memoria y 15,6 veces menos cálculos, en comparación con los dispositivos actuales. Esto se logró manteniendo la red neuronal lo más compacta posible, sin sacrificar la precisión de las predicciones. Hablando de predicciones, se encontró que la precisión de clasificación top 1 del modelo alcanzó el 98,86% en el reconocimiento de objetos. Al mantener el procesamiento en el límite, el tiempo de inferencia se mantuvo en unos muy razonables 100 milisegundos.
Se observó que, debido a las propiedades inherentes de los materiales que componen la rejilla del sensor táctil, habrá cierto nivel de degradación con el uso repetido. Los primeros indicios sugieren que la degradación puede estabilizarse, lo que permitiría recalibrar el diseño actual después de un período de rodaje inicial sin ningún otro cambio. Actualmente están evaluando si este es el caso, o si la degradación del sensor continúa más allá de la meseta aparente, lo que requeriría más cambios de diseño antes de que sea posible el uso del dispositivo en el mundo real.
El equipo prevé que las técnicas de SmartHand se utilicen en futuras aplicaciones robóticas y protésicas de manos. Con un poco más de esfuerzo, este trabajo puede acercarnos a un mundo en el que los robots no parecen tan robóticos.
Tercera Mano Robótica es un kit de fuente abierta cuyas piezas se pueden imprimir en una impresora 3D y que se puede usar en el antebrazo utilizando un Trinket Pro como cerebro
Trinket es una versión reducida de un Arduino con un ATmega328 y de coste reducido, pero obviamente puede usarse cualquier placa que sea compatible con Arduino
Cuando se le solicite, puede entregarle una herramienta que tenga, liberándolo de buscarlo o perderlo todo ello pulsando un único pulsador que Tim (su creador) ha colocado estratégicamente en un dedo gracias a una pieza similar a un anillo impresa también en 3d
En realidad son pocos componentes los usados en este proyecto:
1x9g servo hobby barato
Trinket Pro 5V
Cargador de batería de litio de celda única (3.7V) alimentado a 5V
Batería de 300mAH celda única LiPO
imanes – 5/16 «de diámetro, 1.8» de espesor
13 × 2-56 tornillos
1 × piezas impresas en 3D
Banda de cintura elástica ancha 1 × 1 «
Después de reunir todos los elementos en la lista de componentes e imprimir sus piezas, ¡es hora de comenzar el ensamblaje y conectarlo todo!
Aquí está el diagrama de conexión:
Es bastante simple pues se limita a conectar la placa a un servo controlado por el puerto digital nº8 y que ira alimentando a la salida del cargador a 5v DC y un pulsador que conectaremos al pin 3 y masa .
El resto es simplemente la parte de carga de la batería que se conectará por un lado a la batería y por otro lado tanto al servo como a la placa de control .
Puesto que la alimentación es suministrada por la batería se recomienda colocar un interruptor en la batería para impedir su descarga cuando no se esta usando.
Aquí está el código para hacer su movimiento robótico de tercera mano:
// ThirdHand test script
// by Tim Giles <www.wildcircuits.com>
//servo is on Pin8
//button is on Pin3 and has the pullup enabled
#include
Servo ServoA;
int Angle = 10;
int AngleClosed = 10;
int AngleOpen = 120;
void setup()
{
ServoA.attach(8);
pinMode(3,INPUT_PULLUP);
}
void loop()
{
//update the servo position
ServoA.write(Angle);
delay(1);
//check if the button is pushed
if (digitalRead(3) == 0)
{
//debounce
while (digitalRead(3) == 0){
delay(1);
}
//set the servo to it's open position
Angle = AngleOpen;
ServoA.write(Angle);
//hold the servo in this position to give the user time
//to grab the screwdriver
delay(2000);
//set the servo to it's closed position
Angle = AngleClosed;
ServoA.write(Angle);
}
}
Durante la programación se recomienda desconectar la batería pues de lo contrario, el suministro de refuerzo de 5 V volverá a alimentar su ordenador y puede generar efectos negativos
Si su cable USB que está programando es demasiado largo / demasiado débil, es posible que tenga un comportamiento extraño cuando termine la programación y el servo intente moverse:esto se debe a una caída de voltaje excesiva en el cable USB que hace que el Trinket Pro se reinicie cuando el servo intenta moverse.
PIEZAS IMPRESAS EN 3D
La base , el bazo articulado así como el anillo para el pulsador se han realizado impresas en 3D
Mientras ensambla las piezas impresas en 3D, notará que todos los orificios de los tornillos son ligeramente más pequeños o de mayor tamaño.
Los tornillos 2-56 se ensartarán automáticamente en los orificios de menor tamaño y girarán libremente en los orificios de mayor tamaño, lo cual permite que el tornillo sujete firmemente la bandeja del destornillador mientras que el brazo que acciona la bandeja del destornillador se puede mover libremente.Si sus piezas no van juntas así, entonces necesitará ajustar su impresora o ajustar el tamaño de los orificios de los tornillos.
Puede parecer una banalidad , pero la idea detrás de este prototipo es muy interesante ya que puede suponer una ayuda importante a la movilidad, pues esta assietncia puede ser especialmente importante para los ancianos y otras personas que necesitan este tipo de ayuda en la vida cotidiana.
El sistema que sugieren sus creadores destaca por su simplicidad : una estructura de aluminio para sujetar el brazo, un motor y una placa Arduino con su correspondiente escudo (cuyos detalles, por cierto, han publicado en hackaday.com) ,
Nos explican que en la construcción del exo-brazo buscaban que fuese relativamente barato, sencillo y potente que permitiera un uso fácil del mismo , por lo cual construir su prototipo no deberia costar mas de 100$ , lo cual es un precio bastante razonable ,sobre todo si nos vamos a soluciones que se estan desarrollando la industria.
El desarrollo de este proyecto comenzó centrándose más en el control del brazo y luego en el propio diseño, por lo que tal vez el objetivo número de sus creadores es hacer que el control de ExoArm sea tan barato y tan intuitivo como sea posible.
En el siguiente video podemos verlo en acción:
Como podemos apreciar, hay una estructura articulada de aluminio y precisamente en la articulación esta el motor (en el codo) , aunque sugieren que en otros diseños futuros también proveen implementar un actuador en el hombro( de hecho el shield empleado admite dos motores).
Este exo-brazo tiene tambien apoyo trasero, de modo que todo el peso se distribuye uniformemente a su cuerpo siendo la capacidad de elevación alrededor de 10 kg máximo o 22 libras.
Electrónica
Ademas de la placa Arduino, un componente básico es el driver del motor VNH2SP30 ,el cual es esencialmente una versión en rampa del escudo de motor Ardumoto. Esta placa se presenta como un escudo que se conecta encima de Arduino y es de bajo coste ( unos 6,5€ en Amazon).
Para este Shield se usa un par de drivers de motor de puente completo VNH2SP30. También incluye los circuitos de soporte para que esta placa sea capaz de controlar un par de motores de alta corriente , aunque para esta aplicacion solo se usa uno .
El VIN y el motor son lanzados para terminales de tornillo de 5mm , lo que facilita la conexión de cables de mayor calibre.
Al utilizar este escudo en aplicaciones de alta demanda extrema puede ser necesario mejorar el rendimiento térmico con un disipador de calor o ventilador y soldar los cables directamente a la placa en lugar de usar un terminal de tornillo (tenga en cuenta la alta corriente de este) , aunque cuando se utiliza el escudo en corrientes de hasta 6A los chips apenas llegarán a ser perceptiblemente calientes.
Resumidamente esta son algunas de las características del escudo empleado:
Voltaje: max. 16V
Regimen de corriente: 30A maximo
Corriente permanente: 14 A
Resistencia MOSFET (solo ida): 19 m & OHgr;
Frecuencia PWM: 20 kHz Max.
Tamano placa: 6 * 5,2 * 2cm / 2,4 * 2 * 0,8pulg
Peso : 23 g / 0,8 oz
Una vez resuelto el driver, respecto a Arduino , los pines que se requieren , en la aplicación son los pines siguientes:
Pin 2 como entrada analógica para el encoder solidario al eje del motor para saber la posición de la articulación
Pines 8 como entrada binaria para ordenar subir la articulación via el motor
Pines 9 como entrada binaria para ordenar bajar la articulación vía el motor
Antes de ver el codigo final , es interesante apreciar como el control del motor se hace fijando los pins 3 y 4 a un valor y luego sacando un valor analogico en el pin 5, por ejemplo, parar mover arriba el motor se usa esta función:
Simplemente para parar el moto,r sacamos un valor cero en el pin 5 usan esta otra función:
void stopmove(){ //parar el motor
digitalWrite(3, LOW);
digitalWrite(4, LOW);
analogWrite(5, 0);
}
Una función muy importante es conocer la posición de la articulación gracias a que hay conectado un potenciómetro solidario al aje de modo que capturando el valor de la salida del potenciómetro podemos conocer el angulo ,gracias al siguiente código:
Por ultimo, en la función loop miramos continuamente los valores binarios de los pines 8 y 9 ,y en función de su estado, llamaremos a alguna de las rutinas anteriores:
void loop() //bucle principal de ejecución { int program_runtime = millis();
int readingUp = digitalRead(8); int readingDown = digitalRead(9);
El procesamiento de control como decíamos se hace con un Arduino, por lo que el código es bastante fácil de entender y modificar cuanto se quiera para mejorarlo o adaptarlo a cada necesidad:
float computePID(int setpoint){ //función de calculo de la posición del encoder
angle = analogRead(2);
angle = map(angle, 0, 344, 0, 90); // dejanski kot Serial.print(angle);
1 × calibrador de tensión con el amplificador de celda de carga
1 × Aluminio 4 x 30 x al menos 2000 mm
1 × Arduino Uno / Nano
1 × controlador de motor VNH2SP30
1 × Motor del limpiador del parabrisas del coche
1 × cables largos
1 × Potenciómetro
1 × Li-Po batería 3S 5500mAh
1 × Tornillos y tuercas. M4 y M6
1 × Cinta adhesiva
1 × Zipties
1 × Correas
1 × Placas de madera
1 × Tubo termorretráctil
En el siguiente vídeo el autor describe mas detalles de construcción de este excelente exo-brazo:
Debe estar conectado para enviar un comentario.