Skip to content

소개

시스템 개요

LabVIEW Toolbox 에는 Indy VI(Virtual Instrument) 인 IndyComm.vi 와 Indy 인터페이스를 위한 DLL 라이브러리가 있습니다. Indy VI 는 Indy Framework와 TCP 소켓 프로토콜로 통신하기 위해 DLL file 을 사용하며, 아래 그림은 Indy 로봇을 위한 LabVIEW Toolbox 의 전체 구조를 나타낸 것입니다.

  • IndyLV Project : Indy 인터페이스의 공유 라이브러리를 위한 C++ 프로젝트
    (해당 라이브러리는 소켓 연결을 통해 Indy Framework 와 통신하는 기능을 담당)

  • IndyLV.DLL : IndyLV 프로젝트의 컴파일 결과물 (LabVIEW VI 에서 직접 사용)

  • Indy LabVIEW VI : 사용자가 라이브러리의 작동 방식을 알 수 있도록 제공하는 LabVIEW VI 샘플
    (이를 참고하여 컴포넌트 추가 또는 새로운 컴포넌트 생성 가능)

  • Indy Framework 2.2.2 : Indy 로봇을 작동시키는 바이너리 파일 셋 (Indy 를 구입한 고객에게 제공)


LabVIEW Toolbox 개요

설치

LabVIEW Toolbox는 Github repository 에서 무료로 이용 가능합니다.

Git 도구를 사용하여 저장소를 클론하면 아래 파일과 폴더가 지정한 디렉토리에 저장됩니다.

  • IndyLV : 공유 라이브러리 IndyLV.dll 의 Visual Studio C++ 소스 폴더

  • IndyLV.dll : IndyLV 프로젝트의 컴파일 된 공유 라이브러리 파일 (LabVIEW VI 에서 사용)

  • IndyComm.vi : Indy Framework 와의 통신을 위해 IndyLV.dll 을 사용하는 LabVIEW VI 샘플

구성

LabVIEW Toolbox 는 NI LabVIEW 가 설치된 컴퓨터에서 작동하며 대부분의 LabVIEW 버전과 호환됩니다. 각종 명령과 로봇 상태를 전송하려면 STEP 에 Ethernet 연결이 필요하며, 설치 후 이외 추가 구성 없이 LabVIEW Toolbox 를 바로 사용할 수 있습니다.

사용자 접근 단계

누구나 LabVIEW Toolbox 의 기능을 사용, 수정, 개발할 수 있습니다.

참조 목록

본 메뉴얼의 작성에 있어 참조한 프로젝트이며 중요도 순으로 나열되어 있습니다.

메뉴얼 구성

사용자 메뉴얼 구성은 다음과 같습니다.

  • 일반 정보 : 시스템 용어와 목적

  • 시스템 요약 : 시스템 개요 요약 (시스템 하드웨어 및 소프트웨어 요구 사항, 구성, 사용자 접근 단계)

  • 시작하기 : Indy 패키지의 설치 및 사용 방법

  • 시스템 살펴보기 : 시스템 기능과 구성

약어

본 문서에서 사용되는 약어와 그 의미는 다음과 같습니다.

  • Indy : 모든 종류의 Indy 로봇

  • Indy DCP : Indy 전용 TCP/IP Protocol

  • STEP : Indy 의 임베디드 컨트롤러

  • VI : LabVIEW 의 Indy Virtual Instrument

  • UI : 유저 인터페이스

  • q : 로봇의 관절공간 위치 (라디안)

  • qdot : 로봇의 관절공간 속도 (라디안/초)

  • qddot : 로봇의 관절공간 가속도 (라디안/초2)

  • 6-D 공간 : 3-D 변위 & 3-D 회전

  • Pos / pos : 로봇의 직교 좌표 상 위치 (미터 + 라디안)

  • Vel / vel : 로봇의 직교 좌표 상 속도 (미터/초 + 라디안/초)

  • Acc / acc : 로봇의 직교 좌표 상 가속도 (미터/초2 + 라디안/초2)

튜토리얼

LabVIEW Toolbox 실행

LabVIEW 설치 후, 링크 에서 DMC UI 모음1을 다운 받습니다. Indy VI 는 위 UI 모음을 사용하여 UI 구성 요소의 외관을 개선할 수 있습니다. 그 다음, IndyComm.vi 를 더블 클릭 하여 LabVIEW 에서 샘플 Indy VI 를 실행시킵니다.

LabVIEW 프론트 패널에서 Indy VI 의 UI 중 아래 그림과 같은 설정 영역에 대해 살펴 보겠습니다.


