A simulação de robótica no Unity é tão fácil quanto 1, 2, 3

CAMERON GREENE Anonymous
Nov 19, 2020|9 Min
A simulação de robótica no Unity é tão fácil quanto 1, 2, 3
Esta página da Web foi automaticamente traduzida para sua conveniência. Não podemos garantir a precisão ou a confiabilidade do conteúdo traduzido. Se tiver dúvidas sobre a precisão do conteúdo traduzido, consulte a versão oficial em inglês da página da Web.

Os fluxos de trabalho de desenvolvimento de robôs dependem da simulação para testes e treinamento, e queremos mostrar a você como os roboticistas podem usar o Unity para simulação de robótica. Nesta primeira postagem do blog de uma nova série, descrevemos um fluxo de trabalho comum de desenvolvimento de robótica. Além disso, apresentamos um novo conjunto de ferramentas que tornam a simulação de robótica no Unity mais rápida, eficaz e fácil do que nunca.

Como aproveitar o Unity usando a robótica

Como é caro e demorado desenvolver e testar aplicativos usando um robô real, a simulação está se tornando uma parte cada vez mais importante do desenvolvimento de aplicativos robóticos. A validação do aplicativo na simulação antes da implementação no robô pode reduzir o tempo de iteração, revelando antecipadamente os possíveis problemas. A simulação também facilita o teste de casos extremos ou cenários que podem ser perigosos demais para serem testados no mundo real.

Os principais elementos de uma simulação robótica eficaz incluem os atributos físicos do robô, a cena ou o ambiente em que o robô opera e o software que é executado no robô no mundo real. Garantir que esses três elementos da simulação estejam o mais próximo possível do mundo real é fundamental para testes e treinamentos válidos.

Uma das estruturas mais comuns para o desenvolvimento de software de robôs é o Sistema Operacional de Robôs (ROS). Ele fornece formatos padrão para descrições de robôs, mensagens e tipos de dados usados por milhares de roboticistas em todo o mundo, para casos de uso tão variados quanto montagem industrial, veículos autônomos e até mesmo entretenimento. Uma vibrante comunidade de usuários contribui com muitos pacotes de código aberto para funcionalidades comuns que podem dar início ao desenvolvimento de novos sistemas.

Os roboticistas geralmente arquitetam um aplicativo de robô como um conjunto modular de nós de ROS que pode ser implantado em robôs reais e em computadores que fazem interface com simuladores. Em uma simulação, os desenvolvedores criam um mundo virtual que espelha o caso de uso-alvo do robô real. Ao testar nesse ecossistema simulado, os usuários podem iterar os projetos rapidamente antes de testá-los no mundo real e, por fim, implantá-los na produção.

Imagem do Sistema Operacional de Robôs (ROS)

Um fluxo de trabalho comum de desenvolvimento de robótica, no qual o teste em simulação acontece antes do teste no mundo real

Esta postagem do blog usa o exemplo de uma tarefa simples de manipulação de pick-and-place para ilustrar como os usuários podem aproveitar o Unity para esse fluxo de trabalho de simulação.

1: Definição da tarefa do robô

Seguindo o fluxo de trabalho acima, digamos que a tarefa do nosso robô seja pegar um objeto e colocá-lo em um determinado local. O robô educacional Niryo One de seis eixos serve como braço do robô. O ambiente é mínimo: uma sala vazia, uma mesa na qual o robô se senta e um cubo (ou seja, o objeto-alvo). Para realizar a parte de planejamento de movimento da tarefa, usamos um conjunto popular de pacotes de ROS de planejamento de movimento chamado coletivamente de MoveIt. Quando estivermos prontos para iniciar a tarefa, enviaremos uma solicitação de planejamento do simulador para o MoveIt. A solicitação contém as poses de todas as articulações do robô, a pose do cubo e a posição de destino do cubo. Em seguida, o MoveIt calcula um plano de movimento e envia esse plano de volta ao simulador para execução.

Agora que definimos o problema, vamos ver como usar o Unity nesse fluxo de trabalho de simulação.

2: Trazendo seu robô para a simulação

