Ensinando robôs a enxergar com o Unity

O mundo da robótica é cheio de incógnitas! Desde o ruído do sensor até o posicionamento exato de objetos importantes, os robôs têm uma necessidade fundamental de entender o mundo ao seu redor para ter um desempenho preciso e robusto. Anteriormente, demonstramos uma tarefa de pegar e posicionar no Unity usando o robô Niryo One para pegar um cubo com posição e orientação conhecidas. Essa solução não seria muito robusta no mundo real, pois os locais precisos dos objetos raramente são conhecidos a priori. Em nossa nova demonstração de estimativa de pose de objeto, mostramos como usar o pacote de percepção de visão computacional da Unity para coletar dados e treinar um modelo de aprendizagem profunda para prever a pose de um determinado objeto. Em seguida, mostramos como integrar o modelo treinado com um braço robótico virtual UR3 no Unity para simular o sistema completo de pick-and-place em objetos com poses desconhecidas e arbitrárias.
Os robôs no mundo real geralmente operam em ambientes dinâmicos e precisam se adaptar a eles. Esses aplicativos geralmente exigem que os robôs percebam objetos relevantes e interajam com eles. Um aspecto importante da percepção e da interação com objetos é entender sua posição e orientação em relação a algum sistema de coordenadas, também chamado de "pose". As primeiras abordagens de estimativa de pose geralmente se baseavam em técnicas clássicas de visão computacional e marcadores fiduciais personalizados. Essas soluções são projetadas para operar em ambientes específicos, mas geralmente falham quando seus ambientes mudam ou divergem do esperado. As lacunas introduzidas pelas limitações da visão computacional tradicional estão sendo abordadas por novas e promissoras técnicas de aprendizagem profunda. Esses novos métodos criam modelos que podem prever o resultado correto para uma determinada entrada, aprendendo com muitos exemplos.
Esse projeto usa imagens e rótulos de pose de verdade para treinar um modelo para prever a pose do objeto. Em tempo de execução, o modelo treinado pode prever a pose de um objeto a partir de uma imagem que ele nunca viu antes. Normalmente, dezenas de milhares ou mais de imagens precisam ser coletadas e rotuladas para que os modelos de aprendizagem profunda tenham um desempenho suficiente. A coleta desses dados no mundo real é tediosa, cara e, em alguns casos, como a Localization de objetos 3D, inerentemente difícil. Mesmo quando esses dados podem ser coletados e rotulados, o processo pode se tornar tendencioso, propenso a erros, tedioso e caro. Então, como aplicar abordagens avançadas de aprendizado de máquina ao seu problema quando os dados que você deseja estão fora de alcance ou ainda não existem de fato para o seu aplicativo?
O Unity Computer Vision permite que você gere dados sintéticos como uma solução eficiente e eficaz para seus requisitos de dados de aprendizado de máquina. Este exemplo mostra como geramos dados rotulados automaticamente no Unity para treinar um modelo de aprendizado de máquina. Em seguida, esse modelo é implantado no Unity em um braço robótico UR3 simulado usando o Sistema Operacional de Robôs (ROS) para permitir o pick-and-place com um cubo que tem uma pose desconhecida.

Simuladores, como o Unity, são uma ferramenta poderosa para enfrentar os desafios da coleta de dados por meio da geração de dados sintéticos. Usando o Unity Computer Vision, grandes quantidades de dados perfeitamente rotulados e variados podem ser coletados com o mínimo de esforço, conforme mostrado anteriormente. Para esse projeto, coletamos muitas imagens de exemplo do cubo em várias poses e condições de iluminação. Esse método de randomização de aspectos da cena é chamado de randomização de domínio1. Dados mais variados geralmente levam a um modelo de aprendizagem profunda mais robusto.
Para coletar dados com o cubo em várias poses no mundo real, teríamos que mover manualmente o cubo e tirar uma foto. Nosso modelo usou mais de 30.000 imagens para treinar, portanto, se pudéssemos fazer isso em apenas 5 segundos por imagem, levaríamos mais de 40 horas para coletar esses dados! E esse tempo não inclui a rotulagem que precisa ser feita. Usando o Unity Computer Vision, podemos gerar 30.000 imagens de treinamento e outras 3.000 imagens de validação com rótulos correspondentes em apenas alguns minutos! A câmera, a mesa e a posição do robô são fixas neste exemplo, enquanto a iluminação e a pose do cubo variam aleatoriamente em cada quadro capturado. Os rótulos são salvos em um arquivo JSON correspondente, em que a pose é descrita por uma posição 3D (x,y,z) e uma orientação quaternária (qx,qy,qz,qw). Embora este exemplo varie apenas a pose do cubo e a iluminação do ambiente, o Unity Computer Vision permite que você adicione facilmente a randomização a vários aspectos da cena. Para realizar a estimativa de pose, usamos uma técnica de aprendizado de máquina supervisionada para analisar os dados e gerar um modelo treinado.

