Skip to content

3.9 TrajectoryManager 궤적 클래스

개요

TrajectoryManager 는 오프라인 궤적, CSV 변환, 기록/재생, 경로 실행, 실시간 궤적을 담당합니다.

3.9.1 오프라인 궤적

cpp
SetOfflineTrajectoryFile(const std::string& path) -> STATUS_CODE
PrepareOfflineTrajectory() -> STATUS_CODE
ExecuteOfflineTrajectory() -> STATUS_CODE
메서드설명반환
SetOfflineTrajectoryFile오프라인 궤적 파일 경로 설정STATUS_CODE
PrepareOfflineTrajectory시작점으로 이동STATUS_CODE
ExecuteOfflineTrajectory오프라인 궤적 실행STATUS_CODE

3.9.2 CSV 변환

cpp
TransformCsvToTrajectory(const std::string& fileName, const std::string& separator = " ", const std::string& ioFlag = "2") -> std::pair<std::string, STATUS_CODE>
CheckTransformStatus(const std::string& fileName) -> std::pair<TransformStatusEnum, STATUS_CODE>
메서드설명반환
TransformCsvToTrajectoryCSV 파일 변환std::pair<std::string, STATUS_CODE>
CheckTransformStatus변환 상태 조회std::pair<TransformStatusEnum, STATUS_CODE>

3.9.3 궤적 기록 및 재생

cpp
TrajectoryRecordBegin(const std::string& name) -> STATUS_CODE
TrajectoryRecordFinish(const std::string& name) -> STATUS_CODE
TrajectoryReplayStart(const std::string& name) -> STATUS_CODE
TrajectoryReplayStop(const std::string& name) -> STATUS_CODE
TrajectoryRecordDelete(const std::string& name) -> STATUS_CODE
GetTrajectoryRecordList() -> std::pair<std::vector<std::string>, STATUS_CODE>
GetTrajectoryRecordStartPose(const std::string& name) -> std::pair<MotionPose, STATUS_CODE>
메서드설명반환
TrajectoryRecordBegin기록 시작STATUS_CODE
TrajectoryRecordFinish기록 종료STATUS_CODE
TrajectoryReplayStart재생 시작STATUS_CODE
TrajectoryReplayStop재생 정지STATUS_CODE
TrajectoryRecordDelete기록 파일 삭제STATUS_CODE
GetTrajectoryRecordList기록 목록 조회std::pair<std::vector<std::string>, STATUS_CODE>
GetTrajectoryRecordStartPose첫 번째 포즈 가져오기std::pair<MotionPose, STATUS_CODE>

3.9.4 경로 기록 및 실행

cpp
PathRecordBegin(const std::string& name, const std::string& comment, Float64 param, Float64 angle = 1.0) -> STATUS_CODE
PathRecordFinish() -> STATUS_CODE
GetPathStartPose(const std::string& name) -> std::pair<MotionPose, STATUS_CODE>
GetPathState(const std::vector<std::string>& pathList) -> std::pair<std::map<std::string, int32_t>, STATUS_CODE>
SetPathPlannerParameter(Float64 transitionTime, Float64 scalingFactor) -> STATUS_CODE
GetPathPlannerParameter() -> std::tuple<Float64, Float64, STATUS_CODE>
MovePath(const std::string& name, Float64 vel = 100.0, Float64 acc = 1.0) -> STATUS_CODE
메서드설명반환
PathRecordBegin.path/.traj 기록 시작STATUS_CODE
PathRecordFinish기록 종료STATUS_CODE
GetPathStartPose시작 포즈 가져오기std::pair<MotionPose, STATUS_CODE>
GetPathState상태 배치 조회std::pair<std::map<std::string, int32_t>, STATUS_CODE>
SetPathPlannerParameter경로 플래너 파라미터 설정STATUS_CODE
GetPathPlannerParameter경로 플래너 파라미터 가져오기std::tuple<Float64, Float64, STATUS_CODE>
MovePath경로 파일에 따라 실행STATUS_CODE

3.9.5 실시간 궤적

