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

- 메인 메뉴/ 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 필터하는 스크립트 작성을 요청한다.

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

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