🚛

INCA計測データ(MDF)をCSV/MAT変換するツールをオープンソースで公開しました

に公開

はじめに

車載開発の現場では、INCA(Integrated Calibration and Application Tool)などの計測ツールから出力されるMDF(Measurement Data Format)ファイルも扱います。

ですが、MDFファイルはそのままではExcelやMATLABで読み込めないため、専用の解析ツールが必要になります。市販ツールは高価だったり、もうむしろMATLABに読み込めれば、実験データをそのままsimulinkで作成したロジックの入力として流し込んで、デバッグ作業ができるのにと、使い勝手の悪さを感じることがあると思います。

そこで、PythonがインストールされていないPCでも動く無料の変換ツールを開発し、以前は個人のホームページで配布していました。今回、ソースコードを整理してGitHubでオープンソースとして公開することにしました。

特に本ツールでは、GPLライセンスのライブラリを使用しながらMITライセンスで公開するという、ライセンス対応の実装についても工夫しています。

ツール(MDFDataConverter)の機能

MDFDataConverterは、GUIで操作できる変換ツールです。

  • INCA計測データの変換: MDFファイル(*.dat)を読み込み。
  • リサンプリング: 10ms / 100ms / 1s周期、またはオリジナル軸を保持。
  • 出力形式: CSV(Excel用)とMAT(MATLAB/Simulink用)に対応。

対応フォーマット

分類 形式 備考
入力 MDF(*.dat) INCA計測データ形式に対応
出力 CSV / MAT 分析ソフトで即利用可能

使い方

実行ファイル版(.exe)を使用すれば、Pythonの環境構築は不要です。

  1. GitHub Releasesから MDFDataConverter_vX.XX_win64.zip をダウンロードして解凍します。
  2. MDFDataConverter.exe を実行します。
  3. GUI上で以下の項目を設定します。
    • Select Log file: 変換したいMDFファイル(*.dat)を選択。
    • Time axis: 時間軸の処理方法(リサンプリング周期など)を選択。
    • Output format: CSV または MAT を選択。
  4. Convert! をクリックします。

MDFDataConverter画面

変換されたファイルは、元のログファイルと同じフォルダ内に保存されます。

開発のポイント

実際の開発現場で直面した課題と、それを解決するための実装について紹介します。

1. 現場の課題:GPLライセンスへの対応

MDF形式のパースには、mdfreaderというPythonライブラリを使用しています。このライブラリは非常に強力で、MDF3/MDF4の各種バージョンに対応し、リサンプリング処理なども簡単に実行できます。

import mdfreader

# MDF読み込み
extract_data = mdfreader.Mdf(data_file_path)

# リサンプリングしてCSV出力(10ms周期)
extract_data.export_to_csv(
    file_name='ExtractData.csv', 
    sampling=0.01
)

ただし、mdfreaderはGPL v3ライセンス(コピーレフト)です。そのまま組み込むとプロジェクト全体がGPLになってしまいます。本体はMITライセンスで公開したかったため、モジュール分離という設計を採用しました。

MDFDataConverter/
├── MDFdata2matcsv.py       # MIT License(本体)
└── tool/
    └── MDF_Extractor.py    # GPL v3(mdfreaderを使用)

本体からは設定ファイル経由で呼び出し、GPL部分を疎結合にしています。

# 設定ファイル作成
config_file_name = 'Configuration.cfg'
with open(config_file_name, 'w') as f:
    f.write(data_file_name + '\n')
    f.write('1\n')  # CSVフラグ
    f.write(str(sample_time_step))

# GPL部分を外部モジュールとして呼び出し
from tool import MDF_Extractor
extraction_state = MDF_Extractor.main()

# 設定ファイル削除
if os.path.exists(config_file_name):
    os.remove(config_file_name)

実行ファイルにはGPL部分も含まれるため、README_BINARY.txtに以下を明記することで、GPLの要件(ソースコードの入手方法の明記)を満たしています。

## License Information

1. MDFDataConverter (Main program)
   - License: MIT License

2. MDF_Extractor module (included in the executable)
   - License: GNU General Public License (GPL) v3
   - Source code: https://github.com/Nishina-N/MDFDataConverter

2. MATLAB互換性の確保

MAT形式で出力する際、MATLABの変数名には「31文字以内」という制限があります。これを超えると読み込みエラーの原因となるため、ツール側で名称を調整しています。

# MATLAB変数名の長さ制限(31文字)に対応
max_name_length = 31
signalname_for_dict = signal_name.replace('$', 'LOG_')

if len(signalname_for_dict) > max_name_length:
    signalname_for_dict = signalname_for_dict[:max_name_length]

# scipy.ioを使用してMATLAB構造体として保存
sio.savemat(write_file_name, write_dict)

3. 文字コード問題への対応

MDFファイルから抽出したデータをCSVに変換する際、文字コードの問題が発生することがあります。codecsモジュールを使用して安全に処理しています。

import codecs

# codecsで安全に読み込み
with codecs.open(temp_file_name, "r", "utf-8", "ignore") as f:
    temp_df = pd.read_csv(f, low_memory=False)

# 不要な行を削除して再保存
temp_df = temp_df.iloc[1:temp_df.size, :]
temp_df.to_csv(temp_file_name, index=False)

4. エラーハンドリングとリトライ

ファイル保存時、Excelで同名ファイルを開いていると書き込みエラーになります。リトライ機構を実装し、ユーザーがファイルを閉じる時間を与えるため2秒待機してリトライします。

for i in range(3):  # 最大3回実行
    try:
        if fcsv == 1:
            temp_df.to_csv(write_file_name, index=False)
        else:
            sio.savemat(write_file_name, write_dict)
        
        msgbox.showinfo('information', 'Done')
        break
        
    except Exception as e:
        if i > 0:
            time.sleep(2)
        if i < 2:
            msgbox.showwarning('error',
                'Writing error has occurred.\n'
                'If you opened same named file, please close it.')

技術スタック

言語: Python 3.7+
MDF処理: mdfreader(GPL v3)
データ処理: pandas, numpy, scipy
GUI: tkinter
ビルド: PyInstaller

まとめ

INCA計測データの変換ツールをオープンソース化し、GPLライセンスのライブラリを使用しながらMITライセンスで公開する方法を実装しました。

市販ツールが不足している環境や、解析の自動化を検討されている方の助けになれば幸いです。ソースコードも公開しておりますので、業務に合わせたカスタマイズの参考としてもご活用ください。

関連記事

姉妹ツールとして、CANログ(BLF/ASC)を変換するCANDataConverterも公開しています。

https://zenn.dev/nishina__n/articles/0b41ae81b98b5c

こちらはGPLライセンスの問題がなく、より実装がシンプルです。また、DBC/BLF整合性チェック機能など、実務で役立つ機能を実装しています。


動作報告や機能改善のご要望がございましたら、GitHubのIssuesやコメント欄にてお知らせいただけますと幸いです。

Discussion