cpp
EnterTrajectoryControl() -> STATUS_CODE
SetFifoSize(int32_t size) -> STATUS_CODE
SendTrajectory(const TrajectorySegment& segment) -> STATUS_CODE
StopTrajectoryControl() -> STATUS_CODE
ExitTrajectoryControl() -> STATUS_CODE
SubscribeJointStream() -> STATUS_CODE
UnsubscribeJointStream() -> STATUS_CODE
메서드설명반환
EnterTrajectoryControl실시간 궤적 제어 모드 진입STATUS_CODE
SetFifoSize실시간 궤적 FIFO 크기 설정STATUS_CODE
SendTrajectory궤적 세그먼트 전송STATUS_CODE
StopTrajectoryControl실시간 궤적 제어 정지STATUS_CODE
ExitTrajectoryControl실시간 궤적 제어 모드 종료STATUS_CODE
SubscribeJointStream관절 스트림 구독STATUS_CODE
UnsubscribeJointStream관절 스트림 구독 취소STATUS_CODE

최소 호출 예제

cpp
#include <iostream>  // 궤적 조회 결과를 출력하기 위한 표준 출력 스트림을 포함합니다.
#include "arm_api.h"  // Arm 주 진입점을 포함하며, 연결 후 arm.trajectoryManager로 궤적 인터페이스에 접근합니다.
#include "status_code.h"  // SDK 호출 결과 확인용 STATUS_CODE를 포함합니다.
int main()  // 예제 프로그램 진입점입니다.
{  // 예제 main 함수에 진입합니다.
    Arm arm;  // 로봇 세션 객체를 생성합니다.
    STATUS_CODE connectRet = arm.Connect("192.168.110.2", "");  // 컨트롤러에 연결합니다. 티치 펜던트 주소를 비워 기본 규칙을 사용합니다.
    if (connectRet != STATUS_CODE::OK) {  // 연결 실패 여부를 판단합니다.
        return 1;  // 연결 실패 시 바로 종료합니다.
    }  // 연결 결과 판단을 종료합니다.
    auto [recordNames, listRet] = arm.trajectoryManager.GetTrajectoryRecordList();  // 현재 궤적 기록 파일 목록을 조회합니다.
    auto [transitionTime, scalingFactor, plannerRet] =  // 경로 플래너 파라미터 조회 결과를 받을 준비를 합니다.
        arm.trajectoryManager.GetPathPlannerParameter();  // 경로 전환 시간과 스케일링 계수를 조회합니다.
    if (listRet != STATUS_CODE::OK || plannerRet != STATUS_CODE::OK) {  // 목록 또는 파라미터 조회 실패 여부를 판단합니다.
        return 1;  // 어느 조회든 실패하면 오류 코드로 반환합니다.
    }  // 조회 결과 판단을 종료합니다.
    std::cout << "record_count=" << recordNames.size() << "\n";  // 궤적 기록 파일 수를 출력합니다.
    std::cout << "transition_time=" << transitionTime << "\n";  // 경로 전환 시간을 출력합니다.
    std::cout << "scaling_factor=" << scalingFactor << "\n";  // 경로 스케일링 계수를 출력합니다.
    return 0;  // 예제를 정상 종료합니다.
}  // 예제 main 함수를 종료합니다.

시나리오 예제

아래 조각들은 "CSV 변환, 오프라인 궤적, 기록/재생, 경로 모션, 실시간 궤적" 흐름으로 이 페이지의 API를 교차해서 다룹니다. 조각들은 최소 호출 예제에서 이미 연결에 성공한 arm 객체를 이어받는다고 가정합니다. 로봇을 구동하거나 궤적 파일 상태를 변경하는 호출은 주석으로 유지되어 있으므로 현장을 확인한 뒤 실행하십시오.

CSV 변환 및 변환 상태

