햅틱 디바이스 명령문은 세팅과 게팅(set, get : 그냥 알아들어먹어) 상태와 연관된 모든 명령문이 포함되어있다. 장치 명령문이 실행되면 servo loop가 스케줄러 콜백에 의해 실행되고 곧바로 Getting 상태로 바꾼다. 프레임이 시작되고 끝나면, 기타 여러가지를 적용하고 해제하고 한다.

 

 

초기화

장치와 스케줄러가 사용되기 전에 초기화를 시켜야하는데, 장치는 PHANToM 컨트롤 패널 아래의 PHANToM Configurations에 정의되어있고, 만약 하나의 디바이스만 연결되어있다면 "Default PHANToM"이라고 되어있을 것이다.

 

HHD hHD = hdInitDevice(HD_DEFAULT_DEVICE);

 - 디바이스 초기화

 - 디바이스들이 PHANToM Configurations에서 캘리브레이션이 된 이후 초기화가 된다.

 

hdEnable(HD_FORCE_OUTPUT);

 - 포스 초기화

 

hdStartScheduler();

 - 스케줄러 시작

 - 포스가 적용되지 않더라도 스케줄러는 시작한다.

 - 햅틱 장치가 여러개면 각각의 스케줄러가 요구된다, 하지만 하나만 있을때는 하나만 쓰면 된다.

 - 일반적으로 포스 초기화 이후에 바로 나온데이

 

hdMakeCurrentDevice(hHD);

 - 현재 햅틱장치는 hHD로 선언한 장치를 사용하겠다.

 

hdIsEnabled(HD_FORCE_OUTPUT)

 - 포스가 초기화 되었는지 TRUE or FALSE로 넘겨준다.

 - 그래서 아래와 같은 코드가 가능하다.

  if (!hdIsEnabled(HD_FORCE_OUTPUT))

  {

     hdEnable(HD_FORCE_OUTPUT);

  }

   * 이거시 뭐시냐, 그냥 딱 보면 알것지? 포스준비됐으면 쓰고 아님 말구 이거임

 

hdBeginFrame(), hdEndFrame()

 - hdBeginFrame()과 hdEndFrame() 구문 사이에 프레임들을 놓을 수 있다.

 - 그러니까, 한프레임에서의 장치의 상태 업데이트, 저장 뭐 그냥 다 출력하는걸 몰아놨다구 생각하세요

 - 그럼 뭘 출력하느냐, 바로 햅틱 장치의 포스!

 - 대부분의 햅틱 명령어는 이 사이에서 실행된다.

 - 디바이스가 여러개면

  HHD id1, id2;

   ...

  hdBeginFrame(id1);

  hdBeginFrame(id2);

   ...

  hdEndFrame(id1);

  hdEndFrame(id2);

 - 장치 상태 관리의 대안으로 hlCheckEvents()가 있는데, hlBegin/EndFrame()을 대신한다.

 

스케줄러 명령어

HDCallbackCode HDCALLBACK DeviceStateCallback (void *pUserData);

 - 요고시 기본형태

 - 리턴값 : HD_CALLBACK_DONE or HD_CALLBACK_CONTINUE

 - 콜백은 한번이나 여러번 세팅될 수 있고, 콜백의 리턴값에의해 결정된다

  // 클라이언트의 데이터 정의

  struct DeviceDisplayState

  {

     HDdouble position[3];

     HDdouble force[3];

  }

 

  // 간단한 콜백을 이용한 클라이언트 데이터 사용방법

  HDCallbackCode HDCALLBACK DeviceStateCallback (void *pUserData)

  {

     DeviceDisplayState *pDisplayState = static_cast<DeviceDisplayState*>(pUserData);

 

      hdGetDoublev(HD_CURRENT_POSITION, pDisplayState->position);

      hdGetDoublev(HD_CURRENT_FORCE, pDisplayState->force);

     

      return HD_CALLBACK_DONE;          // 요고 한번 실행

  }

 - 스케줄러 콜은 두가지 타입이 있다, 비동기식과 동기식.

  * 동기식 : 하나의 스케줄러가 완료 됐을때 리턴이 가능해, 완료안되면 리턴은 없다

  * 비동기식 : 스케줄링하고있어도 바로 리턴이 가능하다


'Haptic Rendering > OpenHaptics' 카테고리의 다른 글

HDAPI - 1. Developing Options  (1) 2014.06.10
HDAPI - 0. Overview  (0) 2014.06.10
OpenHaptics - 1. Creating a shape  (0) 2014.06.09
OpenHaptics - 0. Overview  (0) 2014.06.09
Posted by 긍정왕오킹