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]입니다.
단위: N(병진), N·m(회전).

iTargetDirection

unsigned char[6]

제어할 축 마스크
(0: 무시, 1: 능동 제어).
명령한 힘에 반응할 축을 지정합니다.

eForceReference

COORDINATE_SYSTEM

COORDINATE_SYSTEM_TOOL

힘을 정의할 좌표계(예: TOOL, BASE, WORLD)입니다.

fTargetTime

float

0

힘 램프의 전환 시간 [sec]입니다(0–1.0).
이 시간 동안 선형 보간합니다.

eForceMode

FORCE_MODE

FORCE_MODE_ABSOLUTE

힘 모드(절대는 직접 제어, 상대는 증분 적용)입니다.

반환값

값

설명

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을 호출해 일반 제어로 되돌리세요.