Uma simulação de robótica consiste em configurar um ambiente virtual - uma sala básica, como neste exemplo, ou algo mais complexo, como um chão de fábrica com correias transportadoras, caixas, ferramentas e peças - e adicionar a esse ambiente uma representação virtual do robô a ser treinado ou testado. O Unity Editor pode ser usado para criar infinitas permutações de ambientes virtuais. Mas como podemos levar nossos robôs para esses ambientes?

Ao modelar um robô em uma simulação, precisamos representar suas malhas visuais, malhas de colisão e propriedades físicas. As malhas visuais são necessárias para renderizar o robô de forma realista. As malhas de colisão são necessárias para calcular as colisões entre os "links" do robô, os membros rígidos que conectam as articulações e outros objetos no ambiente, bem como com ele mesmo. Essas malhas são normalmente menos complexas do que as malhas visuais para permitir uma verificação de colisão mais rápida, o que pode exigir muita computação. Por fim, as propriedades físicas, como inércia, coeficientes de contato e dinâmica das articulações, são necessárias para uma simulação física precisa, ou seja, para calcular como as forças nos links resultam em alterações no estado do robô, por exemplo, pose, velocidade ou aceleração.

Para nossa sorte, ao usar o fluxo de trabalho de desenvolvimento do ROS, há uma maneira padronizada de descrever todas essas propriedades: Formato Universal de Descrição do Robô (URDF). Os arquivos URDF são arquivos XML que nos permitem especificar essas propriedades visuais, de colisão e físicas em uma linguagem de marcação legível por humanos. Os arquivos URDF também podem incluir arquivos de malha para especificar geometrias complexas. O exemplo abaixo mostra um trecho do arquivo URDF para o robô Niryo One.

A imagem mostra um trecho do arquivo URDF do robô Niryo One.

URDF do robô Niryo One

Para facilitar aos roboticistas a importação de seus robôs para o Unity, estamos lançando o URDF Importer, um pacote de código aberto do Unity para importar um robô para uma cena do Unity usando seu arquivo URDF. Esse pacote aproveita nosso novo suporte para "articulações" no Unity, possibilitado por melhorias no PhysX 4.1. Essa atualização nos permite modelar com precisão as características físicas de um robô para obter simulações cinemáticas mais realistas.

Quando instalado no Unity Editor, esse pacote permite que o usuário selecione um arquivo URDF para importar. Ele analisa o arquivo XML nos bastidores e armazena os links e as articulações nas classes C# apropriadas. Em seguida, ele cria uma hierarquia de GameObjects, em que cada GameObject é um componente ArticulationBody que representa um link específico no robô. Ele atribui propriedades do URDF aos campos correspondentes no ArticulationBody. Quando os usuários adicionam um robô ao Unity, o URDF Importer cria automaticamente um controlador de articulação de teclado rudimentar. Os usuários podem substituir esse controlador por um controlador personalizado usando as APIs do ArticulationBody.

Por exemplo, aqui está o ativo do Niryo One Unity, criado após a importação do arquivo URDF acima.

Exemplo de recurso do Niryo One Unity, criado após a importação do arquivo URDF acima.

Um robô virtual Niryo One no Unity, importado por meio do URDF Importer

3: Conectando sua simulação ao ROS

Agora que o robô está no Unity Editor, devemos testar nosso algoritmo de planejamento de movimento, executado em um conjunto de nós do ROS. Para dar suporte a isso, precisamos configurar uma interface de comunicação entre o Unity e o ROS. O Unity precisa passar mensagens para o ROS que contenham informações de estado - ou seja, as poses do robô, o objeto-alvo e a localização do alvo - juntamente com uma solicitação de planejamento para o serviço de movimentação. Por sua vez, o ROS precisa retornar uma mensagem de trajetória para o Unity correspondente ao plano de movimento (ou seja, a sequência de posições articulares necessárias para concluir a tarefa de pegar e colocar).

