Microcontrolador / CPU para trigonometría rápida en robot?


15

Esto se refiere al hardware que pesa poco, porque un robot ambulante (del tamaño de un gato gordo, 6 patas con 3 DOF) debería llevarlo. Debido a esa caminata, tendrá que hacer mucha trigonometría (usando matemática matricial o no, todavía no estoy seguro) y de aquí viene esta pregunta.

PIC, Arduino o AVR barato no es lo suficientemente rápido como para calcular todo 100 / segundo y tener en cuenta cosas como la inercia y la evitación de obstáculos, o incluso caminos / pasos de fuerza bruta.

  • El plan A es llevar el cerebro al robot. Ya sea microprocesador, micro ITX, nettop u otro; ¿Qué es un hardware eficiente para hacer trigonometría / matemática matricial rápidamente?

    Busqué en línea y esperaba conocer los microcontroladores AVR, x86 o ARM especializados en esto, pero no tuve suerte.

  • El plan B es tener una máquina x86 conectada a través de WiFi para hacer el trabajo pesado. Ideal para la creación de prototipos también, pero me gustaría que esto migre al plan A eventualmente cuando el hardware se miniaturice. Pero incluso entonces, ¿qué CPU de escritorio puede hacer la trigonometría más rápido?

  • El plan C es distribuir la carga y tener un microcontrolador / núcleo eficiente en energía para cada tramo, aunque esa no es la mejor solución por muchas razones, me gusta su capacidad de extensión.

Todavía no he decidido el idioma y / o la biblioteca utilizados, pero prefiero Pascal y C ++.

(sugerencias para etiquetas más adecuadas son bienvenidas, soy nuevo aquí)


11
las matemáticas de coma flotante no son imprescindibles. Siempre puede construir tablas sinusoidales (o cualquier otra función), colocarlas en el flash de un AVR e interpolar entre los valores con cálculos de punto fijo. Esto podría ser lo suficientemente rápido para sus necesidades.
Christoph

3
En lugar de perder las matemáticas pesadas en tiempo real, una solución común es calcular previamente las tablas de valores y luego buscar la respuesta. La idea de distribuir el trabajo entre múltiples CPU también es buena, por ejemplo, una potente CPU maestra y luego un procesador por tramo.
John U

2
También puede considerar hacer este tipo de preguntas en el sitio Robotics Stackexchange .
Rocketmagnet

1
El Plan B hará el cálculo bastante rápido, pero la comunicación a través de WiFi probablemente matará la ganancia de rendimiento. ¿Consideró usar un teléfono Android conectado a través de USB? Es mucho más poder de cómputo sin retraso de wifi
stefan

1
Una placa STM32F4 con unidad de punto flotante parece ser suficiente para su aplicación. Tiene 128k SRAM con 64k CCM. Puede funcionar a 168MHz. Una multiplicación de coma flotante de 32 bits solo toma 1 ciclo de CPU ..
richieqianle

Respuestas:


16

No parece que su aplicación sea realmente tan computacional. Un dsPIC, por ejemplo, puede ejecutar instrucciones de 400 k para cada una de sus iteraciones. Eso es mucho. Sin embargo, será útil tener una buena capacidad de E / S de bajo nivel, generadores PWM, temporizadores y similares.

El seno y el coseno realmente no es tan difícil de hacer en una máquina entera como un dsPIC. Lo he hecho algunas veces yo mismo. El truco es elegir la representación correcta para los ángulos. Los radianes pueden ser agradables desde un punto de vista teórico, pero son inconvenientes computacionalmente. El progreso es artificial y simplemente tonto. Use el rango completo de lo que sea el número entero de su máquina para representar una rotación completa. Por ejemplo, en un dsPIC, que es un procesador de 16 bits, una rotación completa es de 65536 recuentos, que es mucha más precisión y resolución de la que necesita para controlar un robot o que puede medir de todos modos.

