ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CAN 신호들로 실시간 연산하기 - 미니프로그램으로 yaw_rate_ws 계산
    analysis 2024. 10. 25. 02:30

    시작하기 전에

    CAN 버스를 측정하다 보면, 신호들을 이용하여 실시간으로 연산한 결과를 보고 싶은 경우가 종종 있다. mile per hour로 표시된 차속을 km per hour로 변환하는 것처럼 단순 사칙연산의 경우부터, 센서, 액추에이터와 통신하여 전에 없던 새 기능의 프로토타입을 개발하는 복잡한 경우까지 실시간 연산의 적용 사례는 다양하다. TSMaster는 실시간으로 측정되는 메시지와 신호를 대상으로 C나 Python으로 작성한 스크립트를  실행할 수 있다. 이를 미니프로그램이라고 부른다.

    이번 블로그에서는 CAN 버스에 있는 바퀴 속도 신호들에서 실시간으로 요-레이트를 계산하는 Python 코드를 작성하는 과정을 소개한다. 이를 통해서 TSMaster의 미니프로그램 기능과 사용법을 설명한다.

     

    개요

    • 이 실습의 마지막 단계에서 아래 그림처럼 그래픽스 창에 WHL_SPD_RL(wheel speed rear left), WHL_SPD_RR(wheel speed rear right), YAW_RATE( CAN 신호 이름, 차에 장착된 요-레이트 센서 측정값)  yaw_rate_ws(WHL_SPD_RL, WHL_SPD_RR로 계산한 요-레이트), SAS_Angle(Steering Wheel Angle. SAS는 Steering Angle Sensor의 약어일 것이다. SAS는 Angle 외에 Speed 등도 출력한다.)을 표시한다.
    • 그래프로 yaw_rate_ws와 YAW_RATE를 비교한다.
    • YAW_RATE의 변동은 조향에 의한 것이다. 이를 확인하기 위해 그래프에 SAS_Angle을 함께 표시한다.

    실습 마지막에 YAW_RATE와 calc.yaw_rate_ws를 비교한다.

    • WHL_SPD_RL, WHL_SPD_RR, YAW_RATE, SAS_Angle은 CAN 버스에 있는 신호들이다. 이전 블로그에서 설명한 방법대로 신호들을 그래픽스 창 추가하여 볼 수 있다.
    • yaw_rate_ws는 사용자가 정의하여야 한다.
      • TSMaster에서 사용자 변수를 정의할 수 있다. 사용자 정의 변수도 시스템 변수이다. 그래픽스 창에서 CAN 신호를 추가하는 것처럼 시스템 변수를 추가할 수 있다. 
      • yaw_rate_ws는 WHL_SPD_RL과 WHL_SPD_RR이 업데이트될 때마다 새로 계산해야 한다. 이 계산은 미니프로그램에서 한다. TSMaster의 미니프로그램 기능은 코딩 언어로 C와 Python을 지원한다. 이 실습에서는 Python으로 코딩한다.

     

    바퀴 속도에서 요-레이트 계산하는 공식

    • 선회 할 때 안쪽 바퀴와 바깥쪽 바퀴의 속도 차이가 난다. 동일 시간에 동일 선회”각”을 이동하는데 선회 반경이 다르기 때문에 바깥쪽 바퀴가 안쪽 바퀴보다 더 빨리 회전하기 때문이다.
    • 선회 각속도 = 요-레이트 = 𝑑𝜃/𝑑𝑡 = 바퀴 속도 차이 / 바퀴 트랙
    • 바퀴 속도로 계산한 요-레이트를 yaw_rate_ws라고 하겠다.
    • yaw_rate_ws를 deg/sec로 계산하면
          yaw_rate_ws = (WHL_SPD_RR – WHL_SPD_RL) / 1.55 (현대자동차 베뉴의 b = 1.55m 이다.
          x 1000 / 3600 (kph를 mps로 변환)
          x 180 / np.pi (rad을 deg로 변환)
          = (WHL_SPD_RR - WHL_SPD_RL) * 10.27
    • 실습에 사용할 데이터는 전륜 구동 자동차에서 측정했다. 그래서 뒷바퀴 속도 차이로 요-레이트를 계산한다. 

     

    yaw_rate_ws 사용자 변수 만들기

    • 메인 메뉴/ Simulation/ System Variables 버튼을 클릭하여 System Variable Management 창을 연다.

    메인 메뉴/ Simulation/ System Variable 버튼

    • System Variable Management 창에서 User Variables 탭을 클릭한 후, Create a new user variable 버튼을 클릭하여 새 사용자 변수를 추가한다.

    사용자 변수 추가

    • 사용자 변수 정의 창이 열리면 필요 항목을 채워서 사용자 변수를 정의한다.
      • Name: 미니프로그램에서 사용할 변수 이름
      • Category: 변수를 분류하는 목적. 빈칸으로 두어도 된다. 이번 예에서는 "계산"하는(측정한 것이 아닌) 변수라는 의미로 calc 라고 했다.
      • 입력 항목의 이름을 보면 무엇을 입력해야 하는 지 알 수 있을 것이라 짐작하여 추가 설명을 생략합니다. 

     

    yaw_rate_ws 계산하기

    • 메인 메뉴/ Program/ Python Mini Program을 선택한다.

    • 미니프로그램 창이 열립니다. 창은 그림과 같이 되어있다.

    Python Code Editor

    • 설정/선택 영역에서 Properties 탭을 클릭한다.
      • Program Name에 입력한 이름으로 파이썬 스크립트가 저장된다.
      • [중요] Database Symbols에서 dbc를 체크한다. 그래야 dbc의 신호들을 프로그램에서 쉽게 가져다가 사용할 수 있다.

    Python Code Editor/ Properties

    • Functions 탭을 선택한 후, CAN 신호를 골라 더블 클릭하면 코드에 변수가 삽입되어 편리하다.

    코드 에디터에 CAN 신호 변수를 추가하는 방법

    • 뒷바퀴 속도는 WHL_SPD11 메시지의 WHL_SPD_RR, WHL_SPD_RL 신호이다. TSMaster가 “WHL_SPD11 메시지를 수신(Rx) 할 때마다” yaw_rate_ws를 계산한다. 
    • Symbols 탭을 선택한 후, 설정/선택 영역에서 “On CAN Rx”를 찾아, 마우스 우클릭을 한다. Add On RX - CAN Message를 선택한다. (이 실습은 CAN-FD가 아닌 CAN을 대상으로 하기 때문이다.)

    • Id(0x)의 드롭다운 메뉴를 클릭하면 dbc의 메시지들이 보인다. WHL_SPD11을 클릭한다.
    • Name에 적당한 이름을 입력한다. 예, 메시지 이름 (WHL_SPD11). 그러면 함수 이름이 on_can_rx_WHL_SPD11()으로 만들어진다. 의미를 알기 쉽다. 
    • 코딩 영역에 on_can_rx_WHL_SPD11 이라는 이름의 함수 스니펫이 만들어  만들어진다. (스니펫(snippet): 프로그래밍 용어로 재사용 가능한 소스 코드, 기계어, 텍스트의 작은 부분을 의미함)

    • 코딩 영역에 yaw_rate_ws를 계산하는 코드를 입력한다.
      • 계산에 WHL_SPD11 메시지의 WHL_SPD_RR, WHL_SPD_RL 신호들이 필요하다. WHL_SPD11 메시지의 내용은 함수 인자인 ACAN에 있다. ACAN에는 dbc에 있는 WHL_SPD11 메시지의 구조와 무관한 8바이트 데이터가 있다. ACAN을 WHL_SPD11 메시지의 구조에 맞게 신호들로 분해해야 한다. WHL_SPD11_1이라는 변수를 만들어서 그렇게 한다.

    • WHL_SPD11_1 변수가 함수 실행될 때마다  매번 만들어지지 않도록 (즉, WHL_SPD11 메시지를 받을 때마다 = 매20msec. 너무 자주라 프로그램 오버헤드 부하가 클 수 있다.)  Global Definitions에서 미리 만들어 둔다.
    • Symbols 탭의 설정/선택 영역에서 Global Definitions를 선택한다. 코딩 창에 Global Definitions에 해당하는 코드가 나타난다. (처음에는 코드가 없으니 빈 공간이 보인다.) WHL_SPD11_1 변수를 만든다. WHL_SPD11_1 변수는 TWHL_SPD11_1 클래스의 객체이다. TWHL_SPD11_1은 dbc를 읽을 때, TSMaster가 미리 정의해 둔다. 그 정의는 Databases라는 파이썬 모듈에 있다. 그래서 먼저 Databases 모듈을 import 하고 WHL_SPD11 변수를 만든다.   

    WHL_SPD11 메시지를 담을 WHL_SPD11_1 이라는 글로벌 변수를 만든다.

    • yaw_rate_ws를 계산한다. yaw_rate_ws는 on_can_rx_WHL_SPD11 함수의 지역 변수이다. 그래서 그래픽스에서 사용할 수 없다. 미리 만들어둔 (사용자 정의) 시스템 변수인 calc.yaw_rate_ws에 넣어야 한다. 시스템 변수에 값을 넣어주기 위해서 app.set_system_var_double() 함수를 사용한다.

    yaw_rate_ws를 계산하고, 이 값을 calc.yaw_rate-ws라는 시스템 변수에 넣어준다.

    • app.set_system_var_double() 이라는 함수를 어떻게 찾았는가? TSMaster가 제공하는 함수들은 Functions 탭에서 찾을 수 있다. 

    Functions 탭에서 TSMaster 제공하는 함수들을 볼 수 있다.

    • 함수를 더블 클릭하면 코드 창에 삽입된다. 
    • 함수를 사용 방법은 Api Documents 창에서 아래로 스크롤하여 Examples 찾아 참고할 수 있다.
    • 코딩을 완료하면 컴파일을 한다. 컴파일 결과는 출력창에 표시된다.

    • 실행 버튼을 눌러 실행한다. 미니프로그램 실행은 측정, 재생 등의 TSMaster 기능의 실행과 독립적이다. (측정이나 재생을 하지 않는 중에도 미니프로그램을 실행할 수 있다.)

     

    그래픽스 준비

    • yaw_rate_ws 신호를 볼 그래픽스를 준비한다. 메인 메뉴/ Analysis/ Graphics 버튼을 클릭한다.
    • 그래픽스 신호 목록에서 마우스 우클릭을 합니다. 컨텍스트 메뉴에서 Add CAN signal …, Add System Variable ...을 선택하여 CAN 신호나 시스템 변수를 그래프에 추가한다.

    신호 표시 영역에서 마우스 우클릭으로 Add CAN signal, Add System Variable 매뉴를 선택할 수 있다.

     

    실행

    • (아직 실행하지 않았다면) 미니프로그램을 실행한다.
    • 메인 메뉴/ Analysis/ Bus Replay 버튼을 클릭하여 Bus Playback 창을 열고, Start Playback 버튼으로 선택한 측정 파일을 재생한다. 
    • 그래픽스 창과 트레이스 창에 데이터가 표시된다. 
    • 필요에 따라 확대/축소, 곡선 색깔 선택, y축 표시 구간 선택 등을 한다.

    CAN 신호 YAW_RATE와 WHL_SPD_RL, WHL_SPD_RR로 부터 계산한 yaw_rate_ws를 그래프로 비교한다.

    • YAW_RATE와 yaw_rate_ws가 흡사하다. yaw_rate_ws에 노이즈가 심한 구간이 있다. 이 구간은 WHL_SPD_RL와 WHL_SPD_RR에도 노이즈가 심하다. 코드를 수정하여 WHL_SPD나 yaw_rate_ws에 필터를 적용하여 YAW_RATE와 yaw_rate_ws를 비교해 볼 수도 있다. 이런 이유로 요-레이트를 계산하지 않고 차에 센서를 달아서 측정하는 것인가 보다. 센서 대신 계산으로 대체한다면 원가 절감이 가능할 텐데.

     

    결론

    • TSMaster의 미니프로그램 기능을 이용하여, 미니프로그램이 지원하는 코딩 언어인 파이썬으로, CAN 신호인 WHL_SPD_RL, WHL_SPD_RR에서 요-레이트를 계산하여 사용자 변수인 yaw_rate_ws에 저장하고, yaw_rate_ws를 그래픽스 창에서 그래프로 CAN 신호 YAW_RATE와 비교하였다. 
    • 미니프로그램 기능을 이용하면 위와 같은 간단한 계산부터 각 시스템들이 CAN으로 제공하는 센서 신호들과 액추에이터 구동 인터페이스를 이용하여 새로운 기능의 프로토타입을 개발할 수 있다.