task_compliance_ctrl

이 함수는 지정한 기준 좌표계(Reference Coordinate System)에서 작업 공간(Task Space) 순응 제어(직교 좌표 강성 제어)를 시작합니다.

순응 제어를 끝내려면 release_compliance_ctrl을 사용하세요.

정의
DRFLEx.h, CDRFLEx 클래스의 public 섹션

bool task_compliance_ctrl(float fTargetStiffness[NUM_TASK],
                          COORDINATE_SYSTEM eForceReference = COORDINATE_SYSTEM_TOOL,
                          float fTargetTime = 0.f) {
    return _task_compliance_ctrl(_rbtCtrl, fTargetStiffness, eForceReference, fTargetTime);
};

매개변수

매개변수 이름

자료형

기본값

설명

fTargetStiffness

float[6]

XYZ(병진)와 Rx/Ry/Rz(회전)의 강성(Stiffness)
클수록: 더 단단함(덜 유연함)
작을수록: 더 부드러움(더 유연함)
단위: N/m(병진), N·m/rad(회전)

eForceReference

COORDINATE_SYSTEM

COORDINATE_SYSTEM_TOOL

강성 제어의 기준 좌표계(예: TOOL, BASE, WORLD)입니다.

fTargetTime

float

0

강성 변경 전환 시간 [sec]입니다(범위 0–1).
지정한 시간 동안 선형 보간을 사용합니다.

반환값

값

설명

0

실패

1

성공

참고

open_connection에 전달한 주소가 정확히 “127.0.0.1”이면 task_compliance_ctrl, set_stiffnessx, release_compliance_ctrl, set_desired_force, release_force는 컨트롤러에 명령을 보내지 않고 true를 반환합니다.

예제 A — 수동(교시) 핸드가이딩

// 사전 조건:
// - 연결됨
// - 수동(교시) 모드 활성
// - 서보 전원 ON

// 1) 순응 제어를 활성화하기 전에 안전한 위치로 이동
float q0[6] = { 0.0f, 0.0f, 90.0f, 0.0f, 90.0f, 0.0f };
drfl.movej(q0, 60, 30);
drfl.mwait();

// 2) 축별 강성 정의(값이 작을수록 더 유연함)
float stiffness[6] = { 2500.f, 2500.f, 2500.f, 150.f, 150.f, 150.f };

// 3) TOOL 좌표계에서 순응 제어 활성화
if (!drfl.task_compliance_ctrl(stiffness, COORDINATE_SYSTEM_TOOL, 0.1f)) {
    printf("Failed to start compliance control.\n");
    return -1;
}

printf("Compliance active. The arm can now be hand-guided safely.\n");

// 4) 교시 후 순응 제어 해제
drfl.release_compliance_ctrl();
printf("Compliance control released.\n");

예제 B — 자동 모드(삽입 또는 표면 접촉 작업)

// 1) 접근 위치로 이동
float p_app[NUM_TASK] = {550.f, 200.f, 150.f, 180.f, 0.f, 0.f};
float vel1[2] = {150.f, 30.f}, acc1[2] = {400.f, 150.f};
drfl.movel(p_app, vel1, acc1);
drfl.mwait();

// 2) 순응 제어 활성화(Z축과 회전 방향을 유연하게)
float k_soft[NUM_TASK] = {2500.f, 2500.f, 1200.f, 100.f, 100.f, 100.f};
if (!drfl.task_compliance_ctrl(k_soft, COORDINATE_SYSTEM_TOOL, 0.2f)) {
    printf("Failed to enable compliance.\n");
}

// 3) 순응 제어 상태에서 삽입 동작 실행
float p_down[NUM_TASK] = {550.f, 200.f, 90.f, 180.f, 0.f, 0.f};
float vel2[2] = {40.f, 15.f}, acc2[2] = {150.f, 60.f};
drfl.movel(p_down, vel2, acc2);
drfl.mwait();

// 4) 삽입 후 순응 제어 비활성화
drfl.release_compliance_ctrl();
drfl.mwait();

// 5) 정밀 동작 계속 진행
float p_final[NUM_TASK] = {550.f, 200.f, 85.f, 180.f, 0.f, 0.f};
float vel3[2] = {60.f, 20.f}, acc3[2] = {300.f, 120.f};
drfl.movel(p_final, vel3, acc3);
drfl.mwait();

참고 사항 및 모범 사례

  • 순응 제어는 필요한 작업 중에만 활성화하세요. 빠르거나 정밀도가 높은 이동을 실행하기 전에는 release_compliance_ctrl로 해제하세요.

  • 위치 제어와 순응 제어를 전환하기 전에 mwait()로 모션이 끝났는지 확인하세요.

  • 권장 강성 값: XYZ 1500–2500, 회전 100–200.

  • 핸드가이딩이나 정렬 작업에는 TOOL 좌표계를 사용하세요.

  • 순응 방향이 작업 영역의 축을 따라야 하면 BASE 좌표계를 사용하세요.