Pular para o conteúdo principal
Versão: 0.2.7

Simuladores 3D — Guia de Uso

Este guia mostra como usar os três simuladores 3D da lib, desde o caso mais simples (CartPoleView().run()) até customização de parâmetros físicos.


Cart-Pole

Sistema clássico de controle: um carrinho sobre trilho com um pêndulo invertido articulado. Estado de 4 dimensões, instável no equilíbrio vertical.

CartPole — simulação 3D em tempo real

from synapsys.viz import CartPoleView

CartPoleView().run()

Parâmetros físicos (valores padrão):

ParâmetroPadrãoDescrição
m_c1.0 kgmassa do carrinho
m_p0.1 kgmassa do bob
l0.5 mcomprimento da haste
g9.81 m/s²gravidade

Estado: x = [posição do carrinho, velocidade, ângulo θ, velocidade angular θ̇]

LQR padrão: Q = diag([1, 0.1, 100, 10]), R = 0.01·I

Estado inicial customizado:

import numpy as np
CartPoleView(x0=np.array([0.0, 0.0, 0.30, 0.0])).run() # ângulo inicial 0.30 rad
Auto-reset

O carrinho muda de cor para âmbar ao atingir 72% do trilho e para vermelho em 92%. Ao ultrapassar 92%, a simulação é resetada automaticamente.


Pêndulo Invertido

Pêndulo de 1 elo articulado numa base fixa. O sistema mais simples para testar controladores — apenas 2 estados, polo instável em +√(g/l).

Pêndulo Invertido — simulação 3D em tempo real

from synapsys.viz import PendulumView

PendulumView().run()

Parâmetros físicos (valores padrão):

ParâmetroPadrãoDescrição
m1.0 kgmassa do bob
l1.0 mcomprimento da haste
g9.81 m/s²gravidade
b0.1coeficiente de amortecimento viscoso

Estado: x = [θ, θ̇]

LQR padrão: Q = diag([80, 5]), R = I


Mass-Spring-Damper

Sistema massa-mola-amortecedor com rastreamento de setpoint. O MSD tem controles extras na barra: botões para selecionar 3 posições de referência (0 m, +1.5 m, −1.5 m) e atalhos de teclado 1/2/3.

Mass-Spring-Damper — simulação 3D em tempo real

from synapsys.viz import MassSpringDamperView

MassSpringDamperView().run()

Parâmetros físicos (valores padrão):

ParâmetroPadrãoDescrição
m1.0 kgmassa
c0.5 N·s/mcoeficiente de amortecimento
k2.0 N/mconstante da mola

Estado: x = [q, q̇]

Lei de controle LQR (com feed-forward de setpoint):

u = −K·(x − x_ref) + k·sp

Setpoints disponíveis (teclado):

TeclaSetpoint
10.0 m
2+1.5 m
3−1.5 m

Setpoints e estado inicial customizados:

import numpy as np
MassSpringDamperView(
setpoints=[("0", 0.0), ("+2m", 2.0), ("-2m", -2.0)],
x0=np.array([1.0, 0.0]),
).run()

Anatomia da janela

┌──────────────────────────────────────────────────────────────────────┐
│ Título da janela │
├──────────────────────────────┬───────────────────────────────────────┤
│ │ ┌─────────────────────────────────┐ │
│ PyVista 3D │ │ Posição / ângulo │ │
│ • animação física │ ├─────────────────────────────────┤ │
│ • HUD com valores │ │ Velocidade / vel. angular │ │
│ do estado em │ ├─────────────────────────────────┤ │
│ tempo real │ │ Força / torque de controle │ │
│ │ ├─────────────────────────────────┤ │
│ A/D=pert R=reset │ │ Retrato de fase │ │
│ SPACE=pausa Q=fechar │ │ (ponto atual em ciano) │ │
│ │ └─────────────────────────────────┘ │
├──────────────────────────────┴───────────────────────────────────────┤
│ [◀ Perturbar] [──●────── Magnitude: 20 N ──] [Perturbar ▶] │
│ [⏸ Pausa] [↺ Reset] │
├──────────────────────────────────────────────────────────────────────┤
│ t = 3.42 s | pos = +0.012 m | θ = −0.03° | rodando │
└──────────────────────────────────────────────────────────────────────┘
RegiãoO que mostra
Painel 3D (esquerda, ~55%)Cena física animada + HUD de estado + indicações de teclado
Painel telemetria (direita, ~45%)4 gráficos matplotlib (atualização: CartPole ~17 Hz · Pêndulo/MSD ~20 Hz)
Barra de controles (80 px)Perturbação hold-to-apply + slider + pausa/reset
Status barTempo de simulação, variáveis principais, estado (rodando/PAUSADO)

Gráficos de telemetria por simulador

PainelConteúdoCor
1Posição x(t) em m (eixo esq.) + Velocidade ẋ(t) em m/s (eixo dir.)Azul + laranja tracejado
2Ângulo da haste θ(t) em grausLaranja
3Força de controle u(t) em NVermelho
4Retrato de fase (θ vs θ̇)Violeta + ponto ciano

Controles de teclado

TeclaAçãoObservação
A (hold)Perturbação negativaLiberando → perturbação volta a zero
D (hold)Perturbação positivaLiberando → perturbação volta a zero
RReset completoVolta ao estado inicial, limpa histórico
SpacePausa / RetomarAlterna entre e
Q / EscFechar janelaPara o timer e fecha o PyVista
1 / 2 / 3Mudar setpointApenas MSD

Os atalhos funcionam independente de qual painel tem foco (3D ou matplotlib).


Parâmetros físicos customizados

Todos os parâmetros físicos podem ser passados no construtor:

from synapsys.viz import CartPoleView, PendulumView, MassSpringDamperView

# Carrinho pesado, haste longa
CartPoleView(m_c=3.0, m_p=0.5, l=1.0).run()

# Pêndulo curto com amortecimento maior
PendulumView(m=0.5, l=0.6, b=0.3).run()

# Mola mais rígida, amortecimento baixo (subamortecido)
MassSpringDamperView(m=1.0, c=0.1, k=10.0).run()

Ao mudar os parâmetros físicos, o LQR automático é reprojetado internamente via sim.linearize() — nenhum ajuste manual necessário.


Perturbações

Os botões ◀ Perturbar e Perturbar ▶ aplicam uma força/torque enquanto o botão está pressionado (hold-to-apply). Ao soltar, a perturbação vai a zero. Equivalente a segurar A ou D no teclado.

O slider de magnitude define o valor máximo da perturbação. Faixas por simulador:

SimuladorFaixaPadrão
Cart-Pole1–80 N30 N
Pêndulo1–40 N·m20 N·m
MSD1–30 N15 N

Paleta de cores

Todos os elementos visuais usam os tokens da paleta canônica. Ver tokens de cor Dark

from synapsys.viz.palette import Dark, mpl_theme

mpl_theme() # aplica tema escuro globalmente no matplotlib