id별 묶음 저장하여 시간대 샘플링 맞춤

This commit is contained in:
2025-11-03 21:21:11 +00:00
parent d3720bd822
commit 53c94fcc6f

View File

@@ -4,6 +4,7 @@ ESP32 CAN Logger bin 파일을 MDF 형식으로 변환
- CAN Database (DBC 파일) 사용
- Value Table (시그널 값-텍스트 매칭) 지원 (올바른 conversion으로 저장)
- asammdf 라이브러리 사용
- 같은 CAN ID의 시그널들을 그룹으로 묶어서 저장 (수정)
"""
import struct
@@ -165,10 +166,30 @@ class CANBinToMDF:
metadata: MDF 파일 메타데이터 (선택)
compression: 압축 레벨 (0=없음, 1=deflate, 2=transposed, 기본값=2)
"""
signals = []
total_signals = 0
skipped_signals = []
value_table_signals = [] # value table이 있는 시그널 추적
# MDF 파일 생성
if metadata is None:
metadata = {}
default_metadata = {
'author': 'ESP32 CAN Logger',
'department': '',
'project': 'CAN Data Logging',
'subject': 'CAN Bus Data',
}
default_metadata.update(metadata)
mdf = MDF(version='4.10')
# 메타데이터 설정
for key, value in default_metadata.items():
if hasattr(mdf.header, key):
setattr(mdf.header, key, value)
# 메시지별로 시그널 그룹을 만들어서 append
for msg_name, msg_data in decoded_data.items():
timestamps = np.array(msg_data['timestamps'], dtype=np.float64)
@@ -178,6 +199,9 @@ class CANBinToMDF:
except:
continue
# 이 메시지의 시그널들을 담을 리스트
msg_signals = []
for signal_name, values in msg_data.items():
if signal_name == 'timestamps':
continue
@@ -271,30 +295,12 @@ class CANBinToMDF:
conversion=conversion # conversion 추가
)
signals.append(signal)
# MDF 파일 생성
if metadata is None:
metadata = {}
default_metadata = {
'author': 'ESP32 CAN Logger',
'department': '',
'project': 'CAN Data Logging',
'subject': 'CAN Bus Data',
}
default_metadata.update(metadata)
mdf = MDF(version='4.10')
# 메타데이터 설정
for key, value in default_metadata.items():
if hasattr(mdf.header, key):
setattr(mdf.header, key, value)
# 시그널 추가
if signals:
mdf.append(signals)
msg_signals.append(signal)
# 같은 CAN ID(메시지)의 시그널들을 그룹으로 묶어서 append
if msg_signals:
mdf.append(msg_signals)
total_signals += len(msg_signals)
# MDF 파일 저장 (압축 적용)
if compression > 0:
@@ -318,7 +324,8 @@ class CANBinToMDF:
compression_name = compression_names.get(compression, f"레벨 {compression}")
print(f"✓ MDF 파일 생성 완료: {output_path}")
print(f" - 시그널 수: {len(signals)}")
print(f" - 메시지 그룹 수: {len(decoded_data)}")
print(f" - 총 시그널 수: {total_signals}")
print(f" - Value Table 적용 시그널: {len(value_table_signals)}")
print(f" - 파일 크기: {compressed_size:.2f} MB ({compression_name})")
if skipped_signals:
@@ -393,8 +400,8 @@ def main():
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
사용 예제:
python can_bin_to_mdf_final.py -d example.dbc -i canlog_001.bin -o output.mf4
python can_bin_to_mdf_final.py -d vehicle.dbc -i data/*.bin -o output/
python can_bin_to_mdf.py -d example.dbc -i canlog_001.bin -o output.mf4
python can_bin_to_mdf.py -d vehicle.dbc -i data/*.bin -o output/
"""
)
@@ -448,4 +455,4 @@ def main():
if __name__ == "__main__":
main()
main()