servoj_rt
이 함수는 외부 컨트롤러에서 실시간 조인트 위치 제어를 합니다. 목표 위치, 속도, 가속도, 보간 시간을 바탕으로 RT 주기마다 로봇 조인트가 목표 위치로 움직이도록 명령합니다.
정의
DRFLEx.h, CDRFLEx 클래스의 public 섹션
bool servoj_rt(float fTargetPos[NUM_JOINT],
float fTargetVel[NUM_JOINT],
float fTargetAcc[NUM_JOINT],
float fTargetTime) {
return _servoj_rt(_rbtCtrlUDP, fTargetPos, fTargetVel, fTargetAcc, fTargetTime);
};
주의
통신 지연이나 지터가 있으면 모션이 끊기듯 거칠어집니다.
fTargetTime은 전송 간격이 아닙니다. 값을 정하는 방법은 아래 두 번째 주의 절을 참고하세요.
매개변수
매개변수 이름 |
자료형 |
기본값 |
설명 |
|---|---|---|---|
fTargetPos |
float[6] |
목표 조인트 위치[deg]입니다. |
|
fTargetVel |
float[6] |
목표 조인트 속도[deg/s]입니다. |
|
fTargetAcc |
float[6] |
목표 조인트 가속도[deg/s²]입니다. |
|
fTargetTime |
float |
목표 모션 시간[s]입니다. |
참고
이 명령은 비동기로 동작합니다.
내부 모션 프로파일은
fTargetVel과fTargetAcc를 사용해 현재 상태에서fTargetPos까지의 경로를fTargetTime동안 보간합니다.최솟값이 0.001 s인 릴리스에서는
fTargetTime이 컨트롤러 주기(약 1 ms) 이하이면
로봇이 보간 없이 목표로 바로 이동합니다.fTargetPos에 도달하기 전에 다음 명령을 받지 못하면 로봇은 감속해 정지합니다. DRCF v2에서는 set_accj_rt로 설정한 조인트 가속도를 사용하고, 이 값이 0이면 안전 설정의 조인트 가속도 한계를 사용합니다. DRCF v3에서는 항상 안전 설정의 조인트 가속도 한계를 사용합니다.set_velj_rt와 set_accj_rt는 궤적(Trajectory)을 제한하지 않습니다. 궤적은
fTargetPos,fTargetVel,fTargetAcc,fTargetTime을 따릅니다. 조인트 속도를 제한하려면 안전 설정의 조인트 속도 한계를 사용하세요. 이 한계를 넘으면 로봇이 정지합니다.
주의
현재 버전은 시스템의 동작 속도[%]와 동기화되지 않습니다.
fTargetTime은 컨트롤러가fTargetPos에 도달하는 데 주어지는 시간이며, 명령을 보내는 간격이 아닙니다. 연속된 명령이 겹치도록 전송 간격보다 충분히 크게 설정하세요. 전송 간격 이하로 설정하면 모션이 끊기듯 거칠어집니다.컨트롤러는
fTargetTime의 최솟값을 강제하며, 그보다 작은 값은 최솟값으로 올립니다. fTargetTime의 최솟값은 DRCF v2.12.4와 v3.3.x에서 0.001 s입니다. DRCF v2.12.5 이상과 v3.4.0 이상에서는 0.025 s 미만의 값을 0.025 s로 올리며, 이때 각 명령에는 fTargetTime + 0.005 s가 걸립니다. 최솟값보다 작은 값은 알림 없이 대체되므로, 한 컨트롤러 릴리스에서 조정한 값은 다른 릴리스에서 다시 확인해야 합니다.전송 간격은 set_rt_control_input에 선언한 주기와 일치해야 합니다. 선언한 주기보다 느리게 보내면 입력 워치독이 작동해 컨트롤러가 세션을 종료합니다. 하지만
servoj_rt는 비동기이므로 계속 1을 반환합니다.
반환값
값 |
설명 |
|---|---|
1 |
명령을 보냈습니다. 컨트롤러가 명령을 받았거나 적용했다는 뜻은 아닙니다. |
0 |
명령 데이터그램을 보내지 못했습니다. |
참고
이 함수는 비동기로 동작합니다. 컨트롤러가 명령을 수락하거나 거부할 때까지 기다리지 않고 반환하므로, 반환값 1은 로봇이 명령대로 동작했다는 뜻이 아닙니다. 거부된 명령과 모션 경고 및 오류는 set_on_log_alarm으로 보고됩니다. set_on_rt_log_alarm은 RT 세션 메시지만 보고하므로 두 콜백을 모두 등록하세요.
예제
#include <chrono>
#include <cmath>
#include <thread>
drfl.connect_rt_control("192.168.137.100", 12347);
std::string version = "v1.0";
float period = 0.001f; // 1 ms 주기
int lossCount = 4;
// RT 스트리밍 설정
drfl.set_rt_control_input(version, period, lossCount);
drfl.set_rt_control_output(version, period, lossCount);
drfl.start_rt_control();
float fTargetPos[6] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
float fTargetVel[6] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
float fTargetAcc[6] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
float fTargetTime = 0.03f; // 컨트롤러 최솟값보다 큰 값. 위의 참고 사항 참조
for (int i = 0; i < 5000; ++i) {
// 예: 조인트 1 진동
fTargetPos[0] = 10.f * sin(i * 0.01f);
drfl.servoj_rt(fTargetPos, fTargetVel, fTargetAcc, fTargetTime);
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
drfl.stop_rt_control();
drfl.disconnect_rt_control();
이 예제는 servoj_rt 명령을 1 ms 간격으로 반복해 보내 연속 조인트 스트리밍 제어를 하는 방법을 보여 줍니다.
팁
servoj_rt는 반드시 결정론적 루프(1 kHz 이하)에서 실행해야 합니다.저크를 막으려면 매끄럽게 다듬은 조인트 궤적이나 저역 통과 필터를 거친 신호를 사용하세요.
직교 좌표 스트리밍에는 servol_rt를 대신 사용하세요.