최신 버전 정보는 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] |
현재 주기의 증분 모션 값을 담은 배열입니다. |
반환값
값 |
설명 |
|---|---|
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)을 넘으면 안 됩니다.