Skip to content
hmhan1236 edited this page Mar 29, 2018 · 12 revisions

Overview

C-API 문서를 찾는다면? http://gazebosim.org/haptix/api에 들어가 보아라

이 튜토리얼은 손의 설명을 요청하거나 조인트 명령을 보내고 상태를 업데이트 받기 위한 C HAPTIX 클라이언트 라이브브리 `haptix-comm' 사용법에 대하여 설명한다. 설치 순서에 따라 이미 완료하였다고 가정한다.

Compile your controller

이 튜토리얼에서는 모든 손 관절에 sin 함수를 적용하는 아주 기본적인 컨트롤러를 포함합니다. 먼저, 컨트롤러를 컴파일하고 haptix-comm 라이브러리에 링크해야한다.

Windows

Visual Studio 2013을 열고 핸드 컨트롤러를 위한 새로운 프로젝트를 생성한다. File->New Project->Visual C++를 선택하고, 오른쪽 창에서 Win32 Console Application를 선택한다. 프로젝트 이름을 입력한다, 예를 들면 MyBasicController. OK을 누르고, Finish를 누른다. 현재 프로젝트의 소스코드를 기본 컨트롤러 코드로 바꾼다. 소스 코드는 여기에서 복사하여 현재 프로젝트에 복사한다. 소스코드 시작 위치에 아래 줄을 추가한다:

#include "stdafx.h"

Configuration for 64-bit SDK

** Note: 32-bit SDK를 사용한다면 이번 장은 생략한다 ** 툴바에 있는 Win32라고 되어있는 드롭다운 메뉴에서(dropdown menu) Configuration Manager를 선택한다. 그리고 Active solution platform 드롭다운 메뉴에서 <New...>를 선택한다. Type or select the new platform을 누르고 ARMx64로 변경하고 Close를 누른다.

Compile your code

View->Other Windows->Property Manager를 눌러 Property Manager를 연다. 그러면 HAPTIX 라이브러리 SDK에서 제공하는 속성 시트를 사용할 수 있다. Property Manager탬으로 이동하여 프로젝트에서 우클릭을 한다. 그리고 Add Existing Property Sheet...를 선택한다. 새로운 팝업 창이 나타나면 HAPTIX 클라이언트 라이브러리 SDK를 다운로드 한 폴더로 이동하여 haptix-comm이라는 등록 정보 시트를 선택한다. 이 작업은 프로젝트의 모든 dependencies을 처리해준다. 상단의 툴바에서 target build를 DebugRelease로 바꾸고 BUILD->Build Solution을 눌러 컨트롤러를 빌드한다.

Linux

  1. 다운로드와 예제 컴파일을 위하여 아래 패키지를 설치한다.
sudo apt-get install wget cmake build-essential
  1. 실습을 위하여 haptix_controller라는 이름의 새로운 디렉토리를 생성하고 그 디렉토리로 이동한다.
mkdir ~/haptix_controller
cd ~/haptix_controller
  1. 컨트롤러 소스파일cmake 파일을 다운로드 한다.
wget http://bitbucket.org/osrf/haptix-comm/raw/default/example/hx_controller.c
wget http://bitbucket.org/osrf/gazebo_tutorials/raw/default/haptix_comm/files/CMakeLists.txt
  1. 빌드 디렉토리를 생성하고 소스파일을 컴파일한다.
mkdir build
cd build
cmake ..
make

Running the simulation with your controller

리눅스 컴퓨터에서는 haptixStart 데스크탑 아이콘을 더블클릭하여 시뮬레이션을 시작한다.

Windows

Visual Studio를 사용하여 소스코드를 실행할 준비가 되었다면 DEBUG-> Start Without Debugging... 클릭한다. (또는 Ctrl+F5를 누른다) Note: 만약에 윈도우 방화벽이 활성화되어 있으면 최근에 컴파일 된 응용 프로그램을 실행할 수 있는 권한을 묻는 "Windows 보안 경고, Windows 방화벽에서이 프로그램의 일부 기능을 차단했습니다."라는 창이 뜰것이다. 이때 기본 옵션("집 또는 직장 네트워크와 같은 사설망")을 그대로 두고 "액세스 허용"을 클릭 한다.

Linux

  1. 컨트롤러 코드를 실행할 리눅스 컴퓨터에서 터미널창을 열고 실행할 컨느롤러의 위치에 있는 /build디렉토리로 이동한다.
cd ~/haptix_controller/build
  1. 컨트롤러를 실행한다.
./hx_controller

Controller visualization

컨트롤러가 실행되는 동안 가제보에서 손이 부드러운 경로(smooth trajectory)를 따라가는 것을 볼 수 있다.

IMAGE ALT TEXT HERE

The code explained

int main(int argc, char **argv)
{
  int i;
  int counter = 0;
  hxRobotInfo robotInfo;
  hxCommand cmd;
  hxSensor sensor;

  // Capture SIGINT signal.
  if (signal(SIGINT, sigHandler) == SIG_ERR)
    printf("Error catching SIGINT\n");

  // Capture SIGTERM signal.
  if (signal(SIGTERM, sigHandler) == SIG_ERR)
    printf("Error catching SIGTERM\n");

  // Connect to the simulator / hardware
  if (hx_connect(NULL, 0) != hxOK)
  {
    printf("hx_connect(): Request error.\n");
    return -1;
  }

  // Requesting robot information.
  if (hx_robot_info(&robotInfo) != hxOK)
  {
    printf("hx_getrobotinfo(): Request error.\n");
    return -1;
  }

  // Print the robot information.
  printRobotInfo(&robotInfo);

  // Uncomment this block to start logging.
  // if (hxs_start_logging("/tmp/log/") != hxOK)
  //   printf("hxs_start_logging(): error.\n");

  int steps = 0;

  // Send commands at ~100Hz.
  while (steps < 3000)
  {
    // Create a new command based on a sinusoidal wave.
    for (i = 0; i < robotInfo.motor_count; ++i)
    {
      // Set the desired position of this motor
      cmd.ref_pos[i] = (float)(350 * 0.5 *
        sin(0.05 * 2.0 * M_PI * counter * 0.01));
      // We could set a desired maximum velocity
      // cmd.ref_vel[i] = 1.0;
      // cmd.ref_vel_max[i] = 1.0;
      // We could set a desired controller position gain
      // cmd.gain_pos[i] = 1.0;
      // We could set a desired controller velocity gain
      // cmd.gain_vel[i] = 1.0;
    }
    // Indicate that the positions we set should be used.
    cmd.ref_pos_enabled = 1;
    // We're not setting it, so indicate that ref_vel should be ignored.
    cmd.ref_vel_enabled = 0;
    // We're not setting it, so indicate that ref_vel_max should be ignored.
    cmd.ref_vel_max_enabled = 0;
    // We're not setting it, so indicate that gain_pos should be ignored.
    cmd.gain_pos_enabled = 0;
    // We're not setting it, so indicate that gain_vel should be ignored.
    cmd.gain_vel_enabled = 0;

    // Send the new joint command and receive the state update.
    if (hx_update(&cmd, &sensor) != hxOK)
    {
      printf("hx_update(): Request error.\n");
      continue;
    }

    // Debug output: Print the state.
    if (!(counter % 100))
      printState(&robotInfo, &sensor);

    if (++counter == 10000)
      counter = 0;

    ++steps;

    // Here is where you would do your other work, such as reading from EMG
    // sensors, decoding that data, computing your next control command,
    // etc.  In this example, we're just sleeping for 10ms.
    //
    // You might also want to sleep in your code, because there's a maximum
    // rate at which the limb can process new commands and produce new
    // sensor readings.  Depending on how long your computation takes, you
    // might want to wait here until it's time to send a new command.  Or
    // you might want to run as fast as possible, computing and sending new
    // commands constantly (but knowing that not all of them will be
    // executed by the limb).
    unsigned int sleeptime_us = 10000;
#ifdef _WIN32
    Sleep((DWORD)(sleeptime_us / 1e3));
#else
    usleep(sleeptime_us);
#endif
  }

  // Uncomment this block to stop logging.
  // if (hxs_stop_logging() != hxOK)
  //   printf("hxs_stop_logging(): error.\n");

  // Disconnect from the simulator / hardware
  if (hx_close() != hxOK)
  {
    printf("hx_close(): Request error.\n");
    return -1;
  }

  return 0;
}

HAPTIX C API는 5 개의 C 함수 호출로 구성된다: hx_connect(), hx_robot_info(), hx_update(), hx_read_sensors() hx_close(). hx_connect()hx_close()는 Gazebo 시뮬레이터에서는 선택 사항이지만 MuJoCo와의 호환성을 위해 포함 있습니다.

hx_robot_info()는 주어진 장치(Gazebo에서 시뮬레이션 된 손)로부터 정보를 요청한다. 이 호출은 응답이 수신 될 때까지 차단(block)된다.

hx_robot_info()에 대한 매개 변수는 요청 된 장치에 대한 모터, 조인트, 접촉 센서, IMU 및 조인트 제한 수를 포함하는 hxRobotInfo 구조체이다. 또한 장치 업데이트 주기인 업데이트 속도도 포함됩니다. 응답이 유효한다면 반환 값은 hxOK이다.

이 예제에는 디버깅 목적으로 수신 된 모든 필드를 인쇄하는 도움 함수 printRobotInfo()가 포함되어 있습니다.

일단 로봇 정보를 확인하면 손을 제어하기위한 명령을 보낼 수 있다. hx_update() 함수는 새로운 명령을 보내고 현재 손의 상태를 받는 역할을 한다.

먼저, 각 관절의 위치, 속도 및 이득을 포함하는 hxCommand 구조체를 채울 필요가 있다. hxCommand 구조체에 대한 자세한 내용은 haptix-comm API에서 확인할 수 있다. 이 예제의 경우, sin 함수에 따라 모든 관절의 위치를 바꾸고 있다.

hx_update()의 첫 번째 매개 변수인 cmd는 이미 입력되어있는 장치로 보내려는 명령이다. 두 번째 출력 명령 sensor는 함수에 전달된다; 이것은 명령이 적용된 후 손의 상태를 포함하고 있다.

디버깅 목적으로 모든 상태 정보를 보여주는 도움 함수 printState()가 있다. hx_robot_info()와 마찬가지로, hx_update() 함수는 명령이 성공적으로 보내지고 상태가 수신되면 hxOK를 반환한다.

Troubleshooting

윈도우 클라이언트에서 리눅스 가제보 서버로 연결할 수 없을때

일반적으로 Visual Studio에서 시작한 명령 줄에서 오류 메시지 hx_robot_info() Service call timed out가 출력된다. 이것은 Gazebo Linux 서버와의 통신이 실패했음을 의미한다.

첫 번째 확인사항: 두 시스템이 동일한 네트워크에 있고 서로 도달 할 수 있는가? 단순히 양쪽(windows command과 Linux shell)에서 ping 명령을 사용하면, 연결을 확인할 수 있다. 작동하지 않는 경우 네트워크 구성에 문제가 있는 것이다. 둘 다 동일한 네트워크에 연결되어 있는지 확인하여라.

두 번째 확인사항: 통신 레이어가 올바른 네트워크 인터페이스를 사용하고 있는가? Gazebo Linux 서버와 Windows에서 IGN_IP를 올바르게 설정했는지 다시 확인하여라. windows command에서 echo % IGN_IP %에서 확인할 수 있습니다. 완전히 확실하게 하려면, 사용자 세션에서 로그 아웃 한 다음 다시 로그인하고 Visual Studio를 연다.

세 번째 확인사항: Windows 방화벽이 통신에 영향을 주는가? Windows 제어판에서이 기능을 비활성화 할 수 있다 (Windows 방화벽에 다른 프로필이 있음을 기억하고, 모두 비활성화해야 함). Visual Studio를 다시 시작한다.

네 번째 확인사항: 라우터가 통신을 끊고 있는가? 몇 가지 해결책: 라우터에 로그인하고 모든 종류의 방화벽을 비활성화한다. 그렇게 할 수 없다면 이더넷 케이블을 사용하여 두 시스템을 직접 연결하십시오. 동일한 서브넷(192.168.X.Y/255.255.255.0 및 192.168.X.Y+1/255.255.255.0)을 수동으로 셋팅해야 한다.

'Error setting socket option'

아마도 IGN_IP 변수에서 IP 주소를 잘못 입력했을 것이다.

The handsim simulator displays: 'NodeShared: no route to host'

이 에러는 리눅스 시뮬레이터에서 윈도우 시스템으로 다시 연결되지 않는다는 것을 의미한다. 이것은 윈도우 방화벽이 원인일 수 있다.

손이 시뮬레이터에서 움직이지만, 이상하고 부드럽지 않다

무선연결을 사용한다면, 지연으로 인한 연결 실패가 발생할 수 있다. 유선 연결을 시도해 보아라.

윈도우 방화벽 질문에서 잘못된 옵션(취소)을 선택했다

오류로 인해 잘못된 단추를 누르면 윈도우 제어판에서 Windows 방화벽 고급 보안으로 들어가서 인바운드 규칙으로 이동하여 ConsoleApplication (또는 응용 프로그램에 준 이름) 이름으로 보안을 제거 할 수 있다. 또다른 옵션은 Solution Explorer window에 나타나는 프로젝트 속성 이름(솔루션 이름이 아님)에서 응용 프로그램 이름을 수정하는 것이다. 프로젝트를 clean하고 다시 빌드하고 다시 실행한다.

Table of Contents




Clone this wiki locally