Microcontrolador / CPU para trigonometria rápida em robô?


15

Isso se refere ao hardware que pesa pouco, porque um robô ambulante (do tamanho de um gato gordo, 6 pernas com 3 DOF) deve carregá-lo. Por causa disso, será necessário fazer muita trigonometria (usando matemática matricial ou não, ainda não tenho certeza) e é daí que vem a pergunta.

PIC, Arduino ou AVR barato não são rápidos o suficiente para calcular tudo 100 / segundo e manter em mente coisas como inércia e prevenção de obstáculos, ou mesmo caminhos / andamentos de força bruta.

  • O plano A é levar o cérebro ao robô. Seja microprocessador, micro ITX, nettop ou outro; o que é um hardware eficiente para fazer trigonometria / matemática matricial rapidamente?

    Pesquisei on-line e esperava descobrir sobre os microcontroladores AVR, x86 ou ARM especializados nisso, mas sem sorte lá.

  • O plano B é ter uma máquina x86 conectada via Wi-Fi para fazer o trabalho pesado. Ótimo para prototipagem também, mas eu gostaria que isso migrasse para o plano A, eventualmente, quando o hardware miniaturizar. Mas, mesmo assim, qual CPU de desktop pode fazer a trigonometria mais rapidamente?

  • O plano C é distribuir a carga e ter um microcontrolador / núcleo de baixo consumo de energia para cada perna, embora essa não seja a melhor solução por muitas razões, eu gosto da capacidade de extensão dela.

Ainda não decidi o idioma e / ou a biblioteca usada, mas prefiro Pascal e C ++.

(sugestões de tags mais adequadas são bem-vindas, sou novo aqui)


11
matemática de ponto flutuante não é uma obrigação. Você sempre pode criar tabelas senoidais (ou qualquer outra função), colocá-las no flash de um AVR e interpolar entre os valores com cálculos de pontos fixos. Isso pode ser rápido o suficiente para suas necessidades.
Christoph

3
Em vez de perder a matemática pesada em tempo real, uma solução comum é pré-calcular tabelas de valores e procurar a resposta. A idéia de distribuir o trabalho entre várias CPUs também é boa, por exemplo, uma poderosa CPU mestre e, em seguida, um processador por perna.
você

2
Você também pode fazer essa pergunta no site Robotics Stackexchange .
precisa

1
O plano B fará o cálculo com muita rapidez, mas a comunicação via WiFi provavelmente matará o ganho de desempenho. Você considerou usar um telefone Android conectado via usb? É muito mais poder de computação sem lag de wifi
Stefan

1
Uma placa STM32F4 com unidade de ponto flutuante parece ser suficiente para sua aplicação. Possui 128k SRAM com 64k CCM. Pode ser executado em 168MHz. Uma multiplicação de ponto flutuante de 32 bits leva apenas 1 ciclo da CPU. #
Richieqianle

Respostas:


16

Não parece que seu aplicativo seja realmente tudo isso intensivo em computação. Um dsPIC, por exemplo, pode executar instruções de 400 k para cada uma de suas iterações. Isso é muito. No entanto, será útil ter boa capacidade de E / S de baixo nível, geradores de PWM, temporizadores e similares.

Seno e cosseno não são realmente tão difíceis de fazer em uma máquina inteira como um dsPIC. Eu já fiz isso algumas vezes. O truque é escolher a representação correta para os ângulos. Os radianos podem ser bons do ponto de vista teórico, mas são inconvenientes em termos computacionais. Degress é artificial e simplesmente bobo. Use o intervalo completo de qualquer número inteiro do tamanho da máquina para representar uma rotação completa. Por exemplo, em um dsPIC, que é um processador de 16 bits, uma rotação completa tem 65536 contagens, o que é muito mais precisão e resolução do que você precisa para controlar um robô ou que pode ser medido de qualquer maneira.

