-
Notifications
You must be signed in to change notification settings - Fork 14
HAPTIX C API
C-API 문서를 찾는다면? http://gazebosim.org/haptix/api에 들어가 보아라
이 튜토리얼은 손의 설명을 요청하거나 조인트 명령을 보내고 상태를 업데이트 받기 위한 C HAPTIX 클라이언트 라이브브리 `haptix-comm' 사용법에 대하여 설명한다. 설치 순서에 따라 이미 완료하였다고 가정한다.
이 튜토리얼에서는 모든 손 관절에 sin 함수를 적용하는 아주 기본적인 컨트롤러를 포함합니다. 먼저, 컨트롤러를 컴파일하고 haptix-comm 라이브러리에 링크해야한다.
Visual Studio 2013을 열고 핸드 컨트롤러를 위한 새로운 프로젝트를 생성한다. File
->New Project
->Visual C++
를 선택하고, 오른쪽 창에서 Win32 Console Application를 선택한다. 프로젝트 이름을 입력한다, 예를 들면 MyBasicController
. OK
을 누르고, Finish
를 누른다.
현재 프로젝트의 소스코드를 기본 컨트롤러 코드로 바꾼다. 소스 코드는 여기에서 복사하여 현재 프로젝트에 복사한다.
소스코드 시작 위치에 아래 줄을 추가한다:
#include "stdafx.h"
** Note: 32-bit SDK를 사용한다면 이번 장은 생략한다 **
툴바에 있는 Win32
라고 되어있는 드롭다운 메뉴에서(dropdown menu) Configuration Manager를 선택한다.
그리고 Active solution platform
드롭다운 메뉴에서 <New...>
를 선택한다. Type or select the new platform
을 누르고 ARM
을 x64
로 변경하고 Close
를 누른다.
View
->Other Windows
->Property Manager
를 눌러 Property Manager를 연다. 그러면 HAPTIX 라이브러리 SDK에서 제공하는 속성 시트를 사용할 수 있다. Property Manager
탬으로 이동하여 프로젝트에서 우클릭을 한다. 그리고 Add Existing Property Sheet...
를 선택한다. 새로운 팝업 창이 나타나면 HAPTIX 클라이언트 라이브러리 SDK를 다운로드 한 폴더로 이동하여 haptix-comm
이라는 등록 정보 시트를 선택한다. 이 작업은 프로젝트의 모든 dependencies을 처리해준다.
상단의 툴바에서 target build를 Debug
를 Release
로 바꾸고 BUILD
->Build Solution
을 눌러 컨트롤러를 빌드한다.
- 다운로드와 예제 컴파일을 위하여 아래 패키지를 설치한다.
sudo apt-get install wget cmake build-essential
- 실습을 위하여
haptix_controller
라는 이름의 새로운 디렉토리를 생성하고 그 디렉토리로 이동한다.
mkdir ~/haptix_controller
cd ~/haptix_controller
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
- 빌드 디렉토리를 생성하고 소스파일을 컴파일한다.
mkdir build
cd build
cmake ..
make
리눅스 컴퓨터에서는 haptixStart
데스크탑 아이콘을 더블클릭하여 시뮬레이션을 시작한다.
Visual Studio를 사용하여 소스코드를 실행할 준비가 되었다면 DEBUG
-> Start Without Debugging...
클릭한다. (또는 Ctrl+F5를 누른다)
Note: 만약에 윈도우 방화벽이 활성화되어 있으면 최근에 컴파일 된 응용 프로그램을 실행할 수 있는 권한을 묻는 "Windows 보안 경고, Windows 방화벽에서이 프로그램의 일부 기능을 차단했습니다."라는 창이 뜰것이다. 이때 기본 옵션("집 또는 직장 네트워크와 같은 사설망")을 그대로 두고 "액세스 허용"을 클릭 한다.
- 컨트롤러 코드를 실행할 리눅스 컴퓨터에서 터미널창을 열고 실행할 컨느롤러의 위치에 있는
/build
디렉토리로 이동한다.
cd ~/haptix_controller/build
- 컨트롤러를 실행한다.
./hx_controller
컨트롤러가 실행되는 동안 가제보에서 손이 부드러운 경로(smooth trajectory)를 따라가는 것을 볼 수 있다.
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
를 반환한다.
일반적으로 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)을 수동으로 셋팅해야 한다.
아마도 IGN_IP
변수에서 IP 주소를 잘못 입력했을 것이다.
이 에러는 리눅스 시뮬레이터에서 윈도우 시스템으로 다시 연결되지 않는다는 것을 의미한다. 이것은 윈도우 방화벽이 원인일 수 있다.
무선연결을 사용한다면, 지연으로 인한 연결 실패가 발생할 수 있다. 유선 연결을 시도해 보아라.
오류로 인해 잘못된 단추를 누르면 윈도우 제어판에서 Windows 방화벽 고급 보안
으로 들어가서 인바운드 규칙으로 이동하여 ConsoleApplication
(또는 응용 프로그램에 준 이름) 이름으로 보안을 제거 할 수 있다. 또다른 옵션은 Solution Explorer window
에 나타나는 프로젝트 속성 이름(솔루션 이름이 아님)에서 응용 프로그램 이름을 수정하는 것이다. 프로젝트를 clean하고 다시 빌드하고 다시 실행한다.
-
Robot Simulators
-
Build a Robot
- Model structure and requirements
- How to contribute a model
- Make a model
- Make a Mobile Robot
- The relationship among Link, Joint and Axis
- Import Meshes
- Attach Meshes
- Add a Sensor to a Robot
- Make a Simple Gripper
- Attach Gripper to Robot
- Nested model
- Model Editor
- Animated Box
- Make an animated model(actor)
- Inertial parameters of triangle meshes
- Visibility layers
-
Model Editor
-
Build a World
-
Tools and utilities
-
Write a plugin
-
Plugins
-
Sensors
-
User input
-
Transport Library
-
Rendering Library
-
Connect to ROS
-
Ros Control - Advanced
-
DRCSIM for ROS Kinetic (Ubuntu16.04)
-
DRCSIM
- DRC Simulator installation
- Launchfile options
- Spawn Atlas into a custom world
- Animate joints
- Atlas Keyboard Teleoperation over ROS
- Teleoperate atlas with a music mixer
- Visualization and logging
- Atlas MultiSense SL head
- How to use the Atlas Sim Interface
- Atlas fake walking
- Grasp with Sandia hands
- DRC vehicle tele-operation
- DRC vehicle tele operation with Atlas
- Sending joint commands with ROS
- Atlas control over ROS with python
- Modify environment
- Atlas switching control modes
- Atlas Controller Synchronization over ROS Topics
- Changing Viscous Damping Coefficients Over ROS Service
- Running BDI controller demo
- Using the RobotiQ 3 Finger Adaptive Robot Gripper
- BDI Atlas Robot Interface 3.0.0 Stand In Example
-
HAPTIX
- HAPTIX software install and update
- HAPTIX C API
- HAPTIX Matlab and Octave API
- HAPTIX Simulation World API
- HAPTIX Teleoperation
- HAPTIX environment setup
- HAPTIX Optitrack Control
- HAPTIX Tactor Glove
- HAPTIX Simulation World API with Custom World Example
- HAPTIX logging
- HAPTIX DEKA Luke hand installation
- HAPTIX Simulation Scoring Plugin Example
-
MoveIt!
-
Rviz & rqt & ROSBAG
- Control Theory
- TroubleShooting
- Solidworks model to URDF
- ROS-Gazebo with MATLab
- MATLab installation in Linux
- [Gazebo simulation with MATLab]