Skip to content

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 는 종료 후 기록을 씁니다. 재생은 ReplayStartReplayStop 을 사용합니다.
경로 녹화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 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다.
비고maxCountpathCount 이상이어야 합니다. 용량이 부족하면 버퍼 부족 상태 코드를 반환하며 출력 배열은 쓰지 않은 상태로 유지됩니다.

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 변환TransformCsvToTrajectorychar* + bufSize 로 응답 텍스트를 출력합니다. separator 는 일반적으로 "," 또는 " " 를 사용하고, ioFlag 의 기본 기준은 "2" 입니다.
변환 상태CheckTransformStatusIDLE , RUNNING , SUCCESS , FAILED , NOT_FOUND , UNKNOWN 을 포함하는 ArmTransformStatus 를 출력합니다.
기록 목록GetRecordList 는 고정 폭 배열 char outNames[][128] 을 사용하며, 각 이름은 고정 128바이트입니다.
경로 상태GetPathStatemaxCount >= pathCount 를 요구합니다. 용량이 부족하면 버퍼 부족 상태 코드를 반환하고 출력 배열은 쓰지 않은 상태로 유지됩니다.
경로 계획SetPathPlannerParameter 는 이후 MovePath 실행에 영향을 줍니다. GetPathPlannerParameter 는 현재 경로 전환 시간과 스케일 계수를 읽습니다.
실시간 궤적제어 진입, FIFO 설정, 분할 전송, 중지, 종료는 순서대로 호출해야 합니다. 관절 스트림 구독은 실시간 피드백을 엽니다.
궤적 분할ArmTrajectorySegmentCpoint_listtotal_points 로 이번에 전송할 포인트를 설명합니다. seq 는 분할 순번을, last_fragment 는 마지막 분할 여부를 나타냅니다.

펌웨어 호환성

기능최소 펌웨어 버전설명
Arm_Trajectory_PathRecordBegin / Arm_Trajectory_PathRecordFinish1.5.x경로 녹화를 지원합니다.
Arm_Trajectory_MovePath1.5.6 초과1.5.6 이하 버전에는 경로 재생 시 포인트 읽기 이상이 있어 경로 재생 실패가 발생할 수 있습니다.
Arm_Trajectory_RecordBegin / Arm_Trajectory_RecordFinish / Arm_Trajectory_ReplayStart1.5.x궤적 녹화와 재생을 지원합니다.
Arm_Trajectory_SetPathPlannerParameter / Arm_Trajectory_GetPathPlannerParameter1.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;  // 예제에서 분할 변수를 유지합니다.

예제 코드

c99/trajectory_basic/src/main.cpp
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;
}