cpp
const std::string csvName = "demo.csv";  // CSV 파일명 예제를 준비합니다.
auto [transformName, transformRet] = arm.trajectoryManager.TransformCsvToTrajectory(csvName, ",", "2");  // CSV를 궤적 파일로 변환합니다.
if (transformRet == STATUS_CODE::OK) {  // 변환 작업 제출 성공 여부를 판단합니다.
    auto [transformStatus, statusRet] = arm.trajectoryManager.CheckTransformStatus(transformName);  // 변환 작업 상태를 조회합니다.
    std::cout << "transform_status=" << static_cast<int>(transformStatus) << " status_ret=" << static_cast<int>(statusRet) << "\n";  // 변환 상태와 조회 결과를 출력합니다.
}  // 변환 작업 상태 조회 판단을 종료합니다.

오프라인 궤적 파일 실행

cpp
// STATUS_CODE offlineFileRet = arm.trajectoryManager.SetOfflineTrajectoryFile("/root/robot_data/progs/robot_tmp/demo.traj");  // 오프라인 궤적 파일 경로 설정은 후속 궤적 실행에 영향을 주므로 확인한 뒤 실행하십시오.
// STATUS_CODE prepareRet = arm.trajectoryManager.PrepareOfflineTrajectory();  // 오프라인 궤적 준비는 궤적 시작점으로 이동하므로 안전을 확인한 뒤 실행하십시오.
// STATUS_CODE executeRet = arm.trajectoryManager.ExecuteOfflineTrajectory();  // 오프라인 궤적 실행은 로봇을 구동하므로 안전을 확인한 뒤 실행하십시오.

궤적 기록, 재생 및 삭제

cpp
const std::string recordName = "demo_record";  // 궤적 기록 이름 예제를 준비합니다.
auto [recordNames, listRet] = arm.trajectoryManager.GetTrajectoryRecordList();  // 궤적 기록 목록을 조회합니다.
auto [recordStartPose, recordPoseRet] = arm.trajectoryManager.GetTrajectoryRecordStartPose(recordName);  // 기록 궤적의 첫 번째 포즈를 조회합니다.
if (listRet == STATUS_CODE::OK || recordPoseRet == STATUS_CODE::OK) {  // 기록 조회 성공 여부를 판단합니다.
    std::cout << "record_count=" << recordNames.size() << "\n";  // 기록 궤적 수를 출력합니다.
}  // 기록 조회 판단을 종료합니다.
// STATUS_CODE recordBeginRet = arm.trajectoryManager.TrajectoryRecordBegin(recordName);  // 궤적 기록 시작은 기록 상태를 변경하므로 확인한 뒤 실행하십시오.
// STATUS_CODE recordFinishRet = arm.trajectoryManager.TrajectoryRecordFinish(recordName);  // 궤적 기록 종료는 기록 파일을 쓰므로 확인한 뒤 실행하십시오.
// STATUS_CODE replayStartRet = arm.trajectoryManager.TrajectoryReplayStart(recordName);  // 궤적 재생 시작은 로봇을 구동하므로 안전을 확인한 뒤 실행하십시오.
// STATUS_CODE replayStopRet = arm.trajectoryManager.TrajectoryReplayStop(recordName);  // 궤적 재생 정지는 재생 상태를 변경하므로 확인한 뒤 실행하십시오.
// STATUS_CODE recordDeleteRet = arm.trajectoryManager.TrajectoryRecordDelete(recordName);  // 기록 궤적 삭제는 컨트롤러 측 파일을 삭제하므로 확인한 뒤 실행하십시오.

경로 기록 및 경로 모션

