Use corpos articulados para criar facilmente protótipos de projetos industriais com movimentos e comportamentos realistas

No Unity 2020.1, agora na versão beta, teremos um novo componente Physics: ArticulationBody. As articulações facilitam mais do que nunca a simulação de braços robóticos e cadeias cinemáticas com física e movimentos realistas. Juntamente com outros aprimoramentos do PhysX 4.1, a Unity está mais capacitada do que nunca para a simulação de aplicativos industriais.
Com o Unity 2019.3, atualizamos nossa biblioteca de física do PhysX 3.4 para o PhysX 4.0. Agora, a versão beta do Unity 2020.1 leva os usuários um passo adiante com uma atualização para o PhysX 4.1. Embora as compilações anteriores dessa biblioteca tenham proporcionado um excelente desempenho para uma ampla variedade de tipos de jogos, a modelagem da realidade para aplicativos que não são de jogos era mais difícil de ser realizada. A modelagem de cadeias cinemáticas, como o tipo que você veria em uma boneca de pano, um braço robótico ou um mecanismo com várias dobradiças simultâneas, resultaria em um movimento gaguejante e irreal. Essas juntas não apenas teriam uma aparência peculiar, mas também seriam impossíveis de usar para simular um dispositivo real, impedindo os esforços para modelar ou criar protótipos de projetos industriais.
Um dos principais culpados por essas deficiências do mundo real foi a seleção de componentes de junta que conectaram corpos rígidos. Essas articulações, aliadas a um solucionador de física otimizado para o desempenho do jogo em detrimento da fidelidade, resultaram em uma cinemática que não conseguiu simular de forma realista.
Saiba mais sobre os aprimoramentos gerais trazidos pelo PhysX 4.1 aqui.
Certos aplicativos exigem a restrição do movimento de alguns corpos rígidos em relação uns aos outros. Para visualizar isso, imagine conectar os ossos do esqueleto de uma boneca de pano, um braço robótico com várias articulações ou uma porta girando em sua dobradiça. Tradicionalmente, isso tem sido possível por meio dos componentes de junta, como o FixedJoint ou o ConfigurableJoint, que conectam dois objetos Rigidbody.
Nos bastidores, cada articulação será decomposta em algumas restrições primitivas, como uma restrição linear para manter os corpos a uma distância específica ou uma restrição angular para manter os corpos orientados de uma maneira específica em torno de um eixo específico. Essas mesmas restrições são usadas para evitar que os corpos se sobreponham uns aos outros, mantendo a mesma distância entre eles. Todas as restrições combinadas serão conectadas a um solucionador iterativo que visa convergir para um conjunto de impulsos a serem aplicados a cada um dos pares de objetos conectados no espaço do mundo que os posicionará para satisfazer todas as restrições, se possível.
O primeiro problema é o grande número de fatores conflitantes que podem criar problemas de convergência para o solucionador. A contagem de iterações, as massas relativas dos corpos conectados e a complexidade total do conjunto de restrições em uma cena podem criar um cenário insolúvel. Em casos como esse, a solução parcial é usada, de modo que certas restrições não são atendidas.
O segundo problema é que a magnitude do impulso aplicado depende do erro conjunto, um valor que mostra a gravidade da violação de uma restrição em um determinado momento. Devido a esse comportamento de compensação de erros, sempre haverá pelo menos algum efeito de mola, exatamente como se os corpos estivessem conectados por um conjunto de molas amortecidas, especialmente quando as juntas são encadeadas.
Nossa solução para o problema de cinemática acima é o novo conceito de articulação: um conjunto de corpos organizados em uma árvore lógica, em que uma relação pai-filho expressa a ideia de movimento mutuamente restrito. Há sempre um único corpo raiz e não pode haver loops. Usamos a hierarquia de transformação da Unity para expressar as articulações.
Agora, os usuários podem modelar facilmente um robô existente, como o Universal Robots UR3e abaixo, e simular uma tarefa que reflita com mais precisão como seria esse movimento no mundo real. Isso permite que os roboticistas visualizem uma sequência de movimentos específica, testem um novo código ou até mesmo validem novos projetos em um ambiente sintético.
As articulações ajudam os roboticistas e outros desenvolvedores industriais de duas maneiras principais: elas se movem de forma mais semelhante às suas contrapartes do mundo real e podem ser construídas mais rapidamente do que o antigo RigidBody+Joint, economizando tempo de desenvolvimento.
Prevemos que um dos principais casos de uso das articulações será no campo da robótica. Os braços robóticos geralmente têm seis ou mais juntas ligadas em série em uma fileira, o que significa que pequenos erros em cada pose de junta relativa podem ter um efeito potencialmente grande na pose do efetor final; os erros são propagados pela cadeia cinemática, o que cria movimentos irrealistas e uma posição do efetor final que se desviou do alvo.
A simulação pode ajudar os roboticistas a acelerar o tempo de desenvolvimento, modelando virtualmente muitos cenários de implantação e testes unitários e, em seguida, executando-os em escala, em vez de tentar executar esses mesmos conjuntos de testes em um robô real em tempo real. Esperamos que o componente ArticulationBody, bem como as melhorias no PhysX, possam ajudar os roboticistas a usar o Unity em seus esforços de simulação.
A quantidade de graus de liberdade em uma determinada relação pai-filho depende do tipo de junta real usado. Atualmente, oferecemos suporte:
- Fixo: tem zero graus de liberdade e é usado para travar os corpos um em relação ao outro
- Prismático: tem um grau de liberdade, que é um deslocamento linear ao longo de um eixo específico em relação ao eixo principal
- Revolute: tem um grau de liberdade, um análogo rotacional do Prismatic
- Esférica: tem até três graus de liberdade e é uma articulação do tipo ball-in-socket que permite apenas rotações relativas, mas nenhum movimento linear
Para aumentar ainda mais o realismo dessas juntas, é usado um novo solucionador baseado no algoritmo de Featherstone. Essa técnica calcula os efeitos das forças aplicadas a uma estrutura de juntas, elos e corpos sólidos usando coordenadas reduzidas, ou seja, um espaço em que cada corpo tem tantas coordenadas em relação ao seu pai quanto o número de graus de liberdade. Anteriormente, dependíamos de coordenadas máximas que apresentavam melhor desempenho para casos de uso geral, mas sacrificávamos a exatidão e a precisão para obter esse desempenho.
A dinâmica de avanço e as articulações em um espaço de coordenadas reduzido ajudam a satisfazer os altos requisitos de precisão e exatidão que os braços robóticos precisam. Juntamente com outras melhorias fornecidas pelo PhysX 4.1, como o solucionador TGS, as articulações possibilitam simulações confiáveis de braços robóticos no Unity pela primeira vez. A modelagem de um robô usando o solucionador de juntas iterativo exigiu ajustes precisos e atalhos que, ainda assim, não corresponderiam ao movimento de um robô real.
Usamos o algoritmo de dinâmica avançada para simular articulações no espaço de coordenadas reduzido (ou seja, um espaço em que cada corpo tem tantas coordenadas em relação ao seu pai quanto o número de graus de liberdade). Ele é escalonado linearmente com a quantidade total de graus de liberdade em uma articulação e pode ser mais rápido do que usar o solucionador iterativo tradicional, que é escalonado com o número de restrições e, ao mesmo tempo, calcula um resultado mais preciso.
Para oferecer suporte a articulações no Unity, adicionamos um novo componente: o ArticulationBody. Fazendo uma analogia com a física comum, o ArticulationBody é como o Rigidbody e o ConfigurableJoint em um único componente. Em uma articulação, todos os corpos, exceto o corpo raiz, têm uma junta que os conecta ao seu pai, por isso não foram separados em componentes individuais.

