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 : 절대 좌표로의 로봇 이동 명령으로 입력은 목표 위치 (도) 와 관절 수 (DoF)

  • MoveJointBy : 상대 좌표로의 로봇 이동 명령으로 입력은 목표 위치 (도) 와 관절 수 (DoF)

  • MoveTaskTo : 절대 6D 좌표로의 로봇 이동 명령으로 입력은 6개: X (미터), Y (미터), Z(미터), RotX (도), RotY (도), RotZ (도)

  • MoveTaskBy : 상대 6D 좌표로의 로봇 이동 명령으로 입력은 6개: X (미터), Y (미터), Z (미터), RotX (도), RotY (도), RotZ (도).

  • GetJointPosition : 현재 로봇 관절 위치 요청 명령으로 입력은 관절 수, 출력은 각도

  • GetJointVelocity : 현재 로봇 관절 속도 요청 명령으로 입력은 관절 수, 출력은 속도 (도/초)

  • 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 에 포함시킬 수 없습니다.