cpp
const std::string pathName = "demo_path";  // 경로 이름 예제를 준비합니다.
auto [pathStartPose, pathPoseRet] = arm.trajectoryManager.GetPathStartPose(pathName);  // 경로 시작 포즈를 조회합니다.
auto [pathState, pathStateRet] = arm.trajectoryManager.GetPathState(std::vector<std::string>{pathName});  // 경로 상태를 배치로 조회합니다.
auto [transitionTime, scalingFactor, plannerRet] = arm.trajectoryManager.GetPathPlannerParameter();  // 경로 플래너 파라미터를 읽습니다.
if (pathPoseRet == STATUS_CODE::OK || pathStateRet == STATUS_CODE::OK || plannerRet == STATUS_CODE::OK) {  // 경로 조회 성공 여부를 판단합니다.
    std::cout << "transition=" << transitionTime << " scaling=" << scalingFactor << "\n";  // 경로 플래너 파라미터를 출력합니다.
}  // 경로 조회 판단을 종료합니다.
// STATUS_CODE pathBeginRet = arm.trajectoryManager.PathRecordBegin(pathName, "sdk demo", 100.0, 1.0);  // 경로 기록 시작은 경로 파일 상태를 변경하므로 확인한 뒤 실행하십시오.
// STATUS_CODE pathFinishRet = arm.trajectoryManager.PathRecordFinish();  // 경로 기록 종료는 경로 파일을 쓰므로 확인한 뒤 실행하십시오.
// STATUS_CODE setPlannerRet = arm.trajectoryManager.SetPathPlannerParameter(0.2, 1.0);  // 경로 플래너 파라미터 변경은 후속 경로 모션에 영향을 주므로 확인한 뒤 실행하십시오.
// STATUS_CODE movePathRet = arm.trajectoryManager.MovePath(pathName, 100.0, 1.0);  // 경로 모션 실행은 로봇을 구동하므로 안전을 확인한 뒤 실행하십시오.

실시간 궤적 제어

cpp
TrajectorySegment segment;  // 실시간 궤적 전송에 필요한 궤적 세그먼트 객체를 준비합니다.
// STATUS_CODE enterRtRet = arm.realTimeTrajectoryControl.EnterTrajectoryControl();  // 실시간 궤적 제어 모드 진입은 로봇 제어 상태를 변경하므로 확인한 뒤 실행하십시오.
// STATUS_CODE fifoRet = arm.realTimeTrajectoryControl.SetFifoSize(64);  // 실시간 궤적 FIFO 크기 설정은 후속 실시간 궤적 전송에 영향을 주므로 확인한 뒤 실행하십시오.
// STATUS_CODE sendRet = arm.realTimeTrajectoryControl.SendTrajectory(segment);  // 실시간 궤적 세그먼트 전송은 실시간 제어 경로에 진입하므로 확인한 뒤 실행하십시오.
// STATUS_CODE subJointRet = arm.realTimeTrajectoryControl.SubscribeJointStream();  // 실시간 관절 스트림 구독은 실시간 피드백을 열므로 확인한 뒤 실행하십시오.
// STATUS_CODE unsubJointRet = arm.realTimeTrajectoryControl.UnsubscribeJointStream();  // 실시간 관절 스트림 구독 취소는 해당 피드백을 닫으므로 확인한 뒤 실행하십시오.
// STATUS_CODE stopRtRet = arm.realTimeTrajectoryControl.StopTrajectoryControl();  // 실시간 궤적 제어 정지는 제어 상태를 변경하므로 확인한 뒤 실행하십시오.
// STATUS_CODE exitRtRet = arm.realTimeTrajectoryControl.ExitTrajectoryControl();  // 실시간 궤적 제어 모드 종료는 일반 제어 상태로 복귀하므로 확인한 뒤 실행하십시오.

예제 코드

cpp17/trajectory_basic/src/main.cpp
cpp
#include "offline_trajectory/run.h"
#include "record_and_replay/run.h"
#include "path_api/run.h"
#include "realtime_trajectory/run.h"

int main(void)
{
    // [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
    // [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
    return RunTrajectoryBasicOfflineTrajectory();
    // return RunTrajectoryBasicRecordAndReplay();
    // return RunTrajectoryBasicPathApi();
    // return RunTrajectoryBasicRealtimeTrajectory();
}

펌웨어 호환성 설명

기능최소 펌웨어 버전설명
PathRecordBegin / PathRecordFinish1.5.x기록은 정상이나, 1.5.6 이하 버전에는 readViaPoints 버그가 있어 MovePath 재생 시 0개 점을 읽어 MOTION_TABLE_READ_FAILED가 발생합니다.
MovePath (.path / .traj)> 1.5.6펌웨어에서 readViaPoints 가 수정된 뒤 정상 재생할 수 있습니다.
TrajectoryRecordBegin / Finish / Replay1.5.xCSV 궤적 기록 및 재생 정상
SetPathPlannerParameter / GetPathPlannerParameter1.5.x정상