4.2 로봇 모션 제어 및 상태
개요
Motion 클래스는 로봇 모션 제어의 핵심 객체입니다. 이는 다음을 캡슐화합니다:
- Velocity/acceleration 매개변수 관리
- 좌표계 관리
- 포즈 변환
- 궤적 모션 제어
- 드래그 티칭
- 실시간 제어
- 페이로드 관리
일반적인 작업흐름
Arm 가 연결된 후 arm.Motion 를 통해 모션 인스턴스를 얻습니다. 별도의 초기화가 필요하지 않습니다.
4.2.1 로봇 매개변수 가져오기
4.2.1.1 OVC 전체 속도 계수 얻기
| 메서드 이름 | Motion.GetOVC() |
|---|---|
| 설명 | 현재 로봇의 OVC(Overall Velocity Control) 전역 속도 비율을 0~1 범위로 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | double: 전역 속도 비율 값 StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.1.2 OAC 전체 가속 계수 얻기
| 메서드 이름 | Motion.GetOAC() |
|---|---|
| 설명 | 현재 로봇의 OAC(전체 가속 제어) 전역 가속 비율을 0~1.2 범위로 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | double: 전역 가속도 비율 값 StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.1.3 현재 TF 가져오기
| 메서드 이름 | Motion.GetTF() |
|---|---|
| 설명 | 로봇이 사용하는 현재 TF(Tool Frame) 도구 좌표계 인덱스를 0~10 범위로 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | int: TF 공구 좌표계 인덱스 StatusCode: 기능 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.1.4 현재 UF 가져오기
| 메서드 이름 | Motion.GetUF() |
|---|---|
| 설명 | 로봇이 사용하는 현재 UF(사용자 프레임) 사용자 좌표계 인덱스를 0~10 범위로 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | int: UF 사용자 좌표계 인덱스 StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.1.5 현재 TCS 교육 좌표계 가져오기
| 메서드 이름 | Motion.GetTCS() |
|---|---|
| 설명 | 로봇이 사용하는 현재 TCS(교시 좌표계) 좌표계 유형을 가져옵니다. 자세한 내용은 TCSType를 참조하세요. |
| 요청 매개변수 | 없음 |
| 반환 값 | TCSType: TCS 티칭 좌표계 유형 열거형 값 StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class GetMotionParameters
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 获取 OVC 全局速度比率
// [EN] Get OVC global speed ratio
double ovc;
(ovc, code) = controller.Motion.GetOVC();
if (code == StatusCode.OK)
{
Console.WriteLine($"OVC = {ovc}");
}
else
{
Console.WriteLine($"获取OVC失败: {code.GetDescription()}");
}
// [ZH] 获取 OAC 全局加速度比率
// [EN] Get OAC global acceleration ratio
double oac;
(oac, code) = controller.Motion.GetOAC();
if (code == StatusCode.OK)
{
Console.WriteLine($"OAC = {oac}");
}
else
{
Console.WriteLine($"获取OAC失败: {code.GetDescription()}");
}
// [ZH] 获取当前使用的 TF
// [EN] Get current TF (Tool Frame)
int tf;
(tf, code) = controller.Motion.GetTF();
if (code == StatusCode.OK)
{
Console.WriteLine($"TF = {tf}");
}
else
{
Console.WriteLine($"获取TF失败: {code.GetDescription()}");
}
// [ZH] 获取当前使用的 UF
// [EN] Get current UF (User Frame)
int uf;
(uf, code) = controller.Motion.GetUF();
if (code == StatusCode.OK)
{
Console.WriteLine($"UF = {uf}");
}
else
{
Console.WriteLine($"获取UF失败: {code.GetDescription()}");
}
// [ZH] 获取当前使用的 TCS 示教坐标系
// [EN] Get current TCS teaching coordinate system
TCSType tcs;
(tcs, code) = controller.Motion.GetTCS();
if (code == StatusCode.OK)
{
Console.WriteLine($"TCSType = {tcs}");
}
else
{
Console.WriteLine($"获取TCS失败: {code.GetDescription()}");
}
// [ZH] 获取机器人软限位
// [EN] Get robot soft limits
List<List<double>> softLimit;
(softLimit, code) = controller.Motion.GetUserSoftLimit();
if (code == StatusCode.OK)
{
Console.WriteLine("软限位信息:");
for (int i = 0; i < softLimit.Count; i++)
{
Console.WriteLine($"轴{i + 1}: 下限={softLimit[i][0]}, 上限={softLimit[i][1]}");
}
}
else
{
Console.WriteLine($"获取软限位失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.2 로봇 매개변수 설정
4.2.2.1 OVC 전체 속도 계수 설정
| 메서드 이름 | Motion.SetOVC( double value ) |
|---|---|
| 설명 | 현재 로봇의 OVC(Overall Velocity Control) 전역 속도 비율을 설정합니다. |
| 요청 매개변수 | value : 이중 속도 비율, 범위 0~1 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.2.2 OAC 전체 가속 계수 설정
| 메서드 이름 | Motion.SetOAC( double value ) |
|---|---|
| 설명 | 현재 로봇의 OAC(전체 가속 제어) 전역 가속 비율을 설정합니다. |
| 요청 매개변수 | value : 이중 가속도 비율, 범위 0.01~1.2 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.2.3 현재 TF 공구 좌표계 지수 설정
| 메서드 이름 | Motion.SetTF( int value ) |
|---|---|
| 설명 | 현재 TF(도구 프레임) 도구 좌표계 색인을 설정합니다. |
| 요청 매개변수 | value : int TF 인덱스, 범위 0~10 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.2.4 현재 UF 사용자 좌표계 지수 설정
| 메서드 이름 | Motion.SetUF( int value ) |
|---|---|
| 설명 | 현재 UF(사용자 프레임) 사용자 좌표계 인덱스를 설정합니다. |
| 요청 매개변수 | value : int UF 인덱스, 범위 0~10 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.2.5 현재 TCS 티칭 좌표계 설정
| 메서드 이름 | Motion.SetTCS( TCSType value ) |
|---|---|
| 설명 | 현재 TCS(교시 좌표계) 교육 좌표계를 설정합니다. 자세한 내용은 TCSType를 참조하세요. |
| 요청 매개변수 | value : TCSType TCS 티칭 좌표계 유형 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class SetMotionParameters
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 设置 OVC 全局速度比率
// [EN] Set OVC global speed ratio
code = controller.Motion.SetOVC(0.5);
if (code == StatusCode.OK)
{
Console.WriteLine("设置OVC成功");
}
else
{
Console.WriteLine($"设置OVC失败: {code.GetDescription()}");
}
// [ZH] 设置 OAC 全局加速度比率
// [EN] Set OAC global acceleration ratio
code = controller.Motion.SetOAC(0.8);
if (code == StatusCode.OK)
{
Console.WriteLine("设置OAC成功");
}
else
{
Console.WriteLine($"设置OAC失败: {code.GetDescription()}");
}
// [ZH] 设置当前使用的 TF 用户坐标系编号
// [EN] Set current TF (Tool Frame) user coordinate system number
code = controller.Motion.SetTF(2);
if (code == StatusCode.OK)
{
Console.WriteLine("设置TF成功");
}
else
{
Console.WriteLine($"设置TF失败: {code.GetDescription()}");
}
// [ZH] 设置当前使用的 UF 工具坐标系编号
// [EN] Set current UF (User Frame) tool coordinate system number
code = controller.Motion.SetUF(1);
if (code == StatusCode.OK)
{
Console.WriteLine("设置UF成功");
}
else
{
Console.WriteLine($"设置UF失败: {code.GetDescription()}");
}
// [ZH] 设置当前使用的 TCS 示教坐标系
// [EN] Set current TCS teaching coordinate system
code = controller.Motion.SetTCS(TCSType.TOOL);
if (code == StatusCode.OK)
{
Console.WriteLine("设置TCS成功");
}
else
{
Console.WriteLine($"设置TCS失败: {code.GetDescription()}");
}
// [ZH] 设置UDP位置控制的相关参数
// [EN] Set UDP position control related parameters
code = controller.Motion.SetPositionTrajectoryParams(10, 20, 10, 10);
if (code == StatusCode.OK)
{
Console.WriteLine("设置位置控制参数成功");
}
else
{
Console.WriteLine($"设置位置控制参数失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.3 데카르트 Position를 Joint 값으로 변환
| 메서드 이름 | Motion.ConvertCartToJoint( MotionPose pose , int ufIndex = 0, int tfIndex = 0 ) |
|---|---|
| 설명 | 포즈 데이터를 데카르트 좌표에서 관절 좌표로 변환합니다. |
| 요청 매개변수 | pose : MotionPose 로봇의 직교 자세(PoseType.CART; SDK는 자세가 지정되지 않은 경우 자동으로 가능한 자세를 해결합니다.) ufIndex : int 사용자 좌표계 인덱스, 기본값은 0 tfIndex : int 도구 좌표계 인덱스, 기본값은 0 |
| 반환 값 | MotionPose: 변환된 로봇 포즈 데이터 StatusCode: 변환 연산 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class ConvertCartToJoint
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 创建笛卡尔位姿
// [EN] Create Cartesian pose
MotionPose motionPose = new MotionPose();
motionPose.Pt = PoseType.Cart;
motionPose.CartData.Position = new Position
{
X = 300,
Y = 300,
Z = 300,
A = 0,
B = 0,
C = 0,
};
motionPose.CartData.Posture = new Posture
{
WristFlip = 1,
ArmUpDown = 1,
ArmBackFront = 1,
ArmLeftRight = 1,
TurnCircle = new List<int>(9) { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
// [ZH] 将笛卡尔点位转换成关节值点位
// [EN] Convert Cartesian pose to joint pose
MotionPose convertPose;
(convertPose, code) = controller.Motion.ConvertCartToJoint(motionPose);
if (code == StatusCode.OK)
{
Console.WriteLine("笛卡尔转关节成功:");
Console.WriteLine(
$"关节值: J1={convertPose.Joint.J1}, J2={convertPose.Joint.J2}, J3={convertPose.Joint.J3}, J4={convertPose.Joint.J4}, J5={convertPose.Joint.J5}, J6={convertPose.Joint.J6}"
);
}
else
{
Console.WriteLine($"笛卡尔转关节失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.4 Joint 값을 데카르트 Position로 변환
| 메서드 이름 | Motion.ConvertJointToCart( MotionPose pose , int ufIndex = 0, int tfIndex = 0 ) |
|---|---|
| 설명 | 포즈 데이터를 관절 좌표에서 데카르트 좌표로 변환합니다. |
| 요청 매개변수 | pose : MotionPose 로봇의 관절 포즈 ufIndex : int 사용자 좌표계 인덱스, 기본값은 0 tfIndex : int 도구 좌표계 인덱스, 기본값은 0 |
| 반환 값 | MotionPose: 변환된 로봇 포즈 데이터 StatusCode: 변환 연산 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class ConvertJointToCart
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 创建关节位姿
// [EN] Create joint pose
MotionPose motionPose = new MotionPose();
motionPose.Pt = PoseType.Joint;
motionPose.Joint = new Joint
{
J1 = 0,
J2 = 0,
J3 = 60,
J4 = 60,
J5 = 0,
J6 = 0,
};
// [ZH] 将关节值点位转换成笛卡尔点位
// [EN] Convert joint pose to Cartesian pose
MotionPose convertPose;
(convertPose, code) = controller.Motion.ConvertJointToCart(motionPose);
if (code == StatusCode.OK)
{
Console.WriteLine("关节转笛卡尔成功:");
Console.WriteLine(
$"位置: X={convertPose.CartData.Position.X}, Y={convertPose.CartData.Position.Y}, Z={convertPose.CartData.Position.Z}"
);
Console.WriteLine(
$"姿态: A={convertPose.CartData.Position.A}, B={convertPose.CartData.Position.B}, C={convertPose.CartData.Position.C}"
);
}
else
{
Console.WriteLine($"关节转笛卡尔失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.5 Joint 모션
| 메서드 이름 | Motion.MoveJoint( MotionPose pose , double vel = 1, double acc = 1 ) |
|---|---|
| 설명 | 관절 공간에서 가장 빠른 경로를 따라 지정된 위치로 이동하도록 로봇 엔드 이펙터를 제어합니다. |
| 요청 매개변수 | pose : MotionPose 직교 공간 또는 관절 좌표계의 목표 위치 좌표 vel : double 동작 속도, 범위 0~1, 최대 속도의 배수를 나타냄 acc : double Acceleration, 범위 0~1.2, 최대 가속도의 배수를 나타냄 |
| 반환 값 | StatusCode: 모션 명령 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class MoveJoint
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 创建关节位姿
// [EN] Create joint pose
MotionPose motionPose = new MotionPose();
motionPose.Pt = PoseType.Joint;
motionPose.Joint = new Joint
{
J1 = 10,
J2 = 30,
J3 = 30,
J4 = 0,
J5 = 0,
J6 = 0,
};
// [ZH] 让机器人末端移动到指定的位置
// [EN] Move robot end to specified position
code = controller.Motion.MoveJoint(motionPose, 0.5, 0.8);
if (code == StatusCode.OK)
{
Console.WriteLine("关节运动请求成功");
}
else
{
Console.WriteLine($"关节运动失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.6 선형 운동
| 메서드 이름 | Motion.MoveLine( MotionPose pose , double vel = 100, double acc = 1 ) |
|---|---|
| 설명 | 로봇 엔드 이펙터가 직선을 따라 지정된 위치로 이동하도록 제어합니다. 모션 궤적은 두 지점 사이의 직선입니다. |
| 요청 매개변수 | pose : MotionPose 데카르트 공간 또는 관절 좌표계의 대상 위치 좌표 vel : 이중 모션 속도, 범위 0~5000mm/s,는 로봇 엔드 이펙터 이동 속도를 나타냅니다. acc : 이중 가속도, 범위 0~1.2, 최대 가속도의 배수를 나타냅니다. |
| 반환 값 | StatusCode: 모션 명령 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class MoveLine
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 创建关节位姿
// [EN] Create joint pose
MotionPose motionPose = new MotionPose();
motionPose.Pt = PoseType.Joint;
motionPose.Joint = new Joint
{
J1 = 20,
J2 = 40,
J3 = 40,
J4 = 5,
J5 = 5,
J6 = 5,
};
// [ZH] 让机器人末端沿直线移动到指定的位置
// [EN] Move robot end in straight line to specified position
code = controller.Motion.MoveLine(motionPose, 100, 1.0);
if (code == StatusCode.OK)
{
Console.WriteLine("直线运动请求成功");
}
else
{
Console.WriteLine($"直线运动失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.7 원형 운동
| 메서드 이름 | Motion.MoveCircle( MotionPose pose1 , MotionPose pose2 , double vel = 100, double acc = 1 ) |
|---|---|
| 설명 | 중간점과 끝점에 의해 결정되는 호를 사용하여 원형 궤적을 따라 지정된 위치로 이동하도록 로봇 엔드 이펙터를 제어합니다. |
| 요청 매개변수 | pose1 : MotionPose 로봇 모션 중간 포즈 pose2 : MotionPose 로봇 모션 최종 포즈 vel : double 모션 속도, 범위 0~5000mm/s,는 로봇 엔드 이펙터 이동 속도를 나타냅니다. acc : double 가속도, 범위 0~1.2, 최대 가속도의 배수를 나타냄 |
| 반환 값 | StatusCode: 모션 명령 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class MoveCircle
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 创建第一个位姿(途径点)
// [EN] Create first pose (waypoint)
MotionPose motionPose1 = new MotionPose();
motionPose1.Pt = PoseType.Joint;
motionPose1.Joint = new Joint
{
J1 = 0,
J2 = 0,
J3 = 60,
J4 = 60,
J5 = 0,
J6 = 0,
};
// [ZH] 创建第二个位姿(终点)
// [EN] Create second pose (endpoint)
MotionPose motionPose2 = new MotionPose();
motionPose2.Pt = PoseType.Joint;
motionPose2.Joint = new Joint
{
J1 = 0,
J2 = 30,
J3 = 70,
J4 = 40,
J5 = 0,
J6 = 0,
};
// [ZH] 让机器人末端沿弧线移动到指定的位置
// [EN] Move robot end in arc to specified position
code = controller.Motion.MoveCircle(motionPose1, motionPose2, 100, 1.0);
if (code == StatusCode.OK)
{
Console.WriteLine("弧线运动请求成功");
}
else
{
Console.WriteLine($"弧线运动失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.8 현재 포즈 얻기
| 메서드 이름 | Motion.GetCurrentPose( PoseType pt , int ufIndex = 0, int tfIndex = 0 ) |
|---|---|
| 설명 | 로봇의 현재 자세를 가져옵니다. 이는 직교 공간 또는 관절 좌표계의 자세 정보일 수 있습니다. |
| 요청 매개변수 | pt : PoseType 포즈 유형 ufIndex : int 사용자 좌표계 인덱스(PoseType.CART에만 유효; 기본값 0) tfIndex : int 공구 좌표계 인덱스(PoseType.CART에만 유효; 기본값 0) |
| 반환 값 | MotionPose: 로봇 포즈 데이터 StatusCode: 작업 실행 결과 가져오기 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class GetCurrentPose
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 获取机器人的当前位姿(笛卡尔坐标)
// [EN] Get robot current pose (Cartesian coordinates)
MotionPose cartPose;
(cartPose, code) = controller.Motion.GetCurrentPose(PoseType.Cart, 0, 0);
if (code == StatusCode.OK)
{
Console.WriteLine("当前笛卡尔位姿:");
Console.WriteLine(
$"位置: X={cartPose.CartData.Position.X}, Y={cartPose.CartData.Position.Y}, Z={cartPose.CartData.Position.Z}"
);
Console.WriteLine(
$"姿态: A={cartPose.CartData.Position.A}, B={cartPose.CartData.Position.B}, C={cartPose.CartData.Position.C}"
);
}
else
{
Console.WriteLine($"获取笛卡尔位姿失败: {code.GetDescription()}");
}
// [ZH] 获取机器人的当前位姿(关节坐标)
// [EN] Get robot current pose (joint coordinates)
MotionPose jointPose;
(jointPose, code) = controller.Motion.GetCurrentPose(PoseType.Joint, 0, 0);
if (code == StatusCode.OK)
{
Console.WriteLine("当前关节位姿:");
Console.WriteLine(
$"关节值: J1={jointPose.Joint.J1}, J2={jointPose.Joint.J2}, J3={jointPose.Joint.J3}, J4={jointPose.Joint.J4}, J5={jointPose.Joint.J5}, J6={jointPose.Joint.J6}"
);
}
else
{
Console.WriteLine($"获取关节位姿失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.9 DH 매개변수 가져오기
| 메서드 이름 | Motion.GetDHParam() |
|---|---|
| 설명 | 로봇의 DH(Denavit-Hartenberg) 매개변수를 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | List<DHparam>: DH 매개변수 목록 StatusCode: 연산 실행 결과 가져오기 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): 지원되지 않음 |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class GetDHParam
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 获取机器人的DH参数
// [EN] Get robot DH parameters
List<DHparam> dhParamsList;
(dhParamsList, code) = controller.Motion.GetDHParam(1);
if (code == StatusCode.OK)
{
Console.WriteLine("获取DH参数成功:");
for (int i = 0; i < dhParamsList.Count; i++)
{
var dh = dhParamsList[i];
Console.WriteLine($"轴{i + 1}: Alpha={dh.alpha}, A={dh.a}, D={dh.d}, Offset={dh.offset}");
}
}
else
{
Console.WriteLine($"获取DH参数失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.10 DH 매개변수 설정
| 메서드 이름 | Motion.SetDHParam( List<DHparam> dHparams ) |
|---|---|
| 설명 | 로봇의 DH(Denavit-Hartenberg) 매개변수를 설정합니다. |
| 요청 매개변수 | dHparams : 목록<DHparam> DH 매개변수 목록 |
| 반환 값 | StatusCode: 작업 실행 결과 설정 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): 지원되지 않음 |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Types;
public class SetDHParam
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 先获取当前的DH参数
// [EN] First get current DH parameters
List<DHparam> dhParamsList;
(dhParamsList, code) = controller.Motion.GetDHParam(1);
if (code != StatusCode.OK)
{
Console.WriteLine($"获取DH参数失败: {code.GetDescription()}");
return code;
}
Console.WriteLine("获取DH参数成功,准备设置相同的参数...");
// [ZH] 设置DH参数(这里设置为相同的参数作为示例)
// [EN] Set DH parameters (set same parameters as example)
code = controller.Motion.SetDHParam(dhParamsList);
if (code == StatusCode.OK)
{
Console.WriteLine("设置DH参数成功");
}
else
{
Console.WriteLine($"设置DH参数失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.11 축 잠금 상태 가져오기
| 메서드 이름 | Motion.GetDragSet() |
|---|---|
| 설명 | 동작 티칭에만 적용되는 현재 로봇 축 잠금 상태를 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | DragStatus: 축 잠금 상태, True는 축이 이동 가능함을 나타내고, False는 잠겨 있음을 나타냅니다. StatusCode: 기능 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): 지원되지 않음 |
4.2.12 축 잠금 상태 설정
| 메서드 이름 | Motion.SetDragSet( DragStatus dragStatus ) |
|---|---|
| 설명 | 티칭 동작에만 적용되는 현재 로봇 축 잠금 상태를 설정합니다. |
| 요청 매개변수 | dragStatus : DragStatus 축 잠금 상태, 기본값은 모두 True: 잠금 해제 상태 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): 지원되지 않음 |
4.2.13 드래그 티칭 활성화
| 메서드 이름 | Motion.EnableDrag( bool dragState ) |
|---|---|
| 설명 | 로봇에 대한 드래그 티칭을 활성화하거나 비활성화합니다. |
| 요청 매개변수 | dragState : bool 로봇의 드래그 상태, true는 드래그 모드로 들어가는 것을 나타내고, false는 드래그 모드를 종료하는 것을 나타냅니다. |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): 지원되지 않음 |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class DragControl
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 获取当前机器人的轴锁定状态
// [EN] Get current robot axis lock status
DragStatus dragStatus;
(dragStatus, code) = controller.Motion.GetDragSet();
if (code == StatusCode.OK)
{
Console.WriteLine("获取轴锁定状态成功:");
Console.WriteLine(
$"X轴: {dragStatus.CartStatus.X}, Y轴: {dragStatus.CartStatus.Y}, Z轴: {dragStatus.CartStatus.Z}"
);
Console.WriteLine($"连续拖动: {dragStatus.IsContinuousDrag}");
}
else
{
Console.WriteLine($"获取轴锁定状态失败: {code.GetDescription()}");
}
// [ZH] 修改当前机器人的轴锁定状态
// [EN] Modify current robot axis lock status
if (code == StatusCode.OK)
{
dragStatus.CartStatus.X = false;
dragStatus.IsContinuousDrag = true;
code = controller.Motion.SetDragSet(dragStatus);
if (code == StatusCode.OK)
{
Console.WriteLine("设置轴锁定状态成功");
}
else
{
Console.WriteLine($"设置轴锁定状态失败: {code.GetDescription()}");
}
}
// [ZH] 启动拖动(注意:实际使用中需要谨慎)
// [EN] Enable drag (Note: use with caution in practice)
if (code == StatusCode.OK)
{
Console.WriteLine("注意:启动拖动功能,请确保安全!");
code = controller.Motion.EnableDrag(true);
if (code == StatusCode.OK)
{
Console.WriteLine("启动拖动成功");
// [ZH] 等待一段时间后停止拖动
// [EN] Wait for a while then stop drag
Console.WriteLine("等待3秒后停止拖动...");
Thread.Sleep(3000);
code = controller.Motion.EnableDrag(false);
if (code == StatusCode.OK)
{
Console.WriteLine("停止拖动成功");
}
else
{
Console.WriteLine($"停止拖动失败: {code.GetDescription()}");
}
}
else
{
Console.WriteLine($"启动拖动失败: {code.GetDescription()}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.14 실시간 Position 제어 모드 진입
| 메서드 이름 | Motion.EnterPositionControl() |
|---|---|
| 설명 | 실시간 위치 제어 모드로 진입하여 로봇의 정밀한 위치 제어가 가능합니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 메모 | 실시간 제어 모드로 진입한 후에는 UDP를 통해 제어 명령을 전송해야 합니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.15 실시간 Position 제어 모드 종료
| 메서드 이름 | Motion.ExitPositionControl() |
|---|---|
| 설명 | 실시간 위치 제어 모드를 종료하고 기본 로봇 제어 상태로 복귀합니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 메모 | 종료 후 로봇은 더 이상 실시간 제어 명령을 수락하지 않습니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.16 UDP 피드백 구성 가져오기
| 메서드 이름 | Motion.GetUDPFeedbackConfig( int id ) |
|---|---|
| 설명 | UDP 로봇 상태 구성 파일 rtf_info.json을 읽습니다. |
| 요청 매개변수 | id : int 구성 ID, 1부터 시작 |
| 반환 값 | UDPFeedbackConfig: 지정된 ID의 UDP 로봇 상태 구성 StatusCode: 함수 실행 결과 |
| 메모 | 구성 제약: 1. 여러 구성이 존재하는 경우 단 하나의 구성만 sub_flag를 true로 가질 수 있으며 나머지는 false여야 합니다. 2. use_multicast가 true이면 client_ip는 239...* 형식의 멀티캐스트 주소 하나만 지원합니다. 3. use_multicast가 false이면 client_ip는 여러 개의 LAN 유니캐스트 주소를 지원합니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.17 UDP 피드백 구성 설정
| 메서드 이름 | Motion.SetUDPFeedbackConfig( UDPFeedbackConfig config ) |
|---|---|
| 설명 | UDP 로봇 상태 구성 파일 rtf_info.json에 기록합니다. |
| 요청 매개변수 | config : UDPFeedbackConfig UDP 로봇 상태 구성, 구성 내 ID는 1부터 시작 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 메모 | 구성 제약: 1. 여러 구성이 존재하는 경우 단 하나의 구성만 sub_flag를 true로 가질 수 있으며 나머지는 false여야 합니다. 2. use_multicast가 true이면 client_ip는 239...* 형식의 멀티캐스트 주소 하나만 지원합니다. 3. use_multicast가 false이면 client_ip는 여러 개의 LAN 유니캐스트 주소를 지원합니다. 본 인터페이스는 구성 파일에 기록만 하며 즉시 적용되지는 않습니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.18 UDP 피드백 활성화
| 메서드 이름 | Motion.EnableUDPFeedback( int id ) |
|---|---|
| 설명 | 지정된 ID의 UDP 로봇 상태 구성을 활성화하고 rtf_info.json을 동기화하여 즉시 적용합니다. |
| 요청 매개변수 | id : int 구성 ID, 1부터 시작 |
| 반환 값 | StatusCode: 활성화 작업 실행 결과 |
| 메모 | 실행 후 지정된 ID의 sub_flag만 true가 되고 나머지 구성의 sub_flag는 모두 false가 됩니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.19 UDP 피드백 비활성화
| 메서드 이름 | Motion.DisableUDPFeedback( int id ) |
|---|---|
| 설명 | 지정된 ID의 UDP 로봇 상태 구성을 비활성화하고 rtf_info.json을 동기화하여 즉시 적용합니다. |
| 요청 매개변수 | id : int 구성 ID, 1부터 시작 |
| 반환 값 | StatusCode: 비활성화 작업 실행 결과 |
| 메모 | 실행 후 모든 구성의 sub_flag가 false가 됩니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.20 구독 매개변수 설정
| 메서드 이름 | Motion.SetUDPFeedbackParams( bool flag , string ip , int interval , int feedbackType , List<int> DOList = null ) |
|---|---|
| 설명 | 로봇이 지정된 IP 주소로 데이터를 푸시하도록 UDP 피드백 매개변수를 구성합니다. |
| 요청 매개변수 | flag : bool UDP 데이터 푸시 활성화 여부; ip : 문자열 수신자의 IP 주소; interval : int 데이터 전송 간격 (단위: 밀리초); feedbackType : int 피드백 데이터 형식(0: XML 형식); DOList : List<int> 획득할 DO 신호 목록(최대 10개, 선택 사항) |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 메모 | 매개변수 설정은 UDP 데이터 푸시 기능이 활성화된 경우에만 유효합니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class PositionControl
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 设置UDP反馈参数
// [EN] Set UDP feedback parameters
code = controller.Motion.SetUDPFeedbackParams(true, "192.168.1.1", 10, 0);
if (code == StatusCode.OK)
{
Console.WriteLine("设置UDP反馈参数成功");
}
else
{
Console.WriteLine($"设置UDP反馈参数失败: {code.GetDescription()}");
}
// [ZH] 进入实时位置控制模式
// [EN] Enter real-time position control mode
code = controller.Motion.EnterPositionControl();
if (code == StatusCode.OK)
{
Console.WriteLine("进入实时位置控制模式成功");
// [ZH] 在此可以插入发送UDP数据控制机器人的代码
// [EN] Insert UDP data control code here
Console.WriteLine("注意:在实时位置控制模式下,需要通过UDP发送控制指令");
Console.WriteLine("等待2秒...");
Thread.Sleep(2000);
// [ZH] 退出实时位置控制模式
// [EN] Exit real-time position control mode
code = controller.Motion.ExitPositionControl();
if (code == StatusCode.OK)
{
Console.WriteLine("退出实时位置控制模式成功");
}
else
{
Console.WriteLine($"退出实时位置控制模式失败: {code.GetDescription()}");
}
}
else
{
Console.WriteLine($"进入实时位置控制模式失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}데이터 푸시 설명
| 이름 | 필드 | 설명 |
|---|---|---|
| RIst: Cartesian Position | 엑스 | 공구 좌표계의 X 방향 값, 단위는 밀리미터 |
| 와이 | 공구 좌표계의 Y 방향 값, 단위는 밀리미터 | |
| 지 | 공구 좌표계의 Z 방향 값, 단위는 밀리미터 | |
| 에이 | 공구 좌표계에서 X축을 중심으로 한 회전, 단위는 도입니다. | |
| 비 | 공구 좌표계에서 Y축을 중심으로 한 회전, 단위는 도입니다. | |
| 기음 | 공구 좌표계에서 Z축을 중심으로 한 회전, 단위는 도입니다. | |
| AIPos: Joint Position | A1-A6 | 6개 관절의 값, 단위는 도 |
| EIPos: Additional Axis Data | EIPos | 추가 축 데이터 |
| WristBtnState: Wrist Button State | 버튼 상태 | 1 = 버튼이 눌림, 0 = 버튼이 해제됨 |
| 드래그모델 | 드래그 버튼 상태 | |
| 레코드조인트 | 녹음 버튼 상태 가르치기 | |
| 일시중지이력서 | 일시정지/resume 버튼 상태 | |
| Digout: DO Output | 디그아웃 | 디지털 출력 상태(DO) |
| ProgramStatus: Program Status | ProgId | 프로그램 ID |
| 상태 | 인터프리터 실행 상태: 0 = INTERPRETER_IDLE 1 = INTERPRETER_EXECUTE 2 = INTERPRETER_PAUSED | |
| Xpath | 프로그램 세그먼트 반환 값, 형식은 program name: line number | |
| IPOC: Timestamp | IPOC | 타임스탬프 |
4.2.21 로봇의 소프트 한계 가져오기
| 메서드 이름 | Motion.GetUserSoftLimit() |
|---|---|
| 설명 | 로봇의 현재 소프트 제한을 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | List<List<double>>: 로봇의 소프트 리미트, 리스트의 첫 번째 레이어는 각 축을 나타내고, 두 번째 레이어는 각 축의 하한값과 상한값을 나타냅니다. StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.22 UDP Position 제어 매개변수 설정
| 메서드 이름 | Motion.SetPositionTrajectoryParams( int maxTimeoutCount , int timeout , int filterLayer , double wristElbowThreshold , double shoulderThreshold ) |
|---|---|
| 설명 | UDP 위치 제어에 관련된 매개변수를 설정합니다. |
| 요청 매개변수 | maxTimeoutCount : int 최대 시간 초과 수, 범위 [1,100] timeout : int 시간 초과 기간(즉, 전송 간격, 기본값 20ms), 범위 [1,100] filterLayer : int 필터링 레벨, 범위 [1,100] wristElbowThreshold : double 손목/팔꿈치 특이점 접근 임계값, 범위 [10,100] shoulderThreshold : double 어깨 특이점 접근 임계값, 범위 [100,300] |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.23 궤적 정형기 매개변수 조회
| 메서드 이름 | Motion.GetShapingParam() |
|---|---|
| 설명 | 현재 궤적 정형기(trajectory shaper) 매개변수 값을 조회합니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | int: 궤적 정형기 매개변수 값(범위 5~15, 0은 비활성화) StatusCode: 조회 작업 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.7.I.0+ 산업용(Bronze): 지원되지 않음 |
4.2.24 궤적 정형기 매개변수 설정
| 메서드 이름 | Motion.SetShapingParam( int value ) |
|---|---|
| 설명 | 궤적 정형기(trajectory shaper) 매개변수 값을 설정합니다. |
| 요청 매개변수 | value : int 궤적 정형기 매개변수(범위 5~15, 0은 비활성화) |
| 반환 값 | StatusCode: 설정 작업 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.7.I.0+ 산업용(Bronze): 지원되지 않음 |
4.2.25 페이로드 관련 인터페이스
4.2.25.1 현재 활성 페이로드 가져오기
| 메서드 이름 | Motion.Payload.GetCurrentPayload() |
|---|---|
| 설명 | 현재 활성 페이로드 인덱스를 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | int: 현재 활성화된 페이로드의 인덱스 StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.25.2 인덱스로 페이로드 얻기
| 메서드 이름 | Motion.Payload.GetPayloadById( int index ) |
|---|---|
| 설명 | 인덱스별로 페이로드 정보를 가져옵니다. |
| 요청 매개변수 | index : 페이로드 인덱스 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.25.3 지정된 페이로드 활성화
| 메서드 이름 | Motion.Payload.SetCurrentPayload( int index ) |
|---|---|
| 설명 | 인덱스별로 지정된 페이로드를 활성화합니다. |
| 요청 매개변수 | index : 페이로드 인덱스 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
| 메모 | 페이로드 ID는 현재 장치에 존재해야 합니다. |
4.2.25.4 모든 페이로드 정보 얻기
| 메서드 이름 | Motion.Payload.GetAllPayloadInfo() |
|---|---|
| 설명 | 모든 페이로드에 대한 자세한 정보를 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | Dictionary<단위, 문자열>: 페이로드 정보 사전을 반환합니다. StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.25.5 페이로드 추가
| 메서드 이름 | Motion.Payload.AddPayload( PayloadInfo payload ) |
|---|---|
| 설명 | 새로운 페이로드를 추가합니다. |
| 요청 매개변수 | payload : PayloadInfo 페이로드 객체 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 메모 | 새 페이로드 ID는 현재 장치에 없어야 하며 1에서 10 사이여야 합니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
4.2.25.6 지정된 페이로드 삭제
| 메서드 이름 | Motion.Payload.DeletePayload( int index ) |
|---|---|
| 설명 | 지정된 인덱스가 있는 페이로드를 삭제합니다. |
| 요청 매개변수 | index : int 페이로드 인덱스 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
| 메모 | 참고: 현재 활성 페이로드는 삭제할 수 없습니다. 활성 페이로드를 삭제하려면 먼저 다른 페이로드를 활성화한 후 현재 페이로드를 삭제하세요. |
4.2.25.7 지정된 페이로드 업데이트
| 메서드 이름 | Motion.Payload.UpdatePayload( PayloadInfo payload ) |
|---|---|
| 설명 | 지정된 페이로드의 정보를 업데이트합니다. |
| 요청 매개변수 | payload : PayloadInfo 페이로드 객체 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 메모 | 페이로드 ID는 현재 장치에 존재해야 합니다. |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.0.0+ 산업용(Bronze): v7.5.0.0+ |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
public class PayloadControl
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 获取负载列表
// [EN] Get payload list
Dictionary<int, string> payloadList;
(payloadList, code) = controller.Motion.Payload.GetAllPayloadInfo();
if (code == StatusCode.OK)
{
Console.WriteLine("获取负载列表成功:");
foreach (var p in payloadList)
{
Console.WriteLine($"负载ID: {p.Key}, 描述: {p.Value}");
}
}
else
{
Console.WriteLine($"获取负载列表失败: {code.GetDescription()}");
}
// [ZH] 获取当前激活的负载
// [EN] Get current active payload
int currentPayload;
(currentPayload, code) = controller.Motion.Payload.GetCurrentPayload();
if (code == StatusCode.OK)
{
Console.WriteLine($"当前激活的负载ID: {currentPayload}");
}
else
{
Console.WriteLine($"获取当前负载失败: {code.GetDescription()}");
}
// [ZH] 添加新负载
// [EN] Add new payload
PayloadInfo payload = new()
{
Id = 3,
Comment = "测试负载",
Weight = 1.0,
MassCenter = new()
{
X = 1,
Y = 2,
Z = 3,
},
InertiaMoment = new()
{
LX = 10,
LY = 20,
LZ = 30,
},
};
code = controller.Motion.Payload.AddPayload(payload);
if (code == StatusCode.OK)
{
Console.WriteLine("添加负载成功");
}
else
{
Console.WriteLine($"添加负载失败: {code.GetDescription()}");
}
// [ZH] 设置当前激活的负载
// [EN] Set current active payload
if (code == StatusCode.OK)
{
code = controller.Motion.Payload.SetCurrentPayload(3);
if (code == StatusCode.OK)
{
Console.WriteLine("设置当前负载成功");
}
else
{
Console.WriteLine($"设置当前负载失败: {code.GetDescription()}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}4.2.25.8 축 3이 수평인지 확인하기
| 메서드 이름 | Motion.Payload.CheckAxisThreeHorizontal() |
|---|---|
| 설명 | 축 3이 수평인지 확인합니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | double : 3축의 수평각 StatusCode : 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
| 메모 | 페이로드 식별을 수행하려면 수평 각도가 -1과 1 사이여야 합니다. |
4.2.25.9 페이로드 식별 상태 가져오기
| 메서드 이름 | Motion.Payload.GetPayloadIdentifyState() |
|---|---|
| 설명 | 페이로드 식별 상태를 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | PayloadIdentifyState: 페이로드 식별 상태 StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.25.10 페이로드 식별 시작
| 메서드 이름 | Motion.Payload.StartPayloadIdentify( double weight , double angle ) |
|---|---|
| 설명 | 페이로드 식별을 시작합니다. |
| 요청 매개변수 | weight : double 페이로드 중량(무게를 알 수 없는 경우 -1 사용) angle : double 축 6의 허용되는 회전 각도(30-90도) |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
| 메모 | 페이로드 식별을 시작하기 전에 페이로드 식별 상태로 진입해야 합니다. |
4.2.25.11 페이로드 식별 결과 가져오기
| 메서드 이름 | Motion.Payload.PayloadIdentifyResult() |
|---|---|
| 설명 | 페이로드 식별 결과를 가져옵니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | PayloadInfo: 페이로드 식별 결과 StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.25.12 페이로드 식별을 위한 간섭 확인 시작
| 메서드 이름 | Motion.Payload.InterferenceCheckForPayloadIdentify( double weight , double angle ) |
|---|---|
| 설명 | 잠재적인 충돌을 확인하기 위해 페이로드 식별에 대한 간섭 확인을 시작합니다. |
| 요청 매개변수 | weight : double 페이로드 중량(무게를 알 수 없는 경우 -1 사용) angle : double 축 6의 허용되는 회전 각도(30-90도) |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.25.13 페이로드 식별 상태 입력
| 메서드 이름 | Motion.Payload.PayloadIdentifyStart() |
|---|---|
| 설명 | 페이로드 식별 상태로 들어갑니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.25.14 페이로드 식별 상태 종료
| 메서드 이름 | Motion.Payload.PayloadIdentifyDone() |
|---|---|
| 설명 | 페이로드 식별 상태를 종료합니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | StatusCode: 함수 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.25.15 전체 페이로드 식별 프로세스
| 메서드 이름 | Motion.Payload.PayloadIdentify( double weight = -1, double angle = 90 ) |
|---|---|
| 설명 | 위에 언급된 모든 인터페이스를 포함하여 페이로드 식별 프로세스를 완료합니다. 일반적인 페이로드 식별에는 이 인터페이스로 충분합니다. |
| 요청 매개변수 | weight : double 페이로드 중량(무게를 알 수 없는 경우 -1 사용) angle : double 축 6의 허용되는 회전 각도(30-90도) |
| 반환 값 | PayloadInfo: 페이로드 식별 결과 StatusCode: 함수 실행 결과 |
| 메모 | 반환된 페이로드는 로봇에 추가되거나 로봇의 기존 페이로드에 저장될 수 있습니다. 전체 프로세스 단계는 다음과 같습니다. 1. 페이로드 식별 상태 입력 2. 페이로드 식별 시작 3. 페이로드 식별 결과 가져오기 4. 페이로드 식별 상태 종료 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.5.2.0+ 산업용(Bronze): 지원되지 않음 |
4.2.25.16 페이로드 식별 종료
| 메서드 이름 | Motion.Payload.TerminatePayloadIdentify() |
|---|---|
| 설명 | 페이로드 식별 상태를 강제 종료합니다. |
| 요청 매개변수 | 없음 |
| 반환 값 | StatusCode: 상태 전환 작업 실행 결과 |
| 호환 로봇 소프트웨어 버전 | 협업(Copper): v7.7.I.0+ 산업용(Bronze): 지원되지 않음 |
예제 코드
cs
using Agilebot.IR;
using Agilebot.IR.Motion;
using Agilebot.IR.Types;
public class PayloadIdentify
{
public static StatusCode Run(string controllerIP, bool useLocalProxy = true)
{
// [ZH] 初始化捷勃特机器人
// [EN] Initialize the Agilebot robot
Arm controller = new Arm(controllerIP, useLocalProxy);
// [ZH] 连接捷勃特机器人
// [EN] Connect to the Agilebot robot
StatusCode code = controller.ConnectSync();
Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "连接成功/Successfully connected.");
if (code != StatusCode.OK)
{
return code;
}
try
{
// [ZH] 获取机器人模式
// [EN] Get robot mode
(UserOpMode opMode, StatusCode opCode) = controller.GetOpMode();
if (opCode == StatusCode.OK)
{
Console.WriteLine($"当前机器人模式/Current robot mode: {opMode}");
if (opMode != UserOpMode.AUTO)
{
Console.WriteLine(
$"负载测定执行必须在机器人自动模式下/Payload identification execution must be in automatic mode"
);
return StatusCode.OtherReason;
}
}
else
{
Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}");
}
// [ZH] 检测3轴是否水平
// [EN] Check if axis 3 is horizontal
double horizontalAngle;
(horizontalAngle, code) = controller.Motion.Payload.CheckAxisThreeHorizontal();
if (code == StatusCode.OK)
{
Console.WriteLine($"3轴水平角度: {horizontalAngle}");
if (Math.Abs(horizontalAngle) > 1)
{
Console.WriteLine("警告:3轴水平角度超出范围(-1~1),无法进行负载测定");
return StatusCode.OtherReason;
}
}
else
{
Console.WriteLine($"检测3轴水平失败: {code.GetDescription()}");
}
// [ZH] 获取负载测定状态
// [EN] Get payload identification state
PayloadIdentifyState identifyState;
(identifyState, code) = controller.Motion.Payload.GetPayloadIdentifyState();
if (code == StatusCode.OK)
{
Console.WriteLine($"负载测定状态: {identifyState}");
}
else
{
Console.WriteLine($"获取负载测定状态失败: {code.GetDescription()}");
}
// [ZH] 执行完整的负载测定流程
// [EN] Execute complete payload identification process
PayloadInfo payload;
(payload, code) = controller.Motion.Payload.PayloadIdentify(-1, 90);
if (code == StatusCode.OK)
{
Console.WriteLine("负载测定成功:");
Console.WriteLine($"负载重量: {payload.Weight}");
Console.WriteLine(
$"质心位置: X={payload.MassCenter.X}, Y={payload.MassCenter.Y}, Z={payload.MassCenter.Z}"
);
Console.WriteLine(
$"惯性矩: LX={payload.InertiaMoment.LX}, LY={payload.InertiaMoment.LY}, LZ={payload.InertiaMoment.LZ}"
);
// [ZH] 保存负载到机器人中
// [EN] Save payload to robot
payload.Id = 6;
code = controller.Motion.Payload.AddPayload(payload);
if (code == StatusCode.OK)
{
Console.WriteLine("保存负载到机器人成功");
}
else
{
Console.WriteLine($"保存负载失败: {code.GetDescription()}");
}
}
else
{
Console.WriteLine($"负载测定失败: {code.GetDescription()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}");
code = StatusCode.OtherReason;
}
finally
{
// [ZH] 关闭连接
// [EN] Close the connection
StatusCode disconnectCode = controller.Disconnect();
Console.WriteLine(
disconnectCode != StatusCode.OK ? disconnectCode.GetDescription() : "Successfully disconnected."
);
}
return code;
}
}