INCA計測データ(MDF)をCSV/MAT変換するツールをオープンソースで公開しました
はじめに
車載開発の現場では、INCA(Integrated Calibration and Application Tool)などの計測ツールから出力されるMDF(Measurement Data Format)ファイルも扱います。
ですが、MDFファイルはそのままではExcelやMATLABで読み込めないため、専用の解析ツールが必要になります。市販ツールは高価だったり、もうむしろMATLABに読み込めれば、実験データをそのままsimulinkで作成したロジックの入力として流し込んで、デバッグ作業ができるのにと、使い勝手の悪さを感じることがあると思います。
そこで、PythonがインストールされていないPCでも動く無料の変換ツールを開発し、以前は個人のホームページで配布していました。今回、ソースコードを整理してGitHubでオープンソースとして公開することにしました。
特に本ツールでは、GPLライセンスのライブラリを使用しながらMITライセンスで公開するという、ライセンス対応の実装についても工夫しています。
-
GitHubリポジトリ
https://github.com/Nishina-N/MDFDataConverter -
Windows実行ファイル(.exe)
https://github.com/Nishina-N/MDFDataConverter/releases/tag/v2.01
ツール(MDFDataConverter)の機能
MDFDataConverterは、GUIで操作できる変換ツールです。
- INCA計測データの変換: MDFファイル(*.dat)を読み込み。
- リサンプリング: 10ms / 100ms / 1s周期、またはオリジナル軸を保持。
- 出力形式: CSV(Excel用)とMAT(MATLAB/Simulink用)に対応。
対応フォーマット
| 分類 | 形式 | 備考 |
|---|---|---|
| 入力 | MDF(*.dat) | INCA計測データ形式に対応 |
| 出力 | CSV / MAT | 分析ソフトで即利用可能 |
使い方
実行ファイル版(.exe)を使用すれば、Pythonの環境構築は不要です。
-
GitHub Releasesから
MDFDataConverter_vX.XX_win64.zipをダウンロードして解凍します。 -
MDFDataConverter.exeを実行します。 - GUI上で以下の項目を設定します。
- Select Log file: 変換したいMDFファイル(*.dat)を選択。
- Time axis: 時間軸の処理方法(リサンプリング周期など)を選択。
- Output format: CSV または MAT を選択。
-
Convert!をクリックします。
変換されたファイルは、元のログファイルと同じフォルダ内に保存されます。
開発のポイント
実際の開発現場で直面した課題と、それを解決するための実装について紹介します。
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も公開しています。
こちらはGPLライセンスの問題がなく、より実装がシンプルです。また、DBC/BLF整合性チェック機能など、実務で役立つ機能を実装しています。
動作報告や機能改善のご要望がございましたら、GitHubのIssuesやコメント欄にてお知らせいただけますと幸いです。
Discussion