이전 버전(1.33.4)의 문서를 보고 있습니다. 이 버전은 계속 지원됩니다.
최신 버전 정보는 1.33.5에서 확인하세요.

alter_motion

이 함수는 enable_alter_motion이 활성화된 후 현재 모션 궤적(Trajectory)에 증분 보정을 적용합니다. 제어 주기마다 작은 포즈 변화량을 보내 로봇 엔드 이펙터의 위치와 자세를 실시간으로 미세하게 제어할 수 있습니다.

alter_motion()을 호출할 때마다 지정한 fTargetPos 오프셋에 따라 현재 궤적이 수정됩니다. 입력값은 X, Y, Z, Rx, Ry, Rz 방향의 변위와 회전이며, enable_alter_motion()에서 설정한 기준 좌표계를 기준으로 해석됩니다.

이 함수는 M2.4 버전 이상에서 사용할 수 있습니다.

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

bool alter_motion(float fTargetPos[NUM_TASK]) {
    return _alter_motion(_rbtCtrl, fTargetPos);
};

매개변수

매개변수 이름

자료형

기본값

설명

fTargetPos

float[6]

현재 주기의 증분 모션 값을 담은 배열입니다.
순서: [X, Y, Z, Rx, Ry, Rz]
단위: 이동은 mm, 회전은 deg

반환값

값

설명

0

로봇이 오류 상태이거나 오프셋을 보내지 못했습니다.

1

오프셋을 보냈거나, 경로 수정(Alter Motion)이 활성화되지 않아 아무것도 보내지 않았습니다.

예제

std::atomic<bool> g_bRunAlter(true);

// 정지 요청이 올 때까지 작은 증분 포즈를 보내는 스레드
void ThreadFunc() {
    float delta[6] = {1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f};  // 주기마다 ΔX=1mm, ΔRx=1°
    while (g_bRunAlter) {
        drfl.alter_motion(delta);
        std::this_thread::sleep_for(std::chrono::milliseconds(200));  // 200 ms 주기 1회
    }
}

// 1) 경로 수정 모드 활성화(20 x 10 ms = 200 ms 주기)
float limitDpos[2] = {50.0f, 90.0f};
float limitDposPer[2] = {5.0f, 50.0f};
drfl.enable_alter_motion(20, PATH_MODE_DPOS, COORDINATE_SYSTEM_BASE,
                         limitDpos, limitDposPer);

// 2) 수정할 비동기 모션 시작(X 방향 200 mm, 50 mm/s, 약 4초)
float target[6] = {200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
float vel[2] = {50.0f, 30.0f};
float acc[2] = {100.0f, 60.0f};
drfl.amovel(target, vel, acc, 0.f, MOVE_MODE_RELATIVE);

// 3) 사용자 스레드 시작. 스레드가 실행되는 동안 main은 다른 drfl 호출을 하지 않습니다
std::thread th(ThreadFunc);

// 4) 모션이 진행되는 동안 실행해 증분 보정 적용
std::this_thread::sleep_for(std::chrono::seconds(3));

// 5) 스레드를 정지한 후 경로 수정 모드 비활성화
g_bRunAlter = false;
th.join();
drfl.disable_alter_motion();

주의

  • alter_motion()보다 먼저 enable_alter_motion을 호출하세요. 경로 수정이 활성화되지 않은 동안 alter_motion()은 아무것도 보내지 않으면서도 true를 반환합니다. 따라서 true가 반환되어도 오프셋이 적용되었다고 확신할 수 없습니다.

  • 한 CDRFLEx 객체에 대한 호출은 한 번에 하나씩만 해야 합니다. alter_motion()을 주기적으로 보내는 동안에는 같은 객체에서 다른 함수를 호출하지 마세요. 콜백 함수 규칙을 참고하세요.

  • 갱신 주기는 enable_alter_motion에서 설정한 주기 시간과 같아야 합니다.

  • 오프셋은 모션이 실행 중일 때만 적용됩니다. 실행 중인 모션이 없을 때 보낸 오프셋은 무시됩니다. 오프셋을 보내기 전에 모션을 시작하세요(예: amovel).

  • 입력값은 고정 XYZ 표기법을 따르며, 설정한 한계값(fLimitDpos, fLimitDposPer)을 넘으면 안 됩니다.