Una ventaja de esta representación es que todo el ajuste ocurre automáticamente debido a cómo el entero sin signo suma y resta el trabajo. Otra ventaja importante es que esta representación se presta particularmente bien al uso de tablas de búsqueda para seno y coseno. Solo necesita almacenar 1/4 de ciclo. Los dos bits superiores del ángulo le indican en qué cuadrante se encuentra, lo que le indica si debe indexar en la tabla hacia adelante o hacia atrás, y si negar el resultado o no. Los siguientes N bits inferiores se utilizan para indexar en la tabla, con la tabla que tiene 2 N segmentos (2 N +1 puntos). Tenga en cuenta que la indexación hacia atrás en la tabla solo complementa los bits de índice de la tabla.

Puede darle a la mesa suficientes puntos para que elegir la respuesta más cercana sea lo suficientemente bueno. Por ejemplo, si la tabla tiene 1024 segmentos, el seno y el coseno se calcularán al 1/4096 más cercano de un círculo. Eso será suficiente para controlar un robot. Si desea más precisión, puede hacer que la tabla sea más grande o usar los bits inferiores restantes del ángulo para interpolar linealmente entre las entradas adyacentes de la tabla.

De todos modos, el punto es que parece que sus requisitos para este procesador no coinciden con el problema indicado. Probablemente usaría un dsPIC33F. Ciertamente es pequeño, liviano y mucho más eficiente energéticamente que un proceso informático de propósito general completo como un x86 en una computadora de placa única.


Siempre tuve la impresión de que un PIC era lento incluso para la cinemática inversa, pero podría necesitar reconsiderarlo. ¿Es posible hacer cinemática inversa para 6 piernas de 3DOF al menos 100 / segundo? Es una cinemática inversa de 6x3x100 solo para obtener los movimientos vivos de las piernas. De todos modos, necesito que la cinemática inversa suceda en la misma plataforma que se ejecuta el algoritmo, para no tener que volver a implementar estas partes dos veces. El algoritmo sería más exigente, y ciertamente no podrá ejecutarse en una placa PIC o Arduino-isch.
Barry Staes

9

Vas a lidiar con muchas señales de entrada. No necesariamente necesita una CPU con un alto rendimiento; Se pueden procesar muchas señales en paralelo. Este es el territorio típico de DSP. Por supuesto, también desea la funcionalidad general de la CPU. Esto no es problema Hay muchas CPU con DSP integrados.

Un diseño de chip típico para tales aplicaciones es un Cortex-M4. Esto viene con un DSP integrado, y las versiones -M4F también tienen una FPU. Esto podría no ser necesario, la trigonometría se puede hacer fácilmente en matemáticas de punto fijo.


¿Las matemáticas de matriz tendrían una ventaja sobre el Cortex-M4F? (en caso de aventurarme allí, prototipos)
Barry Staes

3
Solo para ser un poco pedante: el núcleo del procesador Cortex-M4 no tiene un DSP integrado, tiene un grado de capacidad DSP incorporado en su núcleo principal del procesador. Las extensiones DSP son la adición de instrucciones de multiplicación / acumulación que facilitan las funciones DSP típicas, como el filtrado y las transformaciones.
uɐɪ

6

Algunas observaciones:

  1. No necesita procesar las operaciones de trigonometría en la misma CPU que ejecuta la evitación de obstáculos. Puede dividir las tareas entre dos microcontroladores y utilizar un protocolo de comunicación para que hablen.

  2. Para un experimento, implementé un algoritmo AHRS con un filtro Kalman en un microcontrolador ARM Cortex M0 (era un STM32, no recuerdo exactamente el resto, pero creo que era de 32 MHz), y usando matemática de punto fijo podría ejecutar a aproximadamente 40 muestras / segundo. Con un controlador más rápido, debería poder transportarlo fácilmente y, por supuesto, puede probar el modo FPGA o DSP.

  3. Yo diría que el control de las piernas no requiere mucha CPU y puede controlar todas las piernas juntas, tal vez por separado de las operaciones de trigonometría y evitación de obstáculos (ver 1)


Los servos se controlan en serie a través del controlador o el bus dynamixel, por lo que básicamente ya está cargado. El problema es que el software necesita hacer muchos más cálculos de cinemática inversa que los necesarios para la pose / marcha en vivo.
Barry Staes

5

La trigonometría es complicada, pero hay atajos. Si tiene poca potencia de procesamiento, considere el algoritmo CORDIC.