A forma dos corpos é descrita com o uso do componente Collider regular, assim como acontece com os Rigidbodies.
Depois de criados, os corpos em uma articulação não podem ser movidos por meio do componente Transformar, porque ele pode romper os limites definidos pelas coordenadas de espaço reduzido. A única exceção é o corpo da raiz, que pode ser movido usando a função ArticulationBody.TeleportRoot. O ArticulationBody não responderá às alterações no componente Transform por padrão.
Dito isso, há várias maneiras possíveis de interagir com uma articulação. Em primeiro lugar, forças e torques podem ser aplicados a cada corpo em uma articulação. Em segundo lugar, cada articulação tem um acionamento linear para cada grau de liberdade que pode ser controlado pela definição de metas lineares e angulares. Por fim, é possível alterar diretamente as poses dos corpos no espaço de coordenadas reduzido.
Uma vantagem específica das articulações é que a qualidade da simulação não depende diretamente da proporção de massa dos corpos conectados. Com corpos rígidos e juntas fixas, a simulação começou a parecer irrealista com proporções de massa superiores a 10:1 entre os corpos conectados. No exemplo a seguir, no entanto, você pode ver que uma grade dimensional de corpos de articulação conectados com juntas fixas ainda pode ser simulada com precisão, mesmo com as esferas vermelhas sendo mil vezes mais pesadas do que as pretas.
A simulação pode ajudar os roboticistas a acelerar o tempo de desenvolvimento, modelando virtualmente muitos cenários de implantação e testes unitários e, em seguida, executando-os em escala, em vez de tentar executar esses mesmos conjuntos de testes em um robô real em tempo real. Esperamos que o componente ArticulationBody, bem como as melhorias no PhysX, possam ajudar os roboticistas a usar o Unity em seus esforços de simulação.
Para ver como um braço de robô de link serial pode ser construído com juntas de articulação, confira nosso projeto de demonstração de robótica.
Baixe o Unity 2020.1, agora em versão beta, para experimentar o ArticulationBody.
