3.11 JoggingControl 티칭 동작
개요
Arm::joggingControl 은 로봇을 수동으로 제어해 스텝 티칭과 연속 조그를 수행하는 데 사용됩니다. 호출자에게 가장 중요한 동시성 의미는 다음과 같습니다.
StepMove()는 동기 호출입니다.ContinuousMove()/MultiMove()는 주기적 조그 작업을 등록합니다.Stop()은 해당 작업을 취소합니다.- 이러한 동작은 같은
Arm세션의 전용 네트워크 스레드를 재사용합니다.
3.11.1 공개 메서드
cpp
StepMove(int32_t ajNum, Float64 stepLength = 0.0, Float64 stepAngle = 0.0) -> STATUS_CODE
ContinuousMove(int32_t ajNum) -> STATUS_CODE
MultiMove(const std::vector<int32_t>& ajNumList) -> STATUS_CODE
Stop() -> void| 메서드 | 설명 | 반환 |
|---|---|---|
StepMove | 단일 스텝 티칭 | STATUS_CODE |
ContinuousMove | 단일 축 연속 조그 시작 | STATUS_CODE |
MultiMove | 다축 연속 조그 시작 | STATUS_CODE |
Stop | 지속 조그 작업 정지 | void |
3.11.2 파라미터 제약
| 항목 | 규칙 |
|---|---|
ajNum | 0 일 수 없으며 절댓값이 9 를 초과할 수 없습니다. |
ajNumList | 비어 있을 수 없습니다. 요소 하나라도 유효하지 않으면 INVALID_PARAMETER 를 반환합니다. |
| 축 의미 | 1~9 의 구체적인 축 의미는 컨트롤러의 현재 좌표계가 결정합니다. |
| 양/음 방향 | 양수는 양의 방향, 음수는 음의 방향을 나타냅니다. |
3.11.3 StepMove 의미
stepAngle > 0이면 이번 스텝은 전달된 각도 스텝 길이를 사용합니다.stepLength > 0이면 이번 스텝은 전달된 직선 스텝 길이를 사용합니다.- 두 스텝 길이가 모두
0이어도 한 번의 스텝 동작을 시작합니다. 실제 동작은 컨트롤러의 현재 티칭 설정에 따라 결정됩니다. - 어느 단계든 실패하면 즉시 오류 코드를 반환하고 현재 동작을 종료합니다.
3.11.4 ContinuousMove / MultiMove 의미
- SDK는
Arm전용 네트워크 스레드에50ms타이머 작업을 등록해 연속 조그 명령을 주기적으로 전송합니다. - 반복 시작 시 먼저
Stop()을 한 번 실행한 뒤 새 지속 조그 작업을 등록합니다. Stop()은 SDK 측의 지속 전송을 취소합니다.- 연속 조그 요청 중 하나가
OK가 아닌 값을 반환하면 해당 타이머 작업은 자동으로 취소됩니다.
3.11.5 수명 주기 제약
StepMove(),ContinuousMove(),MultiMove()는 모두 현재Arm이 연결되어 있어야 합니다.- 지속 조그는 1.3-thread-model에 설명된 SDK 스레드 모델을 재사용합니다.
Arm::Disconnect()와Arm::~Arm()는 암시적으로jogging.Stop()을 실행하므로, 호출자가 먼저 수동으로 정지할 필요는 없습니다.
3.11.6 최소 호출 예제
cpp
#include <chrono> // 조그 지속 시간을 구성하기 위한 시간 유틸리티를 포함합니다.
#include <thread> // 연속 조그를 잠시 유지하기 위한 스레드 sleep 유틸리티를 포함합니다.
#include "arm_api.h" // Arm 주 진입점을 포함하며, 연결 후 arm.joggingControl으로 조그 인터페이스에 접근합니다.
#include "status_code.h" // SDK 호출 결과 확인용 STATUS_CODE를 포함합니다.
int main() // 예제 프로그램 진입점입니다.
{ // 예제 main 함수에 진입합니다.
Arm arm; // 로봇 세션 객체를 생성합니다.
STATUS_CODE connectRet = arm.Connect("192.168.110.2", ""); // 컨트롤러에 연결합니다. 티치 펜던트 주소를 비워 기본 규칙을 사용합니다.
if (connectRet != STATUS_CODE::OK) { // 연결 실패 여부를 판단합니다.
return 1; // 연결 실패 시 바로 종료합니다.
} // 연결 결과 판단을 종료합니다.
STATUS_CODE stepRet = arm.joggingControl.StepMove(1, 0.0, 5.0); // 1번 축에 5도 스텝 길이로 스텝 티칭을 한 번 수행합니다.
if (stepRet != STATUS_CODE::OK) { // 스텝 티칭 실패 여부를 판단합니다.
return 1; // 스텝 실패 시 오류 코드로 반환합니다.
} // 스텝 결과 판단을 종료합니다.
STATUS_CODE moveRet = arm.joggingControl.ContinuousMove(1); // 1번 축 양의 방향 연속 조그를 시작합니다.
if (moveRet != STATUS_CODE::OK) { // 연속 조그 시작 실패 여부를 판단합니다.
return 1; // 시작 실패 시 오류 코드로 반환합니다.
} // 연속 조그 시작 판단을 종료합니다.
std::this_thread::sleep_for(std::chrono::milliseconds(120)); // 연속 조그를 약 120밀리초 유지합니다.
arm.joggingControl.Stop(); // 지속 조그 작업을 정지합니다.
return 0; // 예제를 정상 종료합니다.
} // 예제 main 함수를 종료합니다.시나리오 예제
아래 조각들은 "단일 스텝, 연속 조그, 다축 조그, 정지" 흐름으로 이 페이지의 API를 교차해서 다룹니다. 조각들은 기본적으로 최소 호출 예제에서 이미 연결에 성공한 arm 객체를 이어받는다고 가정합니다. 조그는 로봇을 움직이므로 안전을 확인한 뒤 실행하십시오.
단일 스텝 조그
cpp
// STATUS_CODE stepRet = arm.joggingControl.StepMove(1, 0.0, 5.0); // 단일 스텝은 지정 축을 움직입니다. 안전을 확인한 뒤 실행하십시오.단일 축 연속 조그
cpp
// STATUS_CODE continuousRet = arm.joggingControl.ContinuousMove(1); // 단일 축 연속 조그는 로봇을 계속 구동합니다. 안전을 확인한 뒤 실행하십시오.
// std::this_thread::sleep_for(std::chrono::milliseconds(120)); // 연속 조그 시작 후 잠시 대기합니다.
arm.joggingControl.Stop(); // 현재 지속 조그 작업을 정지합니다.다축 연속 조그
cpp
// STATUS_CODE multiRet = arm.joggingControl.MultiMove(std::vector<int32_t>{1, -2}); // 다축 연속 조그는 여러 축을 계속 구동합니다. 안전을 확인한 뒤 실행하십시오.
// std::this_thread::sleep_for(std::chrono::milliseconds(120)); // 다축 조그 시작 후 잠시 대기합니다.
arm.joggingControl.Stop(); // Stop을 다시 호출해 지속 조그 작업이 취소되도록 합니다.예제 코드
cpp
#include "step_move/run.h"
#include "continuous_move/run.h"
#include "multi_move/run.h"
int main(void)
{
// [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
// [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
return RunJoggingBasicStepMove();
// return RunJoggingBasicContinuousMove();
// return RunJoggingBasicMultiMove();
}cpp
#include <stdio.h>
extern "C" {
#include "c_arm_api.h"
}
int main(void)
{
// [ZH] 本示例直接在源码中写死连接地址,不解析命令行参数。
// [EN] This example hard-codes the connection addresses in the source code and does not parse command-line arguments.
// [ZH] 创建并连接 SDK 句柄。
// [EN] Create the SDK handle and connect to the robot.
ArmHandle* handle = Arm_Create();
if (handle == NULL) {
printf("[c99_jogging] 创建句柄失败 / Failed to create the handle\n");
return 1;
}
int ret = Arm_Connect(handle, "10.27.1.2", "10.27.1.102");
if (ret != 0) {
printf("[c99_jogging] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
Arm_Destroy(handle);
return 1;
}
printf("[c99_jogging] 机器人连接成功 / Robot connected successfully\n");
// [ZH] 顺序执行全部点动接口。
// [EN] Execute all jogging APIs in sequence.
int ajNumList[2] = {1, -2};
ret = Arm_Jogging_StepMove(handle, 1, 0.0, 5.0);
printf("[c99_jogging] StepMove 状态码 / StepMove status code: %d\n", ret);
ret = Arm_Jogging_ContinuousMove(handle, 1);
printf("[c99_jogging] ContinuousMove 状态码 / ContinuousMove status code: %d\n", ret);
Arm_Jogging_Stop(handle);
printf("[c99_jogging] Stop 已调用 / Stop called\n");
ret = Arm_Jogging_MultiMove(handle, ajNumList, 2U);
printf("[c99_jogging] MultiMove 状态码 / MultiMove status code: %d\n", ret);
Arm_Jogging_Stop(handle);
printf("[c99_jogging] Stop 再次调用 / Stop called again\n");
// [ZH] 断开连接并销毁句柄。
// [EN] Disconnect and destroy the handle.
Arm_Disconnect(handle);
Arm_Destroy(handle);
printf("[c99_jogging] 示例结束 / Example finished\n");
return 0;
}