id별 묶음 저장하여 시간대 샘플링 맞춤
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user