공유 라이브러리와 소켓 정보의 설정 영역

  • Indy 라이브러리 경로 : IndyLV.dll 의 절대 경로로 열기 버튼을 클릭하고 IndyLV.dll 파일을 선택하면 경로를 얻을 수 있습니다.

  • 소켓 정보 : STEP IP 주소, 포트 번호, 로봇 이름을 포함한 Indy DCP 소켓에 대한 필수 정보입니다.

  • 연결 생성 : VI를 실행하여 Connect 버튼을 클릭하면 Indy Framework 에 연결할 수 있습니다.

연결이 성공적으로 완료되면, 아래 그림과 같이 로봇 모니터링 영역을 볼 수 있습니다.


로봇 모니터링 영역

  • Ready : 이 LED 는 로봇이 준비 상태임을 나타냅니다.

  • In Motion : 로봇이 움직이고 있으면 해당 LED 가 녹색으로 변합니다.

  • Joint Position : 관절 위치는 왼쪽 부터 수치와 그래프의 두 가지 방식으로 표시됩니다.

  • Joint Velocities : 속도는 하단의 게이지로 표시됩니다.

모니터링 탭 옆의 컨트롤 탭을 아래 그림과 같이 볼 수 있다.


로봇 컨트롤 영역

  • Zero : 영 위치로 이동 (모든 관절의 각도가 0인 위치)

  • Home : 홈 위치로 이동 (미리 정의 된 홈 위치)

  • Stop : 타겟 위치로의 관절 이동의 정지

  • Target Position : 각도 단위의 타겟 위치로 Move Joint 함수에서 사용

  • Move Points : 웨이포인트 목록에 따라 로봇 이동

  • List of Waypoints : Nx6 의 2D 배열로 N 은 포인트 개수, 6은 로봇 관절 수를 의미

  • ←→↑↓ : 글로벌 좌표계의 X, Y, Z 축에 대한 로봇 TCP의 이동 명령 전송 (↑ 와 ↓ 버튼 사이의 숫자만큼 이동)

예제

Indy 공유 라이브러리

도입부에서 간략히 설명했듯이, 공유 라이브러리 IndyLV 는 비쥬얼 스튜디오 C++ 로 개발되었습니다. 이 장에서는 IndyLV 프로젝트의 소스 코드에 대해 설명하고자 합니다. LabVIEW 를 위한 공유 라이브러리 개발에 대한 자세한 내용은 앞선 장에서 적절한 URL을 참조하기 바랍니다.

Toolbox 의 IndyLV 프로젝트는 아래 Visual Studio 그림과 같습니다. 개발자라면 IndySocket.hIndySocket.cpp 을 유의 있게 살펴봐야 하며, 두 파일은 Indy LabVIEW VI 에 의해 호출 된 API 를 선언하고 실행합니다.


Visual Studio C++ 에서의 IndyLV 프로젝트

IndySocket.h 코드 를 자세히 보면 공유 라이브러리를 위해 구현된 모든 함수의 선언을 볼 수 있습니다. 아래 목록은 각 함수에 대한 간략한 설명이며, 함수 구현을 위해 관련 소스 코드를 좀 더 깊게 파악하실 필요가 있습니다.

함수
기능
ConnectIndy Indy Framework 와의 소켓 연결 (파라미터는 IP 주소, 포트, 로봇 명)
DisconnectIndy Indy Framework 와 소켓 연결 종료 및 모든 스레드 정지
CloseAll DisconnectIndy 와 유사한 기능
IsRobotReady 로봇 준비 여부 요청 (준비 시 1, 그렇지 않으면 0 리턴)
IsInMotion 로봇 동작 상태 요청 (동작 중일 시 1, 그렇지 않으면 0 리턴)
MoveHome 홈 위치로의 로봇 이동 명령
MoveZero 영 위치로의 로봇 이동 명령
SlowStop 로봇 작동 중지 명령
MoveJointTo 절대 좌표로의 로봇 이동 명령으로 입력은 목표 위치 (deg) 와 관절 수 (DoF)
MoveJointBy 상대 좌표로의 로봇 이동 명령으로 입력은 목표 위치 (deg) 와 관절 수 (DoF)
MoveTaskTo 절대 6D 좌표로의 로봇 이동 명령으로 입력은 6개
: X (m), Y (m), Z (m), RotX (deg), RotY (deg), RotZ (deg)
MoveTaskBy 상대 6D 좌표로의 로봇 이동 명령으로 입력은 6개
: X (m), Y (m), Z (m), RotX (deg), RotY (deg), RotZ (deg)
GetJointPosition 현재 로봇 관절 위치 요청 명령으로 입력은 관절 수, 출력은 각도(deg)
GetJointVelocity 현재 로봇 관절 속도 요청 명령으로 입력은 관절 수, 출력은 속도 (deg/sec)
MoveWaypoints 웨이포인트 목록에 따른 로봇 이동 명령으로 입력은 웨이포인트 리스트, 포인트 수, 관절 수

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct ConnectionInfo {...};
extern ConnectionInfo connection;

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1 byte boundary */

