Sistema de telemetria e análise de dados automotivos da equipe Mangue Baja (UFPE), usado para carregar, filtrar e analisar os dados de sensores capturados durante as runs do veículo Baja SAE.
O Mangue Logger lê os dados brutos de frequência do sensor de disco de freio do veículo (colunas f1/f2 do CSV), converte esses sinais em canais físicos — RPM, velocidade, aceleração, distância — e disponibiliza:
- Filtragem digital configurável em tempo real, com cache para troca instantânea de parâmetros.
- Um conjunto de painéis de análise (estatísticas, FFT, histogramas, fases, marchas, correlações).
- Detecção automática de insights (anomalias, correlações, comparação entre runs).
- Canais virtuais definidos por expressões NumPy.
- Exportação para Excel, PDF, JSON e CSV.
Toda a matemática do pipeline é 100% vetorizada (NumPy/SciPy), sem loops Python sobre os arrays de amostras — o que mantém a interface responsiva mesmo em runs de 100.000+ pontos.
flowchart LR
subgraph Entrada
CSV[CSV bruto - colunas f1 / f2] --> RD[RunData]
end
subgraph "Processing Core"
RD --> FE[FilterEngine]
FE -- cache SHA-256 --> PC[(ProcessingCache)]
FE --> SP[SignalProcessor]
FE --> IE[IntelligenceEngine]
end
subgraph UI
SP --> AV[AnalysisWidget - painéis]
IE --> AV
AV --> VC[Canais virtuais]
end
subgraph Saída
AV --> EXP[Exporters]
EXP --> XLSX[(Excel)]
EXP --> PDF[(PDF)]
EXP --> JSON[(JSON)]
EXP --> CSVOUT[(CSV tidy)]
end
O projeto segue três camadas:
- Data Layer (
config.py,engine.py) —AppState(estado global com sinais Qt),RunData(carregamento de CSV e acesso uniforme a canais viaget_channel(key)),WorkspaceManager(persistência de layouts, presets e canais virtuais em~/.mangue_logger/) eVirtualChannel(avaliação de expressões NumPy em sandbox restrito). - Processing Core (
processing_core.py) —ProcessingCache(cache thread-safe com hash SHA-256 da configuração de filtro),FilterEngine(Butterworth, Savitzky-Golay, Chebyshev I, Bessel, Mediana, Média Móvel viascipy.signal.filtfilt),SignalProcessor(FFT com janela Hanning, histogramas, detecção de fases, estimativa de marchas) eIntelligenceEngine(anomalias por Z-score robusto/MAD, correlações de Pearson, comparação entre runs). - UI Layer (
analysis_view.py,main.py) — PyQt6 + PyQtGraph commode='peak'(downsampling) esetClipToView(True);PlotPanel(cursor A/B sincronizado),MultiAxisOverlay(múltiplos sinais com eixos Y independentes),PanelCanvas(splitter vertical com drag-to-reorder) eSyncManager(sincronização de cursores entre painéis).
mangue_logger_v6/
├── main.py # Entry point — MainWindow, ControlsPanel
├── config.py # Constantes, tema, AppState (sinais Qt)
├── engine.py # RunData, load_runs, VirtualChannel, WorkspaceManager
├── processing_core.py # ProcessingCache, FilterEngine, SignalProcessor, IntelligenceEngine
├── analysis_view.py # Todos os widgets de análise e canvas
├── exporters.py # CSV via DLL, Excel, PDF, JSON
└── requirements.txt
- Leitura de CSV com engine C do pandas; cada grupo de 10 linhas de
f1/f2é somado e consolidado em 1 amostra a 20 Hz. - Cálculo vetorizado de RPM e velocidade a partir das frequências brutas — sem loops Python.
- 6 filtros digitais aplicáveis em tempo real: Butterworth, Savitzky-Golay, Chebyshev I, Bessel, Mediana e Média Móvel.
ProcessingCachecom hash SHA-256 da configuração de filtro evita reprocessamento redundante (ver Cache de filtragem).IntelligenceEnginegera insights automáticos: anomalias (Z-score robusto/MAD), correlações de Pearson e comparação entre runs.
| Ícone | Painel | Descrição |
|---|---|---|
| ⚗ | Filtro | Configuração interativa com preview instantâneo e presets |
| 📊 | Estatísticas | Tabela com min/max/média/σ; modo estendido com percentis, RMS, skewness |
| ⚖ | Comparação | Barras comparativas de métricas entre todas as runs |
| 🧠 | Inteligência | Insights automáticos com badges de criticidade e correlações Pearson |
| 📶 | Histograma | Distribuição de frequência com normalização e legenda |
| 〰 | FFT / Espectro | Espectro de frequência (0–20 Hz) com janela Hanning e detecção de freq. dominante |
| ✦ | Dispersão | Scatter plot X×Y com linha de regressão e coeficiente de Pearson |
| 🎯 | Fases | Regiões coloridas de aceleração/frenagem/estabilização + gráfico de pizza temporal |
| ⚙ | Marchas | Diagrama RPM×Vel com linhas de razão de marcha estimadas |
| 🔗 | Correlações | Matriz de correlação Pearson com heatmap de células coloridas |
Editor acessível via + Adicionar → ⚙ Canais Virtuais.
- Variáveis disponíveis:
tempo·vel·rpm·acel·dist·rpm_raw·vel_raw·pi - Funções disponíveis:
np·abs·sqrt·log·exp·mean·clip·grad·cumsum·sin·cos·diff·interp·where·fft
rpm * vel / 1000 # Potência estimada (adimensional)
np.clip(acel, 0, None) # Apenas aceleração positiva
np.gradient(vel, tempo) # Derivada numérica da velocidade
dist / 1000 # Distância em km
rpm / (vel + 0.01) / 100 # Estimativa de slip| Formato | Conteúdo |
|---|---|
| Excel | Métricas, variações %, dados brutos, gráficos embutidos, fases, correlações, histogramas |
| Capa com setup do veículo, gráficos matplotlib, scatter plots, histogramas, fases | |
| JSON | Todos os canais + estatísticas estendidas + fases + correlações por run |
| CSV tidy | Formato long com coluna Run + todos os canais filtrados |
O sistema espera um CSV com as colunas f1 e f2 (frequências brutas do sensor de disco de freio):
f1,f2
12,8
15,9
...
O ProcessingCache evita reprocessamento redundante:
- O usuário ajusta o slider do filtro →
FilterPanelemitefilter_changed. FilterEngine.apply()calculaSHA-256(json.dumps(fs))em menos de 1 µs.- Se o hash já existe no cache → retorna em O(1) sem recalcular.
- Se não existe → executa o pipeline SciPy (O(N log N)) e armazena o resultado.
Resultado: troca instantânea de filtros mesmo em runs de 100.000+ amostras.
Gerenciadas pelo requirements.txt:
| Biblioteca | Versão mínima | Uso |
|---|---|---|
| PyQt6 | 6.5.0 | Interface gráfica |
| pyqtgraph | 0.13.3 | Plotagem de alta performance com downsampling |
| numpy | 1.24.0 | Processamento vetorizado dos canais |
| scipy | 1.11.0 | Filtros digitais (filtfilt) |
| pandas | 2.0.0 | Leitura de CSV e manipulação de dataframes |
| xlsxwriter | 3.1.0 | Exportação para Excel |
| reportlab | 4.0.0 | Exportação para PDF (opcional) |
| matplotlib | 3.7.0 | Gráficos embutidos nos relatórios PDF/Excel (opcional) |
| typing_extensions | 4.0.0 | Tipagem e utilitários |
Requer Python 3.10+.
git clone <url-do-repositorio>
cd mangue_logger_v6
pip install -r requirements.txt
python main.py- Na aba Controles, preencha o Setup do Veículo (RPM baixa/alta, peso do CVT, constante da mola, angulação da rampa) — esses dados aparecem na capa dos relatórios.
- Em Arquivos para Análise, selecione um ou mais CSVs de runs. A primeira run da lista é usada como base de comparação; arraste para reordenar.
- Clique em ▶ Rodar Análise para carregar os dados e abrir a aba Análise.
- Ajuste o filtro no painel ⚗ Filtro — a prévia é instantânea graças ao cache de filtragem.
- Explore os demais painéis e adicione canais virtuais conforme necessário.
- Exporte o resultado em PDF, Excel, JSON ou CSV pelos botões da barra superior.
Também é possível gerar o CSV de uma run diretamente a partir da DLL do logger, informando o diretório das runs, o número da run e o diretório de saída no card Geração de CSV (DLL).
Projeto mantido pela equipe Mangue Baja, da Universidade Federal de Pernambuco (UFPE), competidora do Baja SAE Brasil.