Uma vantagem dessa representação é que todo o acondicionamento acontece automaticamente apenas devido ao modo como as entradas e subtraições inteiras não assinadas funcionam. Outra vantagem significativa é que essa representação se presta particularmente bem ao uso de tabelas de pesquisa para seno e cosseno. Você só precisa armazenar 1/4 de ciclo. Os dois bits superiores do ângulo informam em que quadrante você está, que informa se deve indexar na tabela para frente ou para trás e se deve negar o resultado ou não. Os próximos N bits inferiores são usados ​​para indexar na tabela, com a tabela com 2 N segmentos (2 N +1 pontos). Observe que a indexação na tabela para trás está apenas complementando os bits de índice da tabela.

Você pode dar à mesa pontos suficientes para que escolher a resposta mais próxima seja boa o suficiente. Por exemplo, se a tabela tiver 1024 segmentos, o seno e o cosseno serão computados no 1/4096 mais próximo de um círculo. Isso será suficiente para controlar um robô. Se você quiser mais precisão, poderá aumentar a tabela ou usar os bits inferiores restantes do ângulo para interpolar linearmente entre as entradas adjacentes da tabela.

De qualquer forma, o ponto é que parece que seus requisitos para este processador não correspondem ao problema declarado. Eu provavelmente usaria um dsPIC33F. É certamente pequeno, leve e muito mais eficiente em termos de energia do que um processo de computação de uso geral como um x86 em um computador de placa única.


Eu sempre tive a impressão de que um PIC era lento, mesmo para a cinemática inversa, mas talvez eu precise reconsiderar. É possível fazer cinemática inversa para 6 pernas de 3DOF pelo menos 100 / segundo? Isso é cinemática inversa de 6x3x100 apenas para obter os movimentos das pernas ao vivo. De qualquer forma, eu preciso que a cinemática inversa aconteça na mesma plataforma que o algoritmo é executado, para que eu não precise reimplementar essas partes duas vezes. O algoritmo seria mais exigente e certamente não será capaz de rodar em uma placa PIC ou Arduino-isch.
Barry Staes

9

Você vai lidar com muitos sinais de entrada. Você não precisa necessariamente de uma CPU com alto rendimento; muitos sinais podem ser processados ​​em paralelo. Este é o território típico do DSP. Obviamente, você também deseja a funcionalidade geral da CPU. Isso não é problema. Existem muitas CPUs com DSP's integrados.

Um design de chip típico para essas aplicações é um Cortex-M4. Isso vem com um DSP integrado e as versões -M4F também possuem uma FPU. Isso pode não ser necessário, a trigonometria pode ser feita facilmente em matemática de ponto fixo.


A matemática matricial teria uma vantagem no Cortex-M4F? (no caso eu aventurar lá, prototipagem)
Barry Staes

3
Só para ser um pouco pedante - O núcleo do processador Cortex-M4 não possui um DSP integrado, ele possui um grau de capacidade de DSP incorporado ao seu núcleo principal do processador. As extensões DSP são a adição de instruções de multiplicação / acumulação que facilitam funções típicas de DSP, como filtragem e transformações.
uɐɪ

6

Algumas observações:

  1. Você não precisa processar as operações de trigonometria na mesma CPU que executa a prevenção de obstáculos. Você pode dividir as tarefas entre dois microcontroladores e usar um protocolo de comunicação para fazê-los falar.

  2. Para um experimento, implementei um AHRS algoritmo com um filtro Kalman em um microcontrolador ARM Cortex M0 (era um STM32, não lembro exatamente o resto, mas acho que era 32 MHz) e, usando matemática de ponto fixo, eu poderia executar em cerca de 40 amostras / segundo. Com um controlador mais rápido, você poderá carregá-lo facilmente e, é claro, pode tentar o modo FPGA ou DSP.

  3. Eu diria que o controle das pernas não requer muita CPU e você pode controlar todas as pernas juntas, talvez separadamente das operações de trigonometria e prevenção de obstáculos (consulte 1)


Servos são controlados em série via controlador ou barramento dynamixel, então isso já é basicamente carregado. O problema é que o software precisa fazer cálculos cinemáticos muito mais inversos do que o necessário para a pose / marcha ao vivo.
Barry Staes

5

A trigonometria é complicada, mas existem atalhos. Se você tem pouco poder de processamento, considere o algoritmo CORDIC.

