Como posso controlar um sistema rápido em tempo real (200Hz) com um sistema lento (30Hz)?

12

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:

  1. 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.

  2. 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?

arennuit
fonte
1
Se você estiver olhando para redes em tempo real, poderá dar uma olhada no EtherCAT !
precisa saber é o seguinte
1
Tal como está, é improvável que essa pergunta ajude futuros visitantes e possa ser fechada por ser muito localizada . Embora seja útil ter todo o histórico em um só lugar, eu poderia sugerir dividir isso em uma série de perguntas práticas e respondíveis com base nos problemas reais que você enfrenta . Consulte Posso pedir opiniões? para mais informações.
Mark Booth

Respostas:

8

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).

Eu analisei artigos relacionados à arquitetura de robôs, [...] mas ainda não encontrei informações sobre como fazer com que o nível baixo se comunique com o nível alto e de forma escalável. Perdi algo?

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.

Ian
fonte
Eu gosto deste conceito de ponte de comunicação. Vou dar uma olhada no link encaminhado. Muito obrigado!
precisa saber é o seguinte
5

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.

EDDY74
fonte
Oi Eddy, Acabei de perceber sua resposta agora. Você pode explicar a diferença que faz entre "links ponto a ponto" e "barramento do sistema"? Especialmente, você menciona primeiro o ponto-a-ponto para ter uma nota mais baixa, mas diz que o dynamixel usa o UART e é ótimo ... Não tenho certeza se eu o sigo (embora eu concorde que os ônibus do sistema tragam muito em termos de facilidade de uso. Obrigado;)
Arennuit
A topologia usada pelo Dynamixel não é serial ponto a ponto, é encadeada (isto é, uma topologia em anel ou um barramento compartilhado). Em outras palavras, cada motor possui duas portas (uma para entrada e outra para saída - que se conecta ao próximo motor). Como tal, você não tem uma topologia em estrela e a fiação é muito mais simples. Também nunca disse que a comunicação ponto a ponto é de nível inferior, mas que a fiação é geralmente mais complicada em uma rede com muitos nós.
precisa
Entendi! Graças para os detalhes extra um ano depois;)
arennuit
4

Você parece ter 2 problemas separados (mas relacionados) que você está tentando resolver de uma vez. Vamos dividir seu enigma em pedaços menores:

  1. Como comunico comandos de um sistema lento (30Hz) para um controlador rápido (200Hz) e como comunico dados sendo recebidos a 200Hz de volta ao meu thinktank de 30Hz?
  2. Como controle o que está acontecendo em 200Hz, quando só posso dizer ao robô o que fazer em 30Hz?

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.

user2002
fonte