No aprendizado supervisionado, um modelo aprende a prever um resultado específico com base no treinamento de um conjunto de entradas e saídas correspondentes, imagens e rótulos de pose em nosso caso. Há alguns anos, uma equipe de pesquisadores apresentou2uma rede neural convolucional (CNN) que podia prever a posição de um objeto. Como estamos interessados em uma pose 3D para nosso cubo, ampliamos esse trabalho para incluir a orientação do cubo na saída da rede. Para treinar o modelo, minimizamos o erro de mínimos quadrados, ou distância L2, entre a pose prevista e a pose da verdade terrestre. Após o treinamento, o modelo previu a localização do cubo em 1 cm e a orientação em 2,8 graus (0,05 radianos). Agora vamos ver se isso é preciso o suficiente para que nosso robô execute com sucesso a tarefa de pegar e posicionar!

O robô que estamos usando neste projeto é um braço robótico UR3 com uma garra Robotiq 2F-140, que foi trazido para nossa cena Unity usando o pacote Unity Robotics URDF Importer. Para lidar com a comunicação, o pacote Unity Robotics ROS-TCP Connector é usado, enquanto o pacote ROS MoveIt lida com o planejamento e o controle de movimentos.
Agora que podemos prever com precisão a pose do cubo com nosso modelo de aprendizagem profunda, podemos usar essa pose prevista como a pose de destino em nossa tarefa de pegar e colocar. Lembre-se de que, em nossa demonstração anterior do Pick-and-Place, contamos com a pose de verdade do objeto-alvo. A diferença aqui é que o robô executa a tarefa de pegar e colocar sem conhecimento prévio da pose do cubo e só recebe uma pose prevista do modelo de aprendizagem profunda. O processo tem 4 etapas:
Uma imagem com o cubo de destino é capturada pelo Unity
A imagem é passada para um modelo de aprendizagem profunda treinado, que gera uma pose prevista
A pose prevista é enviada para o planejador de movimentos do MoveIt
O ROS retorna uma trajetória para o Unity para que o robô a execute em uma tentativa de pegar o cubo
A cada iteração da tarefa, o cubo é movido para um local aleatório. Embora saibamos a pose do cubo na simulação, não teremos o benefício dessas informações no mundo real. Assim, para estabelecer as bases para transferir este projeto para um robô real, precisamos determinar a pose do cubo apenas com dados sensoriais. Nosso modelo de estimativa de pose torna isso possível e, em nossos testes de simulação, podemos pegar o cubo de forma confiável 89% das vezes em Unity!

Nossa demonstração de estimativa de pose de objeto mostra como a Unity oferece a capacidade de gerar dados sintéticos, treinar um modelo de aprendizagem profunda e usar o ROS para controlar um robô simulado para resolver um problema. Usamos as ferramentas de visão computacional da Unity para criar dados de treinamento sintéticos e rotulados e treinamos um modelo simples de aprendizagem profunda para prever a pose de um cubo. A demonstração fornece um tutorial que o orienta sobre como recriar esse projeto, que pode ser expandido com a aplicação de mais randomizadores para criar cenas mais complexas. Usamos as ferramentas da Unity Robotics para nos comunicarmos com um nó de inferência do ROS que usa o modelo treinado para prever a pose de um cubo. Essas e outras ferramentas abrem as portas para que você explore, teste, desenvolva e implemente soluções localmente. Quando você estiver pronto para escalar sua solução, o Unity Simulation economiza tempo e dinheiro em comparação com os sistemas locais.
E você sabia que as ferramentas Unity Computer Vision e Unity Robotics são gratuitas para uso? Vá até a Demonstração de estimativa de pose de objeto para começar a usá-los hoje mesmo!
Agora que podemos pegar objetos com uma pose desconhecida, imagine como você poderia expandir isso! E se houver obstáculos no caminho? Ou vários objetos na cena? Pense em como você pode lidar com isso e fique atento ao nosso próximo post!
Mal posso esperar até a próxima postagem! Inscreva-se para receber atualizações por e-mail sobre nosso trabalho em robótica ou visão computacional.
Você também pode encontrar mais projetos de robótica em nosso GitHub do Unity Robotics.
Para obter mais projetos de visão computacional, visite nossa página Unity Computer Vision.
Nossa equipe gostaria muito de ouvir suas dúvidas, comentários ou sugestões! Entre em contato com unity-robotics@unity3d.com.
Citações
J. Tobin, R. Fong, A. Ray, J. Schneider, W. Zaremba, P. Abbeel, "Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World" arXiv:1703.06907, 2017
J. Tobin, W. Zaremba e P. Abbeel, "Domain randomization and generative models for robotic grasping", arXiv preprint arXiv:1710.06425, 2017