struct HeaderCommandStruct {...};

#pragma pack(pop)   /* restore original alignment from stack */

union HeaderCommand {...};
union Data {...};
struct ACKPackage {...};

/* Function declarations */
extern "C" __declspec(dllexport) int __cdecl ConnectIndy(char * ipaddr, int port, char * robotname);
extern "C" __declspec(dllexport) int __cdecl DisconnectIndy();
extern "C" __declspec(dllexport) int __cdecl CloseAll();
extern "C" __declspec(dllexport) int __cdecl IsRobotReady(uint8_t * ready);
extern "C" __declspec(dllexport) int __cdecl IsInMotion(uint8_t * in_motion);
extern "C" __declspec(dllexport) int __cdecl MoveHome();
extern "C" __declspec(dllexport) int __cdecl MoveZero();
extern "C" __declspec(dllexport) int __cdecl SlowStop();
extern "C" __declspec(dllexport) int __cdecl MoveJointTo(const double *target, const int16_t num_joints);
extern "C" __declspec(dllexport) int __cdecl MoveJointBy(const double *target, const int16_t num_joints);
extern "C" __declspec(dllexport) int __cdecl MoveTaskTo(const double *target);
extern "C" __declspec(dllexport) int __cdecl MoveTaskBy(const double *target);
extern "C" __declspec(dllexport) int __cdecl GetJointsPosition(double *position, const int16_t num_joints);
extern "C" __declspec(dllexport) int __cdecl GetJointsVelocity(double *velocity, const int16_t num_joints);
extern "C" __declspec(dllexport) int __cdecl MoveWaypoints(const double *waypoints, const int16_t num_points, const int16_t num_joints);

Indy VI 블록 다이어그램

이 장에서는 LabVIEW 에서 Indy VI 의 블록 다이어그램 (그래픽 소스 코드) 에 대해 설명합니다. 사용 된 UI 에서 Indy VI 의 블록다이어 그램 객체들은 모니터링 (그림) 과 제어 (그림) 그룹으로 나뉩니다. 객체별 자세한 설명은 아래와 같습니다.


True/False 버튼 : Indy VI 의 모든 버튼은 릴리즈 시 래치가 기본 설정


Call-Library-Function 노드 : LabVIEW VI 가 호출한 DLL 함수


Switch/Case object : Indy VI 에서의 버튼 값 확인 및 내장 라이브러리 함수 호출


Loop object : 특정 조건이 발생할 때까지 Sub-Diagram 의 코드 반복


Sleep Object : 루프를 밀리세컨드 단위의 일정 시간 (시계 아이콘 옆의 숫자) 만큼 정지


위 객체는 입력 데이터를 받아 waveform chart 형태로 시각화합니다. Indy VI 에서는 관절 위치 표시에 사용합니다.


위 객체는 단일 입력 데이터를 게이지로 표시합니다. Indy VI 에서는 속도 값 표시에 사용합니다.

위 내용을 토대로 로봇 모니터링 블록 다이어그램을 좀 더 자세히 알아보겠습니다. 먼저 모니터링 다이어그램은 IsRobotReady, IsInMotion, GetJointsPosition, GetJointsVelocity 4개의 라이브러리를 호출하는 루프로 구성되며, LED, Waveform Chart, 게이지와 같은 적절한 UI 로 피드백 데이터가 시각화됩니다.


로봇 모니터링 블록 다이어그램

동시에 제어 다이어그램은 아래 그림처럼 폴링 방식으로 루프가 작동합니다. 이 루프는 UI 상에 이벤트가 발생하기 전까지 활성화되지 않기 때문에 Sleep Object 가 필요하지 않습니다. 예를 들어, MoveHome 버튼을 클릭하면, 버튼 값이 False 에서 True 로 바뀌고, Switch/Case Object 의 MoveHome 함수를 작동시킵니다. 이는 Indy Framework 에 TCP socket 으로 요청을 보내며 로봇을 홈 위치로 움직입니다.

마지막으로 중요한 것은 Power 버튼 입니다. 이 버튼의 사용은 안전하게 모니터링과 제어 루프를 종료하고 Indy VI 를 끝낼 수 있도록 합니다. 이 때 Tag 채널을 사용하여 Power 버튼의 신호를 루프 종료에 반영합니다.


로봇 제어 블록 다이어그램


  1. DMC 저작권에 의해 UI 모음을 Neuromeka 의 LabVIEW Toolbox 에 포함시킬 수 없습니다.