최신 버전 정보는 1.33.5에서 확인하세요.
set_desired_force
이 함수는 작업 공간(Task Space)의 각 축에 대한 목표 힘과 토크를 방향 마스크, 전환 시간, 제어 모드(Control Mode)와 함께 정의합니다. fTargetTime 동안 현재 힘에서 목표 값까지 선형으로 전환합니다.
정의
DRFLEx.h, CDRFLEx 클래스의 public 섹션
bool set_desired_force(float fTargetForce[NUM_TASK],
unsigned char iTargetDirection[NUM_TASK],
COORDINATE_SYSTEM eForceReference = COORDINATE_SYSTEM_TOOL,
float fTargetTime = 0.f,
FORCE_MODE eForceMode = FORCE_MODE_ABSOLUTE) {
return _set_desired_force(_rbtCtrl, fTargetForce, iTargetDirection, eForceReference, fTargetTime, eForceMode);
};
매개변수
매개변수 이름 |
자료형 |
기본값 |
설명 |
|---|---|---|---|
fTargetForce |
float[6] |
작업 공간 축을 따라 가할 목표 힘과 토크 [Fx, Fy, Fz, Mx, My, Mz]입니다. |
|
iTargetDirection |
unsigned char[6] |
제어할 축 마스크 |
|
eForceReference |
|
힘을 정의할 좌표계(예: TOOL, BASE, WORLD)입니다. |
|
fTargetTime |
float |
0 |
힘 램프의 전환 시간 [sec]입니다(0–1.0). |
eForceMode |
|
힘 모드(절대는 직접 제어, 상대는 증분 적용)입니다. |
반환값
값 |
설명 |
|---|---|
0 |
실패 |
1 |
성공 |
참고
open_connection에 전달한 주소가 정확히 “127.0.0.1”이면 task_compliance_ctrl, set_stiffnessx, release_compliance_ctrl, set_desired_force, release_force는 컨트롤러에 명령을 보내지 않고 true를 반환합니다.
예제 A — 수동 모드(교시 중 누르기)
// 사전 조건: 연결됨, 교시 모드 활성, 서보 온.
// 1) 중간 강성으로 순응 제어 활성화
float stiff[6] = {3000.f, 3000.f, 3000.f, 200.f, 200.f, 200.f};
drfl.task_compliance_ctrl(stiff, COORDINATE_SYSTEM_TOOL, 0.0f);
// 2) TOOL Z축 방향으로 +20 N 적용
float fTarget[6] = {0.f, 0.f, 20.f, 0.f, 0.f, 0.f};
unsigned char dir[6] = {0, 0, 1, 0, 0, 0}; // Z만 제어
drfl.set_desired_force(fTarget, dir, COORDINATE_SYSTEM_TOOL, 0.3f, FORCE_MODE_ABSOLUTE);
printf("Force control active: +20N along TOOL Z.\n");
// 3) 가한 힘을 서서히 해제
drfl.release_force(0.4f);
drfl.release_compliance_ctrl();
예제 B — 자동 모드(힘 제어 삽입 작업)
// 사전 조건: 로봇 연결됨, 자동 모드 활성, 동작 시퀀스 실행 중.
// 1) 접근 위치로 이동
float p_app[NUM_TASK] = {550.f, 200.f, 130.f, 180.f, 0.f, 0.f};
float vel1[2] = {100.f, 30.f}, acc1[2] = {400.f, 150.f};
drfl.movel(p_app, vel1, acc1);
drfl.mwait();
// 2) 순응 제어 활성화
float stiff[6] = {2500.f, 2500.f, 1500.f, 150.f, 150.f, 150.f};
drfl.task_compliance_ctrl(stiff, COORDINATE_SYSTEM_TOOL, 0.1f);
// 3) 하향 삽입 힘(+Z) 적용
float fTarget[6] = {0.f, 0.f, 30.f, 0.f, 0.f, 0.f};
unsigned char dir[6] = {0, 0, 1, 0, 0, 0};
drfl.set_desired_force(fTarget, dir, COORDINATE_SYSTEM_TOOL, 0.2f, FORCE_MODE_ABSOLUTE);
// 4) 삽입 동작 실행
float p_down[NUM_TASK] = {550.f, 200.f, 90.f, 180.f, 0.f, 0.f};
float vel2[2] = {50.f, 20.f}, acc2[2] = {200.f, 80.f};
drfl.movel(p_down, vel2, acc2);
drfl.mwait();
// 5) 힘과 순응 제어 해제
drfl.release_force(0.3f);
drfl.release_compliance_ctrl();
printf("Force-controlled insertion completed.\n");
참고 사항 및 모범 사례
힘이 활성화된 상태에서 로봇이 EMERGENCY_STOP, SAFE_OFF, SAFE_OFF2 상태가 되면 힘이 해제됩니다(주소 “127.0.0.1”로 연결한 경우는 제외, open_connection 참조).
안정적으로 동작하도록 목표 힘을 설정하기 전에 task_compliance_ctrl을 적용하세요.
방향 마스크를 사용해 필요한 축에만 힘을 가하세요(예: X/Y는 자유롭게 두고 Z 방향으로 누르기).
전환을 부드럽게 하고 갑작스러운 모션을 피하려면
fTargetTime을 작게(0.2–0.5s) 설정하세요.FORCE_MODE_RELATIVE를 사용하면 공정에 맞춰 기존 힘 값을 증분으로 조정할 수 있습니다.힘 기반 작업을 마친 후에는 항상 release_force와 release_compliance_ctrl을 호출해 일반 제어로 되돌리세요.