Dois novos pacotes de integração ROS-Unity agora facilitam a conexão entre o Unity e o ROS. Esses pacotes permitem que as mensagens do ROS sejam transmitidas entre os nós do ROS e o Unity com baixa latência; quando testada em uma única máquina, uma mensagem simples baseada em texto fez a viagem do Unity para um assinante do ROS em milissegundos e uma imagem de 1036 x 1698 em algumas centenas de milissegundos.

Como a comunicação no ROS usa um modelo pub/sub, o primeiro requisito para a comunicação ROS-Unity são as classes no Unity correspondentes aos tipos de mensagens do ROS. Quando os usuários adicionam o pacote ROS-TCP-Connector Unity ao Unity Editor, eles podem usar o plug-in MessageGeneration para gerar classes C#, incluindo funções de serialização e desserialização, a partir de arquivos ROS .msg e .srv. O pacote ROS-TCP-Connector também inclui scripts que o usuário pode estender para publicar mensagens do Unity em um tópico do ROS, assinar mensagens no Unity em um tópico do ROS e criar solicitações e respostas de serviços do ROS. No lado do ROS, um pacote do ROS chamado ROS-TCP-Endpoint pode criar um endpoint para permitir a comunicação entre os nós do ROS e uma cena do Unity usando esses scripts ROS-TCP-Connector.

Vamos agora dar uma olhada em como usar esses pacotes de integração ROS-Unity para a tarefa em questão. Primeiro, usamos os pacotes de integração ROS-Unity para criar um editor no Unity para enviar os dados de pose ao ROS por TCP. No lado do ROS, precisamos configurar um ROS-TCP-Endpoint para assinar essas mensagens de pose.

Em seguida, criaremos um botão "Publish" na cena do Unity junto com um retorno de chamada OnClick. Essa função de retorno de chamada faz uma solicitação de serviço para o planejador de movimento MoveIt. A solicitação de serviço inclui a pose atual do robô, a pose do objeto-alvo e a localização do alvo. Quando o MoveIt recebe a solicitação de planejamento, ele tenta calcular um plano de movimento. Se for bem-sucedido, o serviço retorna o plano, ou seja, uma sequência de posições conjuntas, e um script do Unity executa a trajetória usando as APIs do ArticulationBody. Caso contrário, ele retorna uma mensagem de falha.

O gif abaixo mostra uma simulação em Unity do braço do Niryo One executando com êxito a tarefa de pegar e colocar.

Simulação de uma tarefa de pick-and-place em um robô Niryo One no Unity usando ROS e MoveIt para planejamento de movimento

Simulação de uma tarefa de pick-and-place em um robô Niryo One no Unity usando ROS e MoveIt para planejamento de movimento

Esse exemplo é apenas o começo. Os desenvolvedores podem usar essa demonstração como base para criar cenas Unity mais complexas, adicionar diferentes robôs e integrar outros pacotes de ROS. Fique atento às futuras postagens que abordarão a integração de visão computacional e tarefas orientadas para o aprendizado de máquina em uma estrutura de simulação de robótica.

Conclusão

Essas ferramentas estabelecem as bases para uma nova geração de testes e treinamento em simulação e tornam mais fácil do que nunca usar o Unity para simulação de robótica. Nossa equipe está trabalhando arduamente para viabilizar esses casos de uso de última geração, incluindo treinamento de aprendizado de máquina para robótica, modelagem de sensores, testes em escala e muito mais. Fique atento à nossa próxima postagem no blog desta série, que mostrará como treinar um modelo de aprendizado de máquina baseado em visão para estimar a pose do objeto-alvo na tarefa de pick-and-place.

Próximas etapas

Comece a usar nossas ferramentas de simulação de robótica gratuitamente. Confira nosso tutorial de pick-and-place no GitHub.

Para obter mais projetos de robótica, visite o Unity Robotics Hub no GitHub. Para ver como nossa equipe está facilitando o treinamento de sistemas de visão computacional usando o Unity, leia nossa série de blogs sobre visão computacional.

Para obter mais informações sobre como o Unity pode ser usado para atender às suas necessidades de simulação de robótica, visite nossa página oficial de robótica.

Se quiser entrar em contato com nossa equipe diretamente com perguntas, comentários ou sugestões, envie-nos um e-mail para unity-robotics@unity3d.com.