4.9 C99 Trajectory 궤적 인터페이스
개요
C99 Trajectory 는 오프라인 궤적, CSV 변환, 궤적 녹화/재생, 경로 녹화 실행, 실시간 궤적 제어를 다룹니다. 실시간 궤적 인터페이스는 Arm_RealTimeTrajectory_* 접두사를 사용합니다.
대응 헤더 파일:
include/c_arm_trajectory.h
사용 전제 및 실행 순서
| 범주 | 설명 |
|---|---|
| 세션 요구사항 | 모든 인터페이스는 유효한 ArmHandle* 를 전달해야 하며, 비즈니스 호출 전에 Arm_Connect() 를 먼저 완료해야 합니다. |
| 오프라인 궤적 | 호출 순서는 SetOfflineTrajectoryFile , PrepareOfflineTrajectory , ExecuteOfflineTrajectory 입니다. 준비 단계에서 로봇이 궤적 시작점으로 이동합니다. |
| CSV 변환 | TransformCsvToTrajectory 는 변환 작업을 제출하고, CheckTransformStatus 는 변환 상태를 조회합니다. 변환 응답 텍스트는 호출자가 제공한 char* 버퍼에 기록됩니다. |
| 궤적 녹화 | RecordBegin 은 녹화 상태로 진입하고, RecordFinish 는 종료 후 기록을 씁니다. 재생은 ReplayStart 와 ReplayStop 을 사용합니다. |
| 경로 녹화 | PathRecordBegin 은 .path/.traj 녹화를 시작하고, PathRecordFinish 는 녹화를 종료합니다. |
| 실시간 궤적 | 호출 순서는 제어 모드 진입, FIFO 설정, 궤적 분할 전송, 제어 중지, 제어 모드 종료입니다. |
| 동작형 인터페이스 | PrepareOfflineTrajectory , ExecuteOfflineTrajectory , ReplayStart , MovePath , 실시간 궤적 전송은 모두 로봇을 구동합니다. |
인터페이스 시그니처
Arm_Trajectory_SetOfflineTrajectoryFile
c
int Arm_Trajectory_SetOfflineTrajectoryFile(ArmHandle* h, const char* path);| 항목 | 설명 |
|---|---|
| 설명 | 오프라인 궤적 파일 경로를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.path : const char* , 컨트롤러 측 또는 인터페이스에서 요구하는 파일 경로입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_PrepareOfflineTrajectory
c
int Arm_Trajectory_PrepareOfflineTrajectory(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 오프라인 궤적을 준비하고 시작점으로 이동합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_ExecuteOfflineTrajectory
c
int Arm_Trajectory_ExecuteOfflineTrajectory(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 오프라인 궤적을 실행합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_TransformCsvToTrajectory
c
int Arm_Trajectory_TransformCsvToTrajectory(ArmHandle* h, const char* fileName, const char* separator, const char* ioFlag, char* outResponse, size_t bufSize);| 항목 | 설명 |
|---|---|
| 설명 | CSV 궤적 파일을 컨트롤러에서 실행 가능한 궤적 파일로 변환합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.fileName : const char* , 컨트롤러 측 CSV 파일 이름 또는 경로입니다.separator : const char* , CSV 구분자이며 일반적으로 "," 또는 " " 를 사용합니다.ioFlag : const char* , IO 변환 플래그이며 기본 기준은 "2" 입니다.outResponse : char* , 호출자가 할당하는 응답 텍스트 출력 버퍼입니다.bufSize : size_t , 출력 버퍼 크기이며 끝의 \0 공간을 포함합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 문자열 출력은 호출자가 제공한 버퍼를 사용하며, 버퍼가 부족하면 상태 코드에 따라 반환합니다. |
Arm_Trajectory_CheckTransformStatus
c
int Arm_Trajectory_CheckTransformStatus(ArmHandle* h, const char* fileName, ArmTransformStatus* outStatus);| 항목 | 설명 |
|---|---|
| 설명 | CSV 궤적 변환 상태를 조회합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.fileName : const char* , 컨트롤러 측 파일 이름 또는 경로입니다.outStatus : ArmTransformStatus* , 상태 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_RecordBegin
c
int Arm_Trajectory_RecordBegin(ArmHandle* h, const char* name);| 항목 | 설명 |
|---|---|
| 설명 | 궤적 재현 녹화를 시작합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 궤적 기록 이름이며 NULL 이면 안 됩니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_RecordFinish
c
int Arm_Trajectory_RecordFinish(ArmHandle* h, const char* name);| 항목 | 설명 |
|---|---|
| 설명 | 궤적 재현 녹화를 종료합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 궤적 기록 이름이며 NULL 이면 안 됩니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_ReplayStart
c
int Arm_Trajectory_ReplayStart(ArmHandle* h, const char* name);| 항목 | 설명 |
|---|---|
| 설명 | 궤적 재생을 시작합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 궤적 기록 이름이며 NULL 이면 안 됩니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_ReplayStop
c
int Arm_Trajectory_ReplayStop(ArmHandle* h, const char* name);| 항목 | 설명 |
|---|---|
| 설명 | 궤적 재생을 중지합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 궤적 기록 이름이며 NULL 이면 안 됩니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_RecordDelete
c
int Arm_Trajectory_RecordDelete(ArmHandle* h, const char* name);| 항목 | 설명 |
|---|---|
| 설명 | 궤적 기록을 삭제합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 궤적 기록 이름이며 NULL 이면 안 됩니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_GetRecordList
c
int Arm_Trajectory_GetRecordList(ArmHandle* h, char outNames[][128], size_t maxCount, size_t* outCount);| 항목 | 설명 |
|---|---|
| 설명 | 궤적 기록 목록을 조회합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outNames : char , 궤적 기록 이름 출력 배열이며 각 이름은 고정 128바이트입니다.maxCount : size_t , 출력 배열 용량이며 호출자가 최대 몇 개의 요소를 받을 수 있는지를 나타냅니다.outCount : size_t* , 출력 개수 포인터이며 성공 시 실제 개수를 기록합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 배열 출력은 호출자가 할당합니다. maxCount 는 용량을 나타내고, outCount 는 실제 개수를 반환합니다. |
Arm_Trajectory_GetRecordStartPose
c
int Arm_Trajectory_GetRecordStartPose(ArmHandle* h, const char* name, ArmMotionPose* outPose);| 항목 | 설명 |
|---|---|
| 설명 | 궤적 기록의 시작점 자세를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 궤적 기록 이름이며 NULL 이면 안 됩니다.outPose : ArmMotionPose* , 자세 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_PathRecordBegin
c
int Arm_Trajectory_PathRecordBegin(ArmHandle* h, const char* name, const char* comment, double param, double angle);| 항목 | 설명 |
|---|---|
| 설명 | .path/.traj 파일 녹화를 시작합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 경로 이름이며 NULL 이면 안 됩니다.comment : const char* , 경로 기록 비고입니다.param : double , 경로 녹화 파라미터입니다.angle : double , 경로 녹화 각도 파라미터이며 기본 기준은 1.0 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_PathRecordFinish
c
int Arm_Trajectory_PathRecordFinish(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 경로 기록을 종료합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_GetPathStartPose
c
int Arm_Trajectory_GetPathStartPose(ArmHandle* h, const char* name, ArmMotionPose* outPose);| 항목 | 설명 |
|---|---|
| 설명 | 경로 시작점 자세를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 경로 이름이며 NULL 이면 안 됩니다.outPose : ArmMotionPose* , 자세 출력 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_GetPathState
c
int Arm_Trajectory_GetPathState(ArmHandle* h, const char* const* pathList, size_t pathCount, int* outStates, size_t maxCount);| 항목 | 설명 |
|---|---|
| 설명 | 경로 상태를 조회합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.pathList : const char* const* , 경로 이름 배열입니다.pathCount : size_t , 경로 이름 개수입니다.outStates : int* , 경로 상태 출력 배열입니다.maxCount : size_t , 출력 배열 용량이며 호출자가 최대 몇 개의 요소를 받을 수 있는지를 나타냅니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | maxCount 는 pathCount 이상이어야 합니다. 용량이 부족하면 버퍼 부족 상태 코드를 반환하며 출력 배열은 쓰지 않은 상태로 유지됩니다. |
Arm_Trajectory_SetPathPlannerParameter
c
int Arm_Trajectory_SetPathPlannerParameter(ArmHandle* h, double transitionTime, double scalingFactor);| 항목 | 설명 |
|---|---|
| 설명 | 경로 계획 파라미터를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.transitionTime : double , 경로 계획 전환 시간입니다.scalingFactor : double , 경로 계획 스케일 계수입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_GetPathPlannerParameter
c
int Arm_Trajectory_GetPathPlannerParameter(ArmHandle* h, double* outTransitionTime, double* outScalingFactor);| 항목 | 설명 |
|---|---|
| 설명 | 경로 계획 파라미터를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outTransitionTime : double* , 경로 계획 전환 시간 출력 포인터입니다.outScalingFactor : double* , 경로 계획 스케일 계수 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Trajectory_MovePath
c
int Arm_Trajectory_MovePath(ArmHandle* h, const char* name, double vel, double acc);| 항목 | 설명 |
|---|---|
| 설명 | 경로 이동을 실행합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.name : const char* , 경로 이름이며 NULL 이면 안 됩니다.vel : double , 경로 이동 속도이며 기본 기준은 100.0 입니다.acc : double , 경로 이동 가속도이며 기본 기준은 1.0 입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
실시간 궤적 인터페이스
Arm_RealTimeTrajectory_EnterTrajectoryControl
c
int Arm_RealTimeTrajectory_EnterTrajectoryControl(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 실시간 궤적 제어 모드로 진입합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 진입 후에는 실시간 궤적 제어 순서에 따라 분할 데이터를 전송하고, 종료 시 제어 모드를 빠져나와야 합니다. |
Arm_RealTimeTrajectory_SetFifoSize
c
int Arm_RealTimeTrajectory_SetFifoSize(ArmHandle* h, int size);| 항목 | 설명 |
|---|---|
| 설명 | 실시간 궤적 FIFO 크기를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.size : int , FIFO 크기입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_RealTimeTrajectory_SendTrajectory
c
int Arm_RealTimeTrajectory_SendTrajectory(ArmHandle* h, const ArmTrajectorySegmentC* seg);| 항목 | 설명 |
|---|---|
| 설명 | 실시간 궤적 분할 데이터를 전송합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.seg : const ArmTrajectorySegmentC* , 실시간 궤적 분할 구조체 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_RealTimeTrajectory_StopTrajectoryControl
c
int Arm_RealTimeTrajectory_StopTrajectoryControl(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 실시간 궤적 제어를 중지합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_RealTimeTrajectory_ExitTrajectoryControl
c
int Arm_RealTimeTrajectory_ExitTrajectoryControl(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 실시간 궤적 제어 모드에서 나갑니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_RealTimeTrajectory_SubscribeJointStream
c
int Arm_RealTimeTrajectory_SubscribeJointStream(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 관절 스트림을 구독합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_RealTimeTrajectory_UnsubscribeJointStream
c
int Arm_RealTimeTrajectory_UnsubscribeJointStream(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 관절 스트림 구독을 취소합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
규칙
| 범주 | 설명 |
|---|---|
| 오프라인 궤적 | SetOfflineTrajectoryFile 은 컨트롤러 측 궤적 파일을 설정하고, PrepareOfflineTrajectory 는 시작점으로 이동하며, ExecuteOfflineTrajectory 는 궤적을 실행합니다. |
| CSV 변환 | TransformCsvToTrajectory 는 char* + bufSize 로 응답 텍스트를 출력합니다. separator 는 일반적으로 "," 또는 " " 를 사용하고, ioFlag 의 기본 기준은 "2" 입니다. |
| 변환 상태 | CheckTransformStatus 는 IDLE , RUNNING , SUCCESS , FAILED , NOT_FOUND , UNKNOWN 을 포함하는 ArmTransformStatus 를 출력합니다. |
| 기록 목록 | GetRecordList 는 고정 폭 배열 char outNames[][128] 을 사용하며, 각 이름은 고정 128바이트입니다. |
| 경로 상태 | GetPathState 는 maxCount >= pathCount 를 요구합니다. 용량이 부족하면 버퍼 부족 상태 코드를 반환하고 출력 배열은 쓰지 않은 상태로 유지됩니다. |
| 경로 계획 | SetPathPlannerParameter 는 이후 MovePath 실행에 영향을 줍니다. GetPathPlannerParameter 는 현재 경로 전환 시간과 스케일 계수를 읽습니다. |
| 실시간 궤적 | 제어 진입, FIFO 설정, 분할 전송, 중지, 종료는 순서대로 호출해야 합니다. 관절 스트림 구독은 실시간 피드백을 엽니다. |
| 궤적 분할 | ArmTrajectorySegmentC 는 point_list 와 total_points 로 이번에 전송할 포인트를 설명합니다. seq 는 분할 순번을, last_fragment 는 마지막 분할 여부를 나타냅니다. |
펌웨어 호환성
| 기능 | 최소 펌웨어 버전 | 설명 |
|---|---|---|
Arm_Trajectory_PathRecordBegin / Arm_Trajectory_PathRecordFinish | 1.5.x | 경로 녹화를 지원합니다. |
Arm_Trajectory_MovePath | 1.5.6 초과 | 1.5.6 이하 버전에는 경로 재생 시 포인트 읽기 이상이 있어 경로 재생 실패가 발생할 수 있습니다. |
Arm_Trajectory_RecordBegin / Arm_Trajectory_RecordFinish / Arm_Trajectory_ReplayStart | 1.5.x | 궤적 녹화와 재생을 지원합니다. |
Arm_Trajectory_SetPathPlannerParameter / Arm_Trajectory_GetPathPlannerParameter | 1.5.x | 경로 계획 파라미터 읽기/쓰기를 지원합니다. |
최소 호출 예제
c
#include <stdio.h> // 경로 계획 파라미터 출력을 위해 printf를 포함합니다.
#include "c_arm_api.h" // C99 SDK 최상위 헤더를 포함합니다.
int main(void) // 예제 프로그램 진입점
{ // 예제 main 함수 시작
ArmHandle* h = Arm_Create(); // C99 세션 핸들을 생성합니다.
double transitionTime = 0.0; // 전환 시간 출력 변수를 준비합니다.
double scalingFactor = 0.0; // 스케일 계수 출력 변수를 준비합니다.
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_Trajectory_GetPathPlannerParameter(h, &transitionTime, &scalingFactor); // 경로 계획 파라미터를 조회합니다.
printf("transition=%f scaling=%f\n", transitionTime, scalingFactor); // 계획 파라미터를 출력합니다.
Arm_Disconnect(h); // 연결을 해제합니다.
Arm_Destroy(h); // 핸들을 폐기합니다.
return ret == 0 ? 0 : 1; // 조회 결과에 따라 반환합니다.
} // 예제 main 함수 종료시나리오 예제
c
char names[8][128] = {{0}}; // 궤적 기록 이름 배열을 준비합니다.
size_t nameCount = 0U; // 기록 개수 출력을 준비합니다.
ArmMotionPose startPose = {0}; // 시작점 자세 출력을 준비합니다.
ArmTransformStatus status = ARM_TRANSFORM_UNKNOWN; // 변환 상태 출력을 준비합니다.
double transitionTime = 0.0; // 경로 계획 전환 시간을 준비합니다.
double scalingFactor = 0.0; // 경로 계획 스케일 계수를 준비합니다.
int listRet = Arm_Trajectory_GetRecordList(h, names, 8, &nameCount); // 궤적 기록 목록을 조회합니다.
int poseRet = Arm_Trajectory_GetRecordStartPose(h, "demo", &startPose); // 궤적 기록 시작점을 조회합니다.
int statusRet = Arm_Trajectory_CheckTransformStatus(h, "demo.csv", &status); // CSV 변환 상태를 조회합니다.
int plannerRet = Arm_Trajectory_GetPathPlannerParameter(h, &transitionTime, &scalingFactor); // 경로 계획 파라미터를 조회합니다.
/* int setFileRet = Arm_Trajectory_SetOfflineTrajectoryFile(h, "/root/robot_data/traj/demo.traj"); */ // 오프라인 궤적 파일 설정은 확인 후 실행합니다.
/* int prepareRet = Arm_Trajectory_PrepareOfflineTrajectory(h); */ // 시작점 이동은 로봇을 움직이므로 확인 후 실행합니다.
/* int execRet = Arm_Trajectory_ExecuteOfflineTrajectory(h); */ // 궤적 실행은 로봇을 움직이므로 확인 후 실행합니다.
/* int transformRet = Arm_Trajectory_TransformCsvToTrajectory(h, "demo.csv", ",", "false", NULL, 0); */ // 궤적 파일 변환은 확인 후 실행합니다.
/* int beginRet = Arm_Trajectory_RecordBegin(h, "demo"); */ // 궤적 녹화 시작은 확인 후 실행합니다.
/* int finishRet = Arm_Trajectory_RecordFinish(h, "demo"); */ // 궤적 녹화 종료는 확인 후 실행합니다.
/* int replayRet = Arm_Trajectory_ReplayStart(h, "demo"); */ // 재생 시작은 로봇을 움직이므로 확인 후 실행합니다.
/* int replayStopRet = Arm_Trajectory_ReplayStop(h, "demo"); */ // 재생 중지는 확인 후 실행합니다.
/* int deleteRet = Arm_Trajectory_RecordDelete(h, "demo"); */ // 궤적 기록 삭제는 확인 후 실행합니다.
(void)listRet; // 예제에서 상태 코드를 유지합니다.
(void)poseRet; // 예제에서 상태 코드를 유지합니다.
(void)statusRet; // 예제에서 상태 코드를 유지합니다.
(void)plannerRet; // 예제에서 상태 코드를 유지합니다.실시간 궤적
c
ArmTrajectorySegmentC seg = {0}; // 실시간 궤적 분할 데이터를 준비합니다.
/* int enterRet = Arm_RealTimeTrajectory_EnterTrajectoryControl(h); */ // 실시간 궤적 제어 진입은 확인 후 실행합니다.
/* int fifoRet = Arm_RealTimeTrajectory_SetFifoSize(h, 64); */ // FIFO 크기 설정은 확인 후 실행합니다.
/* int sendRet = Arm_RealTimeTrajectory_SendTrajectory(h, &seg); */ // 분할 전송은 운동을 구동하므로 확인 후 실행합니다.
/* int stopRet = Arm_RealTimeTrajectory_StopTrajectoryControl(h); */ // 실시간 궤적 제어 중지는 확인 후 실행합니다.
/* int exitRet = Arm_RealTimeTrajectory_ExitTrajectoryControl(h); */ // 실시간 궤적 제어 종료는 확인 후 실행합니다.
/* int subRet = Arm_RealTimeTrajectory_SubscribeJointStream(h); */ // 관절 스트림 구독은 확인 후 실행합니다.
/* int unsubRet = Arm_RealTimeTrajectory_UnsubscribeJointStream(h); */ // 관절 스트림 구독 취소는 확인 후 실행합니다.
(void)seg; // 예제에서 분할 변수를 유지합니다.예제 코드
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_trajectory] 创建句柄失败 / 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_trajectory] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
Arm_Destroy(handle);
return 1;
}
printf("[c99_trajectory] 机器人连接成功 / Robot connected successfully\n");
// [ZH] 顺序执行离线轨迹接口。
// [EN] Execute the offline trajectory APIs in sequence.
char transformResponse[512] = {0};
ArmTransformStatus transformStatus = ARM_TRANSFORM_UNKNOWN;
ret = Arm_Trajectory_SetOfflineTrajectoryFile(handle, "demo.traj");
printf("[c99_trajectory] SetOfflineTrajectoryFile 状态码 / SetOfflineTrajectoryFile status code: %d\n", ret);
ret = Arm_Trajectory_PrepareOfflineTrajectory(handle);
printf("[c99_trajectory] PrepareOfflineTrajectory 状态码 / PrepareOfflineTrajectory status code: %d\n", ret);
ret = Arm_Trajectory_ExecuteOfflineTrajectory(handle);
printf("[c99_trajectory] ExecuteOfflineTrajectory 状态码 / ExecuteOfflineTrajectory status code: %d\n", ret);
ret = Arm_Trajectory_TransformCsvToTrajectory(handle, "demo.csv", " ", "2", transformResponse, sizeof(transformResponse));
printf("[c99_trajectory] TransformCsvToTrajectory 状态码 / TransformCsvToTrajectory status code: %d, 返回值 / Response: %s\n", ret, transformResponse);
ret = Arm_Trajectory_CheckTransformStatus(handle, "demo.csv", &transformStatus);
printf("[c99_trajectory] CheckTransformStatus 状态码 / CheckTransformStatus status code: %d, 状态 / Status: %d\n", ret, transformStatus);
// [ZH] 顺序执行录制、回放和路径接口。
// [EN] Execute the record, replay, and path APIs in sequence.
char recordNames[8][128] = {{0}};
size_t recordCount = 0U;
ArmMotionPose recordPose = {0};
ArmMotionPose pathPose = {0};
const char* pathList[1] = {"demo_path"};
int pathStates[1] = {0};
double transitionTime = 0.0;
double scalingFactor = 0.0;
ret = Arm_Trajectory_RecordBegin(handle, "demo_record");
printf("[c99_trajectory] RecordBegin 状态码 / RecordBegin status code: %d\n", ret);
ret = Arm_Trajectory_RecordFinish(handle, "demo_record");
printf("[c99_trajectory] RecordFinish 状态码 / RecordFinish status code: %d\n", ret);
ret = Arm_Trajectory_ReplayStart(handle, "demo_record");
printf("[c99_trajectory] ReplayStart 状态码 / ReplayStart status code: %d\n", ret);
ret = Arm_Trajectory_ReplayStop(handle, "demo_record");
printf("[c99_trajectory] ReplayStop 状态码 / ReplayStop status code: %d\n", ret);
ret = Arm_Trajectory_RecordDelete(handle, "demo_record");
printf("[c99_trajectory] RecordDelete 状态码 / RecordDelete status code: %d\n", ret);
ret = Arm_Trajectory_GetRecordList(handle, recordNames, 8U, &recordCount);
printf("[c99_trajectory] GetRecordList 状态码 / GetRecordList status code: %d, 数量 / Count: %zu\n", ret, recordCount);
ret = Arm_Trajectory_GetRecordStartPose(handle, "demo_record", &recordPose);
printf("[c99_trajectory] GetRecordStartPose 状态码 / GetRecordStartPose status code: %d\n", ret);
ret = Arm_Trajectory_PathRecordBegin(handle, "demo_path", "sdk example", 1.0, 1.0);
printf("[c99_trajectory] PathRecordBegin 状态码 / PathRecordBegin status code: %d\n", ret);
ret = Arm_Trajectory_PathRecordFinish(handle);
printf("[c99_trajectory] PathRecordFinish 状态码 / PathRecordFinish status code: %d\n", ret);
ret = Arm_Trajectory_GetPathStartPose(handle, "demo_path", &pathPose);
printf("[c99_trajectory] GetPathStartPose 状态码 / GetPathStartPose status code: %d\n", ret);
ret = Arm_Trajectory_GetPathState(handle, pathList, 1U, pathStates, 1U);
printf("[c99_trajectory] GetPathState 状态码 / GetPathState status code: %d, 状态 / State: %d\n", ret, pathStates[0]);
ret = Arm_Trajectory_SetPathPlannerParameter(handle, 0.2, 1.0);
printf("[c99_trajectory] SetPathPlannerParameter 状态码 / SetPathPlannerParameter status code: %d\n", ret);
ret = Arm_Trajectory_GetPathPlannerParameter(handle, &transitionTime, &scalingFactor);
printf("[c99_trajectory] GetPathPlannerParameter 状态码 / GetPathPlannerParameter status code: %d, transition_time=%.6f, scaling_factor=%.6f\n", ret, transitionTime, scalingFactor);
ret = Arm_Trajectory_MovePath(handle, "demo_path", 50.0, 1.0);
printf("[c99_trajectory] MovePath 状态码 / MovePath status code: %d\n", ret);
// [ZH] 顺序执行实时轨迹接口。
// [EN] Execute the real-time trajectory APIs in sequence.
double positions[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
ArmTrajectoryPointC point = {0};
ArmTrajectorySegmentC segment = {0};
point.position_list = positions;
point.position_count = 6;
segment.point_list = &point;
segment.total_points = 1U;
segment.seq = 1U;
segment.last_fragment = 1U;
ret = Arm_RealTimeTrajectory_EnterTrajectoryControl(handle);
printf("[c99_trajectory] EnterTrajectoryControl 状态码 / EnterTrajectoryControl status code: %d\n", ret);
ret = Arm_RealTimeTrajectory_SetFifoSize(handle, 8);
printf("[c99_trajectory] SetFifoSize 状态码 / SetFifoSize status code: %d\n", ret);
ret = Arm_RealTimeTrajectory_SubscribeJointStream(handle);
printf("[c99_trajectory] SubscribeJointStream 状态码 / SubscribeJointStream status code: %d\n", ret);
ret = Arm_RealTimeTrajectory_SendTrajectory(handle, &segment);
printf("[c99_trajectory] SendTrajectory 状态码 / SendTrajectory status code: %d\n", ret);
ret = Arm_RealTimeTrajectory_StopTrajectoryControl(handle);
printf("[c99_trajectory] StopTrajectoryControl 状态码 / StopTrajectoryControl status code: %d\n", ret);
ret = Arm_RealTimeTrajectory_UnsubscribeJointStream(handle);
printf("[c99_trajectory] UnsubscribeJointStream 状态码 / UnsubscribeJointStream status code: %d\n", ret);
ret = Arm_RealTimeTrajectory_ExitTrajectoryControl(handle);
printf("[c99_trajectory] ExitTrajectoryControl 状态码 / ExitTrajectoryControl status code: %d\n", ret);
// [ZH] 断开连接并销毁句柄。
// [EN] Disconnect and destroy the handle.
Arm_Disconnect(handle);
Arm_Destroy(handle);
printf("[c99_trajectory] 示例结束 / Example finished\n");
return 0;
}