Pular para o conteúdo principal
sessão · 9–10 setmodo · mediçãomontagem · 7 corpos · 6 juntascódigo · gdjolt/estado · articulação medida
Multicorpo de verdade · o ensaio

Sete corpos, seis juntas.

A entrada Um corpo só, quatro bengalas terminou com uma afirmação que ficou sem prova: a VehicleConstraint é um modelo lumped e não é o rover. Esta entrada constrói a alternativa — corpos rígidos ligados por juntas, com motor no eixo de cada roda — e submete as duas montagens à mesma manobra, para trocar a afirmação por número.

O resultado em uma linha: passando pelo mesmo degrau, na mesma velocidade e com a mesma massa, o chassi articulado inclina 0,00° e o de corpo único inclina 4,34°. Mas o ensaio entregou duas coisas que não estavam no plano — uma delas obriga a reler tudo que foi medido com o modelo antigo.
a ponte que tornou isto possível · Dois mundos, uma cenaplano · roadmap 14–21 set
01

O que "articulado" quer dizer, concretamente

O que existia · lumped

Um corpo rígido e quatro conjuntos de números fingindo ser rodas. As rodas não têm massa, não têm forma e não colidem com nada: mSteerAngle, mAngularVelocity e mAngle são float.

Um raio desce até o chão, mede, e uma fórmula devolve a força. Nenhuma peça mecânica existe.

O que foi construído · rocker

Sete corpos rígidos — chassi, dois braços, quatro rodas — e seis juntas. Cada roda é um cilindro com massa que colide com o chão de verdade.

E nenhuma mola: quem absorve o degrau é a geometria, quando o braço gira. Esse é o princípio do rocker-bogie, e é impossível num bloco único porque não há o que girar.

gdjolt/src/rocker_rig.h · a montagem
chassi
 ├─ Hinge (curso ±30°) ──→ braço esq ─┬─ Hinge + motor → roda 0
 │                                    └─ Hinge + motor → roda 1
 └─ Hinge (curso ±30°) ──→ braço dir ─┬─ Hinge + motor → roda 2
                                      └─ Hinge + motor → roda 3

O detalhe que mais importa está no motor na junta. Em vez de empurrar o corpo para a frente — que é o atalho —, o código manda o eixo girar: SetMotorState(EMotorState::Velocity) e SetTargetAngularVelocity(v / raio). A roda gira, o atrito com o chão faz o conjunto andar. É como um veículo anda de verdade: o motor não empurra o carro, ele gira o eixo.

Uma armadilha que teria custado um dia: o atrito padrão de corpo no Jolt é 0.2 (BodyCreationSettings.h:107). Com esse valor a roda acionada por motor patina em vez de andar. Foi elevado a 1.0 em roda e chão, e isso virou parâmetro declarado do experimento — não detalhe escondido.
02

O banco de ensaio, e as duas vezes que ele estava errado

O vehicle_probe, que antes rodava um veículo só, virou um banco capaz de montar as duas plataformas e submeter as duas à mesma manobra: acelerar em reta contra um degrau. Mesma massa (1500 kg), mesma bitola, mesmo raio de roda, mesma velocidade.

Essa parte — igualar as condições — é o trabalho de verdade da semana, e ela precisou de duas correções antes de produzir um número em que dê para acreditar.

Erro 1 · as velocidades não batiam

Na primeira rodada o lumped percorreu 79 m e o rocker 9,6 m no mesmo tempo — 19 m/s contra 1,8 m/s. Comparar inclinação assim mede a velocidade, não o mecanismo.

Correção

Velocidade-alvo comum de 1,5 m/s. O rocker deriva a rotação do eixo de ω = v/r; o lumped ganhou um acelerador proporcional, porque o WheeledVehicleController tem curva de torque própria e dispara se receber 1.0 fixo.

Erro 2 · o chassi era um pêndulo invertido

O chassi ficava com 10° de inclinação permanente, até parado em chão plano. Sem explicação física.

Causa

As duas juntas dos braços são coaxiais em X, e eu as tinha posto abaixo do centro de massa do chassi. O chassi ficava equilibrado sobre elas como uma vassoura na palma da mão — não há nada segurando a inclinação, e ela cresce sozinha. O pivô subiu para a altura do centro de massa e os 10° sumiram.

Por que registrar os dois erros: os dois produziam tabelas de aparência perfeitamente respeitável. Se a primeira rodada tivesse sido publicada, o número estaria errado e nada denunciaria. O produto da semana não é a montagem — é a desconfiança dos dois primeiros resultados.
03

Resultado 1 · a articulação funciona

Degrau de 0,20 m · mesma velocidade, mesma massalumpedrocker
Inclinação do chassi no obstáculo4,34°0,00°
Inclinação máxima na manobra inteira4,43°0,10°
Altura final do chassi1,0440,850

E o mecanismo aparece na telemetria: quando a roda dianteira encontra o degrau, os braços giram −4,1° e o chassi não se mexe. O braço absorveu o obstáculo inteiro. Conferindo do outro lado, a roda dianteira termina em y = 0,500 — que é exatamente o raio (0,30) mais o degrau (0,20): ela está em cima do degrau, enquanto o chassi seguiu nivelado.

A verificação que fecha: a montagem vive num header compartilhado entre o banco de ensaio e o nó do Godot, de propósito — duas cópias divergiriam sem ninguém notar. O terminal mede 0,10° e z = 8,50; o Godot mede 0,10° e z = 8,47. É a mesma física rodando nos dois lugares.
04

