Skip to content

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+

예제 코드

Motion/GetMotionParameters.cs
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+

예제 코드

Motion/SetMotionParameters.cs
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+

예제 코드

Motion/ConvertCartToJoint.cs
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+

예제 코드

Motion/ConvertJointToCart.cs
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+

예제 코드

Motion/MoveJoint.cs
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+

예제 코드

Motion/MoveLine.cs
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+

예제 코드

Motion/MoveCircle.cs
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+

예제 코드

Motion/GetCurrentPose.cs
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): 지원되지 않음

예제 코드

Motion/GetDHParam.cs
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): 지원되지 않음

예제 코드

Motion/SetDHParam.cs
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): 지원되지 않음

예제 코드

Motion/DragControl.cs
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): 지원되지 않음

예제 코드

Motion/PositionControl.cs
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 PositionA1-A66개 관절의 값, 단위는 도
EIPos: Additional Axis DataEIPos추가 축 데이터
WristBtnState: Wrist Button State버튼 상태1 = 버튼이 눌림, 0 = 버튼이 해제됨
드래그모델드래그 버튼 상태
레코드조인트녹음 버튼 상태 가르치기
일시중지이력서일시정지/resume 버튼 상태
Digout: DO Output디그아웃디지털 출력 상태(DO)
ProgramStatus: Program StatusProgId프로그램 ID
상태인터프리터 실행 상태:
0 = INTERPRETER_IDLE
1 = INTERPRETER_EXECUTE
2 = INTERPRETER_PAUSED
Xpath프로그램 세그먼트 반환 값, 형식은 program name: line number
IPOC: TimestampIPOC타임스탬프

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+

예제 코드

Motion/PayloadControl.cs
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): 지원되지 않음

예제 코드

Motion/PayloadIdentify.cs
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;
    }
}