ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포르쉐 타이칸 CAN 데이터에서 요-레이트 신호 찾기
    application 2026. 1. 4. 00:49

    시작하기 전에 

    타이칸(Taycan)은 포르쉐(Porsche)에서 만든 전기 스포츠 세단이다.

    포르쉐 타이칸 (출처:포르쉐코리아 홈페이지)

     

    이 차의 CAN 데이터 파일에서 어느 메시지, 어느 위치, 몇 비트 크기로 요레이트 신호가 포함되어 있는지 찾아서 dbc 파일에 추가해 달라는 요청을 받았다. 그 방법을 설명한다.

     

     

    개요

    • 내게 주어진 것들
    • 나의 작전: 비트 패턴 검색
    • 작전 실행
    • CAN 리버스 엔지니어링 연장 개발
    • 결론

     

     

    내게 주어진 것들

    • 타이칸을 주행하며 CAN 데이터를 측정할 수 있다.
    • 타이칸에서 측정한 CAN blf 파일
    • 네 바퀴 속도 (WSFL=wheel speed front left, WSFR=wheel speed front right, WSRL=wheel speed rear left, WSRR=wheel speed rear right) 신호들의 정의가 포함된 dbc 파일

     

    나의 작전

    기준 신호 만들기

    • 나는 전에 바퀴 속도에서 요-레이트 신호를 계산한 적이 있다. 
    • CAN 데이터 blf 파일과 네 바퀴 속도 신호들의 정의가 있는 dbc 파일이 있으니, 전에 했던 방법대로 요-레이트를 계산한다.
    • 이렇게 계산한 요-레이트 신호가 내가 찾을 요-레이트 신호의 기준이다.
    • 데이터에 요-레이트 신호가 크게 나오도록 선회 중에 신호를 측정한다. 그러기 위해서 나는 로터리를 한 바퀴 돈다.

    비트 패턴 검색

    • 작업 대상 메시지 아이디를 정한다.
    • 작업할 신호 길이를 n 비트로 가정한다.
    • 시작 비트 위치를 0번 비트 위치로 하여 데이터를 추출한다.
    • 기준 신호와 추출 신호의 Pearson Correlation (피어슨 상관 계수. 이하 상관계수)를 계산하여 저장한다.
    • 아래 그림은 4 바이트 (32 비트)길이 메시지의 0번 비트를 신호 시작 위치로 하여 8 비트 신호를 추출하는 것을 시각화한 것이다. 한 줄은 한 메시지이다. 그림에 있는 메시지들은 blf 파일의 전체 메시지들에서 아이디가 같은 메시지들만 모은 것이다.
    t_0: ▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    t_1: ▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    t_2: ▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    . . . 
    t_n: ▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    • 시작 비트 위치를 1번 비트 위치로 하여 데이터를 추출하고, 상관계수를 계산하고 저장한다. 아래 그림은 신호 시작 위치를 1번 비트 위치로 이동한 상태이다. 
    t_0: ☐▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    t_1: ☐▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    t_2: ☐▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    . . . 
    t_n: ☐▨▨▨▨▨▨▨▨☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐
    • 이런 식으로 시작 비트 위치를 DLC x 8 - signal_size_in_bit 까지 이동하며, 추출-계산-저장을 반복한다.
    t_0: ☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐▨▨▨▨▨▨▨▨
    t_1: ☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐▨▨▨▨▨▨▨▨
    t_2: ☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐▨▨▨▨▨▨▨▨
    . . . 
    t_n: ☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐☐▨▨▨▨▨▨▨▨

     

    • 위 계산을 신호의 크기를 변경하면서 실시한다. 9 비트, 10 비트, ...
    • 위 계산을 전체 메시지 아이디를 대상으로 실시한다. 0x001, 0x002, ...
    • 이 외에도 신호 타입 (signed, unsigned)과 endian (little-endian, big-endian)을 바꿔가며 모든 조합을 대상으로 상관계수를 계산한다. (signed, little-endian), (signed, big-endian), (unsigned, little-endian), (unsigned, big-endian)
    • 비트 패턴 검색에 관한 상세 설명을 아래 링크의 포스트에 했다. 
    • 변수(CAN 채널, 메시지 아이디, 메시지 길이, 데이터 길이, 신호 길이 (8 비트부터 16 비트까지), 신호 타입, endian)가 많고, 각 변수의 경우의 수가 적지 않다. 그들의 곱인 조합의 수가 크다. 즉, 검색 연산의 양이 상당하다.
    • 검색 시간을 절약하기 위해 데이터의 일부 구간을 추출하여 사용한다. 아래 그래프는 yaw_rate 신호를 찾은 후에 그린 것이다. 맨 아래 곡선이 yaw_rate이다. 나는 전체 구간 중에 yaw_rate가 가장 크게 표시되는 (로터리를 선회 중인) 구간의 데이터만 기준 신호로 사용했다.

    추출 신호의 Factor와 Offset 정하기

    • CAN 신호는 비트들의 묶음이다. 비트 값을 엔지니어링 단위로 변환해야 한다. 요-레이트의 경우, deg/sec로 바꿔야 한다. 이때 factor가 1 비트를 몇 deg/sec로 환산할 지를 정한다. offset은 환산 후 얼나마 더하거나 뺄지를 정한다.
    • 기준 신호와 추출 신호의 RMSE (Root Mean Square Error)가 최소가 되는 factor와 offset을 정한다.

    기준 신호와 추출 신호를 비교하기

    • 이상의 계산을 하면 답이 1개만 나오지 않는다. 
    • 여러 메시지의 여러 신호 시작 위치에 다양한 신호 길이, factor, offset, 타입, endian의 조합으로 답"들"이 나온다. 이런 답들을 눈으로 확인하고, 최종적으로 메시지와 신호의 사양을 정한다.

     

    작전 실행

    • 타이칸의 5개 CAN 버스를 측정할 수 있도록 하였다. (타이칸에는 13개의 CAN 버스가 있는 것 같다.) CAN 버스 전선을 찾은 후 전선을 따서 CAN 인터페이스 하드웨어에 연결했다. (한 줄로 썼지만 며칠 걸렸다.)
    • CAN 데이터를 저장하면서 차를 주행했다. 요-레이트 신호가 분명하게 나오도록 (에버랜드 인근의 아래 지도에 화살표한 곳의) 로터리를 돌았다.

    • 로터리를 선회할 때 바퀴 속도는 아래 그래프와 같다. 안쪽 바퀴와 바깥쪽 바퀴의 속도 차이가 확연하다. 요-레이트 신호가 클 것이다.

    • 뒷바퀴 속도 차이와 트랙을 이용해서 계산한 요-레이트 신호(yaw_rate_rr)는 아래 그래프와 같다. 신호가 거칠어서 15개 샘플을 이용하여 이동평균(yaw_rate_ma)을 적용했다.

    • yaw_rate_ma가 기준 신호이다. 
    • blf 파일의 전체 메시지들을 대상으로 비트 패턴 검색을 실시하였다. (길이가 변하는 메시지들이 있었다. (이런 것을 처음 봤다.) 이들을 제외했다.) 대상 메시지는 482개이다.
    • 다양한 결과들을 얻었다. 아래는 일부 예들이다.

     

    • 상관계수가 가장 높은 결과는 아래 그래프이다. 모양이 매우 비슷해 보이는데, 위아래가 뒤집어져 있다. yaw_rate_ma를 계산할 때, 시계 방향이 +가 되도록 했었다.

    • 반시계 방향이 +가 되도록하여 다시 계산했다.

    • Pearson 상관계수의 절대값은 factor의 영향을 받지 않는다. 그래프를 뒤집으니 상관계수의 부호가 뒤집혔다. 절대값은 그대로이다. 
    • 전체 측정 구간을 대상으로 기준 신호와 추출 신호를 비교한다. 일부 구간에서 부호가 반대이다. (다행히) 검색에 지장이 되지 않았다.

    • 위 그래프는 신호 크기가 16 비트일 때이다, 15, 14, 13 비트일 때도 비슷한 (눈으로 보기에는 동일한) 결과를 얻는다. 단지 factor와 offset이 달라진다. (이에 따라 RMSE가 달라진다.)  factor는 신호 크기가 1 비트 줄 때마다 2배씩 증가한다. 당연하다. 비트 수가 줄면 고해상도에서 저해상도로 바뀌니까.
    • 이상은 방법의 개념에 집중하기 중요한 작업들만 설명한 것이다. 위 결과를 내기까지 설명하지 않은 작업들이 있다. 시작부터 끝까지 각 단계를 1회 실행하여 결과가 나온 것이 아니다. 단계별로 결과를 확인하고 이전 단계나 처음 단계로 돌아가 다시 시작하기를 반복했다.
    • 사실 요-레이트 이외에도 찾아야 할 신호들이 많다. 무슨 일이든 빠르게 잘 하려면 연장이 좋아야 한다는 것이 나의 지론이다. 연장을 만들었다. 

     

    CAN 리버스 엔지니어링 연장 개발

    • 이 부분은 다음에 조금 길게 시간 여유가 있을 때 포스팅한다. 
    • 프리뷰를 하자면 아래와 같다.

    🎯 Toolchain Overview

     

    🔍 SignalScout, SignalScountPlus:

    • blf와 dbc를 로드한다.
    • blf의 메시지와 dbc의 메시지 정의를 선택한다.
    • 선택된 메시지를 선택된 정의대로 해석하여 그래프를 그린다. 
    • 바이트별 그래프를 그린다.
    • 메시지와 그에 맞는 정의 수작업으로 찾기 위한 연장이다.

    🎭 SignalCast

    • 기준 신호를
      • 프로그램으로 만들 수도 있고 (위에서 설명한 경우처럼) ,
      • 파일에서 읽어 올 수도 있고,
      • blf 특정 신호로 지정할 수도 있다. 
    • 기준 신호는 비트 패턴 검색을 위해 SignalDirector에 입력되야 한다. 위에 나열한 경우에 따라 기준 신호를 생성하고 SignalDriector에 입력하는 설정이 다르다. 
    • 기준 신호를 만들고 설정을 준비하는 데 사용하는 연장이다.

    🎬 SignalDirector 

    • SignalCast로 정한 기준 신호를 blf 파일을 이용하여 비트 패턴 검색을 하는 연장이다.
    • 비트 패턴 검색에 필요한 설정을 총괄한다.

    🎨 SignalStudio

    • SignalDirector의 비트 패턴 검색으로 한 메시지에 포함된 여러 신호들을 찾을 수 있다. 이 신호들의 위치가 겹칠 수 있다.
    • SignalStudio를 이용하여 각 신호들의 길이, 신호 시작 위치 등 신호들을 변경하며 결과를 그래프로 확인하는 연장이다.

    🎞️ SignalTheater

    • SignalDirector는 여러 가지 가능한 조합들을 계산 결과로 내놓는다.
    • SignalTheater는 계산 결과를 그래프로 표시하여 편리하고 빠른 검토에 사용하는 연장이다.

     

     

    결론

    • CAN 통신 리버스 엔지니어링의 한가지 방법을 소개했다. 이 방법은 요-레이트같은 아날로그 센서의 신호를 찾을 때 적용할 수 있다. 기존에 알고 있는 정보로 검색의 기준 신호를 계산할 수 있을 때 적용할 수 있다. 이 방법을 ESC 작동 플래그 신호처럼 상태를 표시하는 디지털 신호를 찾을 때 적용한다면, 검색 성공 가능성이 매우 낮을 것으로 생각한다. 

     

     

     

    hsl's tsmaster 사용기 목차 :: hsl's tsmaster 사용기    

    포르쉐 타이칸 CAN 데이터에서 횡가속도 신호 찾기 :: hsl's tsmaster 사용기