É basicamente uma tabela de valores para [por exemplo] seno. Os ângulos podem estar em graus, radianos, o que você quiser. O ponto é que o SINE desses valores é 1/2 (0,5), 1/4 (0,25), 1/8, 1/16 ..... para qualquer fração de grau que seu robô possa usar.

Insira seu ângulo, subtraia o primeiro valor da tabela, defina seu resultado como primeiro resultado (0,5). Se, ao subtrair, seu ângulo ficou negativo, adicione o próximo valor (e subtraia 0,25). Caso contrário, continue subtraindo os ângulos e adicionando resultados.

Quando você chega ao final da tabela, tudo o que você fez foi adicionar e subtrair, mas você está muito perto. Há um "fator de violino" final para multiplicar.

A precisão [e a velocidade] do resultado depende do tamanho [e da resolução] da tabela de pesquisa.


O CORDIC parece bom, mas eu o usarei apenas se tornar o robô mais rápido (isso é um requisito).
Barry Staes

3

Você pode considerar o uso de uma placa Raspberry Pi que execute um sistema GNU / Linux de uso geral. O Raspberry Pi possui vários pinos GPIO que podem ser usados ​​para conectar servos de robôs ou placas de extensão.

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

O modelo A Raspberry Pi pode executar até 24 GFLOPs de computação de ponto flutuante de uso geral usando sua GPU usando o OpenGL ES 2, mantendo-se abaixo do orçamento de energia de 2,5W.

http://elinux.org/RPi_Hardware

Exemplo: uma configuração de robô alimentada por bateria implementada usando o Raspberry Pi.

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

Exemplo 2: um robô de 6 patas controlado por um raspberry pi:

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

Exemplo 3: um robô de pêndulo invertido de 2 rodas e auto balanceado controlado por um raspberry pi:

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


2

Para robôs de pernas, você pode criar algumas seqüências de movimento de pernas predefinidas e "reproduzi-las". É possível evitar obstáculos em tempo real com uma fuzzy logicimplementação leve, onde tudo está novamente em formato de tabela e tudo o que você precisa fazer é escolher o valor certo e usá-lo paradefuzzyfication processo.

Tudo pode ser feito em C em um processador de alguma forma mais rápido ARM7. Eu tentei AVRe falhei, depois de gastar muito tempo transformando tudo em fixed point arithmetics.


Jogando animações de marcha é exatamente o que eu não quero. O algoritmo que eu quero implementar descobre o que fazer com as pernas por conta própria, e é por isso que preciso de trigonometria rápida. Eu não tinha que deixar isso claro na minha pergunta. E vendo que muitos concordam com isso, seria um desperdício editar a pergunta. Vou perguntar e ser mais específico, no devido tempo.
Barry Staes

Nesse caso, eu iria para o sistema de servo-perna. Cada perna tem seu próprio controlador. Abordagem baseada em agente.
Gossamer 14/03

1

A plataforma Texas Instruments Stellaris possui uma unidade de ponto flutuante a bordo por padrão. Não tenho certeza se o controlador ARM com clock de 80MHz é rápido o suficiente para o seu aplicativo, mas uma placa de desenvolvimento do LaunchPad é bem barata: http://www.ti.com/ww/en/launchpad/stellaris_head.html

É programável através de USB, cadeias de ferramentas gratuitas estão disponíveis para pelo menos Windows e Linux, medem cerca de 4 × 6 cm e tem mais de 30 pinos GPIO (se contei corretamente).


0

Você pode incorporar a placa da CPU do x86 power pc no seu aplicativo robótico com a ajuda do AVR para controlar as unidades do robô como uma placa de interface. A solução mais rápida e barata do seu problema. Mas sim, você precisa mexer bastante na codificação da arquitetura x86, mas, felizmente, pode entender muita codificação a partir de códigos de SO de código aberto. (Se sua construção mecânica suportar esse peso)


4
"x86" e "power pc" são duas arquiteturas concorrentes totalmente diferentes (e pelo menos em alguns momentos da história).
Chris Stratton
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.