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>| 메서드 | 설명 | 반환 |
|---|---|---|
TransformCsvToTrajectory | CSV 파일 변환 | 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(); // 실시간 궤적 제어 모드 종료는 일반 제어 상태로 복귀하므로 확인한 뒤 실행하십시오.예제 코드
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 / PathRecordFinish | 1.5.x | 기록은 정상이나, 1.5.6 이하 버전에는 readViaPoints 버그가 있어 MovePath 재생 시 0개 점을 읽어 MOTION_TABLE_READ_FAILED가 발생합니다. |
| MovePath (.path / .traj) | > 1.5.6 | 펌웨어에서 readViaPoints 가 수정된 뒤 정상 재생할 수 있습니다. |
| TrajectoryRecordBegin / Finish / Replay | 1.5.x | CSV 궤적 기록 및 재생 정상 |
| SetPathPlannerParameter / GetPathPlannerParameter | 1.5.x | 정상 |