4.4 C99 Motion 동작 인터페이스
개요
C99 Motion 은 전역 속도/가속도, 현재 TF/UF/TCS, 자세 조회 및 변환, DH, 기본 운동, 위치 제어, 드래그 티칭, 소프트 리밋, UDP 피드백, 페이로드 관리를 다룹니다.
대응 헤더 파일:
include/c_arm_motion.hinclude/c_arm_types.h
사용 전제 및 영향 범위
| 범주 | 설명 |
|---|---|
| 세션 요구사항 | 모든 인터페이스에는 유효한 ArmHandle* 를 전달해야 합니다. 생성, 연결, 연결 해제 계열 인터페이스를 제외하고 비즈니스 호출 전에는 Arm_Connect() 를 먼저 완료해야 합니다. |
| 출력 파라미터 | double* , int* , 구조체 포인터, 배열 출력은 모두 호출자가 할당합니다. 반환값이 0 일 때만 출력 내용을 읽어야 합니다. |
| 파라미터 쓰기 | SetOVC , SetOAC , SetTF , SetUF , SetTCS 는 컨트롤러의 현재 운동 파라미터 또는 좌표계 선택을 변경합니다. |
| 운동 실행 | MoveJoint , MoveLine , MoveCircle , 위치 제어, 궤적 드래그, 페이로드 측정 관련 인터페이스는 로봇 현장 상태를 변경합니다. |
| 배열 용량 | GetDHParam , GetUserSoftLimit , Payload_GetAll 은 outArray + maxCount + outCount 를 사용합니다. maxCount 가 부족하면 상태 코드에 따라 반환합니다. |
인터페이스 시그니처
Arm_Motion_GetOVC
c
int Arm_Motion_GetOVC(ArmHandle* h, double* outValue);| 항목 | 설명 |
|---|---|
| 설명 | 전역 속도 비율 OVC를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outValue : double* , 속도 비율 출력이며 범위는 0~1 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_SetOVC
c
int Arm_Motion_SetOVC(ArmHandle* h, double value);| 항목 | 설명 |
|---|---|
| 설명 | 전역 속도 비율 OVC를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.value : double , 속도 비율이며 범위는 0~1 이고 0 보다 커야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetOAC
c
int Arm_Motion_GetOAC(ArmHandle* h, double* outValue);| 항목 | 설명 |
|---|---|
| 설명 | 전역 가속도 비율 OAC를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outValue : double* , 가속도 비율 출력이며 범위는 0~1.2 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_SetOAC
c
int Arm_Motion_SetOAC(ArmHandle* h, double value);| 항목 | 설명 |
|---|---|
| 설명 | 전역 가속도 비율 OAC를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.value : double , 가속도 비율이며 범위는 0.01~1.2 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetTF
c
int Arm_Motion_GetTF(ArmHandle* h, int* outIndex);| 항목 | 설명 |
|---|---|
| 설명 | 현재 도구 좌표계 TF 번호를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outIndex : int* , 도구 좌표계 번호 출력이며 범위는 0~50 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_SetTF
c
int Arm_Motion_SetTF(ArmHandle* h, int index);| 항목 | 설명 |
|---|---|
| 설명 | 현재 도구 좌표계 TF 번호를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , 도구 좌표계 번호이며 범위는 0~50 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetUF
c
int Arm_Motion_GetUF(ArmHandle* h, int* outIndex);| 항목 | 설명 |
|---|---|
| 설명 | 현재 사용자 좌표계 UF 번호를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outIndex : int* , 사용자 좌표계 번호 출력이며 범위는 0~50 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_SetUF
c
int Arm_Motion_SetUF(ArmHandle* h, int index);| 항목 | 설명 |
|---|---|
| 설명 | 현재 사용자 좌표계 UF 번호를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , 사용자 좌표계 번호이며 범위는 0~50 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetTCS
c
int Arm_Motion_GetTCS(ArmHandle* h, int* outType);| 항목 | 설명 |
|---|---|
| 설명 | 현재 티칭 좌표계 타입을 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outType : int* , 티칭 좌표계 타입 출력이며 값은 ArmTcsType 을 참고합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_SetTCS
c
int Arm_Motion_SetTCS(ArmHandle* h, int tcsType);| 항목 | 설명 |
|---|---|
| 설명 | 현재 티칭 좌표계 타입을 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.tcsType : int , 티칭 좌표계 타입이며 값은 ArmTcsType 을 참고합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetCurrentPose
c
int Arm_Motion_GetCurrentPose(ArmHandle* h, int poseType, ArmMotionPose* outPose);| 항목 | 설명 |
|---|---|
| 설명 | 로봇의 현재 자세를 읽습니다. 관절 자세 또는 직교 좌표 자세를 지원합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.poseType : int , 자세 타입이며 ARM_POSE_TYPE_JOINT 또는 ARM_POSE_TYPE_CART 입니다.outPose : ArmMotionPose* , 자세 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_ConvertJointToCart
c
int Arm_Motion_ConvertJointToCart(ArmHandle* h, const ArmMotionPose* inPose, int ufIndex, int tfIndex, ArmMotionPose* outPose);| 항목 | 설명 |
|---|---|
| 설명 | 관절 자세를 직교 좌표 자세로 변환합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.inPose : const ArmMotionPose* , 입력 자세 또는 포인트 구조체 포인터입니다.ufIndex : int , 사용자 좌표계 번호입니다.tfIndex : int , 도구 좌표계 번호입니다.outPose : ArmMotionPose* , 자세 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_ConvertCartToJoint
c
int Arm_Motion_ConvertCartToJoint(ArmHandle* h, const ArmMotionPose* inPose, int ufIndex, int tfIndex, ArmMotionPose* outPose);| 항목 | 설명 |
|---|---|
| 설명 | 직교 좌표 자세를 관절 자세로 변환합니다. inPose->hasPosture 가 0이 아니면 posture 를 해석에 사용합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.inPose : const ArmMotionPose* , 입력 자세 또는 포인트 구조체 포인터입니다.ufIndex : int , 사용자 좌표계 번호입니다.tfIndex : int , 도구 좌표계 번호입니다.outPose : ArmMotionPose* , 자세 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_ConvertCartToJointSimple
c
int Arm_Motion_ConvertCartToJointSimple(ArmHandle* h, const ArmMotionPose* inPose, int ufIndex, int tfIndex, ArmMotionPose* outPose);| 항목 | 설명 |
|---|---|
| 설명 | 직교 좌표 자세를 관절 자세로 변환합니다. 이 인터페이스는 항상 posture 와 hasPosture 를 무시하고 6차원 직교 좌표 위치만 사용해 해석합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.inPose : const ArmMotionPose* , 입력 자세 또는 포인트 구조체 포인터입니다.ufIndex : int , 사용자 좌표계 번호입니다.tfIndex : int , 도구 좌표계 번호입니다.outPose : ArmMotionPose* , 자세 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetDHParam
c
int Arm_Motion_GetDHParam(ArmHandle* h, ArmDhParam* outDhArray, size_t maxCount, size_t* outCount);| 항목 | 설명 |
|---|---|
| 설명 | DH 파라미터 목록을 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outDhArray : ArmDhParam* , DH 파라미터 출력 배열입니다.maxCount : size_t , 출력 배열 용량이며 호출자가 최대 몇 개의 요소를 받을 수 있는지를 나타냅니다.outCount : size_t* , 출력 개수 포인터이며 성공 시 실제 개수를 기록합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_SetDHParam
c
int Arm_Motion_SetDHParam(ArmHandle* h, const ArmDhParam* dhArray, size_t count);| 항목 | 설명 |
|---|---|
| 설명 | DH 파라미터 목록을 씁니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.dhArray : const ArmDhParam* , DH 파라미터 입력 배열입니다.count : size_t , 배열 요소 개수입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_MoveJoint
c
int Arm_Motion_MoveJoint(ArmHandle* h, const ArmMotionPose* pose, double vel, double acc);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 말단을 관절 공간 경로를 따라 대상 포인트로 이동시킵니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.pose : const ArmMotionPose* , 대상 포인트이며 관절 자세 또는 직교 좌표 자세일 수 있습니다.vel : double , 속도 비율이며 범위는 0~1 입니다.acc : double , 가속도 비율이며 범위는 0~1.2 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_MoveLine
c
int Arm_Motion_MoveLine(ArmHandle* h, const ArmMotionPose* pose, double vel, double acc);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 말단을 직선으로 대상 포인트까지 이동시킵니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.pose : const ArmMotionPose* , 대상 포인트이며 관절 자세 또는 직교 좌표 자세일 수 있습니다.vel : double , 말단 속도이며 범위는 1~4000 mm/s 입니다.acc : double , 가속도 비율이며 범위는 0~1.2 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_MoveCircle
c
int Arm_Motion_MoveCircle(ArmHandle* h, const ArmMotionPose* viaPose, const ArmMotionPose* endPose, double vel, double acc);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 말단을 원호를 따라 이동시킵니다. 원호는 경유점과 끝점으로 결정됩니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.viaPose : const ArmMotionPose* , 원호 경유점 자세입니다.endPose : const ArmMotionPose* , 원호 끝점 자세입니다.vel : double , 말단 속도이며 범위는 1~4000 mm/s 입니다.acc : double , 가속도 비율이며 범위는 0~1.2 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_EnterPositionControl
c
int Arm_Motion_EnterPositionControl(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 컨트롤러에 위치 제어 모드 진입을 요청합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 컨트롤러 축 그룹 1 을 고정으로 사용합니다. |
Arm_Motion_SetPositionTrajectoryParams
c
int Arm_Motion_SetPositionTrajectoryParams(ArmHandle* h, int maxTimeoutCount, int timeout, int filterLayer, double wristElbowThreshold, double shoulderThreshold);| 항목 | 설명 |
|---|---|
| 설명 | 위치 제어 모드에서 사용하는 궤적 파라미터를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.maxTimeoutCount : int , 최대 타임아웃 횟수이며 범위는 [1, 100] 입니다.timeout : int , 타임아웃 시간 또는 전송 간격이며 범위는 [1, 100] , 단위는 ms입니다.filterLayer : int , 필터 계층이며 범위는 [1, 100] 입니다.wristElbowThreshold : double , 손목/팔꿈치 특이점 접근 임계값이며 범위는 [10, 100] 입니다.shoulderThreshold : double , 어깨 특이점 접근 임계값이며 범위는 [100, 300] 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 범위를 벗어난 파라미터는 요청 전 INVALID_PARAMETER 를 반환합니다. |
Arm_Motion_ExitPositionControl
c
int Arm_Motion_ExitPositionControl(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 컨트롤러에 위치 제어 모드 종료를 요청합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 컨트롤러 축 그룹 1 을 고정으로 사용합니다. |
Arm_Motion_EnableDrag
c
int Arm_Motion_EnableDrag(ArmHandle* h, int dragState);| 항목 | 설명 |
|---|---|
| 설명 | 드래그 티칭을 켜거나 끕니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.dragState : int , 1 은 드래그 상태 진입, 0 은 드래그 상태 종료를 의미합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetDragSet
c
int Arm_Motion_GetDragSet(ArmHandle* h, ArmDragStatus* outStatus);| 항목 | 설명 |
|---|---|
| 설명 | 드래그 티칭 축 잠금 상태를 읽습니다. 축 잠금은 티칭 운동에만 적용됩니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outStatus : ArmDragStatus* , 상태 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_SetDragStatus
c
int Arm_Motion_SetDragStatus(ArmHandle* h, const ArmDragStatus* dragStatus);| 항목 | 설명 |
|---|---|
| 설명 | 드래그 티칭 축 잠금 상태를 씁니다. 축 잠금은 티칭 운동에만 적용됩니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.dragStatus : const ArmDragStatus* , 드래그 티칭 설정 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_GetUserSoftLimit
c
int Arm_Motion_GetUserSoftLimit(ArmHandle* h, ArmSoftLimit* outArray, size_t maxCount, size_t* outCount);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 사용자 소프트 리밋을 읽고 각 축의 하한과 상한을 반환합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outArray : ArmSoftLimit* , 호출자가 할당하는 출력 배열입니다.maxCount : size_t , 출력 배열 용량이며 호출자가 최대 몇 개의 요소를 받을 수 있는지를 나타냅니다.outCount : size_t* , 출력 개수 포인터이며 성공 시 실제 개수를 기록합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 배열 출력은 호출자가 할당합니다. maxCount 는 용량을 나타내고, outCount 는 실제 개수를 반환합니다. |
Arm_Motion_SetUdpFeedbackParams
c
int Arm_Motion_SetUdpFeedbackParams(ArmHandle* h, int flag, const char* ip, int interval, int feedbackType, const int* doList, size_t doCount);| 항목 | 설명 |
|---|---|
| 설명 | 로봇이 지정한 IP 주소로 데이터를 푸시하도록 UDP 피드백 파라미터를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.flag : int , UDP 데이터 푸시 활성화 여부입니다. 1 은 켜짐, 0 은 꺼짐입니다.ip : const char* , 수신 측 IP 주소 문자열입니다.interval : int , 전송 간격이며 단위는 밀리초입니다.feedbackType : int , 피드백 데이터 형식입니다. 0 은 XML, 1 은 JSON, 2 는 PROTO를 의미합니다.doList : const int* , DO 신호 목록이며 NULL 일 수 있습니다.doCount : size_t , DO 신호 개수이며 최대 10 개입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 파라미터 설정은 UDP 데이터 푸시 기능이 활성화된 경우에만 유효합니다. |
페이로드 인터페이스
Arm_Motion_Payload_GetCurrentId
c
int Arm_Motion_Payload_GetCurrentId(ArmHandle* h, int* outPayloadId);| 항목 | 설명 |
|---|---|
| 설명 | 현재 활성화된 페이로드 ID를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outPayloadId : int* , 현재 페이로드 ID 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_GetById
c
int Arm_Motion_Payload_GetById(ArmHandle* h, int payloadId, ArmPayloadInfo* outPayload);| 항목 | 설명 |
|---|---|
| 설명 | ID로 페이로드 상세 정보를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.payloadId : int , 페이로드 ID입니다.outPayload : ArmPayloadInfo* , 페이로드 정보 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_SetCurrentId
c
int Arm_Motion_Payload_SetCurrentId(ArmHandle* h, int payloadId);| 항목 | 설명 |
|---|---|
| 설명 | 지정한 페이로드 ID를 활성화합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.payloadId : int , 페이로드 ID입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_Add
c
int Arm_Motion_Payload_Add(ArmHandle* h, const ArmPayloadInfo* payloadInfo);| 항목 | 설명 |
|---|---|
| 설명 | 컨트롤러에 사용자 정의 페이로드 설정을 추가합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.payloadInfo : const ArmPayloadInfo* , 페이로드 정보 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_Delete
c
int Arm_Motion_Payload_Delete(ArmHandle* h, int payloadId);| 항목 | 설명 |
|---|---|
| 설명 | 컨트롤러에서 지정한 ID의 사용자 정의 페이로드 설정을 삭제합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.payloadId : int , 페이로드 ID입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 현재 활성화된 페이로드는 직접 삭제할 수 없습니다. 삭제하려면 먼저 다른 페이로드를 활성화하세요. |
Arm_Motion_Payload_Update
c
int Arm_Motion_Payload_Update(ArmHandle* h, const ArmPayloadInfo* payload);| 항목 | 설명 |
|---|---|
| 설명 | 컨트롤러에 이미 존재하는 사용자 정의 페이로드 설정을 업데이트합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.payload : const ArmPayloadInfo* , 페이로드 정보 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_GetAll
c
int Arm_Motion_Payload_GetAll(ArmHandle* h, ArmPayloadSummary* outArray, size_t maxCount, size_t* outCount);| 항목 | 설명 |
|---|---|
| 설명 | 페이로드 요약 목록을 읽습니다. 요약에는 id 와 comment 가 포함됩니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outArray : ArmPayloadSummary* , 호출자가 할당하는 출력 배열입니다.maxCount : size_t , 출력 배열 용량이며 호출자가 최대 몇 개의 요소를 받을 수 있는지를 나타냅니다.outCount : size_t* , 출력 개수 포인터이며 성공 시 실제 개수를 기록합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 배열 출력은 호출자가 할당합니다. maxCount 는 용량을 나타내고, outCount 는 실제 개수를 반환합니다. |
Arm_Motion_Payload_CheckAxisThreeHorizontal
c
int Arm_Motion_Payload_CheckAxisThreeHorizontal(ArmHandle* h, double* outValue);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 3축의 수평 각도를 검사합니다. 단위는 도입니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outValue : double* , 출력값 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 페이로드 측정을 수행하려면 수평 각도가 -1~1 도 사이여야 합니다. |
Arm_Motion_Payload_InterferenceCheck
c
int Arm_Motion_Payload_InterferenceCheck(ArmHandle* h, double weight, double angle);| 항목 | 설명 |
|---|---|
| 설명 | 페이로드 측정의 간섭 검사를 시작합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.weight : double , 페이로드 무게입니다.angle : double , 6축 회전 각도이며 범위는 30~90 도입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_IdentifyStart
c
int Arm_Motion_Payload_IdentifyStart(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 페이로드 측정 준비 상태로 진입합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_StartIdentify
c
int Arm_Motion_Payload_StartIdentify(ArmHandle* h, double weight, double angle);| 항목 | 설명 |
|---|---|
| 설명 | 페이로드 측정 과정을 시작합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.weight : double , 페이로드 무게입니다. 알 수 없으면 -1 을 전달합니다.angle : double , 6축 허용 회전 각도이며 범위는 30~90 도입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 페이로드 측정을 시작하기 전에 반드시 페이로드 측정 준비 상태로 진입해야 합니다. |
Arm_Motion_Payload_GetIdentifyState
c
int Arm_Motion_Payload_GetIdentifyState(ArmHandle* h, int* outState);| 항목 | 설명 |
|---|---|
| 설명 | 페이로드 측정 상태를 조회합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outState : int* , 상태 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_GetIdentifyResult
c
int Arm_Motion_Payload_GetIdentifyResult(ArmHandle* h, ArmPayloadInfo* outPayload);| 항목 | 설명 |
|---|---|
| 설명 | 페이로드 측정 결과를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outPayload : ArmPayloadInfo* , 페이로드 정보 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_IdentifyDone
c
int Arm_Motion_Payload_IdentifyDone(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 페이로드 측정 준비 상태를 종료합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Motion_Payload_Identify
c
int Arm_Motion_Payload_Identify(ArmHandle* h, double weight, double angle, ArmPayloadInfo* outPayload);| 항목 | 설명 |
|---|---|
| 설명 | 전체 페이로드 측정 과정을 한 번 실행하고 결과를 출력합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.weight : double , 페이로드 무게입니다. 알 수 없으면 -1 을 전달합니다.angle : double , 6축 회전 각도이며 범위는 30~90 도입니다.outPayload : ArmPayloadInfo* , 페이로드 정보 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 출력된 페이로드 결과는 새 페이로드 추가에 사용하거나 컨트롤러의 기존 페이로드 설정에 쓸 수 있습니다. |
타입 및 규칙
| 타입 | 설명 |
|---|---|
ArmMotionPose | C99 자세 구조체이며 poseType 에 따라 joint 또는 cartesian 을 사용합니다. |
ArmPoseType | ARM_POSE_TYPE_JOINT 는 관절 자세를, ARM_POSE_TYPE_CART 는 직교 좌표 자세를 의미합니다. |
ArmTcsType | Arm_Motion_SetTCS() 에 사용하는 티칭 좌표계 타입입니다. |
ArmDragStatus | 드래그 티칭 축 잠금 상태입니다. |
ArmSoftLimit | 단일 축 사용자 소프트 리밋입니다. |
ArmPayloadInfo | 전체 페이로드 정보입니다. |
ArmPayloadSummary | 페이로드 목록 요약입니다. |
ArmPayloadIdentifyState | 페이로드 측정 상태입니다. |
| 범주 | 규칙 |
|---|---|
| 전역 파라미터 | OVC는 속도 비율입니다. 읽기 범위는 0~1 , 쓰기 범위는 0~1 이고 0 보다 커야 합니다. OAC는 가속도 비율입니다. 읽기 범위는 0~1.2 , 쓰기 범위는 0.01~1.2 입니다. |
| 좌표계 번호 | TF와 UF 번호 범위는 0~50 입니다. 좌표계 전환은 이후 자세 변환과 운동 실행에 영향을 줍니다. |
| 자세 구조체 | ArmMotionPose.poseType 은 joint 또는 cartesian 사용 여부를 나타냅니다. jointSize , cartesianSize 는 해당 배열의 유효 길이를 나타냅니다. |
| 자세 변환 | 입력 및 출력 자세 구조체는 모두 호출자가 할당합니다. 사용자/도구 좌표계를 명시적으로 사용하지 않으면 0 을 전달합니다. |
| 드래그 상태 | ArmDragStatus.cartStatus[6] 와 jointStatus[9] 는 직교 좌표 축과 관절 축의 티칭 상태를 나타내며, isContinuousDrag 는 연속 드래그 여부를 나타냅니다. |
| 배열 출력 | GetDHParam , GetUserSoftLimit , Payload_GetAll 은 outArray + maxCount + outCount 를 사용합니다. 호출자는 비즈니스 예상에 맞춰 충분한 용량을 준비해야 합니다. |
| 동작형 인터페이스 | MoveJoint , MoveLine , MoveCircle , 위치 제어, 드래그, 페이로드 식별은 현장 상태를 변경합니다. |
| UDP 피드백 | doList 는 선택적 DO 목록이고, doCount 는 요소 개수를 나타내며 최대 10 개입니다. |
호환성
| 기능 | 협동 로봇 | 산업용 로봇 |
|---|---|---|
| 전역 파라미터, 좌표계, 자세 변환, 기본 운동 | v7.5.0.0+ | v7.5.0.0+ |
| DH 파라미터 | v7.5.0.0+ | 지원하지 않음 |
| 드래그 티칭 | v7.5.0.0+ | 지원하지 않음 |
| 사용자 소프트 리밋 | v7.5.0.0+ | v7.5.0.0+ |
| UDP 피드백 파라미터 | v7.5.2.0+ | 지원하지 않음 |
| 페이로드 조회 및 설정 | v7.5.0.0+ | v7.5.0.0+ |
| 페이로드 측정 | v7.5.2.0+ | 지원하지 않음 |
페이로드 측정 흐름
| 단계 | C99 인터페이스 | 설명 |
|---|---|---|
| 1 | Arm_Motion_Payload_CheckAxisThreeHorizontal | 3축 수평 각도를 검사하고 수평 조건을 만족하면 계속합니다. |
| 2 | Arm_Motion_Payload_IdentifyStart | 페이로드 측정 준비 상태로 진입합니다. |
| 3 | Arm_Motion_Payload_StartIdentify | 페이로드 무게와 6축 회전 각도를 전달해 측정을 시작합니다. |
| 4 | Arm_Motion_Payload_GetIdentifyState | 측정 상태를 조회합니다. |
| 5 | Arm_Motion_Payload_GetIdentifyResult | 측정 결과를 읽습니다. |
| 6 | Arm_Motion_Payload_IdentifyDone | 페이로드 측정 준비 상태를 종료합니다. |
| 한 번에 완료 | Arm_Motion_Payload_Identify | 전체 흐름을 실행하고 ArmPayloadInfo 를 출력합니다. |
최소 호출 예제
c
#include <stdio.h> // 속도 비율 출력을 위해 printf를 포함합니다.
#include "c_arm_api.h" // C99 SDK 최상위 헤더를 포함합니다.
int main(void) // 예제 프로그램 진입점
{ // 예제 main 함수 시작
ArmHandle* h = Arm_Create(); // C99 세션 핸들을 생성합니다.
double ovc = 0.0; // OVC 출력 변수를 준비합니다.
if (h == NULL) { // 핸들 생성 실패 여부를 확인합니다.
return 1; // 생성 실패 시 종료합니다.
} // 핸들 검사 종료
if (Arm_Connect(h, "10.27.1.2", "10.27.1.102") != 0) { // 컨트롤러에 연결합니다.
Arm_Destroy(h); // 연결 실패 시 핸들을 해제합니다.
return 1; // 오류를 반환합니다.
} // 연결 검사 종료
int ret = Arm_Motion_GetOVC(h, &ovc); // 전역 속도 비율을 읽습니다.
printf("ovc=%f\n", ovc); // 전역 속도 비율을 출력합니다.
Arm_Disconnect(h); // 연결을 해제합니다.
Arm_Destroy(h); // 핸들을 폐기합니다.
return ret == 0 ? 0 : 1; // 읽기 결과에 따라 반환합니다.
} // 예제 main 함수 종료시나리오 예제
운동 파라미터 읽기 및 설정
c
double ovc = 0.0; // 속도 비율 출력을 준비합니다.
double oac = 0.0; // 가속도 비율 출력을 준비합니다.
int tf = 0; // 도구 좌표계 번호 출력을 준비합니다.
int uf = 0; // 사용자 좌표계 번호 출력을 준비합니다.
int tcs = 0; // 티칭 좌표계 출력을 준비합니다.
int ovcRet = Arm_Motion_GetOVC(h, &ovc); // OVC를 읽습니다.
int oacRet = Arm_Motion_GetOAC(h, &oac); // OAC를 읽습니다.
int tfRet = Arm_Motion_GetTF(h, &tf); // 현재 TF를 읽습니다.
int ufRet = Arm_Motion_GetUF(h, &uf); // 현재 UF를 읽습니다.
int tcsRet = Arm_Motion_GetTCS(h, &tcs); // 현재 TCS를 읽습니다.
/* int setOvcRet = Arm_Motion_SetOVC(h, ovc); */ // 속도 비율 쓰기는 운동 파라미터를 변경하므로 확인 후 실행합니다.
/* int setOacRet = Arm_Motion_SetOAC(h, oac); */ // 가속도 비율 쓰기는 운동 파라미터를 변경하므로 확인 후 실행합니다.
/* int setTfRet = Arm_Motion_SetTF(h, tf); */ // TF 쓰기는 현재 도구 좌표계를 변경하므로 확인 후 실행합니다.
/* int setUfRet = Arm_Motion_SetUF(h, uf); */ // UF 쓰기는 현재 사용자 좌표계를 변경하므로 확인 후 실행합니다.
/* int setTcsRet = Arm_Motion_SetTCS(h, tcs); */ // TCS 쓰기는 티칭 좌표계를 변경하므로 확인 후 실행합니다.
(void)ovcRet; // 예제에서 상태 코드를 유지합니다.
(void)oacRet; // 예제에서 상태 코드를 유지합니다.
(void)tfRet; // 예제에서 상태 코드를 유지합니다.
(void)ufRet; // 예제에서 상태 코드를 유지합니다.
(void)tcsRet; // 예제에서 상태 코드를 유지합니다.자세 및 변환
c
ArmMotionPose jointPose = {0}; // 관절 자세를 준비합니다.
ArmMotionPose cartPose = {0}; // 직교 좌표 자세를 준비합니다.
int poseRet = Arm_Motion_GetCurrentPose(h, ARM_POSE_TYPE_JOINT, &jointPose); // 현재 관절 자세를 가져옵니다.
int jointToCartRet = Arm_Motion_ConvertJointToCart(h, &jointPose, 0, 0, &cartPose); // 관절을 직교 좌표로 변환합니다.
int cartToJointRet = Arm_Motion_ConvertCartToJoint(h, &cartPose, 0, 0, &jointPose); // 직교 좌표를 관절로 변환합니다.
int simpleRet = Arm_Motion_ConvertCartToJointSimple(h, &cartPose, 0, 0, &jointPose); // 간소화된 직교 좌표-관절 변환을 수행합니다.
(void)poseRet; // 예제에서 상태 코드를 유지합니다.
(void)jointToCartRet; // 예제에서 상태 코드를 유지합니다.
(void)cartToJointRet; // 예제에서 상태 코드를 유지합니다.
(void)simpleRet; // 예제에서 상태 코드를 유지합니다.운동, DH, 위치 제어, 드래그 및 페이로드
c
ArmDhParam dh[9] = {0}; // DH 파라미터 배열을 준비합니다.
size_t dhCount = 0U; // DH 개수 출력을 준비합니다.
ArmSoftLimit limits[9] = {0}; // 소프트 리밋 배열을 준비합니다.
size_t limitCount = 0U; // 소프트 리밋 개수 출력을 준비합니다.
ArmDragStatus drag = {0}; // 드래그 상태 구조체를 준비합니다.
ArmPayloadSummary payloads[16] = {0}; // 페이로드 요약 배열을 준비합니다.
size_t payloadCount = 0U; // 페이로드 개수 출력을 준비합니다.
int dhRet = Arm_Motion_GetDHParam(h, dh, 9, &dhCount); // DH 파라미터를 읽습니다.
int limitRet = Arm_Motion_GetUserSoftLimit(h, limits, 9, &limitCount); // 사용자 소프트 리밋을 읽습니다.
int dragRet = Arm_Motion_GetDragSet(h, &drag); // 드래그 상태를 읽습니다.
int payloadRet = Arm_Motion_Payload_GetAll(h, payloads, 16, &payloadCount); // 페이로드 목록을 조회합니다.
/* int moveJRet = Arm_Motion_MoveJoint(h, &jointPose, 20.0, 20.0); */ // 관절 운동은 로봇을 움직이므로 확인 후 실행합니다.
/* int moveLRet = Arm_Motion_MoveLine(h, &cartPose, 20.0, 20.0); */ // 직선 운동은 로봇을 움직이므로 확인 후 실행합니다.
/* int moveCRet = Arm_Motion_MoveCircle(h, &cartPose, &cartPose, 20.0, 20.0); */ // 원호 운동은 로봇을 움직이므로 확인 후 실행합니다.
/* int enterPositionRet = Arm_Motion_EnterPositionControl(h); */ // 위치 제어 모드 진입은 제어 모드를 변경하므로 확인 후 실행합니다.
/* int setPositionParamRet = Arm_Motion_SetPositionTrajectoryParams(h, 10, 10, 5, 20.0, 120.0); */ // 위치 제어 파라미터 쓰기는 궤적 파라미터를 변경하므로 확인 후 실행합니다.
/* int exitPositionRet = Arm_Motion_ExitPositionControl(h); */ // 위치 제어 모드 종료는 제어 모드를 변경하므로 확인 후 실행합니다.
/* int setDhRet = Arm_Motion_SetDHParam(h, dh, dhCount); */ // DH 쓰기는 운동학 파라미터를 변경하므로 확인 후 실행합니다.
/* int enableDragRet = Arm_Motion_EnableDrag(h, 1); */ // 드래그 켜기는 제어 모드를 변경하므로 확인 후 실행합니다.
/* int setDragRet = Arm_Motion_SetDragStatus(h, &drag); */ // 드래그 상태 쓰기는 드래그 설정을 변경하므로 확인 후 실행합니다.
(void)dhRet; // 예제에서 상태 코드를 유지합니다.
(void)limitRet; // 예제에서 상태 코드를 유지합니다.
(void)dragRet; // 예제에서 상태 코드를 유지합니다.
(void)payloadRet; // 예제에서 상태 코드를 유지합니다.예제 코드
cpp
#include <stdio.h>
#include <string.h>
extern "C" {
#include "c_arm_api.h"
}
int main(void)
{
// [ZH] 本示例直接在源码中写死连接地址,不解析命令行参数。
// [EN] This example hard-codes the connection addresses in the source code and does not parse command-line arguments.
// [ZH] 创建并连接 SDK 句柄。
// [EN] Create the SDK handle and connect to the robot.
ArmHandle* handle = Arm_Create();
if (handle == NULL) {
printf("[c99_motion] 创建句柄失败 / Failed to create the handle\n");
return 1;
}
int ret = Arm_Connect(handle, "10.27.1.2", "10.27.1.102");
if (ret != 0) {
printf("[c99_motion] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
Arm_Destroy(handle);
return 1;
}
printf("[c99_motion] 机器人连接成功 / Robot connected successfully\n");
// [ZH] 准备兜底位姿、DH 参数和负载数据,保证全部接口都能直接调用。
// [EN] Prepare fallback poses, DH params, and payload data so every API can be called directly.
ArmMotionPose jointPose = {0};
ArmMotionPose cartPose = {0};
ArmMotionPose convertedPose = {0};
ArmDhParam dhList[16] = {0};
ArmSoftLimit softLimits[16] = {0};
ArmDragStatus dragStatus = {0};
ArmPayloadInfo payload = {0};
ArmPayloadInfo identifyPayload = {0};
ArmPayloadSummary payloadList[16] = {0};
size_t dhCount = 0U;
size_t softLimitCount = 0U;
size_t payloadCount = 0U;
int payloadId = 1;
int identifyState = 0;
double ovc = 0.0;
double oac = 0.0;
int tf = 0;
int uf = 0;
int tcs = ARM_TCS_JOINT;
int doList[2] = {1, 2};
jointPose.poseType = ARM_POSE_TYPE_JOINT;
jointPose.jointSize = 6;
cartPose.poseType = ARM_POSE_TYPE_CART;
cartPose.cartesianSize = 6;
payload.id = 1;
payload.weight = 1.0;
payload.massCenter[0] = 0.1;
payload.massCenter[1] = 0.0;
payload.massCenter[2] = 0.0;
snprintf(payload.comment, sizeof(payload.comment), "sdk example");
dhList[0].id = 1;
dhCount = 1U;
// [ZH] 顺序执行运动查询与设置接口。
// [EN] Execute motion query APIs and setter APIs in sequence.
ret = Arm_Motion_GetOVC(handle, &ovc);
printf("[c99_motion] GetOVC 状态码 / GetOVC status code: %d, OVC=%.6f\n", ret, ovc);
ret = Arm_Motion_SetOVC(handle, ovc);
printf("[c99_motion] SetOVC 状态码 / SetOVC status code: %d\n", ret);
ret = Arm_Motion_GetOAC(handle, &oac);
printf("[c99_motion] GetOAC 状态码 / GetOAC status code: %d, OAC=%.6f\n", ret, oac);
ret = Arm_Motion_SetOAC(handle, oac);
printf("[c99_motion] SetOAC 状态码 / SetOAC status code: %d\n", ret);
ret = Arm_Motion_GetTF(handle, &tf);
printf("[c99_motion] GetTF 状态码 / GetTF status code: %d, TF=%d\n", ret, tf);
ret = Arm_Motion_SetTF(handle, tf);
printf("[c99_motion] SetTF 状态码 / SetTF status code: %d\n", ret);
ret = Arm_Motion_GetUF(handle, &uf);
printf("[c99_motion] GetUF 状态码 / GetUF status code: %d, UF=%d\n", ret, uf);
ret = Arm_Motion_SetUF(handle, uf);
printf("[c99_motion] SetUF 状态码 / SetUF status code: %d\n", ret);
ret = Arm_Motion_GetTCS(handle, &tcs);
printf("[c99_motion] GetTCS 状态码 / GetTCS status code: %d, TCS=%d\n", ret, tcs);
ret = Arm_Motion_SetTCS(handle, tcs);
printf("[c99_motion] SetTCS 状态码 / SetTCS status code: %d\n", ret);
// [ZH] 读取当前关节位姿和笛卡尔位姿,并调用全部位姿转换接口。
// C API 对外笛卡尔顺序统一为 X/Y/Z/A/B/C。
// [EN] Read the current joint and Cartesian poses, then call all pose conversion APIs.
// The C API exposes Cartesian order as X/Y/Z/A/B/C.
ret = Arm_Motion_GetCurrentPose(handle, ARM_POSE_TYPE_JOINT, &jointPose);
printf("[c99_motion] GetCurrentPose(JOINT) 状态码 / GetCurrentPose(JOINT) status code: %d, 关节维度 / Joint size: %d\n", ret, jointPose.jointSize);
ret = Arm_Motion_GetCurrentPose(handle, ARM_POSE_TYPE_CART, &cartPose);
printf("[c99_motion] GetCurrentPose(CART) 状态码 / GetCurrentPose(CART) status code: %d, 笛卡尔维度 / Cartesian size: %d\n", ret, cartPose.cartesianSize);
ret = Arm_Motion_ConvertJointToCart(handle, &jointPose, uf, tf, &convertedPose);
printf("[c99_motion] ConvertJointToCart 状态码 / ConvertJointToCart status code: %d\n", ret);
ret = Arm_Motion_ConvertCartToJoint(handle, &cartPose, uf, tf, &convertedPose);
printf("[c99_motion] ConvertCartToJoint 状态码 / ConvertCartToJoint status code: %d\n", ret);
ret = Arm_Motion_ConvertCartToJointSimple(handle, &cartPose, uf, tf, &convertedPose);
printf("[c99_motion] ConvertCartToJointSimple 状态码 / ConvertCartToJointSimple status code: %d\n", ret);
// [ZH] 读取并写回 DH 参数、软限位和 UDP 反馈参数。
// [EN] Read and write back the DH params, soft limits, and UDP feedback params.
ret = Arm_Motion_GetDHParam(handle, dhList, 16U, &dhCount);
printf("[c99_motion] GetDHParam 状态码 / GetDHParam status code: %d, 数量 / Count: %zu\n", ret, dhCount);
ret = Arm_Motion_SetDHParam(handle, dhList, dhCount > 0U ? dhCount : 1U);
printf("[c99_motion] SetDHParam 状态码 / SetDHParam status code: %d\n", ret);
ret = Arm_Motion_GetUserSoftLimit(handle, softLimits, 16U, &softLimitCount);
printf("[c99_motion] GetUserSoftLimit 状态码 / GetUserSoftLimit status code: %d, 数量 / Count: %zu\n", ret, softLimitCount);
ret = Arm_Motion_SetUdpFeedbackParams(handle, 0, "127.0.0.1", 20, 1, doList, 2U);
printf("[c99_motion] SetUdpFeedbackParams 状态码 / SetUdpFeedbackParams status code: %d\n", ret);
ret = Arm_Motion_EnterPositionControl(handle);
printf("[c99_motion] EnterPositionControl 状态码 / EnterPositionControl status code: %d\n", ret);
ret = Arm_Motion_SetPositionTrajectoryParams(handle, 3, 20, 2, 30.0, 150.0);
printf("[c99_motion] SetPositionTrajectoryParams 状态码 / SetPositionTrajectoryParams status code: %d\n", ret);
ret = Arm_Motion_ExitPositionControl(handle);
printf("[c99_motion] ExitPositionControl 状态码 / ExitPositionControl status code: %d\n", ret);
// [ZH] 直接执行全部运动接口。
// [EN] Execute all motion APIs directly.
ret = Arm_Motion_MoveJoint(handle, &jointPose, 10.0, 10.0);
printf("[c99_motion] MoveJoint 状态码 / MoveJoint status code: %d\n", ret);
ret = Arm_Motion_MoveLine(handle, &cartPose, 50.0, 10.0);
printf("[c99_motion] MoveLine 状态码 / MoveLine status code: %d\n", ret);
ret = Arm_Motion_MoveCircle(handle, &cartPose, &cartPose, 50.0, 10.0);
printf("[c99_motion] MoveCircle 状态码 / MoveCircle status code: %d\n", ret);
// [ZH] 顺序执行全部拖动示教接口。
// [EN] Execute all drag-teaching APIs in sequence.
ret = Arm_Motion_GetDragSet(handle, &dragStatus);
printf("[c99_motion] GetDragSet 状态码 / GetDragSet status code: %d, 连续拖动 / Continuous drag: %d\n", ret, dragStatus.isContinuousDrag);
ret = Arm_Motion_EnableDrag(handle, dragStatus.isContinuousDrag);
printf("[c99_motion] EnableDrag 状态码 / EnableDrag status code: %d\n", ret);
ret = Arm_Motion_SetDragStatus(handle, &dragStatus);
printf("[c99_motion] SetDragStatus 状态码 / SetDragStatus status code: %d\n", ret);
// [ZH] 顺序执行全部负载接口。
// [EN] Execute all payload APIs in sequence.
ret = Arm_Motion_Payload_GetCurrentId(handle, &payloadId);
printf("[c99_motion] Payload_GetCurrentId 状态码 / Payload_GetCurrentId status code: %d, 当前负载 / Current payload id: %d\n", ret, payloadId);
ret = Arm_Motion_Payload_GetById(handle, payloadId, &payload);
printf("[c99_motion] Payload_GetById 状态码 / Payload_GetById status code: %d, comment=%s\n", ret, payload.comment);
ret = Arm_Motion_Payload_SetCurrentId(handle, payloadId);
printf("[c99_motion] Payload_SetCurrentId 状态码 / Payload_SetCurrentId status code: %d\n", ret);
ret = Arm_Motion_Payload_Add(handle, &payload);
printf("[c99_motion] Payload_Add 状态码 / Payload_Add status code: %d\n", ret);
ret = Arm_Motion_Payload_Update(handle, &payload);
printf("[c99_motion] Payload_Update 状态码 / Payload_Update status code: %d\n", ret);
ret = Arm_Motion_Payload_Delete(handle, payload.id);
printf("[c99_motion] Payload_Delete 状态码 / Payload_Delete status code: %d\n", ret);
ret = Arm_Motion_Payload_GetAll(handle, payloadList, 16U, &payloadCount);
printf("[c99_motion] Payload_GetAll 状态码 / Payload_GetAll status code: %d, 数量 / Count: %zu\n", ret, payloadCount);
double axisThree = 0.0;
ret = Arm_Motion_Payload_CheckAxisThreeHorizontal(handle, &axisThree);
printf("[c99_motion] Payload_CheckAxisThreeHorizontal 状态码 / Payload_CheckAxisThreeHorizontal status code: %d, 值 / Value: %.6f\n", ret, axisThree);
ret = Arm_Motion_Payload_InterferenceCheck(handle, payload.weight, 0.0);
printf("[c99_motion] Payload_InterferenceCheck 状态码 / Payload_InterferenceCheck status code: %d\n", ret);
ret = Arm_Motion_Payload_IdentifyStart(handle);
printf("[c99_motion] Payload_IdentifyStart 状态码 / Payload_IdentifyStart status code: %d\n", ret);
ret = Arm_Motion_Payload_StartIdentify(handle, payload.weight, 0.0);
printf("[c99_motion] Payload_StartIdentify 状态码 / Payload_StartIdentify status code: %d\n", ret);
ret = Arm_Motion_Payload_GetIdentifyState(handle, &identifyState);
printf("[c99_motion] Payload_GetIdentifyState 状态码 / Payload_GetIdentifyState status code: %d, 状态 / State: %d\n", ret, identifyState);
ret = Arm_Motion_Payload_GetIdentifyResult(handle, &identifyPayload);
printf("[c99_motion] Payload_GetIdentifyResult 状态码 / Payload_GetIdentifyResult status code: %d, weight=%.6f\n", ret, identifyPayload.weight);
ret = Arm_Motion_Payload_IdentifyDone(handle);
printf("[c99_motion] Payload_IdentifyDone 状态码 / Payload_IdentifyDone status code: %d\n", ret);
ret = Arm_Motion_Payload_Identify(handle, payload.weight, 0.0, &identifyPayload);
printf("[c99_motion] Payload_Identify 状态码 / Payload_Identify status code: %d, weight=%.6f\n", ret, identifyPayload.weight);
// [ZH] 断开连接并销毁句柄。
// [EN] Disconnect and destroy the handle.
Arm_Disconnect(handle);
Arm_Destroy(handle);
printf("[c99_motion] 示例结束 / Example finished\n");
return 0;
}