Move .prds/ (PRDs, roadmap, module and phase docs) to docs/planning/prds/, preserving modules/ and phases/ subdirectory structure. Delete .prds/. Update AGENTS.md documentation table to include docs/planning/prds/ entry. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.6 KiB
Roadmap — Ymir Simulator
Escopo deste roadmap
Hidrodinâmica naval, colisão entre corpos, e controle via API. Sem mooring, anchoring, batimetria complexa, fast-time, SQLite, telemetria, ou domínios não-navais.
Estado Atual — Fase 0 concluída
| Módulo | Status | Localização |
|---|---|---|
RigidBody6DOF + integrador CVODE BDF |
✅ | libs/physics/ |
InertialForces |
✅ | libs/physics/forces/ |
RestoringForces (hidrostática) |
✅ | libs/physics/forces/ |
DampingForces (potencial + linear + quadrático) |
✅ | libs/physics/forces/ |
SquatForces (ICORELS) |
✅ | libs/physics/forces/ |
CurrentForces (Obokata + Regular/Van der Pol) |
✅ | libs/physics/forces/ |
WindForces (Cd por ângulo) |
✅ | libs/physics/forces/ |
ThrustForces (Kt/Kq open-water) |
✅ | libs/physics/forces/ |
RudderForces (foil Cl/Cd) |
✅ | libs/physics/forces/ |
TugForces (PUSH/PULL/ESCORTING simplificado) |
✅ | libs/physics/forces/ |
WaveForces + WaveSpectrum (JONSWAP/Pierson/Regular) |
✅ | libs/world/wave/ |
NavalSimulation (orquestrador básico, 1 corpo) |
✅ | libs/simulation/ |
NavalContext / VesselConfig |
✅ | libs/vessel/ |
| JSON scenario reader | ✅ | libs/persistence/ |
| Math utils + PhysicalConstants | ✅ | libs/common/ |
Fases
Fase 1 — Camada de Embarcação
O que entrega: uma embarcação com propulsores, lemes e rebocadores como entidades reais, capaz de navegar autonomamente por waypoints ou reproduzir comandos gravados.
Bloqueado por: nada — depende apenas da Fase 0.
Componentes:
-
Thruster / Rudder como entidades (
libs/vessel/)- Separação entre config estática (parâmetros físicos) e estado dinâmico (RPM atual, ângulo atual)
- Cada entidade aplica seus próprios filtros de 1ª ordem e limitadores de taxa por tick
ThrustForceseRudderForcespassam a ler do estado da entidade, não da config- Ver decisão D8
-
DynamicVessel— aggregate root que possuiThruster[],Rudder[], controlador ativoupdateControl(t, dt)— executa controlador, escreve demands nas entidadesupdateStates(t, dt)— avança dinâmica de cada entidade, computa cinemática derivada (SOG, COG, deriva)
-
Controladores — selecionados por
std::variant, dispatch porstd::visitManeuverController— LOS + PID de heading e velocidade, lista de waypointsPrescribedController— replay de série temporal (leme e RPM por tempo)BerthManeuverSystem— FSM de 3 estados com rebocadores paramétricos (tugs ainda não são corpos independentes)
-
VesselState— estado operacional visível (luzes de navegação, shapes COLREGS, modo operacional)- Transições manuais via API; sem eventos de âncora ou amarração (ver D9)
-
NavalSimulation multi-corpo — corrige limitação de 1 corpo; suporta N
RigidBody6DOF- Ver decisão D11
Fase 2 — World + Multi-domínio naval
O que entrega: todos os corpos navais coexistindo no mesmo mundo com acoplamento de forças
entre eles. NavalSimulation é substituído por World + NavalDomain.
Bloqueado por: Fase 1.
Componentes:
-
World— orquestrador de domínios (ver D1, D3,world-architecture.md)- Relógio global
- Contém
Simulation(container de corpos) eEnvironment(ambiente compartilhado) - Coordena tick multi-domínio com acoplamento fraco Jacobi (ver D2)
-
NavalDomain— substituiNavalSimulation(ver D5)- Gerencia N corpos navais, um
NavalContextpor corpo - Registra
DynamicVesselpara cada corpo naval
- Gerencia N corpos navais, um
-
Environment(global) — corrente, vento, ondas, profundidade (scalar)- Sobe de
NavalSimulationpara oWorld; todos os domínios lêem daqui
- Sobe de
-
CouplingRegistry— acoplamento fraco entre corpos viaCouplingPort- Força + posição + velocidade no ponto de interface (ver D6)
- Permite rebocadores como corpos independentes trocando força com o navio
-
Queries espaciais básicas — posição de todos os corpos, distância entre pares
- Necessário para collision (Fase 4) e para
BerthManeuverSystemcom tugs independentes
- Necessário para collision (Fase 4) e para
Fase 3 — API de controle
O que entrega: controle e observação do simulador via rede. Cenários carregados e controlados externamente. Estado transmitido em tempo real.
Bloqueado por: Fase 2 (API transmite estado do World).
Componentes:
-
apps/server— WebSocket + Protobuf- Carrega cenário JSON e inicializa o
World - Aceita comandos de controle: trocar waypoints, mudar modo, alterar ambiente
- Transmite stream de estado:
BodyStatede todos os corpos +VesselStatepor embarcação
- Carrega cenário JSON e inicializa o
-
Protocolo — Protobuf
- Mensagens:
ScenarioLoad,ControlCommand,StateUpdate,VesselStateUpdate - Sem autenticação, sem multi-tenant — conexão local ou LAN confiável
- Mensagens:
-
Extensão do JSON reader — suporte a waypoints e configuração de controlador no cenário
Fase 4 — Colisão entre corpos
O que entrega: detecção e resposta a colisões entre corpos rígidos no mundo.
Bloqueado por: Fase 2 (queries espaciais do World são pré-requisito para broadphase).
Componentes:
-
Geometria de colisão — representação simplificada por corpo
- Casco: hull convex ou OBB (oriented bounding box) configurável
- Configurado via
VesselConfig(seção de colisão)
-
Broadphase — filtragem de pares candidatos por AABB
- Atualizado a cada tick com posições do World
-
Narrowphase — GJK para detecção de contato entre convexos
-
Resposta a colisão — impulso com restituição e fricção configuráveis
- Força de separação aplicada via
CouplingPortdoCouplingRegistry - Mesma interface de acoplamento da Fase 2 — sem novo mecanismo
- Força de separação aplicada via
Dependências entre fases
Fase 0 (concluída)
└── Fase 1: Vessel Layer
└── Fase 2: World + NavalDomain
├── Fase 3: API de controle
└── Fase 4: Colisão
Fases 3 e 4 são independentes entre si — podem ser desenvolvidas em paralelo após Fase 2.
Fora do escopo deste roadmap
- Mooring e Anchoring (linhas de amarração, catenária, fundeio)
- Batimetria como campo espacial (profundidade é scalar global)
- Domínios não-navais (estrutural, elétrico, aerodinâmico)
- Fast-time (runner batch acelerado)
- SQLite (JSON reader é suficiente)
- Telemetria
Esses itens podem ser adicionados em roadmap futuro sem breaking change na arquitetura,
graças ao modelo de domínios extensíveis do World (ver world-architecture.md e decisions.md).