No momento, estamos projetando um robô móvel + braço montado com vários graus de liberdade e sensores controlados.
Estou considerando uma arquitetura em duas partes:
Um conjunto de controladores em tempo real (Raspeberry Pis executando um RTOS como Xenomai ou microcontroladores bare metal) para controlar os motores e codificadores de braço. Vamos chamar essas máquinas de RTx, com x = 1,2,3… dependendo do número de microcontroladores. Esse loop de controle será executado em 200Hz.
Uma poderosa máquina linux de baunilha executando o ROS para calcular SLAM, mocap e executar lógica de alto nível (decida a tarefa do robô e calcule a posição e a velocidade desejadas dos motores). Este loop de controle será executado em 30Hz.
Eu sei que minha estrutura precisa ser escalável para dar conta de mais motores, mais sensores, mais PCs (por exemplo, para mocap externo).
Meu principal problema é decidir como os diferentes RTx se comunicam com o PC1. Examinei artigos relacionados à arquitetura de robôs (por exemplo, HRP2 ), na maioria das vezes eles descrevem a arquitetura de controle de alto nível, mas ainda não encontrei informações sobre como fazer com que o baixo nível se comunique com o alto e de forma escalável. Perdi algo?
Para conectar as máquinas RT rápidas que garantem o controle do motor com o PC1, considerei TCP / IP, CAN e UART:
- TCP / IP: não determinístico, mas fácil de implementar. O não determinismo é um problema real (já que, de qualquer forma, só será usado em baixa velocidade 30Hz)?
- CAN: lento, muito confiável, direcionado para carros (vi alguns exemplos usando CAN com robôs, mas parecia exótico)
- UART: se eu tivesse apenas uma máquina RT para controle do motor, consideraria o UART, mas acho que essa porta não se adapta bem a muitos RTx. O TCP / IP é realmente um não-devido às suas características não determinísticas? É tão fácil de usar…
No momento, nenhuma solução realmente parece óbvia para mim. E como não consigo encontrar um exemplo sério de robô usando uma solução confiável e escalável específica, não me sinto confiante em fazer uma escolha.
Alguém tem uma visão clara sobre esse ponto ou literatura para apontar? Existem soluções de comunicação comuns ou comuns usadas em robôs?
fonte
Respostas:
Eu acho que você deu um bom primeiro passo; você dividiu o problema em uma plataforma móvel (que tem incerteza de posição e precisa navegar) e o braço (que tem uma certa certeza de posição em tempo real, por meio de codificadores).
Na sua descrição, parece que você está tentando vincular cada controlador RTx diretamente ao PC1, que está executando o ROS. O que você perdeu é que o ROS foi projetado para lidar com um grupo de aplicativos que podem produzir e consumir dados em taxas diferentes.
O que seu aplicativo precisa é de uma ponte de comunicações - uma única interface entre o loop de 200Hz e o ambiente ROS. Em outras palavras, em vez de amarrar cada controlador RTX para PC1, amarrar todos os controladores de RTX juntos e conectar que a PC1.
Por exemplo, use um barramento I2C para conectar os sistemas RTx e adicione outro controlador RTx para ser o "Arm Master" (AM). O trabalho do AM seria aceitar comandos recebidos em algum formato e protocolo compatíveis com PC1 e converter esses comandos em mensagens I2C. Em seguida, você escreveria um aplicativo ROS para enviar comandos para o AM.
Outra maneira de fazer isso com o I2C seria colocar um controlador I2C diretamente no PC1 e gravar toda a lógica de controle de braço em um aplicativo ROS. Isso pode parecer uma maneira mais simplificada de atingir seu objetivo, mas pode tornar a depuração mais difícil à medida que você remove a modularidade do sistema - você precisará solucioná-lo como um grande sistema complexo em vez de dois componentes facilmente testáveis.
fonte
Eu diria que qualquer aplicativo em que seja necessário um grande número de nós de comunicação (sensores ou atuadores) se beneficiará da implementação como um barramento do sistema (em contraste com os links ponto a ponto, como UART ou Ethernet), devido à complexidade da cablagem, determinismo e modularidade.
Qualquer sistema de controle requer um alto grau de determinismo, em que os canais de largura de banda alta (como Ethernet) geralmente são ruins (especialmente quando usado com um sistema operacional de uso geral que introduz grandes quantidades de tremulação de agendamento), consulte o link a seguir para uma discussão sobre determinismo de agendamento ) Os processadores de aplicativos (como o ARM11 do Raspberry Pi) também são provavelmente inadequados para sistemas em tempo real (devido a efeitos como latência de interrupção e revestimento de tubos de instruções). Consulte a seguinte discussão do digikey comparando o comportamento em tempo real de um núcleo de aplicativo ARM versus um microcontrolador .
É uma pena que a disponibilidade do CAN integrado não seja tão difundido quanto o UART (RS-485) ou o I2C (ainda), porque acho que realmente simplifica o problema de detecção e atuação distribuídas. E embora os 1 Mbps habituais possam parecer lentos, geralmente é mais do que suficiente depois que as taxas de atualização de todos os membros do barramento são calculadas (e a taxa de transmissão sempre pode ser aumentada, dependendo do comprimento do barramento, impedância e se seus transceptores permitirão). Há também um software de simulação brilhante disponível, que basicamente garante os piores tempos de resposta dos casos (por exemplo, o RealTime no trabalho possui um analisador de barramento CAN gratuito chamado RTaW-Sim). E, finalmente, parece que a disponibilidade de sensores MEMS com CAN integrado é bastante baixa.
Outro exemplo em que os atuadores são configurados como um barramento (ou anel) é a série Dynamixels AX e MX, onde cada motor é encadeado para o próximo por meio de um link UART. Isso simplifica bastante o design do sistema se você tiver uma grande quantidade de atuadores.
Mas, voltando à pergunta real, acho que se você descrever seu sistema como pontos de ajuste em tempo real, em vez de comandos (por exemplo, transmitir continuamente um ângulo do motor do que instruir um comando como ângulo de goto), simplifica o acoplamento entre o loop de 200 Hz e 30 Hz.
fonte
Você parece ter 2 problemas separados (mas relacionados) que você está tentando resolver de uma vez. Vamos dividir seu enigma em pedaços menores:
O item 1 pode ser resolvido no hardware conforme sua pergunta original parece apontar - você pode enfileirar dados a 200Hz e enviar o pacote a 30Hz ao seu sistema de nível superior. Você pode fazer isso com TCP / IP ou, possivelmente, CAN, dependendo da quantidade de dados que deseja enviar. Hardware diferente possui diferentes taxas de dados máximas. Adicionar um nível de arquitetura como o ROS para atuar como ponte / árbitro de comunicação, conforme sugerido em outras postagens, também pode ajudar.
O item 2 é um problema da teoria de controle que não pode ser resolvido apenas com o hardware. O SLAM, as determinações de posição e velocidade e a determinação de tarefas que você deseja precisarão ser mais inteligentes, pois eles enviam e recebem informações com menos frequência. Você provavelmente desejará 2 loops de controle : 1 a 200Hz e 1 a 30Hz.
Existem muitas outras perguntas que abrangem os loops de controle de feed-forward, feed-back e PID, mas você perguntou especificamente sobre escalabilidade - a maneira como a maioria dos sistemas gigantes é dimensionada por camadas de loops e lógica de controle, para que as informações mínimas necessárias sejam aplicadas a qualquer hardware você acaba com. Por exemplo, seu controlador de nível superior pode fornecer apenas pontos de posição da meta e uma velocidade média da meta para o nível inferior, não alterar a velocidade 30 vezes por segundo.
fonte