ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 판넬로 출력하는 방법 - 관계도
    analysis 2024. 10. 25. 23:26

    시작하기 전에 

    데이터를 측정 중에 두 신호의 관계를 그래프로 보고 싶은 경우가 있다. 실시간으로 신호 관계를 볼 수 있으면 데이터 측정 후에 별도로 데이터를 처리해서 관계를 확인하고 시험을 다시 하는 반복을 조금이라도 줄일 수 있다.

    TSMaster에는 Panel 기능이 있다. 판넬 기능으로 Relation Chart(관계도)를 그릴 수 있다.

       

    아래 그림은 관계도를 이용하여 신호들 사이의 관계를 실시간으로 표시한 예이다.

     

    Panel의 Relation Chart로 신호들 사이의 관계를 시각화할 수 있다.

    • 신호들 사이에 아래와 같은 관계가 있는 것을 데이터 측정 중에  알 수 있다.
    • YAW_RATE vs yaw_rate_ws
      • YAW_RATE: CAN 버스의 요-레이트 신호. 센서 측정값
      • yaw_rate_ws: CAN 버스의 바퀴 속도 신호들로 계산한 요-레이트
      • 비례하는 관계에 있다. 이상적인 경우 완전히 일치해야 한다.
    • SAS_Angle vs YAW_RATE
      • SAS_Angle: CAN 버스의 조향각 신호. 센처 측정값
      • YAW_RATE: CAN 버스의 요-레이트 신호. 센서 측정값
      • 조향각에 따라 요-레이트가 양의 상관 관계에 있다.
      • 차속, 도로의 횡경사 등에 따라 기울기가 다르다.
      • 조향각이 증가할 때와 감소할 때의 경로가 다르다.
    • YAW_RATE vs LAT_ACCEL
      • YAW_RATE: CAN 버스의 요-레이트 신호. 센서 측정값
      • LAT_ACCEL: CAN 버스의 횡가속도 신호. 센서 측정값
      • 요-레이트와 횡가속도는 양의 상관 관계에 있다. 
      • 차속, 도로의 횡경사 등 여러 원인으로 관계 곡선이 복잡하다.

     

    관계도를 그리는 방법

    • 메인 메뉴/ Simulation/ Panel 버튼을 클릭하여 Panel 창을 만든다.

    • 판넬 창의 왼쪽 부분을 캔버스 영역 오른쪽을 프라퍼티 영역이라고 부르겠다.

    판넬 창은 왼쪽에 캔버스 영역과 오른쪽에 프라퍼티 영역으로 구분된다.

     

    •  프라퍼티 영역에서 "Toolbox" 탭을 클릭한다. 
    • "View Only" 아래 "Relation Chart"를 더블 클릭한다.
    • 캔버스에 관계도 위젯이 표시된다.
    • 테두리를 마우스로 드래그하여 적당한 크기로 만든다. 

     

    • 프라퍼티 영역의 Properties 탭을 클릭하고 "Height" 나 "Width" 프라퍼티에 수치를 입력하여 조절할 수도 있다.
    • 중요한 것은  x축과 y축에 변수를 설정하는 것이다.
    • x축 변수를 설정하려면 "EditSignalIndex"에서 0을 선택한다.
    • CAN 신호라면 "VarType"에서 CANSignal을 선택한다.
    • "VarLink"를 클릭하면 오른쪽에 ... 버튼(3점 버튼)이 생긴다. 이 버튼을 클릭하면 데이터베이스 창이 열린다. 신호를 선택하고 OK 버튼을 클릭하여 창을 닫는다.
    • y축 변수를 설정하려면 EditSignalIndex에서 1을 선택한다.
    • 시스템 변수라면 VarType에서 SystemVar를 선택한다.
    • VarLink를 클릭하여 3점 버튼을 클릭하면 시스템 변수 창이 열린다. 변수를 선택하고 OK 버튼을 클릭한다. 
    • 판넬 창 상단 왼쪽에 연필 모양 버튼을 클릭하면 실행 모드로 전환된다.
    • 실행모드가 되면 오른쪽에 프라퍼디 영역이 사라진다. (편집 모드에서 그리드 점들을 표시하게 했다면 (기본 설정) 그리드 점들도 사라진다.)

    판넬 창을 실행 모드로 전환한 모습. 창의 상단 왼쪽에 연필 모양의 버튼을 클릭하여 모드를 전환한다. 오른쪽 프라퍼티 영역이 사라졌다. 그리드를 표시하는 점들도 사라졌다.

     

     

    트레이스 온라인 재생 상황에서 판넬의 관계도가 동작하는 모습. 4배속

     

    주의: 온라인 재생과 오프라인 재생 시 미니프로그램에서 고려할 점

    • 판넬은 "온라인" 상태에서만 작동하기 때문에, 트레이스를 재생하며 판넬의 관계도를 보려면 아래처럼 두 가지 방법처럼 온라인 상태를 만들어야 한다.  
      1. 하드웨어를 연결하여 온라인 상태에서 트레이스를 재생한다. 하드웨어 없이 데이터 분석하는 경우 할 수 없다.
      2. 가상 하드웨어로 설정하고 트레이스를 재생한다. 가상 하드웨어 설정은 "메인 메뉴/ Hardware/ Channel Selection"에서 할 수 있다. Channel Selection 창에서 Hardware Channel Selection에 Virtual Device를 선택한다. 

    가상 하드웨어 설정

    • 온라인 재생과 오프라인 재생은 메시지 송수신 방향이 반대가 된다. 

    "재생"의 경우다. 왼쪽 그림은 오프라인 재생이다. Dir이 Rx이다. 오른쪽 그림은 온라인 재생이다. Dir Tx이다. 생각해보면 당연하다.

    • yaw_rate_ws를 계산하는 미니프로그램은 WHL_SPD11 메시지를 "수신(Rx)"할 때 계산을한다. WHL_SPD11 메시지를 송신(Tx)할 때 계산하도록 코드를 수정해야 한다. 
    • 수정된 코드는 아래와 같다.
    # CODE BLOCK BEGIN Global_Definitions 
    from TSMaster import *
    # import
    import Databases as dbs 
    
    
    # global
    WHL_SPD11_1 = dbs.TWHL_SPD11_1()
    
    
    # function
    def calc_yaw_rate_ws(ACAN: RawCAN) -> None:
        '''
        WHL_SPD11 메시지를 이용하여 yaw rate를 계산한다.
        on_canfd_rx_WHL_SPD11() 함수와 
        on_canfd_tx_WHL_SPD11() 함수에 동일한 계산 수행이 필요하여 
        별도의 함수로 만들었다.
        on_canfd_rx_WHL_SPD11() 함수와 on_canfd_tx_WHL_SPD11() 함수에서는
        이 함수를 호출하여 계산을 수행한다. 
        '''
        global WHL_SPD11_1
    
        # WHL_SPD11 메시지를 WHL_SPD11_1 변수에 넣는다.
        # WHL_SPD11_1 변수를 먼저 선언해주어야 함.
        # 변수 선언은 Global Definition에서 함
        WHL_SPD11_1.FRawCAN = ACAN
    
        # yaw_rate_ws를 계산한다.
        whl_spd_rr_minus_rl = WHL_SPD11_1.WHL_SPD_RR - WHL_SPD11_1.WHL_SPD_RL
    
        # 베뉴의 rear track은1.555m이다. 
        # wheel_spd_rr_minus_rl를 rear track으로 나눠서 yaw rate를 구한다.
        # wheel speed는 kph이다. mps로 변환하기위해 1000 / 36000을 곱한다.
        # radian을 deg로 변환하기 위해 180 / pi를 곱한다.
        # 위 연산을 하는 것은 whl_spd_rr_minus_rl에 10.27을 곱하는 것과 같다.      
        yaw_rate_ws = whl_spd_rr_minus_rl * 10.27  
    
        # 사용자 변수 calc.yaw_rate_ws에위에서 계산한 yaw_rate_ws를 넣는다.
        app.set_system_var_double('calc.yaw_rate_ws', yaw_rate_ws)
    
        return None
    
    # CODE BLOCK END Global_Definitions 
    # CODE BLOCK BEGIN Instance 
    Instance = MpInstance('panel')
    # CODE BLOCK END Instance 
    
    
    # CODE BLOCK BEGIN On_CAN_FD_Rx WHL_SPD11 LTEsLTEsOTAy
    def on_canfd_rx_WHL_SPD11(ACAN: RawCAN) -> None:
        '''
        WHL_SPD11 메시지를 수신(Rx)할 때마다
        WHL_SPD11 메시지를 이용하여 yaw rate를 계산한다.
        '''
        calc_yaw_rate_ws(ACAN)
    
        return None
    
    # CODE BLOCK END On_CAN_FD_Rx WHL_SPD11
    # CODE BLOCK BEGIN On_CAN_FD_Tx WHL_SPD11 LTEsLTEsOTAy
    def on_canfd_tx_WHL_SPD11(ACAN: RawCAN) -> None:
        '''
        WHL_SPD11 메시지를 송신(Tx)할 때마다
        WHL_SPD11 메시지를 이용하여 yaw rate를 계산한다.
        '''
        calc_yaw_rate_ws(ACAN)
    
        return None
    
    # CODE BLOCK END On_CAN_FD_Tx WHL_SPD11
    # CODE BLOCK BEGIN Step_Function  NQ__
    def step() -> None:
        pass
    
    # CODE BLOCK END Step_Function

     

     

    마무리

    • 신호들 사이의 관계를 실시간으로 그래프로 그리면, 실시간으로 시험 조건을 변경하여 데이터 측정과 처리 사이클을 줄일 수 있다. 즉, 개발 시간을 단축할 수 있다.
    • 판넬을 이용하여 관계도를 그릴 수 있다.
    • 판넬은 온라인 상태에서 동작한다. 하드웨어 없이 온라인 재생을 할 경우 가상 하드웨어를 이용한다.
    • 온라인 재생과 오프라인 재생의 경우 메시지의 송수신 방향이 반대다. 이를 고려하여 메시지 송신 시에 연산을 하도록 작성된 미니프로그램은 메시지 송신 시에 연산을 수행하도록 수정해야 한다.