이전 버전(1.33.4)의 문서를 보고 있습니다. 이 버전은 계속 지원됩니다.
최신 버전 정보는 1.33.5에서 확인하세요.

6.3 고급 튜토리얼

고급 튜토리얼 절에서는 실제 로봇 운용을 위한 실용적이고 안전에 중요한 제어 패턴을 다룹니다. 이 예제들은 기본 API 흐름을 넘어 일시 정지/재개 로직, 안전 정지 복구, 알람 처리, 사용자 정의 모션 계획까지 포함합니다.

각 예제는 비상 정지(Emergency Stop), 제어권 상실, 서보 오프 상태 같은 실제 상황에서 안전하게 상태를 전환하고 복구하는 데 중점을 둡니다.

튜토리얼 흐름

  1. 통합 정지 / 일시 정지 / 재개: 로봇 모션을 안전하게 중단하고 재개합니다.

  2. 안전 정지 및 복구: 안전 정지 상태를 처리하고 운전을 복구합니다.

  3. 알람 및 제어권 상실 처리: 알람과 제어권 중단을 관리합니다.

  4. 모니터링 및 로그 기록: 자세한 모니터링 데이터를 가져와 해석합니다.

  5. 사용자 정의 궤적(Trajectory) 계획: 5차 다항식 궤적을 생성하고 따라갑니다.

  6. 서보 오프 및 재연결: 네트워크가 끊긴 뒤 다시 연결하고 서보를 복구합니다.

통합 정지 / 일시 정지 / 재개

목적
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 흐름을 먼저 구성하고 테스트를 마쳐야 합니다.