6.2 기본 튜토리얼
기본 튜토리얼 절에서는 두산로보틱스 API의 기본 동작을 이해하고 확인할 수 있도록 간단하고 독립적인 예제를 제공합니다. 각 항목은 연결 설정, 서보 활성화, 기본 모션 실행, 짧은 DRL 스크립트 실행 같은 핵심 기능 하나에 집중하므로, 고급 제어로 넘어가기 전에 API가 올바르게 동작하는지 단계별로 확인할 수 있습니다.
이 예제들은 의도적으로 최소한으로 구성되어 추가 로직이나 스레드 없이 핵심 명령 흐름만 보여 줍니다. 시나리오 기반의 전체 예제는 6.6 시나리오 기반 예제를 참고하세요.
튜토리얼 흐름
연결 및 콜백 등록: 로봇 컨트롤러에 연결하고 모니터링 콜백을 설정합니다.
제어권(Control Authority) 및 서보 온: 제어권을 얻고 서보 모터를 활성화합니다.
조그 및 홈: 조인트 단위 모션과 원점 복귀(Homing) 모션을 확인합니다.
MoveJ / MoveL(동기 및 비동기): 기본 모션 명령을 실행합니다.
DRL 미니 루프: 간단한 DRL 스크립트를 안전하게 실행하고 정지합니다.
I/O 기본: 컨트롤 박스의 디지털 출력 전환을 테스트합니다.
아래 각 절에는 간결한 코드 조각과 핵심 확인 사항이 있습니다.
연결 및 콜백 등록
목적
컨트롤러에 연결하고 모니터링 콜백을 등록해 로봇 상태 업데이트와 알람을 받습니다.
#include "DRFLEx.h"
#include <iostream>
#include <thread>
#include <chrono>
using namespace DRAFramework;
CDRFLEx Drfl;
// 최소한의 콜백 함수(애플리케이션에 맞게 확장하세요)
void OnMonitoringStateCB(const ROBOT_STATE eState) { std::cout << "State: " << eState << "\n"; }
void OnMonitroingAccessControlCB(const MONITORING_ACCESS_CONTROL eAccess) { std::cout << "Access control: " << eAccess << "\n"; }
void OnLogAlarm(LPLOG_ALARM pLogAlarm) { std::cout << "Alarm: " << pLogAlarm->_iIndex << "\n"; }
void OnMonitoringDataCB(const LPMONITORING_DATA pData) { (void)pData; }
void OnMonitoringDataExCB(const LPMONITORING_DATA_EX pData) { (void)pData; }
int main()
{
Drfl.set_on_monitoring_state(OnMonitoringStateCB);
Drfl.set_on_monitoring_access_control(OnMonitroingAccessControlCB);
Drfl.set_on_log_alarm(OnLogAlarm);
Drfl.set_on_monitoring_data(OnMonitoringDataCB);
Drfl.set_on_monitoring_data_ex(OnMonitoringDataExCB);
if (!Drfl.open_connection("192.168.137.100")) {
std::cout << "Failed to connect to controller.\n";
return -1;
}
Drfl.setup_monitoring_version(1);
SYSTEM_VERSION ver{};
Drfl.get_system_version(&ver);
std::cout << "System: " << ver._szController << "\n";
std::cout << "Library: " << Drfl.get_library_version() << "\n";
return 0;
}
확인
연결에 성공하고, 상태나 알람 업데이트 같은 로봇 이벤트에 콜백이 반응합니다.
제어권 및 서보 온
목적
제어권을 얻고 로봇의 서보 모터를 활성화합니다.
void OnTpInitializingCompleted() {
Drfl.manage_access_control(MANAGE_ACCESS_CONTROL_FORCE_REQUEST);
}
// GRANT를 받은 후:
if (!Drfl.set_robot_mode(ROBOT_MODE_AUTONOMOUS)) return -1;
if (!Drfl.set_robot_system(ROBOT_SYSTEM_REAL)) return -1;
Drfl.set_robot_control(CONTROL_SERVO_ON);
확인
제어권이 부여되고, 로봇 상태가 STANDBY로 전환되며, 서보 온이 알람 없이 완료됩니다.
조그 및 홈
목적
짧은 조그와 원점 복귀 시퀀스를 실행해 모션 제어를 확인합니다.
// 조그 예제
Drfl.jog(JOG_AXIS_JOINT_1, MOVE_REFERENCE_BASE, 0.0f); // 조그 정지
// 홈 이동 예제
Drfl.move_home(MOVE_HOME_MECHANIC, (unsigned char)1);
확인
조그와 홈 동작이 안전 정지 없이 정상적으로 실행됩니다.
MoveJ / MoveL(동기 / 비동기)
목적
조인트 공간과 직교 좌표 공간에서 기본 모션 명령을 테스트하고, 비동기 제어에서 정지 기능을 확인합니다.
// 예: 작은 증분 모션
// Drfl.movej(targetJ, vel, acc); // 동기
// Drfl.movel(targetX, vel, acc); // 동기
// 비동기 실행과 정지
// Drfl.amovej(targetJ, vel, acc);
Drfl.stop(STOP_TYPE_SLOW);
확인
모션이 정상적으로 실행되고, 명령하면 안전하게 정지합니다.
DRL 미니 루프(시작 / 정지)
목적
간단한 DRL 스크립트를 실행하고 정상적으로 실행되고 안전하게 정지하는지 확인합니다.
const std::string drl =
"loop = 0\n"
"while loop < 3:\n"
" movej(posj(10,10,10,10,10,10), vel=30, acc=30)\n"
" movej(posj(0,0,0,0,0,0), vel=30, acc=30)\n"
" loop += 1\n";
// DRL 시작
// Drfl.drl_start(ROBOT_SYSTEM_REAL, drl);
// DRL 프로그램 정지(급정지, 일반 강제 정지)
Drfl.drl_stop(STOP_TYPE_QUICK);
Drfl.mwait(); // 컨트롤러 응답 대기
확인
DRL 루프가 지정한 횟수만큼 실행되거나 명령에 따라 정지합니다.
I/O 기본(컨트롤 박스 DO)
목적
컨트롤 박스의 디지털 출력을 전환해 기본 I/O 동작을 확인합니다.
Drfl.set_digital_output(GPIO_CTRLBOX_DIGITAL_INDEX_10, true);
std::this_thread::sleep_for(std::chrono::seconds(1));
Drfl.set_digital_output(GPIO_CTRLBOX_DIGITAL_INDEX_10, false);
확인
디지털 출력이 올바르게 전환됩니다(표시등, 릴레이, 테스터로 확인).
참고
이 절의 예제는 각 핵심 API를 단순화해 보여 줍니다. 여러 기능을 통합한 시나리오 기반의 전체 예제는 6.6 시나리오 기반 예제를 참고하세요.