Básicamente es una tabla de valores para [por ejemplo] seno. Los ángulos pueden estar en grados, radianes, lo que quieras. El punto es que el SINE de estos valores es 1/2 (0.5), 1/4 (0.25), 1/8, 1/16 ..... a cualquier fracción de grado que su robot pueda usar.

Ingrese su ángulo, reste el primer valor de la tabla, establezca su resultado en el primer resultado (0.5). Si, al restar, su ángulo se volvió negativo, entonces AGREGUE el siguiente valor (y reste 0.25). De lo contrario, continúe restando ángulos y agregando resultados.

Cuando llegues al final de la tabla, todo lo que has hecho es sumar y restar, pero estás muy cerca. Hay un último "factor de violín" para multiplicar por.

La precisión [y velocidad] del resultado depende del tamaño [y la resolución] de la tabla de búsqueda.


CORDIC se ve bien, pero solo lo usaré si hace que el robot sea más rápido (eso es un requisito).
Barry Staes

3

Puede considerar usar una placa Raspberry Pi que ejecute un sistema GNU / Linux de propósito general. La Raspberry Pi tiene varios pines GPIO que se pueden usar para conectar servos de robot o placas de extensión.

http://www.youtube.com/watch?v=RuYLTudcOaM

El modelo A Raspberry Pi puede hacer hasta 24 GFLOP de cómputo de punto flotante de uso general usando su GPU usando OpenGL ES 2 mientras se mantiene por debajo del presupuesto de potencia de 2.5W.

http://elinux.org/RPi_Hardware

Ejemplo: una configuración de robot con batería implementada con Raspberry Pi.

http://www.homofaciens.de/technics-robots-R3-construction_en_navion.htm

Ejemplo 2: un robot de 6 patas controlado por una frambuesa pi:

http://www.youtube.com/watch?v=Yhv43H5Omfc

Ejemplo 3: un robot de péndulo invertido de 2 ruedas con equilibrio automático controlado por una frambuesa pi:

http://www.youtube.com/watch?v=n-noFwc23y0


2

Para el robot con patas, puede crear algunas secuencias de movimiento de patas predefinidas y "reproducirlas". La evasión de obstáculos en tiempo real se puede hacer con una fuzzy logicimplementación ligera donde todo vuelve a estar en formato de tabla y todo lo que necesita hacer es elegir el valor correcto y usarlo paradefuzzyfication proceso.

Todo se puede hacer en C en un procesador de alguna manera más rápido ARM7. Lo probé AVRy fallé, después de pasar mucho tiempo transformando todo fixed point arithmetics.


Jugar animaciones de marcha es exactamente lo que no quiero. El algoritmo que quiero implementar determina qué hacer con sus patas por sí mismo, y ese algoritmo es la razón por la que necesito una trigonometría rápida. Sin embargo, me faltó aclarar eso en mi pregunta. Y viendo que hay muchas señales sobre esto, sería un desperdicio editar la pregunta. Preguntaré y seré más específico, a su debido tiempo.
Barry Staes

En ese caso, optaría por el sistema de servo pata. Cada pierna tiene su propio controlador. Enfoque basado en el agente.
Gossamer

1

La plataforma Stellaris de Texas Instruments tiene una unidad de coma flotante a bordo por defecto. No estoy seguro de si el controlador ARM con reloj de 80MHz es lo suficientemente rápido para su aplicación, pero una placa de desarrollo LaunchPad es bastante barata: http://www.ti.com/ww/en/launchpad/stellaris_head.html

Es programable a través de USB, las cadenas de herramientas gratuitas están disponibles para al menos Windows y Linux, mide aproximadamente 4 × 6 cm y tiene más de 30 pines GPIO (si contaba correctamente).


0

Puede incrustar la placa de CPU x86 power pc en su aplicación robótica con la ayuda de AVR para controlar las unidades del robot como una tarjeta de interfaz. La solución más rápida y económica de su problema. Pero sí, tiene que codificar mucho la arquitectura x86, pero afortunadamente puede captar gran cantidad de codificación de los códigos de SO de código abierto. (Si su construcción mecánica puede soportar este peso)


44
"x86" y "power pc" son dos arquitecturas competidoras completamente diferentes (y al menos en algunos puntos de la historia).
Chris Stratton
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.