simulation

트레이스를 이용한 RBS(Remaining Bus Simulation)

hsl7 2024. 12. 6. 12:22

 

시작하기 전에

제어기를 대상으로 실험을 할 때, 제어기 작동에 필요한 신호들을 CAN으로 공급해야 한다. 이를 RBS (Remaining Bus Simulation, Rest Bus Simulation)라고 한다. 

차에서 측정한 CAN 트레이스를 TSMaster 온라인 재생(replay) 기능으로 RBS를 할 수 있다.

차에서 측정한 CAN 트레이스에는 시험 대상 제어기가 전송한 메시지들이 포함되어 있다. 이 메시지들을 제외하지 않으면 제어기가 전송하는 메시지와 트레이스에서 재생된 메시지가 동시에 버스에 전송되어 충돌이 발생하는 문제가 있다. 

트레이스에서 메시지를 제외하여(필터하는) RBS하는 방법을 설명한다. 

 

개요

  • (내가 실험을 한 2024-09-05 현재) TSMaster의 온라인 재생 기능에는 "전송" 메시지 필터 기능이 없다.
  • 하드웨어 설정에도 "전송" 메시지 필터 기능이 없다.
    • 하드웨어 설정에 "수신" 메시지 필터 기능이 있다. 리스트 방식이 아니라 필터 대상 메시지를 개별적으로 지정하지 못한다.
  • 원본 트레이스에서 제외 대상 메시지를 제외한 트레이스를 만들고, 이 트레이스를 재생한다.

 

트레이스 분석

  • TSMaster는 blf 형식으로 CAN 버스 데이터를 파일로 저장한다. blf는 (아마도 가장) 많이 사용되는 CAN 버스 데이터 파일 형식이다. 
  • blf는 바이너리 파일로 텍스트 에디터에서 보면 아래 그림과 같이 보인다. 내용을 알 수 없다. 

텍스트 에디터로 본 blf 파일

  • 메인 메뉴/ Analysis/ Log Converter 버튼을 클릭하여 Log Converter 창을 연다.

  • Log Converter 창의 Source file에서 blf 파일을 선택한다. (드래그&드롭하면 편리하다.) Destination file에서 asc 버튼을 클릭한 후 Convert 버튼을 클릭한다. blf 파일이 asc로 변환된다. 

  • asc 파일은 텍스트 파일이다. asc 파일의 한 줄은 TSMaster가 수신한 CAN 메시지 한 개이다. 타임스탬프, 메시지 아이디, Rx/Tx, DLC(Data Length Code), 데이터로 구성된다. 

 

 

트레이스에서 특정 아이디의 메시지를 필터하는 파이썬 스크립트 작성하기

  • Claude에게 asc 파일에서 지정한 메시지 아이디들을 pass/stop 필터하는  스크립트 작성을 요청한다.

Claude에 특정 메시지 아이디를 필터하는 파이썬 스크립트를 요청하였다.

 

프람프트

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()

 

filter_asc.py
0.00MB

 

코드 실행 방법

  • claude가 코드 실행 방법을 함께 알려준다.

 

코드 실행 결과

  • 아래 (pass 필터) 명령을 실행한 결과이다.  지정한 아이디의 메시지들만 남았다. 
python filter_asc.py 20240725_venue2024_07_26_09_17_29.asc pass 220 2B0 386

원본 asc 와 필터된 asc

 

 

 

필터된 asc를 재생하기

  • TSMaster의 Bus Playback에서 필터된 asc 파일을 연다. (드래그&드롭하면 편리하다.)
  • 트레이스를 선택한 후, Start Playback 버튼을 클릭한다.
  • 트레이스 창에서 asc 파일의 메시지들이 재생되는 것을 확인할 수 있다. 

필터된 asc 파일을 재생한다. 트레이스 창에서 지정된 메시지들만 표시되는 것을 확인할 수 있다.

 

 

결론

  • 제어기 대상으로 실험을 할 때, 차량에서 측정한 트레이스로 RBS (Remaining Bus Simulation, Rest Bus Simulation)를 할 수 있다.
  • RBS를 위해서 트레이스에서 제어기가 전송하는 메시지들을 제거해야 한다.
  • 방법은 아래와 같다.
    • TSMaster에서 트레이스 blf 파일을 asc 파일로 변환한다.
    • 첨부된 파이썬 스크립트로 asc에서 지정한 아이디들의 메시지들을 (pass/ stop) 필터하여 asc 파일로 저장한다.
    • TSMaster에서 필터된 asc 파일을 재생한다.  

 

 

목차 :: hsl's tsmaster 사용기