Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

iLogger

Platform Framework Team Version

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.

Visão geral

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.

Arquitetura

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
Loading

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 via get_channel(key)), WorkspaceManager (persistência de layouts, presets e canais virtuais em ~/.mangue_logger/) e VirtualChannel (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 via scipy.signal.filtfilt), SignalProcessor (FFT com janela Hanning, histogramas, detecção de fases, estimativa de marchas) e IntelligenceEngine (anomalias por Z-score robusto/MAD, correlações de Pearson, comparação entre runs).
  • UI Layer (analysis_view.py, main.py) — PyQt6 + PyQtGraph com mode='peak' (downsampling) e setClipToView(True); PlotPanel (cursor A/B sincronizado), MultiAxisOverlay (múltiplos sinais com eixos Y independentes), PanelCanvas (splitter vertical com drag-to-reorder) e SyncManager (sincronização de cursores entre painéis).

Estrutura do projeto

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

Funcionalidades

Carregamento e processamento

  • 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.
  • ProcessingCache com hash SHA-256 da configuração de filtro evita reprocessamento redundante (ver Cache de filtragem).
  • IntelligenceEngine gera insights automáticos: anomalias (Z-score robusto/MAD), correlações de Pearson e comparação entre runs.

Painéis de análise

Í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

Canais virtuais

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

Exportação

Formato Conteúdo
Excel Métricas, variações %, dados brutos, gráficos embutidos, fases, correlações, histogramas
PDF 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

Formato de entrada CSV

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
...

Cache de filtragem

O ProcessingCache evita reprocessamento redundante:

  1. O usuário ajusta o slider do filtro → FilterPanel emite filter_changed.
  2. FilterEngine.apply() calcula SHA-256(json.dumps(fs)) em menos de 1 µs.
  3. Se o hash já existe no cache → retorna em O(1) sem recalcular.
  4. 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.

Dependências

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

Como instalar e executar

Requer Python 3.10+.

git clone <url-do-repositorio>
cd mangue_logger_v6
pip install -r requirements.txt
python main.py
  1. 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.
  2. 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.
  3. Clique em ▶ Rodar Análise para carregar os dados e abrir a aba Análise.
  4. Ajuste o filtro no painel ⚗ Filtro — a prévia é instantânea graças ao cache de filtragem.
  5. Explore os demais painéis e adicione canais virtuais conforme necessário.
  6. 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).

Equipe

Projeto mantido pela equipe Mangue Baja, da Universidade Federal de Pernambuco (UFPE), competidora do Baja SAE Brasil.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages