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/Of |
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 으로 설정 |
setTaskBaseMode(int mode) | TaskMove 제어 기준 축 설정 (0 = Reference frame, 1 = TCP frame) |
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 값으로 할당 |
getSmartDigitalOutput(int idx, char & ret) | idx 번 DO 채널의 값을 참조 변수인 ret 에 저장 |
getSmartDigitalOutputs(char * const & ret) | 모든 DO 값을 한번에 획득. 각 채널의 값들은 참조 변수 ret 의 각 bit에 나뉘어 저장 |
getSmartAnalogInput(int idx, int & ret) | idx 번 AI 채널의 값을 획득. 결과는 참조변수인 ret에 저장 (범위 0~10000) |
setSmartAnalogOutput(int idx, int val) | idx 번 AO 채널에 val 값을 할당 (범위 0-10000) |
getSmartAnalogOutput(int idx, int & ret) | idx 번 AO 채널의 값을 참조 변수인 ret 에 저장. (범위 0-10000) |
setEndtoolDigitalOutput(int endtoolType, char val) | 입력한 endtoolType의 DO에 val 값을 할당 (endtoolType 값: 0 = NPN, 1 = PNP, 2 = Not use, 3 = eModi) |
getEndtoolDigitalOutput(int endtoolType, char & ret) | 입력한 endtoolType의 DO 값을 획득. 결과는 참조변수인 ret에 저장 (endtoolType 값: 0 = NPN, 1 = PNP, 2 = Not use, 3 = eModi) |
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 |
|