Resultado 2 · o modelo antigo estava trapaceando

Varrendo a altura do degrau, o resultado parece se inverter — e é aqui que o ensaio entrega mais do que prometia.

Degraulumpedrockerincl. do lumped
0,10 msobesobe2,23°
0,20 msobesobe4,34°
0,30 msobenão sobe6,45°
0,50 msobenão sobe10,78°

À primeira vista o lumped ganha. Só que a roda tem 0,30 m de raio — e ele está subindo um degrau de 0,50 m. Isso é fisicamente impossível: é um carro de passeio subindo um meio-fio na altura do capô.

vehicle_probe --rig=lumped --step-height=0.50 · a batota em flagrante
passo |   z    | altura | incl.° | susp0  susp1  susp2  susp3
  180 |   3.70 |  0.844 |   0.00 |  0.364  0.364  0.364  0.364
  210 |   4.61 |  0.984 |   8.24 |  0.160  0.160  0.319  0.319   ← salta
  240 |   5.51 |  1.090 |  10.70 |  0.385  0.385  0.365  0.365
  330 |   8.15 |  1.356 |   0.00 |  0.377  0.377  0.376  0.376   ← em cima

A suspensão dianteira comprime de 0,364 para 0,160 de repente e o chassi salta — sem a roda nunca encostar na parede do degrau. O motivo já estava descrito em Um corpo só, quatro bengalas, mas agora está medido: naquele modelo a roda não existe, existe um raio apontado para baixo. Quando o raio passa da quina, encontra o topo, e a fórmula puxa o veículo para lá. A parede vertical do degrau não está no modelo — e a caixa do chassi passa por cima dela porque está mais alta.

O rocker falha em 0,30 m — exatamente o raio da roda, que é o limite geométrico correto de uma roda rígida sem ajuda.

A leitura certa da tabela: o articulado não é pior — ele é o único dos dois que obedece a geometria. O outro não vence por ser capaz, e sim por não representar o obstáculo. Isso obriga a reler qualquer conclusão anterior tirada do modelo lumped sobre terreno acidentado: ele descreve altura de terreno, não forma de obstáculo.
05

Resultado 3 · o custo, medido uma semana antes

No meio do ensaio, o chassi articulado afundava 15 cm andando em chão plano. Sem explicação física: não há mola, e as rodas são rígidas. Investigar isso entregou, de graça, a medição que a faixa A do roadmap ia buscar.

Esforço de cálculoAltura finalIncl. máxµs/quadro
10 vel / 2 pos · o padrão do Jolt0,7271,09°103
30 vel / 6 pos0,8280,12°132
60 vel / 12 pos0,8430,49°172
4 sub-passos0,8500,10°335
8 sub-passos0,8500,24°673

A altura geometricamente correta é 0,850. Portanto: não era física, era o cálculo não terminando — e o padrão do Jolt erra 12 centímetros nesta montagem.

A causa é a razão de massa: o chassi tem 1200 kg e cada braço tem 50 kg. Vinte e quatro para um através de uma junta é duro para um solver que resolve por aproximações sucessivas — com poucas rodadas ele para antes da resposta, e a junta "estica". É exatamente o tipo de montagem que a VehicleConstraint nunca produz, porque lá existe um corpo só.

o joelho está em 4 sub-passos
de 4 para 8, o resultado não muda mais — e o custo dobra
mesmo a configuração mais cara usa 673 µs de 16 700 µs por quadro
Três coisas ficam decididas com número: o passo padrão do Jolt não serve para esta montagem; a configuração recomendada é 4 sub-passos; e o orçamento de um quadro a 60 Hz é gasto em 4 %. Sobra folga — o que responde, do lado do Jolt, a pergunta que o passo de 0,5 ms do GDChrono tinha levantado.
06

O que isso muda

A frente passou a fazer jus ao nome

"Dinâmica multicorpo" descrevia, até esta semana, um projeto cuja simulação tinha um corpo. Agora tem sete, ligados por juntas, com a articulação medida fazendo o que deveria.

de leitura sobre multicorpo para multicorpo rodando

O modelo antigo ganhou um limite conhecido

Não é "menos preciso": ele não representa a forma do obstáculo. Serve para terreno de altura suave; não serve para degrau, pedra ou quina — que é o cenário de rover.

o que foi medido com ele antes precisa ser relido com isso em mente

O caminho do rover está aberto e orçado

A montagem articulada existe, roda no Godot, e custa 4 % de um quadro. O que separa isto de um rover não é mais viabilidade — é quantidade de peças.

a pergunta virou "quando", não "se"
07

O que falta

O bogie — seis rodas

O rocker de quatro rodas para no degrau igual ao raio da roda. É exatamente esse limite que o bogie existe para vencer: a perna dianteira é erguida sobre o obstáculo pela geometria do conjunto. É a continuação natural, e agora com um número concreto para bater — 0,30 m.

O terreno

Trocar o chão de caixa por HeightFieldShape e deformar o sulco com SetHeights. Continua valendo a distinção: o Jolt deforma a geometria, mas não tem terramecânica.

A cena nascer da física

A lição nº 1 do GDChrono. Foi adiada de propósito: com duas montagens concretas na mão, a abstração certa fica muito mais fácil de enxergar do que com uma só. Agora existem duas.

Fontes