servol_rt
이 함수는 외부 컨트롤러에서 실시간 작업 공간(TCP) 위치 제어를 합니다. 목표 포즈, 속도, 가속도, 보간 시간을 바탕으로 실시간 제어(Real-time Control) 주기마다 로봇 TCP(툴 중심점)의 위치와 자세를 명령합니다.
정의
DRFLEx.h, CDRFLEx 클래스의 public 섹션
bool servol_rt(float fTargetPos[NUM_TASK],
float fTargetVel[NUM_TASK],
float fTargetAcc[NUM_TASK],
float fTargetTime) {
return _servol_rt(_rbtCtrlUDP, fTargetPos, fTargetVel, fTargetAcc, fTargetTime);
};
주의
통신 지연이나 네트워크 지터가 있으면
servol_rt모션이 끊기듯 거칠어집니다.목표 시간(fTargetTime)을 조정하고 느린 응답 속도를 사용하거나, 더 매끄러운 모션이 필요하면 speedl_rt를 사용하는 것을 권장합니다.
fTargetTime은 전송 간격이 아닙니다. 값을 정하는 방법은 아래 두 번째 주의 절을 참고하세요.
매개변수
매개변수 이름 |
자료형 |
기본값 |
설명 |
|---|---|---|---|
fTargetPos |
float[6] |
목표 포즈 [X, Y, Z, A, B, C](mm, deg)입니다. 자세는 오일러 ZYZ 규칙을 따릅니다. |
|
fTargetVel |
float[6] |
목표 TCP 속도[mm/s, deg/s] |
|
fTargetAcc |
float[6] |
목표 TCP 가속도[mm/s², deg/s²] |
|
fTargetTime |
float |
목표 보간 시간[s] |
참고
비동기 명령입니다.
내부 모션 프로파일은 현재 상태와 목표 상태
(fTargetPos, fTargetVel, fTargetAcc) 사이를fTargetTime동안 보간합니다.최솟값이 0.001 s인 릴리스에서는
fTargetTime이 컨트롤러 주기(약 1 ms) 이하이면 보간을 건너뜁니다.완료 전에 다음 명령을 받지 못하면 로봇은 set_accx_rt로 설정한 작업 가속도로 감속해 정지합니다.
주의
현재 구현은 동작 속도[%]와 연동되지 않습니다.
fTargetTime은 컨트롤러가 목표에 도달하는 데 주어지는 시간이며, 명령을 보내는 간격이 아닙니다. 연속된 명령이 겹치도록 전송 간격보다 충분히 크게 설정하세요.컨트롤러는
fTargetTime의 최솟값을 강제하며, 그보다 작은 값은 최솟값으로 올립니다. fTargetTime의 최솟값은 DRCF v2.12.x와 v3.3.x에서 0.001 s입니다. DRCF v3.4.0 이상에서는 0.025 s 미만의 값을 0.025 s로 올리며, 이때 각 명령에는 fTargetTime + 0.005 s가 걸립니다. 최솟값보다 작은 값은 알림 없이 대체되므로, 한 컨트롤러 릴리스에서 조정한 값은 다른 릴리스에서 다시 확인해야 합니다.전송 간격은 set_rt_control_input에 선언한 주기와 일치해야 합니다. 그렇지 않으면 입력 워치독이 세션을 종료하지만,
servol_rt는 계속 1을 반환합니다.연속 위치 제어에는 speedl_rt를 고려하세요.
힘/순응 제어(Compliance Control)나 특이점 부근의 DR_VAR_VEL과 함께 사용할 수 없습니다.
이런 경우 시스템이 자동으로 DR_AVOID 모드로 전환합니다.
반환값
값 |
설명 |
|---|---|
1 |
명령을 보냈습니다. 컨트롤러가 명령을 받았거나 적용했다는 뜻은 아닙니다. |
0 |
명령 데이터그램을 보내지 못했습니다. |
참고
이 함수는 비동기로 동작합니다. 컨트롤러가 명령을 수락하거나 거부할 때까지 기다리지 않고 반환하므로, 반환값 1은 로봇이 명령대로 동작했다는 뜻이 아닙니다. 거부된 명령과 모션 경고 및 오류는 set_on_log_alarm으로 보고됩니다. set_on_rt_log_alarm은 RT 세션 메시지만 보고하므로 두 콜백을 모두 등록하세요.
예제
drfl.connect_rt_control("192.168.137.100", 12347);
std::string version = "v1.0";
float period = 0.001f; // 1 ms 주기
int lossCount = 4;
// 실시간 스트리밍 설정
drfl.set_rt_control_input(version, period, lossCount);
drfl.set_rt_control_output(version, period, lossCount);
drfl.start_rt_control();
// 목표 TCP 포즈 정의
float fTargetPos[6] = {150.f, 0.f, 100.f, 0.f, 0.f, 0.f};
float fTargetVel[6] = {200.f, 100.f, 100.f, 20.f, 20.f, 20.f};
float fTargetAcc[6] = {1000.f, 800.f, 800.f, 100.f, 100.f, 100.f};
float fTargetTime = 0.06f; // 60 ms(30 ms 이상 권장)
// 실시간 작업 공간 모션 명령 전송
if (drfl.servol_rt(fTargetPos, fTargetVel, fTargetAcc, fTargetTime))
printf("Task-space motion command successful.\n");
else
printf("Task-space motion failed.\n");
drfl.stop_rt_control();
drfl.disconnect_rt_control();
이 예제는 작업 공간 명령을 1 ms 간격으로 계속 보내 TCP 모션을 실시간으로 제어하는 방법을 보여 줍니다.
팁
외부 시스템에서 정밀한 직교 좌표 보간 제어가 필요하면
servol_rt를 사용하세요.모션이 매끄럽도록 주기 사이의 타이밍을 항상 일정하게 유지하세요.
조인트 수준 스트리밍은 servoj_rt를 참고하세요.