ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트레이스를 이용한 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는 바이너리 파일로 텍스트 에디터에서 보면 아래 그림과 같이 보인다. 내용을 알 수 없다. 

    텍스트 에디터로 본 blf 파일

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

     

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

    blf를 asc로 변환한다.

    • asc 파일은 텍스트 파일이다. asc 파일의 한 줄은 TSMaster가 수신한 CAN 메시지 한 개이다. 타임스탬프, 메시지 아이디, 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 byteHex로 표시한 겁니다.

    나는 원하는 메시지 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에서 재생하는 방식으로 RBS를 할 수 있다.