-
트레이스를 이용한 RBS(Remaining Bus Simulation)simulation 2024. 12. 6. 12:22
시작하기 전에
제어기 대상으로 실험을 할 때, 제어기 작동에 필요한 신호들을 CAN으로 공급해야 한다. 이를 RBS (Remaining Bus Simulation, Rest Bus Simulation)라고 한다.
TSMaster로 차에서 측정한 CAN 트레이스를 온라인 재생(replay)하는 방식으로 RBS를 할 수 있다.
차에서 측정한 CAN 트레이스에는 시험 대상 제어기가 전송한 메시지들이 포함되어 있다. 이 메시지들을 제외하지 않으면 제어기가 전송하는 메시지와 트레이스에서 재생된 메시지가 동시에 버스에 전송되는 문제가 있다.
트레이스에서 메시지를 제외하여(필터하는) RBS하는 방법을 설명한다.
개요
- (내가 실험을 한 2024-09-05 현재) TSMaster의 온라인 재생 기능에는 전송 메시지 필터 기능이 없다.
- 하드웨어 설정에도 전송 메시지 필터 기능이 없다. 하드웨어 설정에 수신 메시지 필터 기능이 있다. 리스트 방식이 아니라 필터 대상 메시지를 개별적으로 지정하지 못한다.
- 원본 트레이스에서 제외 대상 메시지를 제외한 트레이스를 만들고, 이 트레이스를 재생한다.
트레이스 분석
- TSMaster는 blf 형식으로 CAN 버스 데이터를 파일로 저장한다. blf는 (아마도 가장) 많이 사용되는 CAN 버스 데이터 파일 형식이다.
- blf는 바이너리 파일로 텍스트 에디터에서 보면 아래 그림과 같이 보인다. 내용을 알 수 없다.
- 메인 메뉴/ Analysis/ Log Converter 버튼을 클릭하여 Log Converter 창을 연다.
- Log Converter 창의 Source file에서 blf 파일을 선택한다. (드래그&드롭하면 편리하다.) Destination file을 선택한다. asc 버튼을 클릭하면 blf 파일이 asc로 변환된다.
- asc 파일은 텍스트 파일이다. asc 파일의 한 줄은 TSMaster가 수신한 CAN 메시지 한 개이다. 타임스탬프, 메시지 아이디, DLC(Data Length Code), 데이터로 구성된다.
트레이스에서 특정 아이디의 메시지를 필터하는 파이썬 스크립트 작성하기
- Claude에게 asc 파일에서 지정한 메시지 아이디들을 pass/stop 필터하는 스크립트 작성을 요청한다.
프람프트
date 4/9/2024 20:7:43.359
base hex timestamps absolute
no internal events logged
// TOSUN libLog V2022.10.6.794
14.002498 1 2B0 Tx d 6 EB FF 00 07 31 AC
14.009001 1 220 Tx d 8 F0 43 7E 00 00 51 10 AB
14.012371 1 2B0 Tx d 6 EC FF 02 07 52 17
14.015545 1 386 Tx d 8 00 40 00 40 00 40 00 80
14.019155 1 220 Tx d 8 F2 A3 7E 00 00 51 10 BD
14.022387 1 2B0 Tx d 6 EB FF 02 07 33 95
14.029039 1 220 Tx d 8 F3 A3 7E 00 00 50 10 CD
14.032499 1 2B0 Tx d 6 EB FF 00 07 64 1B
14.033306 1 386 Tx d 8 00 80 00 40 00 40 00 80
14.039015 1 220 Tx d 8 F1 A3 7E 00 00 4F 10 D8
위는 파일 확장자가 asc인 파일의 내용입니다.
asc는 일반 텍스트 파일입니다.
asc의 내용은 차량 CAN 통신의 데이터입니다.
처음 네 줄은 메타 정보입니다.
5번째 줄부터 통신 데이터입니다. 파일의 마지막 줄까지 통신 데이터이며 같은 형식입니다.
한 줄이 한 CAN 메시지입니다.
컬럼들은 공백으로 구분됩니다. 컬럼 별 데이터는 아래와 같습니다.
컬럼 1: timestamp
컬럼 2: channel
컬럼 3: message id
컬럼 4: Tx 혹은 Rx 구분 표시
컬럼 5: d (무슨 의미가 있을 텐데 모르겠습니다. 항상 d입니다. 무슨 의미인지 알면 알려주세요.)
컬럼 6: DLC (Data Length Code)
컬럼 7 이후: 데이터. 각 컬럼이 1 byte를 Hex로 표시한 겁니다.
나는 원하는 메시지 id들만 pass 하거나 stop 하여 원래 파일 이름에 pass_filtered 혹은 stop_filtered 라는 post-fix가 붙은 파일로 저장하고 싶습니다. 메타 정보를 포함해서.
이렇게 하는 파이썬 프로그램을 짜줄 수 있습니까?
코드
- claude가 작성한 코드는 아래와 같다.
import argparse import os def filter_can_messages(input_file, output_file, filter_ids, filter_type): with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: # Write metadata for _ in range(4): line = infile.readline() outfile.write(line) # Process CAN messages for line in infile: parts = line.split() if len(parts) >= 3: message_id = parts[2] if filter_type == 'pass': if message_id in filter_ids: outfile.write(line) elif filter_type == 'stop': if message_id not in filter_ids: outfile.write(line) def main(): parser = argparse.ArgumentParser(description='Filter CAN messages based on message IDs.') parser.add_argument('input_file', help='Input .asc file') parser.add_argument('filter_type', choices=['pass', 'stop'], help='Filter type: pass or stop') parser.add_argument('filter_ids', nargs='+', help='Message IDs to filter') args = parser.parse_args() input_file = args.input_file filter_type = args.filter_type filter_ids = set(args.filter_ids) file_name, file_extension = os.path.splitext(input_file) output_file = f"{file_name}_{filter_type}_filtered{file_extension}" filter_can_messages(input_file, output_file, filter_ids, filter_type) print(f"Filtered messages saved to {output_file}") if __name__ == "__main__": main()
코드 실행 방법
- claude가 코드 실행 방법을 함께 알려준다.
코드 실행 결과
- 아래 (pass 필터) 명령을 실행한 결과이다. 지정한 아이디의 메시지들만 남았다.
python filter_asc.py 20240725_venue2024_07_26_09_17_29.asc pass 220 2B0 386
필터된 asc를 온라인 재생하기
- TSMaster의 Bus Playback에서 필터된 asc 파일을 연다. (드래그&드롭하면 편리하다.)
- 트레이스를 선택한 후, Start Playback 버튼을 클릭한다.
- 트레이스 창에서 asc 파일의 메시지들이 재생되는 것을 확인할 수 있다.
결론
- 제어기 대상으로 실험을 할 때, 차량에서 측정한 트레이스로 RBS (Remaining Bus Simulation, Rest Bus Simulation)를 할 수 있다.
- RBS를 위해서 트레이스에서 제어기가 전송하는 메시지들을 제거해야 한다.
- TSMaster에서 트레이스 blf 파일을 asc 파일로 변환하고, 간단한 파이썬 스크립트로 asc에서 지정한 메시지 아이디들을 (pass/ stop) 필터 한 후, 필터된 asc를 TSMaster에서 재생하는 방식으로 RBS를 할 수 있다.
'simulation' 카테고리의 다른 글
Symbol Mapping 기능을 이용한 yaw_rate_ws 계산하기 (0) 2024.12.09 CAN 버스 시뮬레이션 (RBS: Remaining Bus Simulation) (0) 2024.11.25 판넬로 사용자 입력 받는 법 (0) 2024.11.03