ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 그래픽 프로그램(graphic program)으로 yaw_rate_ws 계산하기
    design 2024. 12. 11. 17:52

    시작하기 전에

    전에 파이썬 미니프로그램으로 뒷바퀴 속도들로 부터 요-레이트(yaw_rate_ws)를 구하는 방법을 설명했었다.

     

    TSMaster는 파이썬 미니프로그램, C 미니프로그램, 그래픽 프로그램을 지원한다. 내가 C를 잘 다루지 못하기도 하지만, C 미니프로그램은 파이썬 미니프로그램과 사용법이 거의 비슷하여 별도의 설명이 필요하지 않을 것으로 생각한다.

     

    그래픽 프로그램은 나도 처음 접한다. 직접 사용해 보면서 사용법을 정리한다. 파이썬 미니프로그램과 비교하기 편리하도록 yaw_rate_ws 계산하는 프로그램을 작성한다. 

     

     

    개요

    • 그래픽 프로그램 작성법
    • 프로그램 설명
    • 그래픽 창에서 결과 확인하기

     

     

    그래픽 프로그램 작성법

    그래픽 프로그램 기본 준비

    • 메인 메뉴/ Design/ Graphic Program 버튼을 클릭하여 새 그래픽 프로그램 창을 연다.

    • 아래 그림과 같은 그래픽 프로그램 창이 열린다.

    • "Graphic Program 80"이 프로그램 이름이다. 이 부분을 변경하여 프로그램 이름을 입력한다.

    • 위 그림에서 첫 모듈의 Sub Module Name을 더블 클릭하면 모듈의 Properties 탭이 열린다.
    • Display Nam과 Program Name을 변경할 수 있다. 나는 모두 calc_yaw_rate_ws로 입력하였다. Program Name은 자동으로 이름 앞에 am_이 붙어서 am_calc_yaw_rate로 변경되었다.

     

    블록 추가 방법

    • 그래픽 프로그램은 블록들로 구성된다. 
    • 그래픽 프로그램 영역에서 Entry Point를 선택한 후 프로그램 버튼들 중에서 녹색 + 버튼을 누르면 아래 쪽에 새 실행 블록이 추가된다. 

    녹색 + 버튼을 클릭하여 새 블록을 추가한다. 블록이 추가되면 빨간색 + 버튼도 활성화 된다. 녹색 + 버튼은 현재 선택된 블록 "아래"에, 빨간색 + 버튼은 오른쪽에 새 블록을 추가한다.
    블록을 선택하고 마우스 우클릭을 하면 블록을 다룰 수 있는 여러 명령들을 볼 수 있다.

    • 명령들 중에 Jump 관련 명령들이 있다. (Add Down Jump, Add Right Jump, Add From). 그래픽 프로그램은 분기 (if else) 반복 (for, while) 등을 점프를 이용하여 구성한다. 점프 라벨을 이용하여 점프할 곳을 지정한다. 잠시 후에 상세하게 설명한다. 

    블록 타입

    • 새로 추가된 블록은 NOP (No Operation)이다. Properties 설정의 Select Type에서 타입을 선택할 수 있다. 

    블록의 타입에는 NOP, Read or Write Signals, API Function Call, Expression 등이 있다.

    • Read or Write Signals는 CAN 신호, 시스템 변수, 지역 변수를 읽거나 변수에 쓸 때 사용한다.
    • API Function Call은 TSMaster가 제공하는 Mini Program System Functions, Mini Program Library Functions, Internal Functions 등에 미지 정해진 함수들을 이용할 때 사용한다. 850개 이상의 시스템 함수, 30개 이상의 라이브러리 함수가 정의되어 있다.  

    블록 타입 API Function Call에서는 System Functions, Library Functions, Internal Functions에 사전에 정의된 함수들을 선택할 수 있다.

    • Expression은 수식으로 연산을 할 때 사용한다.

    Expression 블록으로 수식 연산을 한다.

     

    • 위 그림은 (x1 - x2) * 10.27 이라는 연산을 하는 경우이다. 여기서 x1은 WHL_SPD11 메시지의 WHL_SPD_RR 신호이고, x2는 같은 메시지의 WHL_SPD_RL 신호이다. 두 바퀴 속도의 차이와 뒷바퀴 사이의 거리를 이용해서 yaw_rate_ws를 구한다. 
    • 수식 입력란 오른쪽 끝에 + 버튼을 이용하여 x1, x2 변수를 추가하였다. x1의 변수 부분을 클릭하면 화살표 모양의 버튼이 생긴다. (아래 그림 참조) 이 버튼을 클릭하면 익숙한 변수 선택 화면들이 순차적으로 뜬다. 

    기타

    • Run Info. 탭에서는 현재 선택된 블록의 실행 정보를 알 수 있다. 

    선택된 블록의 실행 관련 정보를 알 수 있다. 화면 아래에 Log Replay가 있다. 실행 정보를 파일에 저장하고, 저장된 파일을 재생할 수 있나보다.

     

    프로그램

    • 내가 작성한 yaw_rate_ws를 계산하는 그래픽 프로그램은 아래 그림과 같다.
    • 프로그램의 기능은 단순하다. 온라인 재생을 하면서 WHL_SPD_11 메시지의 WHL_SPD_RR과 WHL_SPD_RL 신호들을 이용하여 요-레이트를 계산하여 시스템 변수 gpl.yaw_rate_ws에 할당하는 작업을 "반복"한다. 시스템 변수 gpl.yaw_rate_ws를 저장하는 이유는 그래픽 창에서 WHL_SPD_RR, WHL_SPD_RL, gpl.yaw_rate_ws를 동시에 그래프로 보기 위해서다.   
    • 온라인 재생은 start_online_replay 함수를 호출하여 실행한다. 이미 재생 중이면 또 start_online_replay 함수를 호출하지 않도록 "분기" 한다. 분기 처리를 위해 get_online_replay_status 함수를 호출하여 재생 상태 (status_replay)와 재생 진도 (progress_replay)에 저장한다. status_replay가 재생 중이라면 start_online_replay 호출을 건너뛰고 yaw_rate_ws 계산을 한다.
    • 각 블록을 순차적으로 설명한다.

     

    NOP (connect)

    • NOP (No Operation) 이다.
    • 원래 의도는 api 호출로 connect를 하는 것이다.
      • connect가 의도대로 작동하지 않아서 NOP로 하였다.
      • 토선에 문의하니 버그라고 한다. 조만간 수정된 베타 릴리즈가 있을 것으로 예상한다.
    • connect는 메인 메뉴/ Analysis의 Start 버튼을 수동으로 클릭하여 실행한다. 

    get_online_replay_status

    • api 호출이다.
    • y = 옆에 드롭다운 메뉴의 입력 칸에 replay라는 키워드를 입력하면 replay와 관련된 함수들의 목록이 뜬다. 목록에서 함수를 선택한다.

    api 함수 드롭다운 메뉴의 검색 칸에 replay라는 키워드를 입력하면 관련 함수들의 목차가 뜬다.

    • 함수의 기능과 아규먼트의 설명은 검색 칸 오른쪽에  ? 버튼을 클릭하여 볼 수 있다.  

    ? 버튼을 클릭하면 함수의 기능 설명, 파라미터 설명, 예제 코드를 볼 수 있다.

    • get_online_replay_status 함수는 AStatus와 AProgressPercent100을 반환한다. AStatus와 AProgressPercent100으로 사용할 변수들이 필요하다. (그래픽 창처럼 다른 기능들과 공유하지 않고) 모듈 내에서만 공유되는 변수라 지역 변수면 된다. Vars 탭에서 지역 변수를 선언한다.
    • Vars 탭을 클릭한다. 표의 빈 곳에서 마우스 우클릭하면 변수를 추가, 삭제, 복사할 수 있는 메뉴가 뜬다. Add Variable을 클릭하여 status_replay, progress_replay 변수를 추가한다. AStatus는 ps32 형이다. AProgressPercent100은 pfloat이다. status_replay와 progress_replay를 각각 Integer와 Double로 한다. 

     

    replay 진행 중?

    • get_online_replay_status에서 재생 진행 여부를 status_replay 변수에 저장하였다.
    • status_replay가 재생 중이 아니라고 하면 start_online_replay 함수를 호출하여 재생을 시작한다. 재생 중이라고 하면 calc yaw_rate_ws로 진행하여 yaw_rate_ws를 계산한다.

    • 위 설명처럼 하기 위해서 replay 진행 중? 블록을 아래 그림과 같이 Expression 타입으로 만든다.
    • + 버튼을 이용해서 x1을 추가한다.
    • x1에는 local 변수 status_replay를 선택한다.
    • 수식에는 (x1 = 0)을 입력한다. x1은 0인가?
      • [주의] 판단 블록의 결과 값이 0 이면 아래 블록이, 0이 아니면 오른쪽 블록이 실행된다. x1이 0(재생 중이 아님)이면 판단 블록의 값은 1이된다. 그래서 오른쪽 블록이 실행된다.    

    status_replay 변수의 값에 따라 replay 진행 중? 블록의 값을 정한다.

    • replay 진행 중? 블록에서 마우스 우클릭으로 Add Right Action/ Add Right(tab)을 선택한다. 오른쪽에 새 블록이 추가된다. 이 블럭을 아래와 같이 설정하여 start_online_replay 함수가 호출되도록 한다. replay 진행 중? 블록의 모양이 판정을 의미하는 마름모로 변경된다.

    start_online_replay 블록을 추가한다.

    • start_online_replay 후 yaw_rate_ws 계산으로 점프해야 한다. 점프를 하기 위해 점프 source와 destination을 설정해야 한다. start_online_replay 블록에서 마우스 우클릭 후 Add Down Jump를 선택하여 점프 소스를 추가한다. jump label에 replay_running이라고 입력한다.

    점프 소스를 추가하고 label을 replay_running 으로 한다.

    replay 진행 중? 블록을 선택한 후 마우스 우클릭하고 Add Down Action/ Add From (Alt + Enter)를 선택하여 점프 destination을 추가한다.

     

    점프 destination을 추가한다.

     

    점프 destination의 label을 replay_running이라고 source의 label과 일치시킨다.

    calc ywa_rate_ws

    • replay_running 점프 데스티네이션 블록 아래에 새 블록을 추가한다.
    • yaw_rate_ws 계산을 위해 아래와 같이 설정한다.  

    x1에는 CAN의 WHL_SPD_RR 신호를 x2에는 WHL_SPD_RL 신호를 복사한다. x1과 x2를 이용하여 y를 계산한다. y는 요-레이트이다. y를 시스템 변수 gpl.yaw_rate_ws에 복사한다.

    check yaw_rate_ws range

    • 그래픽 프로그램가 검증/시험에 편리함을 보이기 위해 추가하였다. 
    • check_verdict 함수를 이용하여 gpl.yaw_rate_ws가 -10에서 10 사이면 ok, 아니면 nok(not ok)로 판정(verdict)한다. 그렇게 하기 위해 아래 그림과 같이 설정한다.

    gpl.yaw_rate_ws 신호가 min (-10) max (10) 범위 안에 있으면 ok, 밖에 있으면 nok로 판정한다.

    • 프로그램 실행 중에 이 블록의 값이 ok이면 블록은 녹색으로 nok이면 빨간색으로 표시된다.

    wait

    • WHL_SPD11 메시지는 20msec 주기로 전송된다. wait를 주지 않으면 프로그램은 메시지 수신 여부와 상관없이 반복해서 계산을 한다. 메시지 주기와 계산 주기를 맞추기 위해 wait 20msec를 추가한다.  

    메시지 전송 주기와 yaw_rate_ws 계산 주기를 맞추기 위해 wait 20msec를 추가한다.

    replay 완료?

    • progress_replay를 보고 재생 완료를 판정한다. status_replay와 같은 방식으로 설정한다. 
    • 데모 용도로 재생 중간에 멈추도록 하기 위해 pregress_status > 12(임의로 정한 값이다) 이면 재생을 멈추도록 하였다.  

    progress_replay가 12를 초과하면 재생을 멈추도록 Expression을 설정하였다.

    재생 중 yaw_rate_ws 계산을 "반복"하도록 하기 위하여 점프 소스와 데스티네이션을 추가해야 한다. 점프 소스와 데스티네이션 추가 방법은 status_replay의 방법과 동일하다.

    stop_online_replay

    • 온라인 재생을 정지하기 위해 새 api 함수 블록을 추가한다. 
    • 아래 그림과 같이 설정한다.

     

    disconnect

    • 온라인 connect를 해제하기 위해 disconnect api 함수 블록을 추가한다. 
    • 아래 그림과 같이 설정한다.

    End 

    • 프로그램 수행 종료를 표시하기 위해 NOP 블록을 추가한다.

     

     

    그리팩 창에서 결과 확인하기

    • 프로그램을 실행하면 그래픽 창에 WHL_SPD_RR, WHL_SPD_RL, glp.yaw_rate_ws 그래프가 아래 동영상 처럼 표시된다.
    • yaw_rate_ws의 값이 -10 deg/sec 에서 10 deg/sec 구간 내에 있으면 check yaw_rate_ws range 블록이 녹색이다. 구간을 벗어나면 빨간색이 된다. 다시 구간 안으로 들어오면 녹색이 되야하는데 빨간색으로 남는다.
      • 설계 의도가 한 번 nok가 되면 계속 nok 상태로 남는 것인지 토선에 문의하여 확인 중이다.
      • 설계 의도가 한 번 nok가 되면 nok 상태로 남는 것이라고 확인하였다. 2024-12-11 17:57
    • 시스템 메시지 창을 보면 ok, nok에 따라 텍스트가 녹색이나 빨간색으로 변경되는 것을 볼 수 있다.  

     

    https://youtu.be/9jdsK0DCcXc

     

     

    결론

    • 그래픽 프로그램을 이용하면 TSMaster의 기능들을 엮어서 검증 시험 등 연구&개발 작업을 자동화 할 수 있다.
    • 자동화 아이디어가 있는데 C, Python 프로그래밍을 할 줄 모르는 사람들에게 특히 유용하다고 생각한다.
    • 그래픽 프로그래밍은 텍스트 프로그래밍에 비해 직관적이고 실행을 시각화 한다는 장점이 있다. 반면에 작성에 시간이 더 소요된다는 단점이 있다. 사용자가 자기 능력과 목적에 맞는 방법을 선택할 선택의 문제이다. 그런 관점에서 선택의 여지가 있다는 점은 또 다른 장점이라고 생각한다.  

     

    참고