최신 버전 정보는 1.33.5에서 확인하세요.
6.3 고급 튜토리얼
고급 튜토리얼 절에서는 실제 로봇 운용을 위한 실용적이고 안전에 중요한 제어 패턴을 다룹니다. 이 예제들은 기본 API 흐름을 넘어 일시 정지/재개 로직, 안전 정지 복구, 알람 처리, 사용자 정의 모션 계획까지 포함합니다.
각 예제는 비상 정지(Emergency Stop), 제어권 상실, 서보 오프 상태 같은 실제 상황에서 안전하게 상태를 전환하고 복구하는 데 중점을 둡니다.
튜토리얼 흐름
통합 정지 / 일시 정지 / 재개: 로봇 모션을 안전하게 중단하고 재개합니다.
안전 정지 및 복구: 안전 정지 상태를 처리하고 운전을 복구합니다.
알람 및 제어권 상실 처리: 알람과 제어권 중단을 관리합니다.
모니터링 및 로그 기록: 자세한 모니터링 데이터를 가져와 해석합니다.
사용자 정의 궤적(Trajectory) 계획: 5차 다항식 궤적을 생성하고 따라갑니다.
서보 오프 및 재연결: 네트워크가 끊긴 뒤 다시 연결하고 서보를 복구합니다.
통합 정지 / 일시 정지 / 재개
목적
API 실행과 DRL 실행 모두에서 모션을 정지, 일시 정지, 재개하는 통합 패턴을 보여 줍니다.
// 키보드 기반 제어 스레드 예제
while (true) {
char ch = getch();
switch (ch) {
case 's': // 정지
Drfl.stop(STOP_TYPE_SLOW);
Drfl.drl_stop(STOP_TYPE_QUICK);
break;
case 'p': // 일시 정지
Drfl.move_pause();
break;
case 'r': // 재개
Drfl.move_resume();
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
확인
로봇이 부드럽게 정지하거나 일시 정지하고, 안전 오류 없이 모션을 재개합니다.
안전 정지 및 복구
목적
안전 정지 상태에서의 전환을 처리하고 정상 운전을 자동으로 복구합니다.
std::atomic<int> g_nPendingState(-1);
void OnMonitoringStateCB(const ROBOT_STATE eState) {
// 상태만 기록하고, 처리는 콜백 함수 밖에서 합니다
g_nPendingState = (int)eState;
}
// 메인 루프
while (true) {
switch (g_nPendingState.exchange(-1)) {
case STATE_SAFE_STOP:
Drfl.set_safe_stop_reset_type(SAFE_STOP_RESET_TYPE_DEFAULT);
Drfl.set_robot_control(CONTROL_RESET_SAFET_STOP);
break;
case STATE_SAFE_OFF:
Drfl.set_robot_control(CONTROL_SERVO_ON);
break;
case STATE_SAFE_STOP2:
Drfl.set_robot_control(CONTROL_RECOVERY_SAFE_STOP);
break;
case STATE_SAFE_OFF2:
Drfl.set_robot_control(CONTROL_RECOVERY_SAFE_OFF);
break;
default:
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
확인
로봇이 안전 정지나 서보 오프 상태에서 자동으로 복구되어 STANDBY로 돌아갑니다. set_robot_control은 콜백 밖에서 호출하세요. 콜백 함수 규칙을 참고하세요.
알람 및 제어권 상실 처리
목적
컨트롤러 알람과 제어권 상실에 동적으로 대응합니다.
void OnLogAlarm(LPLOG_ALARM tLog) {
std::cout << "Alarm Group: " << (int)tLog->_iGroup
<< ", Index: " << (int)tLog->_iIndex << std::endl;
}
void OnMonitoringAccessControlCB(const MONITORING_ACCESS_CONTROL eControl) {
switch (eControl) {
case MONITORING_ACCESS_CONTROL_REQUEST:
Drfl.manage_access_control(MANAGE_ACCESS_CONTROL_RESPONSE_NO);
break;
case MONITORING_ACCESS_CONTROL_GRANT:
g_bHasControlAuthority = TRUE;
break;
case MONITORING_ACCESS_CONTROL_LOSS:
g_bHasControlAuthority = FALSE;
Drfl.manage_access_control(MANAGE_ACCESS_CONTROL_FORCE_REQUEST);
break;
default:
break;
}
}
확인
시스템이 알람 정보를 출력하고, 제어권을 잃은 뒤 자동으로 다시 얻습니다.
manage_access_control은 요청을 보내자마자 반환하므로 콜백 안에서 호출할 수 있습니다(콜백 함수 규칙 참고).
모니터링 및 로그 기록
목적
자세한 실시간 모니터링 데이터에 접근하고 로봇 매개변수를 기록합니다.
void OnMonitoringDataExCB(const LPMONITORING_DATA_EX pData) {
std::cout << "TCP Target Position: ["
<< pData->_tCtrl._tWorld._fTargetPos[0] << ", "
<< pData->_tCtrl._tWorld._fTargetPos[1] << ", "
<< pData->_tCtrl._tWorld._fTargetPos[2] << "]"
<< std::endl;
}
확인
모션 중 실시간 위치나 상태 값이 주기적으로 갱신됩니다.
사용자 정의 궤적 계획
목적
5차 다항식을 이용한 사용자 정의 궤적 생성을 보여 줍니다. 이 기법은 매끄러운 조인트 궤적이나 오프라인 시뮬레이션에 유용합니다.
struct PlanParam {
float time;
float ps[6], vs[6], as[6];
float pf[6], vf[6], af[6];
float A0[6], A1[6], A2[6], A3[6], A4[6], A5[6];
};
void TrajectoryPlan(PlanParam* plan) {
float tf = plan->time;
for (int i = 0; i < 6; i++) {
plan->A0[i] = plan->ps[i];
plan->A1[i] = plan->vs[i];
plan->A2[i] = plan->as[i] / 2;
plan->A3[i] = (20*plan->pf[i] - 20*plan->ps[i]
- (8*plan->vf[i] + 12*plan->vs[i]) * tf
- (3*plan->as[i] - plan->af[i]) * tf * tf) / (2 * tf * tf * tf);
}
}
확인
생성된 계수로 위치, 속도, 가속도 프로파일이 연속적으로 만들어집니다.
서보 오프 및 재연결
목적
네트워크가 끊기거나 서보 오프 상태가 된 뒤 컨트롤러에 자동으로 다시 연결합니다.
void OnDisconnected() {
while (!Drfl.open_connection("192.168.137.100")) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
확인
연결이 끊긴 뒤 자동으로 다시 연결되고, 로봇을 재부팅하지 않고도 제어를 재개할 수 있습니다.
참고
고급 제어 기법을 사용하려면 6.2 기본 튜토리얼의 기본 API 흐름을 먼저 구성하고 테스트를 마쳐야 합니다.