Problema
O TCC simula um caminhão autônomo no campus da Mauá dentro do CARLA, um simulador pesado que só roda numa máquina com placa de vídeo. Banca, feira e parceiro precisavam ver o resultado sem instalar nada.
Meu papel
Fiz todas as partes: a navegação em Python (percepção, fusão de sensores e controle), o pipeline do mapa, os painéis de telemetria e a maquete 3D publicada.
Solução
- Maquete 3D do campus feita do levantamento topográfico real: malha glTF de 21 partes, 28 prédios casados com a planilha de edificações, anel viário de 784 m com 4 lombadas e 8 faixas, e 411 das 1.743 árvores levantadas.
- Caminhão autônomo com perfil de velocidade determinístico: freia nas lombadas (8 km/h), reduz nas faixas (12 km/h) e para 3 s quando há pedestre.
- Interface de operações: KPIs, linha do tempo da volta, busca com voo de câmera, modos de câmera e um modo apresentação para deixar rodando numa TV.
Como foi feito
- Simulação: Python no CARLA 0.9.16, percepção com YOLO, LiDAR e câmeras, fusão GNSS + IMU com filtro de Kalman, controle Pure Pursuit e telemetria em SQLite.
- Mapa: DXF do levantamento convertido em OpenDRIVE (34 vias, 4 junções, 1,56 km) por um pipeline com validação automática.
- Web: Next.js com export estático e React Three Fiber; compressão meshopt leva o modelo a 0,4 MB e o site inteiro a 2,9 MB.
- Testes: Playwright roda 5 voltas seguidas conferindo que nenhuma roda sai da pista, e um teste confirma que o site funciona offline. A simulação tem 362 testes offline.
Resultados
A maquete abre em qualquer navegador, inclusive no celular, e ficou no ar no GitHub Pages para a banca e a feira. O mesmo dado da simulação alimenta o painel 3D ao vivo e em replay.
Próximos passos
Validar ao vivo a nova rodada do mapa, calibrar o detector de lombadas com o LiDAR real e medir o custo do painel web sobre a simulação (meta: menos de 5% de FPS).
Código
// passes de frenagem (para tras) e aceleracao (para frente),
// duas voltas para fechar o ciclo
for (let r = 0; r < 2; r++)
for (let k = 2 * n - 1; k >= 0; k--) {
const i = k % n;
const j = (i + 1) % n;
v[i] = Math.min(v[i], Math.sqrt(v[j] * v[j] + 2 * A_FREIO * ds));
}
for (let r = 0; r < 2; r++)
for (let k = 0; k < 2 * n; k++) {
const i = (k + 1) % n;
const h = k % n;
v[i] = Math.min(v[i], Math.sqrt(v[h] * v[h] + 2 * A_ACEL * ds));
}Stack
- Python
- CARLA
- YOLO
- OpenDRIVE
- Next.js
- React Three Fiber
- Playwright