C++ IndyDCP client
C++ IndyDCP client 는 IndyDCP Protocol 을 기반으로 Indy 를 제어할 수 있는 C++ class 입니다. 모든 관련 함수는 IndyDCPConnector.h 에 선언되어 있습니다.
설치
C++ IndyDCP client 의 소스파일과 프로젝트 파일은 다운로드 페이지에서 사용중인 Indy SW와 동일버전으로 다운로드 해주시기 바랍니다.
C++ IndyDCP client 는 WIndows와 Linux 두 OS에서 사용할 수 있습니다. 윈도우 환경에서 실행시킬 경우 아래 경로의 Visual Studio 프로젝트를 여시면 됩니다.
- /IndyDCPClientWindows/IndyDCPClientWindows.sln
 
Notes
1 2 3  |  | 
Socket 통신의 초기화와 종료
C++ IndyDCP client 를 사용하기 전, OS별로 아래와 같이 socket 통신을 사용하기 위한 라이브러리 초기화를 수행해야 합니다. Windows의 경우 별도의 종료 함수도 호출해주어야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12  |  | 
1 2 3 4 5 6 7  |  | 
Indy와의 연결 및 연결 해제
Indy 와의 모든 통신은 IndyDCPConnector.h 에 선언되어 있는 IndyDCPConnector 클래스를 통해 수행할 수 있습니다. IndyDCPConnector 객체를 초기화하기 위해서는, Indy 의 종류와 IP 주소를 입력해야 합니다. 사용 가능한 모든 로봇 종류는 NRMKIndy::Service::DCP namespace 안에 정의되어 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  |  | 
C++ IndyDCP 명령어 리스트
아래는 IndyDCP 전체 명령어 중 일부에 대한 사용 예시들을 나타냅니다. 예시에 포함되지 않은 명령어는 전체 명령어 리스트에서 확인할 수 있으며 사용방법에 대해서는 다운받은 C++ IndyDCP 코드를 참고해주시기 바랍니다.
Note
1 |  | 
| 함수 | 기능 | 
|---|---|
| ***stopEmergency()*** | 비상정지 실행 | 
| ***resetRobot()*** | 로봇 리셋 | 
|  ***setServoOnOff(const char * const servoVec)*** ***setServoOnOff(const bool * const servoVec)*** ***setServoOnOff(std::initializer_list  | 
        ***servoVec*** 값에 따라 서보 On/Off  | 
    
|  ***setBrakeOnOff(const char * const brakeVec)*** ***setBrakeOnOff(const bool * const brakeVec)*** ***setBrakeOnOff(std::initializer_list  | 
        ***brakeVec*** 값에 따라 브레이크 On/Off  | 
    
| ***stopMotion()*** | 로봇 모션 중지 | 
| ***executeMoveCommand(const std::string & cmdName)*** | Conty를 통해 티칭된 ***cmdName*** 이름을 가진 Move Command 실행 | 
| ***moveJointHome()*** | 홈 포지션으로 이동 | 
| ***moveJointZero()*** | 제로 포지션으로 이동 | 
| ***moveJointTo(const double * const qvec)*** ***moveJointTo(std::initializer_list  | 
      모든 관절 각도를 ***qvec***의 값으로 이동 | 
| ***moveJointBy(const double * const qvec)*** ***moveJointBy(std::initializer_list  | 
      모든 관절 각도를 ***qvec***의 값 만큼 상대적으로 이동 | 
|  ***moveTaskTo(const double * const pvec)*** ***moveTaskTo(std::initializer_list  | 
      로봇 엔드 이펙터를 ***pvec***의 6 자유도 위치로 이동 | 
|  ***moveTaskBy(const double * const pvec)*** ***moveTaskBy(std::initializer_list  | 
      로봇 엔드 이펙터를 ***pvec*** 의 6 자유도 값 만큼 상대적으로 이동 | 
| ***startCurrProgram()*** | 현재 로드된 로봇 프로그램 실행 | 
| ***pauseProgram()*** | 현재 현재 실행중인 프로그램 일시정지 | 
| ***resumeProgram()*** | 현재 일시정지된 프로그램 재개 | 
| ***stopProgram()*** | 현재 프로그램 중지 | 
| ***startRegisteredDefaultProgram()*** | 현재 등록된 기본 콘티 프로그램 실행 | 
| ***registerDefaultProgram(int idx)*** | idx 1-10번 기본 프로그램 등록 | 
| ***getRegisteredDefaultProgram(int &ret)*** | 현재 등록된 기본 프로그램 번호 요청 | 
| ***isRobotRunning(bool& ret)*** | 로봇 소프트웨어의 동작 여부를 확인 | 
| ***isRobotReady(bool& ret)*** | 로봇이 동작 가능한 상태인 지 확인 | 
| ***isEmergencyStopped(bool& ret)*** | 로봇이 비상 정지 상태인 지 확인 | 
| ***isCollided(bool& ret)*** | 로봇이 충돌 감지로 인해 정지되어 있는 지 확인 | 
| ***isErrorState(bool& ret)*** | 로봇이 에러 상태인 지 확인 | 
| ***isMoveFinished(bool& ret)*** | 로봇의 동작이 멈춘 상태인 지 확인 | 
| ***isBusy(bool& ret)*** | 로봇이 움직이는 도중인 지 확인 | 
| ***isHome(bool& ret)*** | 로봇이 홈 포지션에 있는 지를 확인 | 
| ***isZero(bool& ret)*** | 로봇이 제로 포지션에 있는 지를 확인 | 
| ***isInResetting(bool& ret)*** | 로봇이 리셋 도중인 지 확인 | 
| ***isDirectTeachingMode(bool& ret)*** | 로봇이 직접교시 모드인 지 확인 | 
| ***isTeachingMode(bool& ret)*** | 로봇이 교시 모드인 지 확인 (직접 교시, 조그) | 
| ***isProgramRunning(bool& ret)*** | 로봇이 동작 프로그램을 수행중인 지 확인 | 
| ***isProgramPaused(bool& ret)*** | 로봇의 동작 프로그램이 일시정지 되었는 지 확인 | 
| ***isContyConnected(bool& ret)*** | 로봇에 **Conty** 가 연결되었는 지 확인 | 
| ***changeToDirectTeachingMode()*** | 로봇 직접교시 모드 진입 | 
| ***finishDirectTeachingMode()*** | 로봇 직접교시 모드 종료 | 
| ***addJointWaypointSet(const double * const qvec)*** ***addJointWaypointSet(std::initializer_list  | 
      관절 웨이포인트 추가 | 
| ***removeJointWaypointSet()*** | 마지막 관절 웨이포인트를 제거 | 
| ***clearJointWaypointSet()*** | 모든 관절 웨이포인트 제거 | 
| ***executeJointWaypointSet()*** | 저장된 관절 웨이포인트로 모션 시작 | 
|  ***addTaskWaypointSet(const double * const pvec)*** ***addTaskWaypointSet(std::initializer_list  | 
      태스크 웨이포인트 추가 | 
| ***removeTaskWaypointSet()*** | 태스크 웨이포인트 제거 | 
| ***clearTaskWaypointSet()*** | 태스크 웨이포인트 제거 | 
| ***executeTaskWaypointSet()*** | 저장된 태스크 웨이포인트 사이의 모션 시작 | 
|  ***setDefaultTCP(const double * const tcpVec)*** ***setDefaultTCP(std::initializer_list  | 
      기본 TCP값을 ***tcpVec*** 로 설정 | 
| ***resetDefaultTCP()*** | 기본 TCP값 리셋 | 
|  ***setTCPCompensation(const double * const tcpVec)*** ***setTCPCompensation(std::initializer_list  | 
      TCP 보정값을 ***tcpVec*** 로 설정 | 
| ***resetTCPCompensation()*** | TCP 보정값 리셋 | 
|  ***setReferenceFrame(const double * const refFrameVec)*** ***setReferenceFrame(std::initializer_list  | 
      Reference 프레임 값을 ***refFrameVec*** 으로 설정 | 
| ***resetReferenceFrame()*** | Reference 프레임 값 리셋 | 
| ***setCollisionDetectionLevel(int level)*** | 충돌감지 민감도 레벨 설정 (1-5) | 
| ***setJointBoundaryLevel(int level)*** | JointMove 기본 속도/가속도 한계 레벨 설정 (1-9) | 
| ***setTaskBoundaryLevel(int level)*** | TaskMove 기본 속도/가속도 한계 레벨 설정 (1-9) | 
| ***setJointBlendingRadius(double radius)*** | JointMove 블랜딩 반경을 ***radius*** 값으로 설정 | 
| ***setTaskBlendingRadius(double radius)*** | TaskMove 블랜딩 반경 ***radius*** 값으로 설정 | 
| ***setJointWaypointTime(double time)*** | JointMove의 웨이포인트간 이동시간을 ***time*** 으로 설정 | 
| ***setTaskWaypointTime(double time)*** | TaskMove의 웨이포인트간 이동시간을 ***time*** 으로 설정 | 
| ***getDefaultTCP(double * const ret)*** | 기본 TCP값 요청 | 
| ***getTCPCompensation(double * const ret)*** | TCP 보정값 요청 | 
| ***getReferenceFrame(double * const ret)*** | Reference Frame 값 요청 | 
| ***getCollisionDetectionLevel(int &ret)*** | 충돌감지 민감도 레벨 값 요청 | 
| ***getJointBoundaryLevel(int &ret)*** | JointMove 기본 속도/가속도 한계 레벨값 요청 | 
| ***getTaskBoundaryLevel(int &ret)*** | TaskMove 기본 속도/가속도 한계 레벨값 요청 | 
| ***getJointBlendingRadius(double &ret)*** | JointMove 기본 블렌딩 반경값 요청 | 
| ***getTaskBlendingRadius(double &ret)*** | TaskMove 기본 블렌딩 반경값 요청 | 
| ***getJointWaypointTime(double &ret)*** | JointMove의 웨이포인트 간 이동시간 요청 | 
| ***getTaskWaypointTime(double &ret)*** | TaskMvoe의 웨이포인트 간 이동시간 요청 | 
| ***getTaskBaseMode(int &ret)*** | TaskMove 제어 기준 축 요청 | 
| ***getRobotRunningTime(double &ret)*** | 로봇 초기화 이후 총 실행시간 요청 | 
| ***getControlMode(int &ret)*** | 현재 로봇의 제어 모드 요청 | 
|  ***getJointServoState(char * const ret)***  ***getJointServoState(char * const retServo, char * const retBrake)*** ***getJointServoState(bool * const retServo, bool * const retBrake)***  | 
        각 관절 축의 Servo, Brake 상태 요청  | 
    
| ***getJointPosition(double * const ret)*** | 현재 로봇의 Joint 각도 위치 요청 | 
| ***getJointVelocity(double * const ret)*** | 현재 로봇의 Joint 각속도 요청 | 
| ***getTaskPosition(double * const ret)*** | 현재 로봇의 Task 위치 요청 | 
| ***getTaskVelocity(double * const ret)*** | 현재 로봇의 Task 속도 요청 | 
| ***getTorque(double * const ret)*** | 현재 로봇의 토크 요청 | 
| ***getLastEmergencyInfo(int & retCode, int * const retIntArgs, double * const retDoubleArgs)*** | 로봇의 가장 최근 Emergency 상태 정보 요청 | 
| ***getSmartDigitalInput(int idx, char & ret)*** | ***idx*** 번 DI 채널의 값을 참조 변수인 ***ret*** 에 저장 | 
| ***getSmartDigitalInputs(char * const & ret)*** | 모든 DI 값을 한번에 획득. 각 채널의 값들은 참조 변수 ***ret*** 의 각 bit에 나뉘어 저장 | 
| ***setSmartDigitalOutput(int idx, char val)*** | ***idx*** 번 DO 채널에 ***val*** 의 값을 할당 | 
| ***setSmartDigitalOutputs(const char * const val)*** | 모든 DO 채널에 값을 할당. 각 채널의 값들은 ***val***의 각 bit 값으로 할당 | 
| ***getSmartAnalogInput(int idx, int & ret)*** | ***idx*** 번 AI 채널의 값을 획득. 결과는 참조변수인 ***ret***에 저장 (범위 0~10000) | 
| ***setSmartAnalogOutput(int idx, int val)*** | ***idx*** 번 AO 채널에 ***val*** 값을 할당 (범위 0-10000) | 
| ***getRobotCanFTSensorRaw(int * const ret)*** | 로봇 앤드툴 CAN포트에 연결된 FT 센서의 raw 데이터값 수신 | 
| ***getRobotCanFTSensorTransformed(double * const ret)*** | 로봇 앤드툴 CAN포트에 연결된 FT 센서의 변환된 데이터값 수신 | 
| ***getCBCanFTSensorRaw(int * const ret)*** | 컨트롤박스의 CAN포트에 연결된 FT 센서의 raw 데이터값 수신 | 
| ***getCBCanFTSensorTransformed(double * const ret)*** | 컨트롤박스의 CAN포트에 연결된 FT 센서의 변환된 데이터값 수신 | 
| ***readDirectVariable(int type, int addr, void * ret)*** | ***type*** 타입과 ***addr*** 주소를 가지는 직접변수 단일 값 읽기 | 
| ***readDirectVariables(int type, int addr, int len, void * ret)*** | ***type*** 타입과 ***addr*** 주소를 가지는 직접변수를 len 길이만큼 연속 값 읽기 | 
| ***writeDirectVariable(int type, int addr, void * ptrVal)*** | ***type*** 타입과 ***addr*** 주소를 가지는 직접변수에 ptrVal 값 단일 쓰기 | 
| ***writeDirectVariables(int type, int addr, int len, void * ptrVal)*** | ***type*** 타입과 ***addr*** 주소를 가지는 직접변수에 ptrVal 값을 len 길이만큼 연속 값 쓰기 | 
단위
- 6 자유도 위치 는 3차원 위치를 나타내는 3 개의 double 값과(x, y, z), 3차원 회전을 나타내는 3개의 double 각도 값으로(θx, θy, θz) 구성, 회전은 z-y-x의 순서로 적용.
 - 위치와 각도의 단위는 각각 m, °.
 - 모든 관절 값은 ° 단위로 표시.
 
간단한 모션과 DIO 예제
이 장에서는 간단한 로봇 동작과 DIO 제어를 포함한 예제를 소개합니다. 명확한 예시를 위해, 로봇은 Indy7, IP 주소는 192.168.0.100 로 가정합니다.
Warning
1 |  | 
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101  |  |