--- url: /zh/1-python/0-prologue/0.1-version.html title: 版本记录 --- # 版本记录 [​](#版本记录) | 文档版本 | SDK 版本号 | 版本时间 | | ---- | ------- | ---------- | | V2.0 | 1.7.1.3 | 2025.07.07 | | V3.0 | 2.0.0.0 | 2025.12.05 | [更新说明](./../Agilebot%5FRobot%5FPython%5FSDK%5FChangeLog.html) --- url: /zh/1-python/0-prologue/0.2-compatibility.html title: 机器人版本兼容性 --- # 机器人版本兼容性 [​](#机器人版本兼容性) SDK 支持捷勃特 Scara,Puma 及协作机器人系列。须对已安装机器人软件的设备使用。兼容兼容的机器人软件版本。部分功能因版本不同,返回结果有所差异,详见第 4 章功能列表。 SDK 连接到机械臂时会对机械臂运动控制软件的版本进行检查,如果低于版本最低要求将无法连接,低于推荐版本要求将提示版本过低,请及时更新兼容的机器人软件版本 SDK 某些接口只支持对应的版本控制器,请注意查看具体接口兼容性 | SDK 版本 | 兼容的机器人软件版本 | 支持状态 | | -------- | ------------------------------- | ---- | | v1.7.0.X | Copper v7.6.X.X、Bronze v7.6.X.X | 支持中 | | v1.7.1.X | Copper v7.6.X.X、Bronze v7.6.X.X | 支持中 | | v2.0.0.X | Copper v7.7.X.X、Bronze v7.7.X.X | 支持中 | --- url: /zh/1-python/1-intro/1.1-robot-system.html title: 1.1 机器人系统 --- # 1.1 机器人系统 [​](#1-1) SDK 安装于客户上位机,SDK 提供了上位机操作和检测机器人的接口,本系统由上位机、控制器和机器人本体组成。本体是指机械本体组成,机械本体由电机、减速机、编码器和传动机构等部分组成。控制柜操作面板上有状态指示灯、控制柜开关、通信接口等。 --- url: /zh/1-python/1-intro/1.2-envronment.html title: 1.2 环境要求 --- # 1.2 环境要求 [​](#1-2) 硬件及操作系统: * Windows 10 及以上 * x86\_64 架构 * Linux (推荐使用 Ubuntu 18.04 以上) * x86\_64 架构 * Arm 架构 Python 版本: * 3.8 及以上 --- url: /zh/1-python/1-intro/1.3-install.html title: 1.3 安装 --- # 1.3 安装 [​](#1-3) ### 环境安装 [​](#环境安装) * 下载 python 环境,推荐使用 Conda 配置环境,下载并安装最新的当前系统的 Miniforge 软件或 Miniconda 软件。 * Conda 下载地址:[Miniforge3](https://mirrors.tuna.tsinghua.edu.cn/github-release/conda-forge/miniforge/LatestRelease) * 安装好后启动 Miniforge Prompt,输入以下指令进行 conda 初始化 ```shell conda init ``` * 安装好后启动 Miniforge Prompt 或者系统终端,输入下列命令创建新的 python 环境 ```shell conda create -n agilesdk python=3.10 ``` * 输入命令进入刚创建的环境 ```shell conda activate agilesdk ``` * 如果 conda 环境安装不便可使用 pip 创建和激活虚拟环境 ```shell # 创建 python3.10 -m venv agilesdk # Windows下激活环境 .\agilesdk\Scripts\activate # Linux下激活环境 source myenv/bin/activate ``` * 输入 cd 命令进入解压后目录,使用下方命令安装所需 python 包 ```shell cd 包解压目录 pip install -r requirements.txt ``` * 如果遇到安装错误,重复上述安装命令或切换网络后再试或者使用命令更换安装源再试: ```shell pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ ``` * 如果 pip 安装失败,可打开 requirements.txt,对每个包使用 conda 进行安装 ```shell conda install package_name= ``` ### IDE 安装 [​](#ide安装) * 推荐使用 PyCharm 作为开发环境 * PyCharm 下载地址: * 下载并安装好 PyCharm Community Edition 后,启动软件 * 新建 Python 项目,项目类型选择纯 Python * 解释器类型选择基础 Conda,路径设置为之前创建的 agilesdk 环境 * 点击创建,即可开始编写代码 ### SDK 安装及测试 [​](#sdk安装及测试) * 输入下述命令安装 python 版本的机器人 SDK,将 x.x.x 替换为当前 sdk 版本号 ```shell pip install Agilebot.SDK.A-x.x.x-py3-none-any.whl ``` * 进入 example 示例文件夹,使用下述命令运行测试 ```shell cd example python 示例程序名(示例:python arm/get_version.py) ``` * 运行示例时上位机必须连接到机器人网络中。 --- url: /zh/1-python/2-glossary/ title: 2 名词解释 --- # 2 名词解释 [​](#2) | 名词 | 描述 | | ------ | ---------------------------------------------------------------- | | 示教器 | 连接在机器人上的手持设备,用于对机器人进行示教和控制 | | SDK | 软件开发工具包,用于对机器人进行编程和控制 | | 机器人网络 | 机器人与外部计算机之间的网络连接 | | 控制器 | 机器人的控制单元,负责执行运动指令、处理传感器数据和管理机器人状态 | | 机械臂 | 机器人的主要运动部分,由多个关节和连杆组成 | | 伺服系统 | 控制机器人关节运动的电机驱动系统,提供精确的位置和速度控制 | | 示教 | 通过手动操作机器人或示教器来记录机器人运动轨迹和动作的过程 | | 关节 | 机器人机械臂中连接各个连杆的可动部件,每个关节对应一个自由度 | | 笛卡尔坐标 | 以 X、Y、Z 三个相互垂直的轴为基准的三维坐标系统,用于描述机器人在空间中的位置和姿态 | | 位姿 | 机器人在空间中的位置和姿态的组合,包括位置坐标和旋转角度 | | 轨迹 | 机器人末端执行器在空间中移动的路径,通常由一系列位姿点组成 | | 负载 | 机器人末端执行器所承载的重量和物体,影响机器人的运动性能和精度 | | 坐标系 | 用于描述机器人位置和姿态的参考系统,包括基坐标系、工具坐标系、用户坐标系等 | | OVC | Overall Velocity Control,全局速度控制,用于设置机器人整体运动速度的倍率 | | OAC | Overall Acceleration Control,全局加速度控制,用于设置机器人整体加速度的倍率 | | TF | Tool Frame,工具坐标系,以机器人末端工具为原点的坐标系 | | UF | User Frame,用户坐标系,用户自定义的坐标系,便于编程和定位 | | TCS | Teach Coordinate System,示教坐标系,用于示教时的坐标参考系统 | | DH 参数 | Denavit-Hartenberg 参数,用于描述机器人连杆几何关系的标准参数 | | PR 寄存器 | Pose Register,位姿寄存器,用于存储机器人位姿信息的寄存器 | | MR 寄存器 | Motion Register,运动寄存器,用于存储运动相关参数的寄存器 | | SR 寄存器 | String Register,字符串寄存器,用于存储字符串信息的寄存器 | | R 寄存器 | Real Register,实数寄存器,用于存储数值信息的寄存器 | | MH 寄存器 | Modbus Holding Register,Modbus 保持寄存器,用于 Modbus 通信的保持寄存器 | | MI 寄存器 | Modbus Input Register,Modbus 输入寄存器,用于 Modbus 通信的输入寄存器 | | DI | Digital Input,数字信号输入,用于接收外部数字信号 | | DO | Digital Output,数字信号输出,用于控制外部设备或执行器 | | BAS | Basic Script,基础脚本语言,用于编写机器人控制程序的高级编程语言 | | Scara | Selective Compliance Assembly Robot Arm,选择性柔顺装配机器人手臂,一种四轴工业机器人类型 | | 协作机器人 | 能够与人类安全协作的机器人,通常具有力感知和碰撞检测功能 | | 工业机器人 | 用于工业自动化生产的机器人,通常具有高精度、高速度和高负载能力 | | Copper | 捷勃特协作机器人产品线的代号 | | Bronze | 捷勃特工业机器人产品线的代号 | --- url: /zh/1-python/3-struct/ title: 3 数据结构 --- # 3 数据结构 [​](#3) ## 3.1 StatusCodeEnum [​](#3-1) **说明** 接口返回状态码 备注:如发现未在说明书里显示的返回码,需要查看机器人故障码表或者根据返回值的字面意思理解 **导入** ```python from Agilebot import StatusCodeEnum ``` **属性** | **名称** | **枚举值** | **描述** | | ----------------------------------------- | ------- | ------------------------------------- | | OK | 0 | 成功 | | INCOMPATIBLE\_VERSION | \-1 | 版本不兼容 | | CONNECTION\_TIMEOUT | \-3 | 连接超时 | | INTERFACE\_NOTIMPLEMENTED | \-4 | 当前控制器该接口未实现 | | INDEX\_OUT\_OF\_RANGE | \-5 | 索引下标越界 | | UNSUPPORTED\_FILETYPE | \-6 | 不支持的文件类型 | | UNSUPPORTED\_PARAMETER | \-7 | 不支持的机器人参数 | | UNSUPPORTED\_SIGNAL\_TYPE | \-8 | 不支持的 IO 信号类型 | | PROGRAM\_NOT\_FOUND | \-9 | 找不到对应的程序 | | PROGRAM\_POSE\_NOT\_FOUND | \-10 | 找不到对应的程序点位 | | WRITE\_PROGRAM\_POSE\_FAILED | \-11 | 更新写入程序点位失败 | | GET\_ALARM\_CODE\_FAILED | \-12 | 访问报警服务获取报警码失败 | | WRONG\_POSITION\_INFO | \-13 | 控制器返回错误的点位信息 | | UNSUPPORTED\_TRATYPE | \-14 | 不支持的运动类型 | | INVALID\_DH\_LIST | \-15 | 错误的变换参数列表,请联系开发人员 | | INTERVAL\_PORTS\_MUST\_NOTNONE | \-16 | 时间间隔和输出端口列表和电平持续时间必须非空 | | INVALID\_IP\_ADDRESS | \-17 | 无效的 IP 地址 | | INVALID\_DH\_PARAMETERS | \-18 | 无效的 DH 参数 | | INVALID\_PAYLOAD\_INFO | \-19 | 无效的负载信息 | | INVALID\_FLYSHOT\_CONFIG | \-20 | 无效的飞拍配置参数 | | FAILED\_TO\_DOWNLOAD\_SAME\_NAME\_FILE | \-21 | 因重名不允许覆写 | | FAILED\_TO\_CONVERT\_CART\_TO\_JOINT | \-22 | 转换笛卡尔坐标失败 | | FAILED\_TO\_GET\_ALL\_INVERSE\_KINEMATICS | \-23 | 获取一个回转数内的八组解失败 | | COORDINATE\_LIMIT\_EXCEEDED | \-24 | 坐标系个数上限为 10 个 坐标系 ID 合法范围值是 \[1, 10\] | | FILE\_NOTEXIST | \-25 | 文件不存在 | | INVALID\_IO\_LIST\_PARAMETERS | \-26 | 无效的 IO 列表参数 | | INVALID\_PARAMETER | \-27 | 无效的参数 | | NOT\_FOUND | \-28 | 找不到对应的数据 | | LOCAL\_PROXY\_UNSUPPORTED | \-29 | 当前环境不支持本地代理 | | CONTROLLER\_ERROR | \-254 | 控制器错误,详情请联系开发人员 | | SERVER\_ERR | \-255 | 其他原因 | ## 3.2 RobotStatusEnum [​](#3-2) **说明** 机器人运行状态 **导入** ```python from Agilebot import RobotStatusEnum ``` **属性** | **名称** | **枚举值** | **描述** | | ------------------------- | ------- | --------------- | | ROBOT\_UNKNOWN | \-1 | 未知状态 | | ROBOT\_IDLE | 0 | 机器人空闲 | | ROBOT\_RUNNING | 1 | 机器人运行中 | | ROBOT\_TEACHING | 2 | 机器人示教中 | | ROBOT\_DRAG | 3 | 机器人拖动中 | | ROBOR\_FORCE\_DRAG | 4 | 机器人强制拖动中 | | ROBOT\_IDLE\_TO\_RUNNING | 101 | 机器人中间状态 空闲转换为运行 | | ROBOT\_IDLE\_TO\_TEACHING | 102 | 机器人中间状态 空闲转换为示教 | | ROBOT\_RUNNING\_TO\_IDLE | 103 | 机器人中间状态 运行转换为空闲 | | ROBOT\_TEACHING\_TO\_IDLE | 104 | 机器人中间状态 示教转换为空闲 | ## 3.3 CtrlStatusEnum [​](#3-3) **说明** 控制器运行状态 **导入** ```python from Agilebot import CtrlStatusEnum ``` **属性** | 名称 | 枚举值 | 描述 | | --------------------------- | --- | --------------- | | CTRL\_UNKNOWN | \-1 | 未知的控制器状态 | | CTRL\_INIT | 0 | 控制器初始化 | | CTRL\_ENGAGED | 1 | 控制器使能 | | CTRL\_ESTOP | 2 | 控制器急停 | | CTRL\_TERMINATED | 3 | 控制器中止 | | CTRL\_ANY\_TO\_ESTOP | 101 | 控制器中间状态 其他转换为急停 | | CTRL\_ESTOP\_TO\_ENGAGED | 102 | 控制器中间状态 急停到使能 | | CTRL\_ESTOP\_TO\_TERMINATED | 103 | 控制器中间状态 急停到中止 | ## 3.4 ServoStatusEnum [​](#3-4) **说明** 伺服控制器状态 **导入** ```python from Agilebot import ServoStatusEnum ``` **属性** | 名称 | 枚举值 | 描述 | | ------------------ | --- | ---------- | | SERVO\_UNKNOWN | \-1 | 未知的伺服控制器状态 | | SERVO\_IDLE | 1 | 伺服控制器空闲 | | SERVO\_RUNNING | 2 | 伺服控制器运行中 | | SERVO\_DISABLE | 3 | 伺服控制器关闭 | | SERVO\_WAIT\_READY | 4 | 伺服控制器等待就绪 | | SERVO\_WAIT\_DOWN | 5 | 伺服控制器等待关闭 | | SERVO\_INIT | 10 | 伺服控制器初始化 | ## 3.5 SoftModeEnum [​](#3-5) **说明** 机器人 PC 状态模式状态 **导入** ```python from Agilebot import SoftModeEnum ``` **属性** | 名称 | 枚举值 | 描述 | | ------------- | --- | ------ | | UNKNOWN | 0 | 未知 | | AUTO | 1 | 自动模式 | | MANUAL\_LIMIT | 2 | 手动限速模式 | | MANUAL | 3 | 手动模式 | ## 3.6 PoseType [​](#3-6) **说明** 机器人参数类型 **导入** ```python from Agilebot import PoseType ``` **属性** | 名称 | 枚举值 | 描述 | | ----- | --- | ----- | | JOINT | 0 | 关节空间 | | CART | 1 | 笛卡尔坐标 | ## 3.7 TCSType [​](#3-7) **说明** 坐标系类型 **导入** ```python from Agilebot import TCSType ``` **属性** | 名称 | 枚举值 | 描述 | | ---------- | --- | ---------- | | JOINT | 0 | 关节空间 | | BASE | 1 | 基坐标系 | | WORLD | 2 | 世界坐标系 | | USER | 3 | 用户坐标系 | | TOOL | 4 | 工具坐标系 | | RTCP\_USER | 5 | RTCP 用户坐标系 | | RTCP\_TOOL | 6 | RTCP 工具坐标系 | ## 3.8 Joint [​](#3-8) **说明** 描述机器人关节位置的数据结构 **导入** ```python from Agilebot import Joint ``` **属性** | 属性 | 类型 | 描述 | | -- | ----- | ------- | | j1 | float | 关节 1 的值 | | j2 | float | 关节 2 的值 | | j3 | float | 关节 3 的值 | | j4 | float | 关节 4 的值 | | j5 | float | 关节 5 的值 | | j6 | float | 关节 6 的值 | | j7 | float | 关节 7 的值 | | j8 | float | 关节 8 的值 | | j9 | float | 关节 9 的值 | ## 3.9 Position [​](#3-9) **说明** 描述机器人笛卡尔位姿的数据结构 **导入** ```python from Agilebot import Position ``` **属性** | 属性 | 类型 | 描述 | | -- | ----- | ----- | | x | float | X 轴坐标 | | y | float | Y 轴坐标 | | z | float | Z 轴坐标 | | a | float | A 轴角度 | | b | float | B 轴角度 | | c | float | C 轴角度 | ## 3.10 Posture [​](#3-10) **说明** 描述机器人形态参数的数据结构 **导入** ```python from Agilebot import Posture ``` **属性** | 属性 | 类型 | 描述 | | ---------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- | | turn\_cycle | int\[\] | 各轴的回转数,取值范围为..., -2,-1,0,1,2,...。各轴处在 0° 姿势下为 0;执行直线、圆弧动作时目标点回转数自动选择。对应关节回转角≥180° 时取值≥1,-179.99\~179.99° 对应 0,≤-180° 时取值≤-1 | | wrist\_flip | int | 腕部翻转姿态,取值范围为 - 1、0、1。在 6 轴机器人 J5 关节配置中,值 = 1 表示腕向下翻转,值 =-1 表示腕向上翻转 | | arm\_up\_down | int | 臂部上下姿态,取值范围为 - 1、0、1。在 6 轴机器人 J3 关节配置中,值 = 1 表示手臂在上(前向条件下,3 轴在 4 轴到 2 轴连线上方且 J3<0),值 =-1 表示手臂在下(前向条件下,3 轴在该连线下方且 J3>0) | | arm\_back\_front | int | 臂部前后姿态,取值范围为 - 1、0、1。在 6 轴机器人 J1 关节配置中,值 = 1 表示手臂在前(协作面向前方,2 轴在 1 轴左侧),值 =-1 表示手臂在后(协作面向前方,2 轴在 1 轴右侧) | | arm\_left\_right | int | 臂部左右姿态,取值范围为 - 1、0、1。在 4 轴 Scara 机器人 J2 关节配置中,值 = 1 表示 Scara 手臂在右,值 =-1 表示 Scara 手臂在左 | ## 3.11 BaseCartData [​](#3-11) **说明** 描述机器人笛卡尔目标位姿的数据结构 **导入** ```python from Agilebot import BaseCartData ``` **属性** | 属性 | 类型 | 描述 | | -------- | ---------------- | -------- | | position | [Position](#3-9) | 笛卡尔位姿的数据 | | posture | [Posture](#3-10) | 机器人形态参数 | ## 3.12 MotionPose [​](#3-12) **说明** 描述机器人点位的结构 坐标数据中,XYZ 方向距离数据单位为毫米 (mm),角度数据单位为 度 (°),部分版本角度信息为弧度,详见功能列表返回结果说明。 **导入** ```python from Agilebot import MotionPose ``` **属性** | 属性 | 类型 | 描述 | | -------- | --------------------- | ----------------------- | | cartData | [BaseCartData](#3-11) | 笛卡尔数据 | | joint | [Joint](#3-8) | 关节数据 | | pt | [PoseType](#3-6) | 点位类型,默认为 PoseType.JOINT | ## 3.13 DHparam [​](#3-13) **说明** 机器人 DH 参数列表 **导入** ```python from Agilebot import DHparam ``` **属性** | 属性 | 类型 | 描述 | | ------ | ----- | --------- | | id | int | DH 参数的 ID | | d | float | 关节距离 | | a | float | 杆件长度 | | alpha | float | 杆件扭角 | | offset | float | 关节转角 | ## 3.14 PayloadInfo [​](#3-14) **说明** 机器人负载信息。 **导入** ```python from Agilebot import PayloadInfo ``` **属性** | 属性 | 类型 | 描述 | | --------------- | ------------- | -------- | | id | int | 序号 ID | | weight | float | 负载重量(kg) | | comment | str | 注释 | | mass\_center | MassCenter | 质心 | | inertia\_moment | InertiaMoment | 惯性矩 | ### MassCenter [​](#masscenter) | 属性 | 类型 | 描述 | | -- | ----- | -- | | x | float | X | | y | float | Y | | z | float | Z | ### InertiaMoment [​](#inertiamoment) | 属性 | 类型 | 描述 | | -- | ----- | -- | | lx | float | LX | | ly | float | LY | | lz | float | LZ | ## 3.15 ProgramCartData [​](#3-15) **说明** 程序点位信息 **导入** ```python from Agilebot import ProgramCartData ``` **属性** | 属性 | 类型 | 描述 | | -------- | --------------------- | ----------- | | baseCart | [BaseCartData](#3-11) | 笛卡尔数据 | | uf | int | 使用的用户坐标系 ID | | tf | int | 使用的工具坐标系 ID | ## 3.16 ProgramPoseData [​](#3-16) **说明** 程序点位信息 **导入** ```python from Agilebot import ProgramPoseData ``` **属性** | 属性 | 类型 | 描述 | | -------- | ------------------------ | ----------------------- | | cartData | [ProgramCartData](#3-15) | 程序点位数据 | | joint | [Joint](#3-8) | 关节数据 | | pt | [PoseType](#3-6) | 点位类型,默认为 PoseType.JOINT | ## 3.17 ProgramPose [​](#3-17) **说明** 程序点位信息 **导入** ```python from Agilebot import ProgramPose ``` **属性** | 属性 | 类型 | 描述 | | -------- | ------------------------ | ------ | | poseData | [ProgramPoseData](#3-16) | 程序点位数据 | | id | int | 点位 ID | | name | str | 点位名称 | | comment | str | 点位注释 | ## 3.18 PoseRegisterData [​](#3-18) **说明** 寄存器点类,用于表示和处理机械臂的寄存器点数据。 **导入** ```python from Agilebot import PoseRegisterData ``` **属性** | 属性 | 类型 | 描述 | | -------- | --------------------- | ----------------------- | | cartData | [BaseCartData](#3-11) | 笛卡尔数据 | | joint | [Joint](#3-8) | 关节数据 | | pt | [PoseType](#3-6) | 点位类型,默认为 PoseType.JOINT | ## 3.19 PoseRegister [​](#3-19) **说明** 寄存器点类,用于表示和处理机械臂的寄存器点数据。 **导入** ```python from Agilebot import PoseRegister ``` **属性** | 属性 | 类型 | 描述 | | ---------------- | ------------------------- | ------ | | poseRegisterData | [PoseRegisterData](#3-18) | 程序点位数据 | | id | int | 点位 ID | | name | str | 点位名称 | | comment | str | 点位注释 | ## 3.20 TransformStatusEnum [​](#3-20) **说明** 离线轨迹文件转换状态的枚举 **导入** ```python from Agilebot import TransformStatusEnum ``` **属性** | 名称 | 枚举值 | 描述 | | --------------------- | --- | --------- | | TRANSFORM\_START | 0 | 转换任务开始 | | TRANSFORM\_RUNNING | 1 | 转换任务执行中 | | TRANSFORM\_SUCCESS | 2 | 转换任务已完成 | | TRANSFORM\_FAILED | 3 | 转换任务失败 | | TRANSFORM\_NOT\_FOUND | 4 | 转换任务没找到 | | TRANSFORM\_UNKNOWN | 5 | 未知的转换任务状态 | ## 3.21 HWState [​](#3-21) **说明** 机器人状态 HWState 枚举 **导入** ```python from Agilebot import HWState ``` **属性** | 名称 | 描述 | | ---------------------------------- | -------------- | | TOPIC\_JOINT | 发布机械臂关节状态反馈 | | TOPIC\_CURRENT\_CARTESIAN | 发布 TCP 当前笛卡尔坐标 | | TOPIC\_UF | 发布当前用户坐标系信息 | | TOPIC\_TF | 发布当前工具坐标系信息 | | TOPIC\_VELOCITY | 发布全局速度比率 | | TOPIC\_RUNNING\_STATUS | 发布控制器运行状态 | | TOPIC\_INTERPRETER\_STATUS | 发布解释器状态 | | TOPIC\_ROBOT\_STATUS | 发布机器人状态 | | TOPIC\_CTRL\_STATUS | 发布控制器状态 | | TOPIC\_SERVO\_STATUS | 发布伺服控制器状态 | | TOPIC\_TRAJECTORY\_RECORDS\_STATUS | 发布轨迹复现记录状态 | ## 3.22 CoordinateSystemType [​](#3-22) **说明** 机器人坐标系相关信息 **导入** ```python from Agilebot import CoordinateSystemType ``` **属性** | 名称 | 枚举值 | 描述 | | --------- | --- | ----- | | UserFrame | 0 | 用户坐标系 | | ToolFrame | 1 | 工具坐标系 | ## 3.23 Coordinate [​](#3-23) **说明** 坐标系信息,用于工具坐标系和用户坐标系。 Coordinate system data, including tool frame and user frame. **导入** ```python from Agilebot import Coordinate ``` **属性** | 属性 | 类型 | 描述 | | ------- | ---------------- | ------- | | id | int | 坐标系 ID | | name | str | 坐标系名称 | | comment | str | 坐标系描述 | | data | [Position](#3-9) | 坐标系位置数据 | ## 3.24 DragStatus [​](#3-24) **说明** 机器人轴拖动状态类 **导入** ```python from Agilebot import DragStatus ``` **属性** | 属性 | 类型 | 描述 | | -------------------- | ---------------------- | -------------- | | cart\_status | [CartStatus](#3-24-1) | 笛卡尔坐标系各轴拖动锁定状态 | | joint\_status | [JointStatus](#3-24-2) | 关节轴拖动锁定状态 | | is\_continuous\_drag | bool | 持续拖动的标志 | ## 3.24.1 CartStatus [​](#3-24-1) **说明** 笛卡尔状态类,用于表示笛卡尔坐标系的状态。 **导入** ```python from Agilebot import CartStatus ``` **属性** | 属性 | 类型 | 描述 | | -- | ---- | ----- | | x | bool | X 轴状态 | | y | bool | Y 轴状态 | | z | bool | Z 轴状态 | | a | bool | A 轴状态 | | b | bool | B 轴状态 | | c | bool | C 轴状态 | ## 3.24.2 JointStatus [​](#3-24-2) **说明** 关节状态类,用于表示机械臂各关节的状态。所有关节的状态默认为 True(可用)。 **导入** ```python from Agilebot import JointStatus ``` **属性** | 属性 | 类型 | 描述 | | -- | ---- | ------ | | j1 | bool | J1 轴状态 | | j2 | bool | J2 轴状态 | | j3 | bool | J3 轴状态 | | j4 | bool | J4 轴状态 | | j5 | bool | J5 轴状态 | | j6 | bool | J6 轴状态 | | j7 | bool | J7 轴状态 | | j8 | bool | J8 轴状态 | | j9 | bool | J9 轴状态 | ## 3.25 ModbusChannel [​](#3-25) **说明** Modbus 通道类型 **导入** ```python from Agilebot import ModbusChannel ``` **属性** | 名称 | 枚举值 | 描述 | | ------------------------ | --- | --------------- | | CONTROLLER\_TCP\_TO\_485 | 2 | TCP2RS485 模块通道。 | | WRIST\_485\_0 | 3 | 手腕 AI 通道。 | | WRIST\_485\_1 | 4 | 手腕 DO 通道。 | | CONTROLLER\_485 | 5 | 控制柜 485 通道。 | ## 3.26 PayloadIdentifyState [​](#3-26) **说明** 负载测定状态。 **导入** ```python from Agilebot import PayloadIdentifyState ``` **属性** | 名称 | 枚举值 | 描述 | | -------------------------- | --- | ---------- | | PAYLOAD\_CHECK\_INIT | 0 | 负载测定检查初始化中 | | PAYLOAD\_CHECK\_RUNNING | 1 | 负载测定检查运行中 | | PAYLOAD\_CHECK\_SUCCESS | 2 | 负载测定检查成功 | | PAYLOAD\_CHECK\_FAILED | 3 | 负载测定检查失败 | | PAYLOAD\_IDENTIFY\_INIT | 4 | 负载测定初始化 | | PAYLOAD\_IDENTIFY\_RUNNING | 5 | 负载测定运行中 | | PAYLOAD\_IDENTIFY\_SUCCESS | 6 | 负载测定成功 | | PAYLOAD\_IDENTIFY\_FAILED | 7 | 负载测定失败 | ## 3.27 MoveMode [​](#3-27) **说明** 示教运动模式 **导入** ```python from Agilebot import MoveMode ``` **属性** | 名称 | 枚举值 | 描述 | | ---------- | --- | ---- | | Continuous | 0 | 连续运动 | | Stepping | 1 | 步进运动 | ## 3.28 SignalType [​](#3-28) **说明** `SignalType` 是一个枚举类,用于区分不同类型的输入输出信号。它涵盖了数字信号、专用信号、手臂信号、组信号、模拟信号等多种类型,帮助在机器人控制系统中准确识别和管理不同类型的信号。 **导入** ```python from Agilebot import SignalType ``` **属性** | 名称 | 枚举值 | 描述 | | --- | --- | ------------------------------- | | DI | 1 | 数字输入信号(Digital Input) | | DO | 2 | 数字输出信号(Digital Output) | | UI | 3 | 专用输入信号(User Input) | | UO | 4 | 专用输出信号(User Output) | | RI | 5 | 远程控制输入信号(Remote Control Input) | | RO | 6 | 远程控制输出信号(Remote Control Output) | | GI | 7 | 组输入信号(Group Input) | | GO | 8 | 组输出信号(Group Output) | | TAI | 9 | 手腕模拟输入信号(Tool Analog Input) | | TDI | 10 | 手腕数字输入信号(Tool Digital Input) | | TDO | 11 | 手腕数字输出信号(Tool Digital Output) | | AI | 12 | 模拟输入信号(Analog Input) | | AO | 13 | 模拟输出信号(Analog Output) | ## 3.29 SignalValue [​](#3-29) **说明** `SignalValue` 类用于定义信号的开关值。它通过两个常量 `OFF` 和 `ON` 来表示信号的关闭和开启状态。此类在机器人控制系统中用于控制和读取信号的状态。 **导入** ```python from Agilebot import SignalValue ``` **属性** | 名称 | 值 | 描述 | | --- | - | ---- | | OFF | 0 | 信号关闭 | | ON | 1 | 信号开启 | ## 3.30 SerialParams [​](#3-30) **说明** 串口通讯参数类,用于配置 Modbus-RTU/TCP 转 485 通讯时的完整参数集合。 实例化后可直接传递给底层通讯接口,实现一键参数下发。 **导入** ```python from Agilebot import SerialParams, ModbusChannel, ModbusParity ``` **构造方法** ```python SerialParams( id: int = 1, channel: ModbusChannel = ModbusChannel.CONTROLLER_TCP_TO_485, ip: str = "10.27.1.80", port: int = 502, baud: int = 9600, data_bit: int = 8, stop_bit: int = 1, parity: ModbusParity = ModbusParity.NONE, timeout: int = 1000 ) ``` **属性** | 属性 | 类型 | 描述 | | --------- | ------------- | ----------------------------------------------------------------------- | | id | int | 主站 id | | channel | ModbusChannel | 通讯通道,如 CONTROLLER\_TCP\_TO\_485 | | ip | str | CONTROLLER\_TCP\_TO\_485 模块的地址,仅 channel 为 CONTROLLER\_TCP\_TO\_485 时有效 | | port | int | CONTROLLER\_TCP\_TO\_485 模块的端口,仅 channel 为 CONTROLLER\_TCP\_TO\_485 时有效 | | baud | int | 串口波特率,可选 9600\\19200\\38400\\57600\\115200\\1000000 | | data\_bit | int | 数据位长度,可选 8\\9 | | stop\_bit | int | 停止位长度,可选 1\\2 | | parity | ModbusParity | 校验位,可选 NONE\\ODD\\EVEN,默认无校验 ModbusParity.NONE | | timeout | int | 读 / 写超时时间,单位毫秒,默认 1000 ms | ## 3.31 SubPub 订阅相关类型 [​](#3-31) ### 3.31.1 RobotTopicType [​](#3-31-1) **说明** 机器人实时数据主题枚举,用于订阅或发布机器人状态。 **导入** ```python from Agilebot import RobotTopicType ``` **枚举值** | 名称 | 描述 | | ---------------------------- | ------------------------------------ | | JOINT\_POSITION | 关节实际位置 | | CARTESIAN\_POSITION | 当前用户工具坐标系下 TCP 笛卡尔位姿(x,y,z,rx,ry,rz) | | TCP\_WORLD\_CARTESIAN | 世界坐标系下的 TCP 笛卡尔位姿 | | TCP\_BASE\_CARTESIAN | 基坐标系下的 TCP 笛卡尔位姿 | | USER\_FRAME | 当前用户坐标系编号 | | TOOL\_FRAME | 当前工具坐标系编号 | | VELOCITY\_RATIO | 全局速度比率(0–100 %) | | GLOBAL\_ACC\_RATIO | 全局加速度比率(0–100 %) | | CALIBRATE\_STATUS | 轴组校准状态 | | TRAJECTORY\_RECORD | 轨迹记录状态 | | RUNNING\_STATUS | 控制器运行状态 | | INTERPRETER\_STATUS | 解释器状态(运行 / 暂停 / 停止 / 错误) | | ROBOT\_STATUS | 机器人本体综合状态 | | CTRL\_STATUS | 控制器就绪状态 | | SERVO\_STATUS | 伺服使能状态 | | USER\_OP\_MODE | 当前用户操作模式 | | SOFT\_OP\_MODE | 当前软操作模式 | | OPERATION\_STATUS | 操作状态 | | PERFORMANCE\_GEAR | 性能档位 | | POWER\_STATUS | 电源状态 | | POWER\_ON\_STATUS | 上电状态 | | SAFETY\_ALARM | 安全报警 | | SAFETY\_PLANE\_STATUS | 安全平面状态 | | TOOL\_POSTURE\_LIMIT\_STATUS | 工具姿态限制状态 | | JOINTS\_RECORD | 关节记录 | | TP\_PROGRAM\_STATUS | TP 程序运行状态 | --- ### 3.31.2 RegTopicType [​](#3-31-2) **说明** 预置寄存器主题类型枚举,用于访问控制器内部 R / MR / SR / PR 寄存器。 **导入** ```python from Agilebot import RegTopicType ``` **枚举值** | 名称 | 枚举值 | 描述 | | -- | --- | ------ | | R | R | 通用寄存器 | | MR | MR | 运动寄存器 | | SR | SR | 字符串寄存器 | | PR | PR | 位置寄存器 | --- ### 3.31.3 IOTopicType [​](#3-31-3) **说明** 预置 IO 主题类型枚举,涵盖数字、组、模拟、工具 IO 及专用 IO。 **导入** ```python from Agilebot import IOTopicType ``` **枚举值** | 名称 | 枚举值 | 描述 | | --- | --- | ------ | | DI | DI | 数字输入 | | DO | DO | 数字输出 | | GI | GI | 组输入 | | GO | GO | 组输出 | | RI | RI | 远程控制输入 | | RO | RO | 远程控制输出 | | UI | UI | 专用输入 | | UO | UO | 专用输出 | | TDI | TDI | 工具数字输入 | | TDO | TDO | 工具数字输出 | | TAI | TAI | 工具模拟输入 | | AI | AI | 通用模拟输入 | | AO | AO | 通用模拟输出 | --- url: /zh/1-python/4-methods/4.1-arm.html title: 4.1 机器人基础操作 --- # 4.1 机器人基础操作 [​](#4-1) ## 说明 [​](#说明) Arm 类封装了绝大多数与捷勃特机器人相关的高频接口,负责完成连接管理、状态查询、控制指令发送等核心能力。典型使用流程为:实例化 `Arm(local_proxy=False)` → 调用 `connect()` 建立与控制器 / 示教器的通信 → 根据业务调用运动、状态、I/O 等接口 → 最后调用 `disconnect()` 或 `release_access()` 等方法释放资源。实例化后无需手动加载配置,类会在内部完成 SDK 版本检查、控制器类型识别以及代理服务的自动选择,并在日志中提示所使用的通信链路。当 `local_proxy=True` 时请确保本机具备同网段通信能力且控制器 IP 可达;当与工业机器人配合时,若需要保持 PC 模式,应在连接后调用 `acquire_access()` 并在操作完成后及时 `release_access()` ,以避免示教器控制权限被长时间占用。 ## 类构造函数 [​](#类构造函数) | 方法名 | **Arm**( local\_proxy : bool = False) | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 捷勃特机器人类,包含所有可用接口,需初始化并连接机器人。初始化时会输出 SDK 版本与使用手册地址。 | | 请求参数 | local\_proxy : bool 是否使用本地控制器代理服务,默认为 False。\- True :在本机启动代理服务,仅支持输入 IP 地址(不支持域名),需 PC 具备本地通信能力。\- False :使用控制器 / 示教器内置代理服务,机器人软件需为 v7.7 及以上并已安装代理服务。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.1 连接机器人 [​](#4-1-1) | 方法名 | **connect**( arm\_controller\_ip : str = COBOT\_IP , teach\_panel\_ip : Optional\[str\] = None) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 连接捷勃特机器人,必须先初始化机器人。内部会判断协作 / 工业型号、自动补全示教器 IP 并启动代理服务。 | | 请求参数 | arm\_controller\_ip : str 协作或工业机器人控制柜 IP 地址,缺省使用 COBOT\_IP 常量。 teach\_panel\_ip : Optional \[str\] 工业机器人示教器 IP,缺省时协作机器人使用控制柜 IP,工业机器人自动匹配默认示教器 IP 或沿用控制柜 IP。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | \- 仅当 local\_proxy=True 且输入为有效 IP 地址时才会启动本地代理;Airbot 域名仅支持 HTTP,无法配合本地代理。\- 当输入的 IP / 域名无效时返回 INVALID\_IP\_ADDRESS 。\- 若无法连接控制器,会返回 CONTROLLER\_CONNECTION\_ERROR 并附带错误信息。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.2 判断与机械臂的连接是否有效 [​](#4-1-2) | 方法名 | **is\_connected**() -> bool | | ---------- | --------------------------------------------------- | | 描述 | 判断与机械臂的连接是否有效 | | 请求参数 | 无参数 | | 返回值 | bool: 连接状态,True: 连接有效,False: 连接失效 | | 备注 | 旧版 is\_connect() 已标记为即将废弃,等价功能请使用 is\_connected() 。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.3 与机器人断开连接 [​](#4-1-3) | 方法名 | **disconnect**() | | ---------- | ---------------------------------------------- | | 描述 | 断开和捷勃特机器人的连接 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/connect\_disconnect.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的基础通讯连接断开示例 / Example of a basic communication connection """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 检查连接状态 # [EN] Check connection status connect_status = arm.is_connected() # [ZH] 打印结果 # [EN] Print the result print(f"当前连接状态 / Current connection status: {connect_status}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.4 获取当前机器人型号 [​](#4-1-4) | 方法名 | **get\_arm\_model\_info**() -> tuple\[str, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------ | | 描述 | 获取当前机器人型号信息 | | 请求参数 | 无参数 | | 返回值 | str: 机器人型号如 "GBT-C5A" [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_arm\_model\_info.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的型号获取示例 / Example of model info acquisition """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取型号 # [EN] Get the robot model model_info, ret = arm.get_arm_model_info() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取型号成功 / Get robot model successfully") print(f"机器人型号 / Robot model: {model_info}") else: print(f"获取型号失败,错误代码 / Get robot model failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() ``` ## 4.1.5 获取机器人运行状态 [​](#4-1-5) | 方法名 | **get\_robot\_status**() -> tuple\[RobotStatusEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人运行状态 | | 请求参数 | 无参数 | | 返回值 | [RobotStatusEnum](./../3-struct/#3-2): 机器人运行状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_robot\_status.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的机器人状态获取示例 / Example of obtaining robot status """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取机器人运行状态 # [EN] Get the robot running status state, ret = arm.get_robot_status() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取机器人运行状态成功 / Get robot running status successful") print(f"机器人运行状态 / Robot running status: {state.msg}") else: print(f"获取机器人运行状态失败,错误代码 / Get robot running status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.6 获取当前控制器运行状态 [​](#4-1-6) | 方法名 | **get\_ctrl\_status**() -> tuple\[CtrlStatusEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------ | | 描述 | 获取当前捷勃特机器人控制器运行状态 | | 请求参数 | 无参数 | | 返回值 | [CtrlStatusEnum](./../3-struct/#3-3): 控制器运行状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_ctrl\_status.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的获取运动控制器运行状态示例 / Example of the operating status of the controller """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取运动控制器运行状态 # [EN] Get the controller running status state, ret = arm.get_ctrl_status() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取运动控制器运行状态成功 / Get controller running status successful") print(f"运动控制器运行状态 / Controller running status: {state.msg}") else: print(f"获取运动控制器运行状态失败,错误代码 / Get controller running status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.7 获取当前伺服控制器状态 [​](#4-1-7) | 方法名 | **get\_servo\_status**() -> tuple\[ServoStatusEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------- | | 描述 | 获取当前捷勃特机器人伺服控制器状态 | | 请求参数 | 无参数 | | 返回值 | [ServoStatusEnum](./../3-struct/#3-4): 伺服控制器状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_servo\_status.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的伺服状态获取示例 / Example of obtaining servo status """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取伺服控制器状态 # [EN] Get the servo controller status state, ret = arm.get_servo_status() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取伺服控制器状态成功 / Get servo controller status successful") print(f"伺服控制器状态 / Servo controller status: {state.msg}") else: print(f"获取伺服控制器状态失败,错误代码 / Get servo controller status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.8 获取机器人当前的软状态 [​](#4-1-8) | 方法名 | **get\_soft\_mode**() -> tuple\[SoftModeEnum, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人当前的软状态 (PC 模式下的手 / 自动状态) | | 请求参数 | 无参数 | | 返回值 | [SoftModeEnum](./../3-struct/#3-5): 伺服控制器状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.9 设置机器人当前的软状态 [​](#4-1-9) | 方法名 | **set\_soft\_mode**( soft\_mode : SoftModeEnum) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------- | | 描述 | 设置机器人当前的软状态 (PC 模式下的手 / 自动状态) | | 请求参数 | soft\_mode : [SoftModeEnum](./../3-struct/#3-5) 软状态值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/soft\_mode.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的机器人软状态获取示例 / Example of obtaining the soft state of a robot """ from Agilebot import Arm, SoftModeEnum, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置机器人当前的软状态为手动限速模式 # [EN] Set the robot's current soft state to manual limit mode ret = arm.set_soft_mode(SoftModeEnum.MANUAL_LIMIT) # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print( "设置机器人当前的软状态为手动限速模式成功 / Set the robot's current soft state to manual limit mode successfully" ) else: print( f"设置机器人当前的软状态为手动限速模式失败,错误代码 / Set the robot's current soft state to manual limit mode failed, error code: {ret.errmsg}" ) arm.disconnect() exit(1) # [ZH] 获取机器人当前的软状态 # [EN] Get the robot's current soft state state, ret = arm.get_soft_mode() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取机器人当前的软状态成功 / Get the robot's current soft state successfully") print(f"机器人当前的软状态 / Robot current soft state: {state.name}") else: print(f"获取机器人当前的软状态失败,错误代码 / Get the robot's current soft state failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.10 获取机器人操作模式 [​](#4-1-10) | 方法名 | **get\_op\_mode**() -> tuple\[SoftModeEnum, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人操作模式(如机器人 / 虚拟控制器的手动、自动等操作权限状态)。 | | 请求参数 | 无参数 | | 返回值 | [SoftModeEnum](./../3-struct/#3-5): 操作模式 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 当控制器未返回有效模式时将回退为 SoftModeEnum.UNKNOWN 。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.11 设置机器人操作模式 [​](#4-1-11) | 方法名 | **set\_op\_mode**( soft\_mode : SoftModeEnum) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------- | | 描述 | 设置机器人操作模式,仅支持虚拟机器人 / 仿真控制器。 | | 请求参数 | soft\_mode : [SoftModeEnum](./../3-struct/#3-5) 目标操作模式,不能为 UNKNOWN 。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 如果传入 SoftModeEnum.UNKNOWN ,接口将返回 UNSUPPORTED\_PARAMETER 。 | | 兼容的机器人软件版本 | 协作 (Copper): 仅仿真;工业 (Bronze): 仅仿真 | ## 4.1.12 上位机获取操作权限 [​](#4-1-12) | 方法名 | **acquire\_access**() | | ---------- | ----------------------------------------------------------- | | 描述 | 上位机获取操作权限,使机器人进入[ PC 模式](./../2-glossary/#2) | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | 仅工业机器人需要调用此接口保持 PC 模式,协作及 P7A 无需使用。内部会启动心跳线程,每 2 秒向控制器发送保活。 | | 兼容的机器人软件版本 | 协作 (Copper): 不支持 工业 (Bronze): v7.5.0.0+ | ## 4.1.13 上位机返还操作权限 [​](#4-1-13) | 方法名 | **release\_access**() | | ---------- | -------------------------------------------- | | 描述 | 上位机返还操作权限,使机器人退出[ PC 模式](./../2-glossary/#2) | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | 仅工业机器人需要调用,用于停止 acquire\_access() 启动的心跳线程。 | | 兼容的机器人软件版本 | 协作 (Copper): 不支持 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/access\_operate.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的操作权限获取示例 / Example of obtaining operation permissions """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取权限 # [EN] Acquire access arm.acquire_access() # [ZH] 返还权限 # [EN] Release access arm.release_access() # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.14 获取机器人控制器版本 [​](#4-1-14) | 方法名 | **get\_controller\_version**() -> tuple\[str, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------- | | 描述 | 获取当前捷勃特机器人控制器版本,建议优先使用此方法。 | | 请求参数 | 无参数 | | 返回值 | str: 控制器版本 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 控制器版本低于推荐版本时,SDK 会在连接流程中输出升级建议。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/get\_version.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的运动控制器版本获取示例 / Example of obtaining the controller version """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取运动控制器版本 # [EN] Get the controller version version_info, ret = arm.get_controller_version() # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("获取运动控制器版本成功 / Get controller version successful") print(f"运动控制器版本 / Controller version: {version_info}") else: print(f"获取运动控制器版本失败,错误代码 / Get controller version failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.15 设置机器人 LED 指示灯 [​](#4-1-15) | 方法名 | **switch\_led\_light**( mode : bool) -> StatusCodeEnum | | ---------- | ------------------------------------------------------ | | 描述 | 设置当前捷勃特机器人的 LED 指示灯 | | 请求参数 | mode : bool,True 为打开,False 为关闭 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.1.3+ 工业 (Bronze): 不支持 | 示例代码 arm/switch\_led\_light.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的机器人灯环状态获取示例 / Example of obtaining the status of the LED """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 控制LED灯光关闭 # [EN] Control LED light off ret = arm.switch_led_light(mode=False) # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("LED灯光关闭成功 / Control LED light off successfully") else: print(f"LED灯光关闭失败,错误代码 / Control LED light off failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 控制LED灯光开启 # [EN] Control LED light on ret = arm.switch_led_light(mode=True) # [ZH] 检查是否成功 # [EN] Check if successful if ret == StatusCodeEnum.OK: print("LED灯光开启成功 / Control LED light on successfully") else: print(f"LED灯光开启失败,错误代码 / Control LED light on failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.16 机器人伺服上电 [​](#4-1-16) | 方法名 | **servo\_on**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 当前捷勃特机器人伺服上电 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.17 机器人伺服下电 [​](#4-1-17) | 方法名 | **servo\_off**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 当前捷勃特机器人伺服下电 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.18 机器人伺服重置 [​](#4-1-18) | 方法名 | **servo\_reset**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 当前捷勃特机器人伺服重置 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/servo\_operate.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的控制伺服操作示例 / Eexample of control servo operation example """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 机器人伺服重置 # [EN] Robot servo reset ret = arm.servo_reset() if ret == StatusCodeEnum.OK: print("伺服重置成功 / Servo reset successfully") else: print(f"伺服重置失败,错误代码 / Servo reset failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 机器人伺服下电 # [EN] Robot servo power off ret = arm.servo_off() if ret == StatusCodeEnum.OK: print("伺服下电成功 / Servo power off successfully") else: print(f"伺服下电失败,错误代码 / Servo power off failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 机器人伺服上电 # [EN] Robot servo power on ret = arm.servo_on() if ret == StatusCodeEnum.OK: print("伺服上电成功 / Servo power on successfully") else: print(f"伺服上电失败,错误代码 / Servo power on failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.1.19 机器人紧急停止 [​](#4-1-19) | 方法名 | **estop**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 当前捷勃特机器人紧急停止 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 arm/estop.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Arm类下的紧急停止示例 / Example of emergency stop """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 机器人紧急停止 # [EN] Robot emergency stop ret = arm.estop() if ret == StatusCodeEnum.OK: print("机器人紧急停止成功 / Robot emergency stop successfully") else: print(f"机器人紧急停止失败,错误代码 / Robot emergency stop failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.2-motion.html title: 4.2 机器人运动控制和状态 --- # 4.2 机器人运动控制和状态 [​](#4-2) ## 说明 [​](#说明) Motion 类是捷勃特机器人运动控制的核心对象,负责速度 / 加速度参数、坐标系、点位转换、轨迹运动、拖动示教、实时控制和负载管理等操作的统一封装。常见流程为:在 `Arm` 完成连接后,通过 `arm.motion` 获取实例。 ## 4.2.1 获取机器人参数 [​](#4-2-1) ### 4.2.1.1 获取 OVC 全局速度比率 [​](#4-2-1-1) | 方法名 | **motion.get\_OVC**() -> tuple\[float, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 获取当前机器人 OVC 全局速度比率,比率在 0\~1 之间 | | 请求参数 | 无参数 | | 返回值 | float:速度比率,结果在 0\~1 之间 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.2 获取 OAC 全局加速度比率 [​](#4-2-1-2) | 方法名 | **motion.get\_OAC**() -> tuple\[float, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------- | | 描述 | 获取当前机器人 OAC 全局加速度比率,比率在 0\~1.2 之间 | | 请求参数 | 无参数 | | 返回值 | float:速度比率,结果在 0\~1.2 之间 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.3 获取当前使用的 TF 工具坐标系编号 [​](#4-2-1-3) | 方法名 | **motion.get\_TF**() -> tuple\[int, StatusCodeEnum\] | | ---------- | --------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TF 工具坐标系编号,序号范围为 0\~50 | | 请求参数 | 无参数 | | 返回值 | int: 工具坐标系编号 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.4 获取当前使用的 UF 用户坐标系编号 [​](#4-2-1-4) | 方法名 | **motion.get\_UF**() -> tuple\[int, StatusCodeEnum\] | | ---------- | --------------------------------------------------------- | | 描述 | 获取当前机器人使用的 UF 用户坐标系编号,序号范围为 0\~50 | | 请求参数 | 无参数 | | 返回值 | int: 用户坐标系编号 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.5 获取当前使用的 TCS 示教坐标系 [​](#4-2-1-5) | 方法名 | **motion.get\_TCS**() -> tuple\[TCSType, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TCS 示教坐标系,具体参见[ TCSType](./../3-struct/#3-7) | | 请求参数 | 无参数 | | 返回值 | [TCSType](./../3-struct/#3-7): 示教坐标系编号 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/set\_param.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 全局参数设置示例 / Example of system parameter setting """ from Agilebot import Arm, StatusCodeEnum, TCSType # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置机器人各参数 # [EN] Set robot parameters ret = arm.motion.set_OVC(0.7) if ret == StatusCodeEnum.OK: print("设置全局速度比率成功 / Set global velocity ratio successful") else: print(f"设置全局速度比率失败,错误代码 / Set global velocity ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_OAC(0.7) if ret == StatusCodeEnum.OK: print("设置全局加速度比率成功 / Set global acceleration ratio successful") else: print(f"设置全局加速度比率失败,错误代码 / Set global acceleration ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_TCS(TCSType.TOOL) if ret == StatusCodeEnum.OK: print("设置示教坐标系类型成功 / Set teaching coordinate system type successful") else: print(f"设置示教坐标系类型失败,错误代码 / Set teaching coordinate system type failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_UF(0) if ret == StatusCodeEnum.OK: print("设置用户坐标系成功 / Set user coordinate system successful") else: print(f"设置用户坐标系失败,错误代码 / Set user coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = arm.motion.set_TF(0) if ret == StatusCodeEnum.OK: print("设置工具坐标系成功 / Set tool coordinate system successful") else: print(f"设置工具坐标系失败,错误代码 / Set tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.2 设置机器人参数 [​](#4-2-2) ### 4.2.2.1 设置 OVC 全局速度比率 [​](#4-2-2-1) | 方法名 | **motion.set\_OVC**( value : float) -> StatusCodeEnum | | ---------- | ----------------------------------------------------- | | 描述 | 设置机器人的 OVC 全局速度比率 | | 请求参数 | value : float,速度比率范围是 (0, 1\],即大于 0 且不超过 1 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.2 设置 OAC 全局加速度比率 [​](#4-2-2-2) | 方法名 | **motion.set\_OAC**( value : float) -> StatusCodeEnum | | ---------- | ----------------------------------------------------- | | 描述 | 设置机器人的 OAC 全局加速度比率 | | 请求参数 | value : float,加速度比率在 (0.01, 1.2\] 区间内 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.3 设置当前使用的 TF 工具坐标系 [​](#4-2-2-3) | 方法名 | **motion.set\_TF**( value : int) -> StatusCodeEnum | | ---------- | -------------------------------------------------- | | 描述 | 设置机器人当前使用的 TF 工具坐标系 | | 请求参数 | value : int, 工具坐标系编号,支持的序号范围为 0\~50 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.4 设置当前使用的 UF 用户坐标系 [​](#4-2-2-4) | 方法名 | **motion.set\_UF**( value : int) -> StatusCodeEnum | | ---------- | -------------------------------------------------- | | 描述 | 设置机器人当前使用的 UF 用户坐标系 | | 请求参数 | value : int, 用户坐标系编号,支持的序号范围为 0\~50 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.5 设置当前使用的 TCS 示教坐标系 [​](#4-2-2-5) | 方法名 | **motion.set\_TCS**( value : TCSType) -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 设置机器人当前使用的 TCS 示教坐标系,具体参见[ TCSType](./../3-struct/#3-7) | | 请求参数 | value : [TCSType](./../3-struct/#3-7) TCS 示教坐标系 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_param.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 全局参数获取示例 / Example of system parameter acquisition """ from Agilebot import Arm, StatusCodeEnum, TCSType # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取机器人各参数并打印 # [EN] Get robot parameters and print res, ret = arm.motion.get_OVC() if ret == StatusCodeEnum.OK: print("获取全局速度比率成功 / Get global velocity ratio successful") else: print(f"获取全局速度比率失败,错误代码 / Get global velocity ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"全局速度比率 / Global velocity ratio: {res}") res, ret = arm.motion.get_OAC() if ret == StatusCodeEnum.OK: print("获取全局加速度比率成功 / Get global acceleration ratio successful") else: print(f"获取全局加速度比率失败,错误代码 / Get global acceleration ratio failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"全局加速度比率 / Global acceleration ratio: {res}") res, ret = arm.motion.get_TCS() if ret == StatusCodeEnum.OK: print("获取示教坐标系类型成功 / Get teaching coordinate system type successful") else: print(f"获取示教坐标系类型失败,错误代码 / Get teaching coordinate system type failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"示教坐标系类型 / Teaching coordinate system type: {TCSType(res).name}") res, ret = arm.motion.get_UF() if ret == StatusCodeEnum.OK: print("获取用户坐标系成功 / Get user coordinate system successful") else: print(f"获取用户坐标系失败,错误代码 / Get user coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"用户坐标系 / User coordinate system: {res}") res, ret = arm.motion.get_TF() if ret == StatusCodeEnum.OK: print("获取工具坐标系成功 / Get tool coordinate system successful") else: print(f"获取工具坐标系失败,错误代码 / Get tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"工具坐标系 / Tool coordinate system: {res}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.3 将笛卡尔点位转换成关节值点位 [​](#4-2-3) | 方法名 | **motion.convert\_cart\_to\_joint**( pose : MotionPose, uf\_index : int = 0, tf\_index : int = 0) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将位姿数据从笛卡尔点位转换成关节值点位表达 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 机器人的笛卡尔位姿(PoseType.CART),若未指定 posture SDK 将自动求解可行姿态 uf\_index : int 用户坐标系 id tf\_index : int 工具坐标系 id | | 返回值 | [MotionPose](./../3-struct/#3-12): 机器人点位 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.4 将关节值点位转换成笛卡尔点位 [​](#4-2-4) | 方法名 | **motion.convert\_joint\_to\_cart**( pose : MotionPose, uf\_index : int = 0, tf\_index : int = 0) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将关节值点位转换成笛卡尔点位 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 机器人的关节位姿 uf\_index : int 用户坐标系 id tf\_index : int 工具坐标系 id | | 返回值 | [MotionPose](./../3-struct/#3-12): 机器人点位 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/convert\_pose.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 转换关节值坐标使用示例 / Example of converting joint coordinates """ from Agilebot import Arm, MotionPose, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.CART motion_pose.cartData.position.x = 221.5 motion_pose.cartData.position.y = -494.1 motion_pose.cartData.position.z = 752.0 motion_pose.cartData.position.a = -89.1 motion_pose.cartData.position.b = 31.6 motion_pose.cartData.position.c = -149.3 # [ZH] 转换关节值坐标 # [EN] Convert to joint coordinates joint_pose, ret = arm.motion.convert_cart_to_joint(motion_pose) if ret == StatusCodeEnum.OK: print("转换关节值坐标成功 / Convert to joint coordinates successful") else: print(f"转换关节值坐标失败,错误代码 / Convert to joint coordinates failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {joint_pose.pt}") print( f"轴位置 / Axis position: \n" f"J1:{joint_pose.joint.j1}\n" f"J2:{joint_pose.joint.j2}\n" f"J3:{joint_pose.joint.j3}\n" f"J4:{joint_pose.joint.j4}\n" f"J5:{joint_pose.joint.j5}\n" f"J6:{joint_pose.joint.j6}" ) # [ZH] 转换笛卡尔坐标 # [EN] Convert to Cartesian coordinates cart_pose, ret = arm.motion.convert_joint_to_cart(joint_pose) if ret == StatusCodeEnum.OK: print("转换笛卡尔坐标成功 / Convert to Cartesian coordinates successful") else: print(f"转换笛卡尔坐标失败,错误代码 / Convert to Cartesian coordinates failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {cart_pose.pt}") print( f"笛卡尔位置 / Cartesian position: \n" f"X:{cart_pose.cartData.position.x}\n" f"Y:{cart_pose.cartData.position.y}\n" f"Z:{cart_pose.cartData.position.z}\n" f"A:{cart_pose.cartData.position.a}\n" f"B:{cart_pose.cartData.position.b}\n" f"C:{cart_pose.cartData.position.c}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.5 让机器人末端移动到指定的位置 [​](#4-2-5) | 方法名 | **motion.move\_joint**( pose : MotionPose, vel : float = 1, acc : float = 1) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 让机器人末端移动到指定的位置,移动方式为最快路径 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 笛卡尔空间或关节坐标系上的一个点的坐标 vel : float 运动的速度,范围是 0\~1, 表示最大速度的倍数 acc : float 范围是 0\~1.2, 表示最大加速度的倍数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/move\_joint.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 关节运动使用示例 / Example of joint movement usage """ from Agilebot import Arm, MotionPose, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.JOINT motion_pose.joint.j1 = 0 motion_pose.joint.j2 = 0 motion_pose.joint.j3 = 60 motion_pose.joint.j4 = 60 motion_pose.joint.j5 = 0 motion_pose.joint.j6 = 0 # [ZH] 发送运动请求 # [EN] Send motion request ret = arm.motion.move_joint(motion_pose, vel=0.5, acc=0.5) if ret == StatusCodeEnum.OK: print("关节运动成功 / Joint motion successful") else: print(f"关节运动失败,错误代码 / Joint motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.6 让机器人末端沿直线移动到指定的位置 [​](#4-2-6) | 方法名 | **motion.move\_line**( pose : MotionPose, vel : float = 100, acc : float = 1) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 让机器人末端沿直线移动到指定的位置,移动方式为两点之间的直线路径 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-12) 笛卡尔空间或关节坐标系上的一个点的坐标 vel : float 运动的速度,范围是 1\~4000mm/s, 表示机械臂末端移动速度 acc : float 范围是 0\~1.2, 表示最大加速度的倍数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/move\_line.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 直线运动使用示例 / Example of linear motion usage """ from Agilebot import Arm, MotionPose, PoseType, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.JOINT motion_pose.joint.j1 = 0 motion_pose.joint.j2 = 0 motion_pose.joint.j3 = 60 motion_pose.joint.j4 = 60 motion_pose.joint.j5 = 0 motion_pose.joint.j6 = 0 # [ZH] 发送运动请求 # [EN] Send motion request ret = arm.motion.move_line(motion_pose, vel=100, acc=0.5) if ret == StatusCodeEnum.OK: print("直线运动成功 / Line motion successful") else: print(f"直线运动失败,错误代码 / Line motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 结束后断开机器人连接 # [EN] Disconnect from the robot after completion arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.7 让机器人末端沿弧线移动到指定的位置 [​](#4-2-7) | 方法名 | **motion.move\_circle**( pose1 : MotionPose, pose2 : MotionPose, vel : float = 100, acc : float = 1.0) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 让机器人末端沿弧线移动到指定的位置 | | 请求参数 | pose1 : [MotionPose](./../3-struct/#3-12) 机械臂运动的途径点位姿 pose2 : [MotionPose](./../3-struct/#3-12) 机械臂运动的终点位姿 vel : float 运动的速度,范围是 1\~4000mm/s, 表示机械臂末端移动速度 acc : float 范围是 0\~1.2, 表示最大加速度的倍数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/move\_circle.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 圆弧运动使用示例 / Example of circular arc motion usage """ import time from Agilebot import Arm, MotionPose, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化位姿 # [EN] Initialize pose motion_pose = MotionPose() motion_pose.pt = PoseType.CART motion_pose.cartData.position.x = 377.000 motion_pose.cartData.position.y = 202.820 motion_pose.cartData.position.z = 507.155 motion_pose.cartData.position.c = 0 motion_pose.cartData.position.b = 0 motion_pose.cartData.position.a = 0 # [ZH] 运动到初始点 # [EN] Move to initial position ret = arm.motion.move_joint(motion_pose) if ret == StatusCodeEnum.OK: print("运动到初始点成功 / Move to initial position successful") else: print(f"运动到初始点失败,错误代码 / Move to initial position failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 修改为运动中间点 # [EN] Modify to intermediate motion point motion_pose.cartData.position.x = 488.300 motion_pose.cartData.position.y = 359.120 motion_pose.cartData.position.z = 507.155 # [ZH] 运动终点 # [EN] End position motion_pose2 = MotionPose() motion_pose2.pt = PoseType.CART motion_pose2.cartData.position.x = 629.600 motion_pose2.cartData.position.y = 509.270 motion_pose2.cartData.position.z = 507.155 motion_pose2.cartData.position.c = 0 motion_pose2.cartData.position.b = 0 motion_pose2.cartData.position.a = 0 # [ZH] 等待运动结束 # [EN] Wait for motion to complete time.sleep(10) # [ZH] 开始运动 # [EN] Start motion ret_code = arm.motion.move_circle(motion_pose, motion_pose2, vel=100) if ret_code == StatusCodeEnum.OK: print("圆弧运动成功 / Circle motion successful") else: print(f"圆弧运动失败,错误代码 / Circle motion failed, error code: {ret_code.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.8 获取机器人的当前位姿 [​](#4-2-8) | 方法名 | **motion.get\_current\_pose**( pose\_type : PoseType, uf\_index : int = 0, tf\_index : int = 0) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取机器人的当前位姿,可获取笛卡尔空间或关节坐标系下的位姿信息 | | 请求参数 | pose\_type :[PoseType](./../3-struct/#3-6) 位姿类型 uf\_index : 当使用 PoseType.CART 时需传入用户坐标系 id, 默认 0 tf\_index : 当使用 PoseType.CART 时需传入工具坐标系 id, 默认 0 | | 返回值 | [MotionPose](./../3-struct/#3-12): 机器人位姿 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_current\_pose.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 当前关节位姿获取示例 / Example of current joint pose acquisition """ from Agilebot import Arm, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前位姿 # [EN] Get current pose motion_pose, ret = arm.motion.get_current_pose(PoseType.JOINT) if ret == StatusCodeEnum.OK: print("获取关节位姿成功 / Get joint pose successful") else: print(f"获取关节位姿失败,错误代码 / Get joint pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {motion_pose.pt}") print( f"轴位置 / Axis position:\n" f"J1:{motion_pose.joint.j1}\n" f"J2:{motion_pose.joint.j2}\n" f"J3:{motion_pose.joint.j3}\n" f"J4:{motion_pose.joint.j4}\n" f"J5:{motion_pose.joint.j5}\n" f"J6:{motion_pose.joint.j6}" ) # [ZH] 获取当前位姿 # [EN] Get current pose motion_pose, ret = arm.motion.get_current_pose(PoseType.CART, 0, 0) if ret == StatusCodeEnum.OK: print("获取笛卡尔位姿成功 / Get Cartesian pose successful") else: print(f"获取笛卡尔位姿失败,错误代码 / Get Cartesian pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果位姿 # [EN] Print result pose print(f"位姿类型 / Pose type: {motion_pose.pt}") print( f"坐标位置 / Coordinate position:\n" f"X:{motion_pose.cartData.position.x}\n" f"Y:{motion_pose.cartData.position.y}\n" f"Z:{motion_pose.cartData.position.z}\n" f"A:{motion_pose.cartData.position.a}\n" f"B:{motion_pose.cartData.position.b}\n" f"C:{motion_pose.cartData.position.c}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.9 获取机器人的 DH 参数 [​](#4-2-9) | 方法名 | **motion.get\_DH\_param**() -> tuple\[list\[DHparam\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------ | | 描述 | 获取机器人的 DH 参数 | | 请求参数 | 无参数 | | 返回值 | list([DHparam](./../3-struct/#3-13)): DH 参数列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | ## 4.2.10 设置机器人的 DH 参数 [​](#4-2-10) | 方法名 | **motion.set\_DH\_param**( dh\_list : list\[DHparam\]) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------ | | 描述 | 设置机器人的 DH 参数 | | 请求参数 | dh\_list : list([DHparam](./../3-struct/#3-13)) DH 参数列表 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/DH\_param.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: DH参数设置使用示例 / Example of DH parameter setting usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取DH参数 # [EN] Get DH parameters res, ret = arm.motion.get_DH_param() if ret == StatusCodeEnum.OK: print("获取DH参数成功 / Get DH parameters successful") else: print(f"获取DH参数失败,错误代码 / Get DH parameters failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置DH参数 # [EN] Set DH parameters ret = arm.motion.set_DH_param(res) if ret == StatusCodeEnum.OK: print("设置DH参数成功 / Set DH parameters successful") else: print(f"设置DH参数失败,错误代码 / Set DH parameters failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result for param in res: print( f"DH参数的ID / DH parameter ID: {param.id}\n" f"杆件长度 / Link length: {param.a}\n" f"杆件扭角 / Link twist angle: {param.alpha}\n" f"关节距离 / Joint distance: {param.d}\n" f"关节转角 / Joint angle: {param.offset}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.11 获取机器人轴锁定状态 [​](#4-2-11) | 方法名 | **motion.get\_drag\_set**() -> tuple\[DragStatus, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人轴锁定状态,轴锁定只针对示教运动 | | 请求参数 | 无参数 | | 返回值 | [DragStatus](./../3-struct/#3-27): 轴锁定状态,True 表示该轴为可移动状态,False 表示被锁定 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/get\_drag\_set.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 拖动设置使用示例 / Example of drag Settings usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前轴锁定状态 # [EN] Get current axis lock status drag_status, ret = arm.motion.get_drag_set() if ret == StatusCodeEnum.OK: print("获取拖动设置成功 / Get drag set successful") else: print(f"获取拖动设置失败,错误代码 / Get drag set failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"当前X轴拖动状态 / Current X axis drag status: {drag_status.cart_status.x}\n" f"当前Y轴拖动状态 / Current Y axis drag status: {drag_status.cart_status.y}\n" f"当前Z轴拖动状态 / Current Z axis drag status: {drag_status.cart_status.z}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.12 设定机器人轴锁定状态 [​](#4-2-12) | 方法名 | **motion.set\_drag\_set**( drag\_status : DragStatus) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------- | | 描述 | 设定当前机器人轴锁定状态,轴锁定只针对示教运动 | | 请求参数 | drag\_status :[DragStatus](./../3-struct/#3-27) 各轴的锁定状态,默认全部为 True:解锁状态 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/set\_drag\_set.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 拖动状态设置实例 / Example of dragging status setting """ from Agilebot import Arm, DragStatus, StatusCodeEnum, TCSType # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置示教坐标系 # [EN] Set teaching coordinate system arm.motion.set_TCS(TCSType.BASE) if ret == StatusCodeEnum.OK: print("操作成功 / Operation successful") else: print(f"操作失败,错误代码 / Operation failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置要锁定的轴 # [EN] Set axes to be locked drag_status = DragStatus() drag_status.cart_status.x = False drag_status.cart_status.y = False # [ZH] 设置连续拖动开关 # [EN] Set continuous drag switch drag_status.is_continuous_drag = True # [ZH] 设置轴锁定状态 # [EN] Set axis lock status ret = arm.motion.set_drag_set(drag_status) if ret == StatusCodeEnum.OK: print("设置拖动状态成功 / Set drag status successful") else: print(f"设置拖动状态失败,错误代码 / Set drag status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"当前X轴拖动状态 / Current X axis drag status: {drag_status.cart_status.x}\n" f"当前Y轴拖动状态 / Current Y axis drag status: {drag_status.cart_status.y}\n" f"当前Z轴拖动状态 / Current Z axis drag status: {drag_status.cart_status.z}" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.13 设定当前机器人是否启动拖动 [​](#4-2-13) | 方法名 | **motion.enable\_drag**( drag\_state : bool) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------- | | 描述 | 设定当前机器人是否启动拖动 | | 请求参数 | drag\_state :bool 机器人是否允许拖动,True 表示进入拖动状态,False 表示退出拖动状态 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | 示例代码 motion/enable\_drag.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 拖动示教使用示例 / example of drag teaching usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 进入拖动示教 # [EN] Enter drag teaching mode ret = arm.motion.enable_drag(True) if ret == StatusCodeEnum.OK: print("进入拖动示教成功 / Enter drag teaching successful") else: print(f"进入拖动示教失败,错误代码 / Enter drag teaching failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 退出拖动示教 # [EN] Exit drag teaching mode ret = arm.motion.enable_drag(False) if ret == StatusCodeEnum.OK: print("退出拖动示教成功 / Exit drag teaching successful") else: print(f"退出拖动示教失败,错误代码 / Exit drag teaching failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.14 进入实时位置控制模式 [​](#4-2-14) | 方法名 | **motion.enter\_position\_control**() -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 进入实时位置控制模式,允许对机器人进行精确的位置控制 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 在进入实时控制模式后,必须通过 UDP 发送控制指令 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ## 4.2.15 退出实时位置控制模式 [​](#4-2-15) | 方法名 | **motion.exit\_position\_control**() -> StatusCodeEnum | | ---------- | ------------------------------------------------------ | | 描述 | 退出实时位置控制模式,恢复默认的机器人控制状态 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 退出后,机器人将不再接受实时控制指令 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ## 4.2.16 设置 UDP 反馈参数 [​](#4-2-16) | 方法名 | **motion.set\_udp\_feedback\_params**( flag : bool, ip : str, interval : int, feedback\_type : int, DO\_list : list\[int\] = None) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 配置机器人向指定 IP 地址推送数据的 UDP 反馈参数 | | 请求参数 | flag :bool 是否开启 UDP 数据推送; ip :str 接收端的 IP 地址; interval :int 发送数据的间隔(单位:毫秒); feedback\_type :int 反馈数据格式(0:XML,1:JSON,2:PROTO); DO\_list :list \[int\] 期望获取的 DO 信号列表(最多十个,可选) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | 参数设置仅在 UDP 数据推送功能启用时有效 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | 示例代码 motion/UDP\_feedback\_position\_control.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 实时位置控制模式使用示例 / Example of the real-time location control mode usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置udp反馈参数 # [EN] Set UDP feedback parameters ret = arm.motion.set_udp_feedback_params(True, "10.27.1.254", 20, 1, [0, 1, 2]) if ret == StatusCodeEnum.OK: print("设置UDP反馈参数成功 / Set UDP feedback parameters successful") else: print(f"设置UDP反馈参数失败,错误代码 / Set UDP feedback parameters failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 进入实时位置控制模式 # [EN] Enter real-time position control mode ret = arm.motion.enter_position_control() if ret == StatusCodeEnum.OK: print("进入实时位置控制模式成功 / Enter real-time position control mode successful") else: print( f"进入实时位置控制模式失败,错误代码 / Enter real-time position control mode failed, error code: {ret.errmsg}" ) arm.disconnect() exit(1) # [ZH] 在此插入发送UDP数据控制机器人代码 # [EN] Insert UDP data sending code to control robot here # [ZH] 退出实时位置控制模式 # [EN] Exit real-time position control mode ret = arm.motion.exit_position_control() if ret == StatusCodeEnum.OK: print("退出实时位置控制模式成功 / Exit real-time position control mode successful") else: print(f"退出实时位置控制模式失败,错误代码 / Exit real-time position control mode failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 推送数据说明 [​](#推送数据说明) | 名称 | 字段 | 描述 | | ------------------------- | ---------------------------------------------------------------------------- | ------------------ | | **RIst: 笛卡尔位置** | X | 工具坐标系下 X 方向值,单位为毫米 | | Y | 工具坐标系下 Y 方向值,单位为毫米 | | | Z | 工具坐标系下 Z 方向值,单位为毫米 | | | A | 工具坐标系下绕 X 方向旋转,单位为度 | | | B | 工具坐标系下绕 Y 方向旋转,单位为度 | | | C | 工具坐标系下绕 Z 方向旋转,单位为度 | | | **AIPos: 关节位置** | A1-A6 | 六个关节的值,单位为角度 | | **EIPos: 附加轴数据** | EIPos | 附加轴数据 | | **WristBtnState: 手腕按键状态** | 按键状态 | 1 = 按键按下,0 = 按键抬起 | | DragModel | 拖拽按键状态 | | | RecordJoint | 示教记录按键状态 | | | PauseResume | 暂停恢复按键状态 | | | **Digout: DO 输出** | Digout | 数字输出(DO)的状态 | | **ProgramStatus: 程序状态** | ProgId | 程序 ID | | Status | 解释器执行状态:0 = INTERPRETER\_IDLE1 = INTERPRETER\_EXECUTE2 = INTERPRETER\_PAUSED | | | Xpath | 程序片段返回值,格式为 程序名:行号 | | | **IPOC: 时间戳** | IPOC | 时间戳 | ## 4.2.17 获取机器人软限位 [​](#4-2-17) | 方法名 | **motion.get\_user\_soft\_limit**() -> tuple\[list\[list\[float\]\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------ | | 描述 | 获取当前机器人软限位信息 | | 请求参数 | 无 | | 返回值 | List (List (float)): 机器人软限位信息,列表第一层代表各轴,第二层代表每个轴的下限位和上限位值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_user\_soft\_limit.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 用户软限位设置获取示例 / Example of obtaining the user's soft limit setting """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前机器人软限位信息 # [EN] Get current robot soft limit information res, ret = arm.motion.get_user_soft_limit() if ret == StatusCodeEnum.OK: print("获取用户软限位成功 / Get user soft limit successful") else: print(f"获取用户软限位失败,错误代码 / Get user soft limit failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"当前机器人软限位信息 / Current robot soft limit information: {res}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.2.18 负载相关接口 [​](#4-2-18) ### 4.2.18.1 获取当前激活的负载编号 [​](#4-2-18-1) | 方法名 | **motion.payload.get\_current\_payload**() -> tuple\[int, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------- | | 描述 | 获取当前激活的负载编号,返回对应的 ID 编号 | | 请求参数 | 无参数 | | 返回值 | int: 负载编号 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_current\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 获取当前负载示例 / Example of get the current load """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取当前激活负载 # [EN] Get current active payload current_payload_id, ret = arm.motion.payload.get_current_payload() if ret == StatusCodeEnum.OK: print("获取当前负载成功 / Get current payload successful") else: print(f"获取当前负载失败,错误代码 / Get current payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"当前激活负载ID为 / Current active payload ID: {current_payload_id}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.2 根据指定编号获取负载信息 [​](#4-2-18-2) | 方法名 | **motion.payload.get\_payload\_by\_id**( payload\_id : int) -> tuple\[PayloadInfo, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取指定编号的负载信息 | | 请求参数 | payload\_id : int 指定的负载 ID 编号 | | 返回值 | [PayloadInfo](./../3-struct/#3-14): 负载信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_payload\_by\_id.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 根据ID获取负载参数示例 / Example of obtaining load parameters based on ID """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取负载 # [EN] Get payload res, ret = arm.motion.payload.get_payload_by_id(6) if ret == StatusCodeEnum.OK: print("获取负载成功 / Get payload successful") else: print(f"获取负载失败,错误代码 / Get payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"负载ID / Payload ID: {res.id}\n" f"负载质量 / Payload mass: {res.weight}\n" f"负载注释 / Payload comment: {res.comment}\n" f"负载质心 / Payload mass center: {res.mass_center.x}, {res.mass_center.y}, {res.mass_center.z}\n" f"负载转动惯量 / Payload inertia moment: {res.inertia_moment.lx}, {res.inertia_moment.ly}, {res.inertia_moment.lz}\n" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.3 根据指定编号激活负载 [​](#4-2-18-3) | 方法名 | **motion.payload.set\_current\_payload**( payload\_id : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------ | | 描述 | 根据指定编号激活负载 | | 请求参数 | payload\_id : int 指定的负载 ID 编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/set\_current\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 当前负载设置示例 / Example of the current load settings """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 指定编号激活负载 # [EN] Activate payload by specified ID ret = arm.motion.payload.set_current_payload(1) if ret == StatusCodeEnum.OK: print("设置当前负载成功 / Set current payload successful") else: print(f"设置当前负载失败,错误代码 / Set current payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.4 向机器人控制柜添加一个用户自定义负载信息 [​](#4-2-18-4) | 方法名 | **motion.payload.add\_payload**( payload\_info : PayloadInfo) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------- | | 描述 | 向机器人控制柜添加一个用户自定义负载信息 | | 请求参数 | payload\_info : [PayloadInfo](./../3-struct/#3-14) 用户自定义负载信息 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/add\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 添加负载使用示例 / Example of Add load usage """ from Agilebot import Arm, PayloadInfo, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 初始化负载 # [EN] Initialize payload new_payload = PayloadInfo() new_payload.id = 6 new_payload.comment = "Test" new_payload.weight = 5 new_payload.mass_center.x = -151 new_payload.mass_center.y = 1.0 new_payload.mass_center.z = 75 new_payload.inertia_moment.lx = 0.11 new_payload.inertia_moment.ly = 0.61 new_payload.inertia_moment.lz = 0.54 # [ZH] 添加负载 # [EN] Add payload ret = arm.motion.payload.add_payload(new_payload) if ret == StatusCodeEnum.OK: print("添加负载成功 / Add payload successful") else: print(f"添加负载失败,错误代码 / Add payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.5 根据指定编号删除对应的负载信息 [​](#4-2-18-5) | 方法名 | **motion.payload.delete\_payload**( payload\_id : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------ | | 描述 | 向控制器删除一个用户自定义负载 | | 请求参数 | payload\_id : int 指定的负载 ID 编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 注意:无法删除当前激活的负载,如果要删除激活的负载,请先激活其他负载再删除当前负载 | 示例代码 motion/delete\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 删除负载使用示例 / Example of delete the load usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除指定ID负载 # [EN] Delete payload with specified ID ret = arm.motion.payload.delete_payload(6) if ret == StatusCodeEnum.OK: print("删除负载成功 / Delete payload successful") else: print(f"删除负载失败,错误代码 / Delete payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print("删除负载6成功 / Delete payload 6 successful") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.6 更新一个已存在负载信息 [​](#4-2-18-6) | 方法名 | **motion.payload.update\_payload**( payload\_info : PayloadInfo) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------- | | 描述 | 向机器人更新一个已存在的用户自定义负载的信息 | | 请求参数 | payload\_info : [PayloadInfo](./../3-struct/#3-14) 用户自定义更新负载的信息 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/update\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 更新负载使用示例 / Example of updating the load """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取负载 # [EN] Get payload payload_info, ret_code = arm.motion.payload.get_payload_by_id(6) payload_info.comment = "Test" payload_info.weight = 10 payload_info.mass_center.x = -100 payload_info.mass_center.y = 10 payload_info.mass_center.z = 10 payload_info.inertia_moment.lx = 10 payload_info.inertia_moment.ly = 10 payload_info.inertia_moment.lz = 10 # [ZH] 更新负载 # [EN] Update payload ret = arm.motion.payload.update_payload(payload_info) if ret == StatusCodeEnum.OK: print("更新负载成功 / Update payload successful") else: print(f"更新负载失败,错误代码 / Update payload failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"负载ID / Payload ID: {payload_info.id}\n" f"负载质量 / Payload mass: {payload_info.weight}\n" f"负载质心 / Payload mass center: {payload_info.mass_center.x}, {payload_info.mass_center.y}, {payload_info.mass_center.z}\n" f"负载转动惯量 / Payload inertia moment: {payload_info.inertia_moment.lx}, {payload_info.inertia_moment.ly}, {payload_info.inertia_moment.lz}\n" f"负载注释 / Payload comment: {payload_info.comment}\n" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.7 获取所有负载信息 [​](#4-2-18-7) | 方法名 | **motion.payload.get\_all\_payload**() -> tuple\[list, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------- | | 描述 | 获取所有负载信息 | | 请求参数 | 无参数 | | 返回值 | list : 所有负载信息列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 motion/get\_all\_payload.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 所有负载获取示例 / Example of all load acquisition """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to controller ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有负载 # [EN] Get all payloads res, ret = arm.motion.payload.get_all_payload() if ret == StatusCodeEnum.OK: print("获取所有负载成功 / Get all payloads successful") else: print(f"获取所有负载失败,错误代码 / Get all payloads failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result for payload in res: print(f"负载ID / Payload ID: {payload[0]}\n负载注释 / Payload comment: {payload[1]}\n") # [ZH] 结束后断开机器人连接 # [EN] Disconnect from robot after completion arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ### 4.2.18.8 检测 3 轴是否水平 [​](#4-2-18-8) | 方法名 | **motion.payload.check\_axis\_three\_horizontal**() -> tuple\[float, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 检测 3 轴是否水平 | | 请求参数 | 无 | | 返回值 | float: 返回 3 轴的水平角度,单位为度 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 水平的角度,必须在 - 1\~1 之间才能进行负载测定 | ### 4.2.18.9 获取负载测定状态 [​](#4-2-18-9) | 方法名 | **motion.payload.get\_payload\_identify\_state**() -> tuple\[PayloadIdentifyState, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取负载测定的状态 | | 请求参数 | 无 | | 返回值 | [PayloadIdentifyState](./../3-struct/#3-31) 返回负载测定状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.10 开始负载测定 [​](#4-2-18-10) | 方法名 | **motion.payload.start\_payload\_identify**( weight : float, angle : float) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 开始负载测定 | | 请求参数 | weight :float 负载重量(未知重量填 - 1); angle :float 6 轴允许转动的角度(30-90 度) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 开始负载测定前必须先进入负载测定状态 | ### 4.2.18.11 获取负载测定结果 [​](#4-2-18-11) | 方法名 | **motion.payload.payload\_identify\_result**() -> tuple\[PayloadInfo, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------- | | 描述 | 获取负载测定的结果 | | 请求参数 | 无 | | 返回值 | [PayloadInfo](./../3-struct/#3-14): 返回负载测定结果[StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.12 开始干涉检查 [​](#4-2-18-12) | 方法名 | **motion.payload.interference\_check\_for\_payload\_identify**( weight : float, angle : float) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------- | | 描述 | 开始负载测定的干涉检查 | | 请求参数 | weight : float 负载重量; angle : float 6 轴转动角度(30-90 度) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.13 进入负载测定状态 [​](#4-2-18-13) | 方法名 | **motion.payload.payload\_identify\_start**() -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 进入负载测定状态 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.14 结束负载测定状态 [​](#4-2-18-14) | 方法名 | **motion.payload.payload\_identify\_done**() -> StatusCodeEnum | | ---------- | -------------------------------------------------------------- | | 描述 | 结束负载测定状态 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.18.15 负载测定全流程 [​](#4-2-18-15) | 方法名 | **motion.payload.payload\_identify**( weight : float, angle : float) -> tuple\[PayloadInfo, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------ | | 描述 | 完整的负载测定流程,包含上述负载测定全部接口,无特殊需求负载测定只用该接口即可 | | 请求参数 | weight : float 负载重量(未知重量填 - 1); angle : float 6 轴转动角度(30-90 度) | | 返回值 | [PayloadInfo](./../3-struct/#3-14): 负载测定结果 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 返回的负载可以新增到机器人中或写入机器人中已有的某个负载 全流程步骤: 1\. 移动到指定水平位并检测是否水平 2\. 进入负载测定状态 3\. 开始负载测定 4\. 获取负载测定结果 5\. 结束负载测定状态 | 示例代码 motion/payload\_identify.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 负载识别使用示例 / Example of load identification usage """ import time from Agilebot import Arm, MotionPose, PoseType, ServoStatusEnum, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) motion_pose = MotionPose() motion_pose.pt = PoseType.JOINT motion_pose.joint.j1 = 0 motion_pose.joint.j2 = 0 motion_pose.joint.j3 = 0 motion_pose.joint.j4 = 0 motion_pose.joint.j5 = 0 motion_pose.joint.j6 = 0 # [ZH] 运动到指定点 # [EN] Move to specified position code = arm.motion.move_joint(motion_pose) if ret == StatusCodeEnum.OK: print("运动到指定点成功 / Move to specified position successful") else: print(f"运动到指定点失败,错误代码 / Move to specified position failed, error code: {ret.errmsg}") arm.disconnect() exit(1) while True: # [ZH] 获取伺服状态 # [EN] Get servo status state, ret = arm.get_servo_status() if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) if state == ServoStatusEnum.SERVO_IDLE: break else: time.sleep(1) # [ZH] 开始负载测定并获取结果 # [EN] Start payload identification and get result res, ret = arm.motion.payload.payload_identify(-1, 90) if ret == StatusCodeEnum.OK: print("负载识别成功 / Payload identification successful") else: print(f"负载识别失败,错误代码 / Payload identification failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.3-execution.html title: 4.3 机器人程序操作类 --- # 4.3 机器人程序操作类 [​](#4-3) ## 说明 [​](#说明) Execution 类提供机器人程序与运动任务的统一调度接口,可用于启动 / 停止 / 暂停 / 恢复示教程序、管理并发运行的任务列表,以及执行 BAS 脚本等自定义流程。配合 `Arm` 与 `Motion` 的连接和运动能力,Execution 负责在上位机侧触发和管控控制器中的程序流程。 ## 4.3.1 执行某个指定的程序 [​](#4-3-1) | 方法名 | **execution.start**( program\_name : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------- | | 描述 | 执行某个指定的程序 | | 请求参数 | program\_name : str 需要执行的程序名称 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.2 停止正在执行的程序 [​](#4-3-2) | 方法名 | **execution.stop**( program\_name : str = '') -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 停止正在执行的程序或停止机器人当前正在执行的运动 | | 请求参数 | program\_name : str 需要停止的程序名称,默认为空字符串,表示停止当前正在运行的程序或运动指令 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.3 返回所有正在运行的程序详细信息 [​](#4-3-3) | 方法名 | **execution.all\_running\_programs**() -> tuple\[list, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 返回所有正在运行的程序详细信息,信息包含线程 ID、程序名、xpath、程序状态以及程序类型 | | 请求参数 | 无参数 | | 返回值 | list: 运行的程序详细信息列表,列表中的每个元素包含 thread\_id 、 program\_name 、 xpath 、 program\_status 、 program\_type 等字段 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.4 暂停程序运行 [​](#4-3-4) | 方法名 | **execution.pause**( program\_name : str = '') -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------- | | 描述 | 暂停当前正在执行程序或暂停当前机器人正在执行的运动 | | 请求参数 | program\_name : str 需要暂停的程序名称,默认为空字符串,表示暂停当前正在运行的程序或运动指令 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.5 恢复程序运行 [​](#4-3-5) | 方法名 | **execution.resume**( program\_name : str = '') -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------- | | 描述 | 继续运行某个处于暂停状态的程序 | | 请求参数 | program\_name : str 需要继续运行的程序名称,默认为空字符串,表示继续运行当前处于暂停状态的程序或运动指令 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 execution/program\_execution.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 自定义程序使用示例 / Example of custom program usage """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connection successful") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) program_name = "test" # [ZH] 执行程序 # [EN] Execute program ret = arm.execution.start(program_name) if ret == StatusCodeEnum.OK: print("程序启动成功 / Program start successful") else: print(f"程序启动失败,错误代码 / Program start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有正在运行的程序 # [EN] Get all running programs programs_list, ret = arm.execution.all_running_programs() if ret == StatusCodeEnum.OK: print("获取运行程序列表成功 / Get running programs list successful") else: print(f"获取运行程序列表失败,错误代码 / Get running programs list failed, error code: {ret.errmsg}") arm.disconnect() exit(1) for program in programs_list: print(f"正在运行的程序名:{program}") time.sleep(2) # [ZH] 暂停程序 # [EN] Pause program ret = arm.execution.pause(program_name) if ret == StatusCodeEnum.OK: print("程序暂停成功 / Program pause successful") else: print(f"程序暂停失败,错误代码 / Program pause failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(2) # [ZH] 恢复程序 # [EN] Resume program ret = arm.execution.resume(program_name) if ret == StatusCodeEnum.OK: print("程序恢复成功 / Program resume successful") else: print(f"程序恢复失败,错误代码 / Program resume failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(2) # [ZH] 停止程序 # [EN] Stop program ret = arm.execution.stop(program_name) if ret == StatusCodeEnum.OK: print("程序停止成功 / Program stop successful") else: print(f"程序停止失败,错误代码 / Program stop failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.3.6 执行 BAS 脚本程序 [​](#4-3-6) | 方法名 | **execution.execute\_bas\_script**( `bas_script` : BasScript | list\[str\]) -> StatusCodeEnum | |------|---------------------------| | 描述 | 执行用户自定义的 BAS 脚本程序 | | 请求参数 | `bas_script` : [BasScript](./4.12-bas%5Fscript.html#4-12) 或 list \[str\] 用户自定义的 BAS 脚本程序 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | BAS 脚本程序的暂停、恢复、停止方法同普通程序 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): v7.6.0.0+ | execution/bas\_script\_execution.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: Bas脚本创建和使用示例 / Example of Bas script creation and usage """ from Agilebot import * # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 创建BasScript对象 # [EN] Create BasScript object bs = BasScript(name="bas_test") ret = bs.assign_value(AssignType.R, 1, OtherType.VALUE, 10) ret = bs.move_joint( pose_type=MovePoseType.PR, pose_index=1, speed_type=SpeedType.VALUE, speed_value=100, smooth_type=SmoothType.SMOOTH_DISTANCE, smooth_distance=200.5, ) ret = bs.wait_time(ValueType.VALUE, 10) if ret == StatusCodeEnum.OK: print("创建BasScript对象成功 / Create BasScript object successfully") else: print(f"创建BasScript对象失败,错误代码 / Create BasScript object failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 执行脚本 # [EN] Execute script ret = arm.execution.execute_bas_script(bs) if ret == StatusCodeEnum.OK: print("执行脚本成功 / Execute script successfully") else: print(f"执行脚本失败,错误代码 / Execute script failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 结束后断开机器人连接 # [EN] Disconnect from the robot after completion arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.4-program_pose.html title: 4.4 程序信息读写 --- # 4.4 程序信息读写 [​](#4-4) ## 说明 [​](#说明) ProgramPose 相关接口用于读取、写入和转换机器人示教程序中的位姿点位。通过 `program_pose` 模块可以定位到指定程序与点位序号,执行增删改查操作,并在笛卡尔 / 关节表示之间进行转换,便于在上位机场景下批量维护程序点位或做离线编辑。 ## 4.4.1 获取指定程序中指定位姿点值 [​](#4-4-1) | 方法名 | **program\_pose.read**( program\_name : str, index : int, program\_type : str = USER\_PROGRAM) -> tuple\[ProgramPose, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取一个程序中指定序号的 Pose 的值 | | 请求参数 | program\_name : str 指定程序名 index : int 指定 pose 的序号 program\_type : str 程序类型,默认为 USER\_PROGRAM | | 返回值 | [ProgramPose](./../3-struct/#3-17): 位姿信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.2 修改指定程序中指定位姿点值 [​](#4-4-2) | 方法名 | **program\_pose.write**( program\_name : str, index : int, value : ProgramPose, program\_type : str = USER\_PROGRAM) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 修改用户指定程序中指定序号的位姿点值 | | 请求参数 | program\_name : str 指定程序名 index : int 指定 pose 的序号 value : [ProgramPose](./../3-struct/#3-17) 需更新的新 pose 值 program\_type : str 程序类型,默认为 USER\_PROGRAM | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.3 获取指定程序中所有的位姿点 [​](#4-4-3) | 方法名 | **program\_pose.read\_all\_poses**( program\_name : str, program\_type : str = USER\_PROGRAM) -> tuple\[list\[ProgramPose\], StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取指定程序中所有的位姿点信息 | | 请求参数 | program\_name : str 指定程序名 program\_type : str 程序类型,默认为 USER\_PROGRAM | | 返回值 | list([ProgramPose](./../3-struct/#3-17)): 位姿信息列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.4 向程序中添加指定位姿点 [​](#4-4-4) | 方法名 | **program\_pose.add**( program\_name : str, index : int, value : ProgramPose, program\_type : str = USER\_PROGRAM) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 在程序中指定序号处新增一个位姿点,若编号已存在则返回错误 | | 请求参数 | program\_name : str 指定程序名 index : int 指定 pose 的序号 value : [ProgramPose](./../3-struct/#3-17) 需新增的 pose 值 program\_type : str 程序类型,默认为 USER\_PROGRAM | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.5 写入程序中一个或者多个机器人位姿点值 [​](#4-4-5) | 方法名 | **program\_pose.write\_poses**( program\_name : str, poses\_to\_update : list\[ProgramPose\]) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 写入一个程序中一个或者多个的机器人 Pose 点位值。注意:只能写入已经存在的点位,并不能新增点位 | | 请求参数 | program\_name : str 指定程序名 poses\_to\_update : list([ProgramPose](./../3-struct/#3-17)) 待更新的点位列表 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.4.6 机器人程序位姿点类型转换 [​](#4-4-6) | 方法名 | **ProgramPoses.convert\_pose**( pose : ProgramPose, from\_type : PoseType, to\_type : PoseType) -> tuple\[ProgramPose, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将程序中机器人位姿点在轴坐标和笛卡尔空间坐标之间转换 | | 请求参数 | pose : [ProgramPose](./../3-struct/#3-17) 要转换的 pose 值 from\_type : [PoseType](./../3-struct/#3-6) 转换前的类型 to\_type : [PoseType](./../3-struct/#3-6) 希望转换后的类型 | | 返回值 | [ProgramPose](./../3-struct/#3-17): 位姿信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 program\_pose.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 机器人位姿使用示例 / Example of robot pose usage """ from Agilebot import Arm, PoseType, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) program_name = "test_prog" # [ZH] 读取所有位姿 # [EN] Read all poses poses, ret = arm.program_pose.read_all_poses(program_name) if ret == StatusCodeEnum.OK: print("读取所有位姿成功 / Read all poses successfully") # [ZH] 打印位姿信息 # [EN] Print pose information for p in poses: print(f"位姿ID / Pose ID:{p.id}\n位姿名称 / Pose name:{p.name}") else: print(f"读取所有位姿失败,错误代码 / Read all poses failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取单个位姿 # [EN] Read a single pose pose, ret = arm.program_pose.read(program_name, 1) if ret == StatusCodeEnum.OK: print("读取单个位姿成功 / Read single pose successfully") # [ZH] 打印位姿信息 # [EN] Print pose information print( f"位姿ID / Pose ID:{pose.id}\n" f"位姿名称 / Pose name:{pose.name}\n" f"位姿类型 / Pose type:{pose.poseData.pt}\n" f"X:{pose.poseData.cartData.baseCart.position.x}\n" f"Y:{pose.poseData.cartData.baseCart.position.y}\n" f"Z:{pose.poseData.cartData.baseCart.position.z}\n" f"J1:{pose.poseData.joint.j1}\n" f"J2:{pose.poseData.joint.j2}\n" f"J3:{pose.poseData.joint.j3}\n" ) else: print(f"读取单个位姿失败,错误代码 / Read single pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 修改位姿 # [EN] Modify pose pose.comment = "SDK_TEST_COMMENT" ret = arm.program_pose.write(program_name, 1, pose) if ret == StatusCodeEnum.OK: print("修改位姿成功 / Modify pose successfully") else: print(f"修改位姿失败,错误代码 / Modify pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 转换位姿 # [EN] Convert pose converted_pose, ret = arm.program_pose.convert_pose(pose, PoseType.CART, PoseType.JOINT) if ret == StatusCodeEnum.OK: print("转换位姿成功 / Convert pose successfully") else: print(f"转换位姿失败,错误代码 / Convert pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印位姿信息 # [EN] Print pose information print( f"位姿ID / Pose ID:{converted_pose.id}\n" f"位姿名称 / Pose name:{converted_pose.name}\n" f"位姿类型 / Pose type:{converted_pose.poseData.pt}\n" f"X:{converted_pose.poseData.cartData.baseCart.position.x}\n" f"Y:{converted_pose.poseData.cartData.baseCart.position.y}\n" f"Z:{converted_pose.poseData.cartData.baseCart.position.z}\n" f"J1:{converted_pose.poseData.joint.j1}\n" f"J2:{converted_pose.poseData.joint.j2}\n" f"J3:{converted_pose.poseData.joint.j3}\n" ) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.5-signals.html title: 4.5 IO信号 --- # 4.5 IO 信号 [​](#4-5) ## 说明 [​](#说明) Signals 模块提供对控制器 IO 的统一读写接口,涵盖数字 / 模拟输入输出以及多路批量操作和定时触发能力。通过 `signals` 可以读取当前信号状态、批量写入 DO/RO/GO 等端口或根据时间间隔触发脉冲,用于与外部夹爪、传感器或生产线设备的联动。 ## 4.5.1 读取指定类型指定端口 IO 的值 [​](#4-5-1) | 方法名 | **signals.read**( signal\_type : SignalType, index : int) -> tuple\[float, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------------------- | | 描述 | 读取指定类型指定端口 IO 的值(支持 DI/DO/UI/UO/RI/RO/GI/GO/TAI/TDI/TDO/AI/AO) | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要读取的 IO 类型 index : int 要读取的 IO 的序号,从 1 开始 | | 返回值 | float: IO 值,DI/DO/RI/RO/TAI/TDI/TDO/AI/AO 返回 0 或 1,GI/GO 返回整型数值(负数表示 Off 状态) [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | UI/UO 只能读不能写 | ## 4.5.2 写指定类型指定端口 IO 的值 [​](#4-5-2) | 方法名 | **signals.write**( signal\_type : SignalType, index : int, value : float) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 写指定类型指定端口 IO 的值,当前仅支持 DO/RO/GO/TDO/AO | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要写入的 IO 类型 index : int 要写入的 IO 的序号,从 1 开始 value : float 要写入的值,DO/RO/TDO 仅允许 0 或 1,GO 为整型数值,AO 接受浮点模拟量 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 signals/signals.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 单信号IO读写示例 / Example of single-signal I/O reading and writing """ from Agilebot import Arm, SignalType, SignalValue, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取IO # [EN] Read IO do_value, ret = arm.signals.read(SignalType.DO, 1) if ret == StatusCodeEnum.OK: print("读取IO成功 / Read IO successfully") print(f"DO 1 状态 / DO 1 status:{do_value}") else: print(f"读取IO失败,错误代码 / Read IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 写入IO # [EN] Write IO ret = arm.signals.write(SignalType.DO, 1, SignalValue.ON) if ret == StatusCodeEnum.OK: print("写入IO成功 / Write IO successfully") else: print(f"写入IO失败,错误代码 / Write IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.5.3 批量获取 DO (数字输出) 端口值 [​](#4-5-3) | 方法名 | **signals.multi\_read**( signal\_type : SignalType, io\_list : list) -> tuple\[list, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------------- | | 描述 | 批量获取 DO (数字输出) 端口值 | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要读取的 IO 类型,当前只支持 DO io\_list : list 包含要读取的端口号,不能为空 | | 返回值 | list: 控制器返回的端口值列表,形式为 \[port1, state1, port2, state2, ...\] [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | UI/UO 只能读不能写 | ## 4.5.4 多路设置 DO (数字输出) 信号 [​](#4-5-4) | 方法名 | **signals.multi\_write**( signal\_type : SignalType, io\_list : list) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 多路设置 DO (数字输出) 信号 | | 请求参数 | signal\_type : [SignalType](./../3-struct/#3-28) 要写入的 IO 类型,当前只支持 DO io\_list : list 包含端口号和端口值的列表,例如 \[port1, state1, port2, state2\],列表长度必须为偶数且大于 0 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 signals/multi\_read\_write.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 多信号IO读写示例 / Example of multi-signal I/O reading and writing """ from Agilebot import Arm, SignalType, SignalValue, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取IO # [EN] Read IO do_value, ret = arm.signals.multi_read(SignalType.DO, [1, 2]) if ret == StatusCodeEnum.OK: print("读取IO成功 / Read IO successfully") print(f"DO 1 状态 / DO 1 status:{do_value}") else: print(f"读取IO失败,错误代码 / Read IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 写入IO # [EN] Write IO ret = arm.signals.multi_write(SignalType.DO, [1, SignalValue.ON, 2, SignalValue.ON]) if ret == StatusCodeEnum.OK: print("写入IO成功 / Write IO successfully") else: print(f"写入IO失败,错误代码 / Write IO failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.5.5 根据时间间隔触发多路 IO [​](#4-5-5) | 方法名 | **signals.trigger\_io\_with\_intervals**( in\_port : int = -1, intervals : list, out\_ports : list, pulse\_duration : int) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 基于一组时间间隔触发多路输出端口,可选地在检测到某个 DI 输入口上升沿后开始计时 | | 请求参数 | in\_port : int 输入端口号,默认为 -1(表示无需等待输入触发) intervals : list 以毫秒为单位的触发时间间隔列表 out\_ports : list 要触发的输出端口号列表 pulse\_duration : int 输出脉冲持续时间(毫秒) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/1-python/4-methods/4.6-register.html title: 4.6 寄存器信息 --- # 4.6 寄存器信息 [​](#4-6) ## 说明 [​](#说明) Register 模块提供上位机读写控制器寄存器的统一入口,覆盖数值寄存器 R、运动寄存器 MR、字符串寄存器 SR、位姿寄存器 PR 以及 Modbus 寄存器等多种类型。通过 `register` 接口可以批量读取、写入或删除各类寄存器数据,便于在程序运行时传递参数、同步状态或与外部系统共享配置。 ## 4.6.1 R 数值寄存器相关操作 [​](#4-6-1) ### 4.6.1.1 读取一个 R 寄存器的值 [​](#4-6-1-1) | 方法名 | **register.read\_R**( index : int) -> tuple\[float, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------- | | 描述 | 读取一个 R 数值寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | float: 寄存器值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.1.2 写入一个 R 寄存器的值 [​](#4-6-1-2) | 方法名 | **register.write\_R**( index : int, value : float) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------- | | 描述 | 写入一个 R 数值寄存器的值 | | 请求参数 | index : int 要写入的 R 寄存器编号 value : float 要写入的寄存器数值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.1.3 删除一个 R 寄存器 [​](#4-6-1-3) | 方法名 | **register.delete\_R**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------ | | 描述 | 删除指定的 R 数值寄存器 | | 请求参数 | index : int 要删除的 R 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) registers/R.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: R寄存器读写示例 / Example of reading and writing the R register """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加R寄存器 # [EN] Add R register ret = arm.register.write_R(5, 8.6) if ret == StatusCodeEnum.OK: print("写入R寄存器成功 / Write R register successful") else: print(f"写入R寄存器失败,错误代码 / Write R register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取R寄存器 # [EN] Read R register res, ret = arm.register.read_R(5) if ret == StatusCodeEnum.OK: print("读取R寄存器成功 / Read R register successful") else: print(f"读取R寄存器失败,错误代码 / Read R register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print the result print(f"R寄存器值 / R register value: {res}") # [ZH] 删除R寄存器 # [EN] Delete R register ret = arm.register.delete_R(5) if ret == StatusCodeEnum.OK: print("删除R寄存器成功 / Delete R register successful") else: print(f"删除R寄存器失败,错误代码 / Delete R register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.2 MR 运动寄存器相关操作 [​](#4-6-2) ### 4.6.2.1 读取一个 MR 寄存器的值 [​](#4-6-2-1) | 方法名 | **register.read\_MR**( index : int) -> tuple\[int, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 读取一个 MR 运动寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.2.2 写入一个 MR 寄存器的值 [​](#4-6-2-2) | 方法名 | **register.write\_MR**( index : int, value : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 写入一个 MR 运动寄存器的值 | | 请求参数 | index : int 要写入的 MR 寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.2.3 删除一个 MR 寄存器 [​](#4-6-2-3) | 方法名 | **register.delete\_MR**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 删除指定的 MR 运动寄存器 | | 请求参数 | index : int 要删除的 MR 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-1) registers/MR.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: MR寄存器读写示例 / Example of reading and writing MR Registers """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加MR寄存器 # [EN] Add MR register ret = arm.register.write_MR(5, 8) if ret == StatusCodeEnum.OK: print("写入MR寄存器成功 / Write MR register successful") else: print(f"写入MR寄存器失败,错误代码 / Write MR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取MR寄存器 # [EN] Read MR register res, ret = arm.register.read_MR(5) if ret == StatusCodeEnum.OK: print("读取MR寄存器成功 / Read MR register successful") else: print(f"读取MR寄存器失败,错误代码 / Read MR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print the result print(f"MR寄存器值 / MR register value: {res}") # [ZH] 删除MR寄存器 # [EN] Delete MR register ret = arm.register.delete_MR(5) if ret == StatusCodeEnum.OK: print("删除MR寄存器成功 / Delete MR register successful") else: print(f"删除MR寄存器失败,错误代码 / Delete MR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.3 SR 字符串寄存器相关操作 [​](#4-6-3) ### 4.6.3.1 读取一个 SR 寄存器的值 [​](#4-6-3-1) | 方法名 | **register.read\_SR**( index : int) -> tuple\[str, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 读取一个 SR 字符串寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | str: 寄存器值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.3.2 写入一个 SR 寄存器的值 [​](#4-6-3-2) | 方法名 | **register.write\_SR**( index : int, value : str) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 写入一个 SR 字符串寄存器的值 | | 请求参数 | index : int 要写入的 SR 寄存器编号 value : str 要写入的寄存器字符串值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.3.3 删除一个 SR 寄存器 [​](#4-6-3-3) | 方法名 | **register.delete\_SR**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 删除指定的 SR 字符串寄存器 | | 请求参数 | index : int 要删除的 SR 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-2) registers/SR.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: SR寄存器读写示例 / Example of reading and writing SR registers """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加SR寄存器 # [EN] Add SR register ret = arm.register.write_SR(5, "pytest") if ret == StatusCodeEnum.OK: print("写入SR寄存器成功 / Write SR register successful") else: print(f"写入SR寄存器失败,错误代码 / Write SR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取SR寄存器 # [EN] Read SR register res, ret = arm.register.read_SR(5) if ret == StatusCodeEnum.OK: print("读取SR寄存器成功 / Read SR register successful") else: print(f"读取SR寄存器失败,错误代码 / Read SR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print the result print(f"SR寄存器值 / SR register value: {res}") # [ZH] 删除SR寄存器 # [EN] Delete SR register ret = arm.register.delete_SR(5) if ret == StatusCodeEnum.OK: print("删除SR寄存器成功 / Delete SR register successful") else: print(f"删除SR寄存器失败,错误代码 / Delete SR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.4 PR 位姿寄存器相关操作 [​](#4-6-4) ### 4.6.4.1 读取一个 PR 寄存器的值 [​](#4-6-4-1) | 方法名 | **register.read\_PR**( index : int) -> tuple\[PoseRegister, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------- | | 描述 | 读取一个 PR 位姿寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | [PoseRegister](./../3-struct/#3-19): PR 寄存器位姿数据 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.4.2 写入一个 PR 寄存器的值 [​](#4-6-4-2) | 方法名 | **register.write\_PR**( value : PoseRegister) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 写入一个 PR 位姿寄存器的值 | | 请求参数 | value : [PoseRegister](./../3-struct/#3-19) 要写入的 PR 寄存器位姿数据 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.1+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.4.3 删除一个 PR 寄存器 [​](#4-6-4-3) | 方法名 | **register.delete\_PR**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 删除指定的 PR 位姿寄存器 | | 请求参数 | index : int 要删除的 PR 寄存器编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码-3) registers/PR.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: PR寄存器读写示例 / Example of reading and writing to the PR register """ from Agilebot import Arm, PoseRegister, PoseType, Posture, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 添加PR寄存器 # [EN] Add PR register # [ZH] 创建位姿 # [EN] Create pose pose_register = PoseRegister() posture = Posture() posture.arm_back_front = 1 pose_register.poseRegisterData.cartData.posture = posture pose_register.id = 5 pose_register.poseRegisterData.pt = PoseType.CART pose_register.poseRegisterData.cartData.position.x = 100 pose_register.poseRegisterData.cartData.position.y = 200 pose_register.poseRegisterData.cartData.position.z = 300 ret = arm.register.write_PR(pose_register) if ret == StatusCodeEnum.OK: print("写入PR寄存器成功 / Write PR register successful") else: print(f"写入PR寄存器失败,错误代码 / Write PR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取PR寄存器 # [EN] Read PR register res, ret = arm.register.read_PR(5) if ret == StatusCodeEnum.OK: print("读取PR寄存器成功 / Read PR register successful") else: print(f"读取PR寄存器失败,错误代码 / Read PR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print( f"位姿寄存器ID / Pose register ID: {res.id}\n" f"位姿类型 / Pose type: {res.poseRegisterData.pt}\n" f"X / X: {res.poseRegisterData.cartData.position.x}\n" f"Y / Y: {res.poseRegisterData.cartData.position.y}\n" f"Z / Z: {res.poseRegisterData.cartData.position.z}\n" f"C / C: {res.poseRegisterData.cartData.position.c}\n" f"B / B: {res.poseRegisterData.cartData.position.b}\n" f"A / A: {res.poseRegisterData.cartData.position.a}\n" ) # [ZH] 删除PR寄存器 # [EN] Delete PR register ret = arm.register.delete_PR(5) if ret == StatusCodeEnum.OK: print("删除PR寄存器成功 / Delete PR register successful") else: print(f"删除PR寄存器失败,错误代码 / Delete PR register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.6.5 Modbus 寄存器(MH 保持寄存器、MI 输入寄存器) [​](#4-6-5) ### 4.6.5.1 读取一个 MH 寄存器的值 [​](#4-6-5-1) | 方法名 | **register.read\_MH**( index : int) -> tuple\[int, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 读取一个 MH 保持寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.5.2 写入一个 MH 寄存器的值 [​](#4-6-5-2) | 方法名 | **register.write\_MH**( index : int, value : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 写入一个 MH 保持寄存器的值 | | 请求参数 | index : int 要写入的 MH 寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.5.3 读取一个 MI 寄存器的值 [​](#4-6-5-3) | 方法名 | **register.read\_MI**( index : int) -> tuple\[int, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 读取一个 MI 输入寄存器的值 | | 请求参数 | index : int 要读取的寄存器编号 | | 返回值 | int: 寄存器值 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 4.6.5.4 写入一个 MI 寄存器的值 [​](#4-6-5-4) | 方法名 | **register.write\_MI**( index : int, value : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 写入一个 MI 输入寄存器的值 | | 请求参数 | index : int 要写入的 MI 寄存器编号 value : int 要写入的寄存器数值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ### 示例代码 [​](#示例代码-4) registers/MH\_MI.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: MH寄存器及MI寄存器读写示例 / Example of reading and writing to the MH register and MI register """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取MH寄存器 # [EN] Read MH register res, ret = arm.register.read_MH(1) if ret == StatusCodeEnum.OK: print("读取MH寄存器成功 / Read MH register successful") else: print(f"读取MH寄存器失败,错误代码 / Read MH register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"MH寄存器 / MH register: {res}") # [ZH] 写入MH寄存器 # [EN] Write MH register ret = arm.register.write_MH(1, 16) if ret == StatusCodeEnum.OK: print("写入MH寄存器成功 / Write MH register successful") else: print(f"写入MH寄存器失败,错误代码 / Write MH register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取MI寄存器 # [EN] Read MI register res, ret = arm.register.read_MI(1) if ret == StatusCodeEnum.OK: print("读取MI寄存器成功 / Read MI register successful") else: print(f"读取MI寄存器失败,错误代码 / Read MI register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 打印结果 # [EN] Print result print(f"MI寄存器 / MI register: {res}") # [ZH] 写入MI寄存器 # [EN] Write MI register ret = arm.register.write_MI(1, 18) if ret == StatusCodeEnum.OK: print("写入MI寄存器成功 / Write MI register successful") else: print(f"写入MI寄存器失败,错误代码 / Write MI register failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.7-trajectory.html title: 4.7 轨迹控制 --- # 4.7 轨迹控制 [​](#4-7) ## 说明 [​](#说明) Trajectory 模块提供离线轨迹执行、轨迹 / 路径录制、转换与复现的完整流程接口,可设置待执行的轨迹文件、驱动机器人按轨迹启动 / 停止、在控制器中完成 CSV→trajectory 格式转换,并支持在上位机记录轨迹、查询轨迹状态及配置路径规划器参数,方便实现复杂轨迹复现与定制运动。 ## 4.7.1 设置待执行的离线轨迹文件 [​](#4-7-1) | 方法名 | **trajectory.set\_offline\_trajectory\_file**( path : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置待执行的离线轨迹文件 | | 请求参数 | path : str 设置离线轨迹文件程序名,如示例文件 A.trajectoryA.trajectory 轨迹文件格式为**文本文件**,说明如下: \- 第 1 行:6 代表 6 个轴,0.001 代表两个点之间间隔 1ms ,8093 代表一共 8093 个轨迹点 。 \- 第二行:表示 6 个轴的起始位置 。 \- 3-8095 行:表示轨迹点,包括 6 个轴的位置 、速度 、加速度 、力矩前馈、do 端口、do 端口的值 \- do\_port 代表使用的 do 端口(取值范围 1-24)。 \- do\_port 为 - 1, 表示在该位置不会触发 IO 信号。 \- do\_port 为 1, do\_state 为 1, 则表明 do1 端口会在该位置触发 ON 信号 \- do\_port 为 1, do\_state 为 0, 则表明 do1 端口会在该位置触发 OFF 信号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.2 让机器人以安全速度移动到离线轨迹中的起始点 [​](#4-7-2) | 方法名 | **trajectory.prepare\_offline\_trajectory**() -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 让机器人以安全速度移动到离线轨迹中的起始点 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.3 让机器人开始执行离线轨迹文件 [​](#4-7-3) | 方法名 | **trajectory.execute\_offline\_trajectory**() -> StatusCodeEnum | | ---------- | --------------------------------------------------------------- | | 描述 | 让机器人开始执行离线轨迹程序 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.4 轨迹文件转换功能 [​](#4-7-4) | 方法名 | **trajectory.transform\_csv\_to\_trajectory**( file\_name : str, separator : str = " ", io\_flag : str = "2") | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将轨迹 csv 文件转换成 trajectory 格式的轨迹文件并存放在控制柜的轨迹文件目录上 | | 请求参数 | file\_name : str CSV 格式轨迹文件名,无需加 .csv 后缀 separator : 空格或逗号。参数为空格时,转换生成的文件为 .trajectory 后缀;参数为逗号时,转换生成的文件为 .csv 后缀 io\_flag : 当为 1 时,生成的 IO 信息使用默认值( do\_port = -1 , do\_state = 0 );当为 2 时,使用用户指定的 IO 信息 | | 返回值 | str:转换后轨迹文件路径 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.5 查询轨迹文件转换状态 [​](#4-7-5) | 方法名 | **trajectory.check\_transform\_status**( file\_name : str) -> tuple\[TransformStatusEnum, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------------- | | 描述 | 查询轨迹文件转换的当前状态 | | 请求参数 | file\_name : str transform\_csv\_to\_trajectory 接口返回的轨迹文件路径 | | 返回值 | [TransformStatusEnum](./../3-struct/#3-20): 转换状态 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) trajectory/offline\_trajectory.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 离线轨迹使用示例 / Example of offline trajectory usage """ import time from Agilebot import Arm, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置离线轨迹文件 # [EN] Set the offline trajectory file ret = arm.trajectory.set_offline_trajectory_file("test_torque.trajectory") if ret == StatusCodeEnum.OK: print("设置离线轨迹文件成功 / Set offline trajectory file successful") else: print(f"设置离线轨迹文件失败,错误代码 / Set offline trajectory file failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 准备进行离线轨迹运行 # [EN] Prepare for offline trajectory execution ret = arm.trajectory.prepare_offline_trajectory() if ret == StatusCodeEnum.OK: print("准备离线轨迹运行成功 / Prepare offline trajectory execution successful") else: print(f"准备离线轨迹运行失败,错误代码 / Prepare offline trajectory execution failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 等待控制器到位 # [EN] Wait for the controller to be ready while True: robot_status, ret = arm.get_robot_status() if ret == StatusCodeEnum.OK: print("获取机器人状态成功 / Get robot status successful") else: print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"robot_status arm: {robot_status}") servo_status, ret = arm.get_servo_status() if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"伺服状态 / Servo status: {servo_status}") if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE: break time.sleep(2) # [ZH] 执行离线轨迹 # [EN] Execute the offline trajectory ret = arm.trajectory.execute_offline_trajectory() if ret == StatusCodeEnum.OK: print("执行离线轨迹成功 / Execute offline trajectory successful") else: print(f"执行离线轨迹失败,错误代码 / Execute offline trajectory failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.7.6 开始记录轨迹 [​](#4-7-6) | 方法名 | **trajectory.trajectory\_record\_begin**( name : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------- | | 描述 | 让机器人开始记录轨迹 | | 请求参数 | name : 设置轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.7 结束记录轨迹 [​](#4-7-7) | 方法名 | **trajectory.trajectory\_record\_finish**( name : str) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------ | | 描述 | 让机器人结束记录轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.8 开始播放轨迹 [​](#4-7-8) | 方法名 | **trajectory.trajectory\_replay\_start**( name : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------- | | 描述 | 让机器人开始播放轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.9 结束播放轨迹 [​](#4-7-9) | 方法名 | **trajectory.trajectory\_replay\_stop**( name : str) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------- | | 描述 | 让机器人结束播放轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.10 删除轨迹 [​](#4-7-10) | 方法名 | **trajectory.trajectory\_record\_delete**( name : str) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------ | | 描述 | 删除机器人中指定轨迹 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.11 获取轨迹复现中的轨迹列表 [​](#4-7-11) | 方法名 | **trajectory.get\_trajectory\_record\_list**() -> tuple\[list\[str\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 获取轨迹复现中的轨迹列表 | | 请求参数 | 无 | | 返回值 | list \[str\]: 轨迹列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.12 获取轨迹复现中的轨迹起始位置 [​](#4-7-12) | 方法名 | **trajectory.get\_trajectory\_record\_start\_pose**( name : str) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 获取轨迹复现中的轨迹起始位置 | | 请求参数 | name : 轨迹程序名 | | 返回值 | [MotionPose](./../3-struct/#3-12): 轨迹起始位置 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 trajectory/trajectory\_record.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 轨迹记录相关使用示例 / Example of real-time trajectory records usage """ import time from Agilebot import Arm, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum from Agilebot.IR.A.hardware_state import HardwareState, HWState # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 订阅轨迹记录状态 # [EN] Subscribe to the trajectory record status hw_state = HardwareState("10.27.1.254") hw_state.subscribe(topic_list=[HWState.TOPIC_TRAJECTORY_RECORDS_STATUS]) # [ZH] 开始记录轨迹 # [EN] Start recording trajectory ret = arm.trajectory.trajectory_record_begin("test") if ret == StatusCodeEnum.OK: print("开始轨迹记录成功 / Start trajectory record successful") else: print(f"开始轨迹记录失败,错误代码 / Start trajectory record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(10) res = hw_state.recv() print(f"轨迹记录状态 / Trajectory record status: {res}") # [ZH] 结束记录轨迹 # [EN] End recording trajectory ret = arm.trajectory.trajectory_record_finish("test") if ret == StatusCodeEnum.OK: print("结束轨迹记录成功 / End trajectory record successful") else: print(f"结束轨迹记录失败,错误代码 / End trajectory record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res = hw_state.recv() print(f"轨迹记录状态 / Trajectory record status: {res}") # [ZH] 获取轨迹列表 # [EN] Get trajectory list record_list, ret = arm.trajectory.get_trajectory_record_list() if ret == StatusCodeEnum.OK: print("获取轨迹记录列表成功 / Get trajectory record list successful") else: print(f"获取轨迹记录列表失败,错误代码 / Get trajectory record list failed, error code: {ret.errmsg}") arm.disconnect() exit(1) assert "test" in record_list # [ZH] 获取轨迹起始位姿 # [EN] Get trajectory start pose pose, ret = arm.trajectory.get_trajectory_record_start_pose("test") if ret == StatusCodeEnum.OK: print("获取轨迹起始位姿成功 / Get trajectory start pose successful") else: print(f"获取轨迹起始位姿失败,错误代码 / Get trajectory start pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 移动到起始位姿 # [EN] Move to the start pose ret = arm.motion.move_joint(pose) if ret == StatusCodeEnum.OK: print("关节运动成功 / Joint motion successful") else: print(f"关节运动失败,错误代码 / Joint motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 等待控制器到位 # [EN] Wait for the controller to be ready while True: robot_status, ret = arm.get_robot_status() if ret == StatusCodeEnum.OK: print("获取机器人状态成功 / Get robot status successful") else: print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"robot_status arm: {robot_status}") servo_status, ret = arm.get_servo_status() if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"伺服状态 / Servo status: {servo_status}") if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE: break time.sleep(2) # [ZH] 开始回放轨迹 # [EN] Start replay trajectory ret = arm.trajectory.trajectory_replay_start("test") if ret == StatusCodeEnum.OK: print("开始轨迹回放成功 / Start trajectory replay successful") else: print(f"开始轨迹回放失败,错误代码 / Start trajectory replay failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(5) # [ZH] 停止回放轨迹 # [EN] Stop replay trajectory ret = arm.trajectory.trajectory_replay_stop("test") if ret == StatusCodeEnum.OK: print("停止轨迹回放成功 / Stop trajectory replay successful") else: print(f"停止轨迹回放失败,错误代码 / Stop trajectory replay failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 删除轨迹 # [EN] Delete trajectory ret = arm.trajectory.trajectory_record_delete("test") if ret == StatusCodeEnum.OK: print("删除轨迹记录成功 / Delete trajectory record successful") else: print(f"删除轨迹记录失败,错误代码 / Delete trajectory record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.7.13 开始记录轨迹 / 路径 [​](#4-7-13) | 方法名 | **trajectory.path\_record\_begin**( name : str, comment : str, param : float, angle : float = 1) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 开始轨迹表(_.traj_)或路径表(_.path_)的记录。 | | 请求参数 | name :轨迹 / 路径文件名,必须以 .traj 或 .path 结尾。 comment :轨迹 / 路径的描述信息。 param :\- 路径表(_.path_):移动距离阈值(mm)。\- 轨迹表(_.traj_):记录间隔时间(ms)。 angle :旋转角度阈值(°),仅当 name 为路径表(_.path_)时生效。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | ## 4.7.14 结束记录轨迹 / 路径 [​](#4-7-14) | 方法名 | **trajectory.path\_record\_finish**() -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 结束当前轨迹表 / 路径表的记录。 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | ## 4.7.15 获取轨迹 / 路径起始姿态 [​](#4-7-15) | 方法名 | **trajectory.get\_path\_start\_pose**( name : str) -> tuple\[MotionPose, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------- | | 描述 | 获取指定轨迹 / 路径文件的起始姿态。 | | 请求参数 | name :轨迹 / 路径文件名。 | | 返回值 | MotionPose 起始姿态,[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | ## 4.7.16 获取轨迹 / 路径状态 [​](#4-7-16) | 方法名 | **trajectory.get\_path\_state**( path\_list : list\[str\]) -> tuple\[dict\[str, int\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 批量查询轨迹 / 路径文件当前状态。 | | 请求参数 | path\_list :待查询的轨迹 / 路径文件名列表。 | | 返回值 | dict\[str, int\] 文件名→状态码映射,[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | ## 4.7.17 设置路径规划参数 [​](#4-7-17) | 方法名 | **trajectory.set\_path\_planner\_parameter**( transition\_time : float, scaling\_factor : float) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置路径规划器参数,影响运动平滑性与速度 / 加速度分配策略。 | | 请求参数 | transition\_time :过渡时长,0\~1。数值越大,加减速越柔和。 scaling\_factor :路径参数 _s_ 的重新分布权重,0\~1:\- 0:每段匀速分配(等长标度)。\- 1:按最大位移线性分配(等速缩放)。\- 0.5:等加速度缩放。\- 0.33:等急动度缩放(综合平衡)。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | ## 4.7.18 获取路径规划参数 [​](#4-7-18) | 方法名 | **trajectory.get\_path\_planner\_parameter**() -> tuple\[float, float, StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------------------- | | 描述 | 读取当前路径规划器参数。 | | 请求参数 | 无 | | 返回值 | transition\_time :过渡时长,0\~1。 scaling\_factor :路径参数 _s_ 的重新分布权重,0\~1。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | ## 4.7.19 沿轨迹 / 路径运动 [​](#4-7-19) | 方法名 | **trajectory.move\_path**( name : str, vel : float = 100, acc : float = 1) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------- | | 描述 | 让机器人末端沿指定轨迹 / 路径文件运动。 | | 请求参数 | name :轨迹 / 路径文件名。 vel :末端速度,0\~5000 mm/s。 acc :加速度倍数,0\~1.2。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.8.0.0+ 工业 (Bronze): 不支持 | 示例代码 trajectory/path\_record.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 路径记录相关使用示例 / Example of usage related to path records """ import time from Agilebot import Arm, MoveMode, RobotStatusEnum, ServoStatusEnum, StatusCodeEnum # [ZH] 初始化机械臂并连接到指定IP地址 # [EN] Initialize the robotic arm and connect to the specified IP address arm = Arm() ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 开始记录轨迹,指定文件名、轨迹名、记录模式和覆盖选项 # [EN] Start trajectory recording, specifying filename, trajectory name, recording mode and overwrite option ret = arm.trajectory.path_record_begin("test_path.path", "Path Test", 10, 1) if ret == StatusCodeEnum.OK: print("开始路径记录成功 / Start path record successful") else: print(f"开始路径记录失败,错误代码 / Start path record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 检查记录状态,传入轨迹文件名列表 # [EN] Check recording status, passing in trajectory filename list state, ret = arm.trajectory.get_path_state(["test_path.path"]) if ret == StatusCodeEnum.OK: print("获取路径状态成功 / Get path state successful") else: print(f"获取路径状态失败,错误代码 / Get path state failed, error code: {ret.errmsg}") arm.disconnect() exit(1) if state["test_path.path"] == 0: print("路径表记录中 / Path table recording in progress") # [ZH] 示教运动 # [EN] Teaching motion ret = arm.jogging.move(3, MoveMode.Continuous) if ret == StatusCodeEnum.OK: print("点动运动成功 / Jogging movement successful") else: print(f"点动运动失败,错误代码 / Jogging movement failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # 等待3秒,让机械臂持续运动 time.sleep(2) # 停止机械臂运动 arm.jogging.stop() time.sleep(2) ret = arm.jogging.move(-3, MoveMode.Continuous) if ret == StatusCodeEnum.OK: print("点动运动成功 / Jogging movement successful") else: print(f"点动运动失败,错误代码 / Jogging movement failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # 等待3秒,让机械臂持续运动 time.sleep(2) # 停止机械臂运动 arm.jogging.stop() time.sleep(2) # [ZH] 结束轨迹记录 # [EN] Finish trajectory recording ret = arm.trajectory.path_record_finish() if ret == StatusCodeEnum.OK: print("结束路径记录成功 / Finish path record successful") else: print(f"结束路径记录失败,错误代码 / Finish path record failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 检查记录状态,传入轨迹文件名列表 # [EN] Check recording status, passing in trajectory filename list state, ret = arm.trajectory.get_path_state(["test_path.path"]) if ret == StatusCodeEnum.OK: print("获取路径状态成功 / Get path state successful") else: print(f"获取路径状态失败,错误代码 / Get path state failed, error code: {ret.errmsg}") arm.disconnect() exit(1) if state["test_path.path"] == 1: print("路径表记录完成 / Path table recording completed") # [ZH] 获取记录轨迹的起始位置姿态 # [EN] Get the starting position pose of the recorded trajectory pose, ret = arm.trajectory.get_path_start_pose("test_path.path") if ret == StatusCodeEnum.OK: print("获取路径起始位姿成功 / Get path start pose successful") else: print(f"获取路径起始位姿失败,错误代码 / Get path start pose failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 移动到起始位姿 # [EN] Move to the start pose ret = arm.motion.move_joint(pose) if ret == StatusCodeEnum.OK: print("关节运动成功 / Joint motion successful") else: print(f"关节运动失败,错误代码 / Joint motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 等待控制器到位 # [EN] Wait for the controller to be ready while True: robot_status, ret = arm.get_robot_status() # [ZH] 检查机器人状态获取是否成功 # [EN] Check if robot status acquisition is successful if ret == StatusCodeEnum.OK: print("获取机器人状态成功 / Get robot status successful") else: print(f"获取机器人状态失败,错误代码 / Get robot status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"robot_status arm: {robot_status}") servo_status, ret = arm.get_servo_status() # [ZH] 检查伺服状态获取是否成功 # [EN] Check if servo status acquisition is successful if ret == StatusCodeEnum.OK: print("获取伺服状态成功 / Get servo status successful") else: print(f"获取伺服状态失败,错误代码 / Get servo status failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print(f"servo status arm: {servo_status}") if robot_status == RobotStatusEnum.ROBOT_IDLE and servo_status == ServoStatusEnum.SERVO_IDLE: break time.sleep(2) # [ZH] 设置轨迹规划参数(速度比例和加速度比例) # [EN] Set trajectory planning parameters (velocity ratio and acceleration ratio) ret = arm.trajectory.set_path_planner_parameter(0.5, 0.3333333) if ret == StatusCodeEnum.OK: print("设置路径规划参数成功 / Set path planner parameter successful") else: print(f"设置路径规划参数失败,错误代码 / Set path planner parameter failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取轨迹规划参数以验证设置是否成功 # [EN] Get trajectory planning parameters to verify if the setting is successful param1, param2, ret = arm.trajectory.get_path_planner_parameter() if ret == StatusCodeEnum.OK: print("获取路径规划参数成功 / Get path planner parameter successful") else: print(f"获取路径规划参数失败,错误代码 / Get path planner parameter failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 移动到记录的轨迹,指定轨迹文件名、速度和模式 # [EN] Move to the recorded trajectory, specifying trajectory filename, speed and mode ret = arm.trajectory.move_path("test_path.path", 2000, 1) if ret == StatusCodeEnum.OK: print("路径运动成功 / Path motion successful") else: print(f"路径运动失败,错误代码 / Path motion failed, error code: {ret.errmsg}") arm.disconnect() exit(1) time.sleep(3) # [ZH] 断开与机械臂的连接 # [EN] Disconnect from the robotic arm arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- url: /zh/1-python/4-methods/4.8-alarm.html title: 4.8 报警信息 --- # 4.8 报警信息 [​](#4-8) ## 说明 [​](#说明) Alarm 模块提供对机器人报警信息的读取、复位和查询功能,用于监控和处理机器人运行时可能出现的异常情况。通过 `alarm` 接口可以查询当前是否有活动报警、获取所有报警信息、复位报警等操作,帮助开发者及时发现并处理机器人异常状态。 ## 4.8.1 复位报警 [​](#4-8-1) | 方法名 | **alarm.reset**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 复位当前错误 / 报警 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.8.2 获取所有活动报警 [​](#4-8-2) | 方法名 | **alarm.get\_all\_active\_alarms**( language : LanguageType) -> tuple\[list, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 获取所有当前活动的报警 | | 请求参数 | language : LanguageType 输出语言,可选: LanguageType.English 、 LanguageType.Chinese | | 返回值 | list: 活动报警条目列表 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.8.3 获取最高优先级报警 [​](#4-8-3) | 方法名 | **alarm.get\_top\_alarm**() -> tuple\[ROBOT\_ALARM, StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------- | | 描述 | 获取当前最高优先级的报警 | | 请求参数 | 无参数 | | 返回值 | ROBOT\_ALARM : 最高优先级报警 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) alarm.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 告警功能使用示例 / Example of using the alarm function """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有的活动的报警 # [EN] Get all active alarms alarms, ret = arm.alarm.get_all_active_alarms() if ret == StatusCodeEnum.OK: print("获取报警信息成功 / Get alarm information successfully") for alarm in alarms: print(alarm) else: print(f"获取报警信息失败,错误代码 / Failed to get alarm information, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 获取所有的活动的报警 # [EN] Get all active alarms alarm, ret = arm.alarm.get_top_alarm() if ret == StatusCodeEnum.OK: print("获取报警信息成功 / Get alarm information successfully") for alarm in alarm: print(alarm) else: print(f"获取报警信息失败,错误代码 / Failed to get alarm information, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 重置报警 # [EN] Reset alarms ret = arm.alarm.reset() if ret == StatusCodeEnum.OK: print("报警重置成功 / Alarm reset successfully") else: print(f"报警重置失败,错误代码 / Alarm reset failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.9-file_manager.html title: 4.9 文件管理 --- # 4.9 文件管理 [​](#4-9) ## 说明 [​](#说明) FileManager 用于在上位机和机器人控制器之间上传、下载、删除或搜索程序、轨迹及临时文件等资源。通过 `file_manager` 接口可以批量管理 USER\_PROGRAM、BLOCK\_PROGRAM、TRAJECTORY、ROBOT\_TMP 等类型文件,支持覆盖控制、模式匹配查询,方便部署 / 备份程序或同步调试产线数据。 ## 4.9.1 上传本地文件到机器人 [​](#4-9-1) | 方法名 | **file\_manager.upload**( file\_path : str, file\_type : str, overwriting : bool = False) -> StatusCodeEnum | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将本地文件上传到机器人控制器 | | 请求参数 | file\_path : str 本地文件的绝对路径。 file\_type : str 文件类型:• USER\_PROGRAM: file\_path 输入程序 “基名” 路径(例: /root/robot\_data/test\_prog ),会上传同目录下的 test\_prog.json 和 test\_prog.xml 两个文件。• BLOCK\_PROGRAM: file\_path 输入积木程序 “基名” 路径(例: /root/robot\_data/test\_block\_prog ),会上传同目录下的 test\_block\_prog.block 、 test\_block\_prog.json 和 test\_block\_prog.xml 三个文件。• TRAJECTORY: file\_path 输入轨迹文件的完整路径(例: /root/robot\_data/test\_torque.trajectory ),会上传该 .trajectory 文件。• ROBOT\_TMP: file\_path 输入临时文件的完整路径(例: /root/robot\_data/test.csv ),会上传该文件。 overwriting : bool 是否覆盖机器人上已存在的同名文件,默认: False 。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | USER\_PROGRAM 、 BLOCK\_PROGRAM 上传时仅填写程序 “基名”(无需后缀)。 | ## 4.9.2 下载机器人文件到本地 [​](#4-9-2) | 方法名 | **file\_manager.download**( file\_name : str, file\_path : str, file\_type : str, overwriting : bool=False) -> StatusCodeEnum | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 将机器人上的文件下载到本地目录。 | | 请求参数 | file\_name : str 文件名。不同类型要求如下:・USER\_PROGRAM:填写程序 “基名”(无需后缀),会下载对应的 .json 与 .xml 两个文件。・TRAJECTORY:填写完整文件名(含后缀 .trajectory )。・ROBOT\_TMP:填写完整文件名(含后缀,如 .csv 等)。 file\_path : str 本地保存目录。 file\_type : str 文件类型( BLOCK\_PROGRAM 暂不支持下载)。 overwriting : bool 若目标路径存在同名文件,是否覆盖。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.9.3 删除机器人上的文件 [​](#4-9-3) | 方法名 | **file\_manager.delete**( file\_name : str, file\_type : str) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 从机器人控制器删除文件。 | | 请求参数 | file\_name : str 要删除的文件名。不同类型要求如下:・USER\_PROGRAM / BLOCK\_PROGRAM:填写程序 “基名”(无需后缀)。・TRAJECTORY / ROBOT\_TMP:填写完整文件名(含后缀)。 file\_type : str 文件类型。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.9.4 查找符合给定 pattern 的文件 [​](#4-9-4) | 方法名 | **file\_manager.search**( pattern : str, file\_list : list) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------- | | 描述 | 在控制器上查找符合指定 pattern 的文件 | | 请求参数 | pattern : str 文件名匹配模式 file\_list : list 输出列表(用于接收匹配到的文件名) | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 示例代码 [​](#示例代码) file\_manager/file\_manager.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 文件操作, 上传下载示例 / Example of file operation, upload and download """ from pathlib import Path from Agilebot import ROBOT_TMP, TRAJECTORY, USER_PROGRAM, FileManager, StatusCodeEnum current_path = Path(__file__) path = str(current_path) # [ZH] 连接文件管理服务 # [EN] Connect to the file management service file_manager = FileManager("10.27.1.254") # [ZH] 上传其他文件 # [EN] Upload other files tmp_file_path = path.replace("file_manager.py", "test.csv") ret = file_manager.upload(tmp_file_path, ROBOT_TMP, True) if ret == StatusCodeEnum.OK: print("文件上传成功 / File upload successful") else: print(f"文件上传失败,错误代码 / File upload failed, error code: {ret.errmsg}") exit(1) # [ZH] 上传程序 # [EN] Upload a program prog_file_path = path.replace("file_manager.py", "test_prog") ret = file_manager.upload(prog_file_path, USER_PROGRAM, True) if ret == StatusCodeEnum.OK: print("程序上传成功 / Program upload successful") else: print(f"程序上传失败,错误代码 / Program upload failed, error code: {ret.errmsg}") exit(1) # [ZH] 上传轨迹 # [EN] Upload a trajectory trajectory_file_path = path.replace("file_manager.py", "test_torque.trajectory") ret = file_manager.upload(trajectory_file_path, TRAJECTORY, True) if ret == StatusCodeEnum.OK: print("轨迹上传成功 / Trajectory upload successful") else: print(f"轨迹上传失败,错误代码 / Trajectory upload failed, error code: {ret.errmsg}") exit(1) # [ZH] 搜索文件 # [EN] Search for files file_list = list() ret = file_manager.search("test.csv", file_list) if ret == StatusCodeEnum.OK: print("文件搜索成功 / File search successful") else: print(f"文件搜索失败,错误代码 / File search failed, error code: {ret.errmsg}") exit(1) print("搜索文件:", file_list) # [ZH] 下载文件 # [EN] Download a file download_file_path = path.replace("file_manager.py", "download") ret = file_manager.download("test_torque", download_file_path, file_type=TRAJECTORY) if ret == StatusCodeEnum.OK: print("文件下载成功 / File download successful") else: print(f"文件下载失败,错误代码 / File download failed, error code: {ret.errmsg}") exit(1) # [ZH] 删除文件 # [EN] Delete a file ret = file_manager.delete("test_torque.trajectory", TRAJECTORY) if ret == StatusCodeEnum.OK: print("文件删除成功 / File delete successful") else: print(f"文件删除失败,错误代码 / File delete failed, error code: {ret.errmsg}") exit(1) ``` --- --- url: /zh/1-python/4-methods/4.10-coordinate_system.html title: 4.10 坐标系 --- # 4.10 坐标系 [​](#4-10) ## 说明 [​](#说明) CoordinateSystem 模块负责管理机器人用户坐标系(UF)与工具坐标系(TF),提供新增、删除、更新、查询和计算坐标系的统一接口。通过 `coordinate_system.UF/TF` 可以维护控制器中的坐标系列表或依据示教点快速求解新坐标系,便于多工位调试和工具切换时保持一致的空间参考。 ## 4.10.1 获取用户 / 工具坐标系摘要信息列表 [​](#4-10-1) | 方法名 | **coordinate\_system.UF/TF.get\_coordinate\_list**() -> tuple\[List\[Coordinate\], StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取用户 / 工具坐标系的摘要信息列表 | | 请求参数 | 无参数 | | 返回值 | UserCoordSummaryList:坐标系摘要信息列表 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.2 添加一个用户 / 工具坐标系 [​](#4-10-2) | 方法名 | **coordinate\_system.UF/TF.add**( coordinate : Coordinate) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------- | | 描述 | 向当前用户 / 工具坐标系集合中添加一个坐标系 | | 请求参数 | coordinate : [Coordinate](./../3-struct/#3-23) 要添加的坐标系信息 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.3 从当前的用户 / 工具坐标系系统删除一个用户 / 工具坐标系 [​](#4-10-3) | 方法名 | **coordinate\_system.UF/TF.delete**( index : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------- | | 描述 | 从当前的用户 / 工具坐标系集合中删除一个坐标系 | | 请求参数 | index :int 坐标系编号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.4 从当前的用户 / 工具坐标系系统更新一个用户 / 工具坐标系信息 [​](#4-10-4) | 方法名 | **coordinate\_system.UF/TF.update**( coordinate : Coordinate) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------- | | 描述 | 在当前的用户 / 工具坐标系集合中更新一个坐标系的信息 | | 请求参数 | coordinate : [Coordinate](./../3-struct/#3-23) 新的坐标系内容 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.5 从当前的用户 / 工具坐标系系统获取一个用户 / 工具坐标系信息 [​](#4-10-5) | 方法名 | **coordinate\_system.UF/TF.get**( index : int) -> tuple\[Coordinate, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 从当前的用户 / 工具坐标系集合中获取一个指定的坐标系 | | 请求参数 | index :int 坐标系编号 | | 返回值 | [Coordinate](./../3-struct/#3-23): 坐标系信息 [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.10.6 计算用户 / 工具坐标系信息 [​](#4-10-6) | 方法名 | **coordinate\_system.UF/TF.calculate**(pose: List\[[Position](./../3-struct/#3-9)\]) -> tuple\[[Position](./../3-struct/#3-9), StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 根据输入的多组位姿,计算用户 / 工具坐标系,并返回计算得到的位姿结果 | | 请求参数 | pose :List\[[Position](./../3-struct/#3-9)\] 输入的位置信息列表 | | 返回值 | [Position](./../3-struct/#3-9):计算后的位置信息 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 coordinate\_system.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 坐标系系统使用示例 / Example of coordinate system usage """ from Agilebot import Arm, Coordinate, Position, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret != StatusCodeEnum.OK: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("机器人连接成功 / Robot connected successfully") # [ZH] 定义位姿数据用于计算工具坐标系 # [EN] Define pose data for calculating tool coordinate system pose_data = [ Position(341.6861424047297, -33.70972073115479, 430.1721970894897, 0.001, 6.745, -180.000), Position(365.4597874970455, 77.95089759481547, 441.39040857936857, -7.343, 12.620, 138.857), Position(410.64702354574865, 10.394172666192766, 468.26089261578807, 18.719, 29.151, 155.585), Position(483.2519847999948, 112.71925218513972, 448.39071038067624, 33.947, 69.714, 133.597), ] # [ZH] 根据位姿数据计算工具坐标系 # [EN] Calculate tool coordinate system based on pose data pose, ret = arm.coordinate_system.TF.calculate(pose_data) if ret != StatusCodeEnum.OK: print(f"计算工具坐标系失败,错误代码 / Calculate tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("计算工具坐标系成功 / Calculate tool coordinate system successfully") print(f"计算得到的位姿 / Calculated pose:X={pose.x}, Y={pose.y}, Z={pose.z}, A={pose.a}, B={pose.b}, C={pose.c}") # [ZH] 创建工具坐标系对象 # [EN] Create tool coordinate system object tf = Coordinate(5, "test_tf", "测试工具坐标系", pose) # [ZH] 删除可能存在的ID为5的坐标系(避免冲突) # [EN] Delete coordinate system with ID 5 if exists (avoid conflict) arm.coordinate_system.TF.delete(5) # [ZH] 添加工具坐标系名字 / Add tool coordinate system ret = arm.coordinate_system.TF.add(tf) if ret != StatusCodeEnum.OK: print(f"添加工具坐标系失败,错误代码 / Add tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("添加工具坐标系成功 / Add tool coordinate system successfully") # [ZH] 获取工具坐标系列表 # [EN] Get tool coordinate system list tf_list, ret = arm.coordinate_system.TF.get_coordinate_list() if ret != StatusCodeEnum.OK: print(f"获取工具坐标系列表失败,错误代码 / Get tool coordinate system list failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("获取工具坐标系列表成功 / Get tool coordinate system list successfully") print(f"工具坐标系列表 / Tool coordinate system list: {tf_list}") # [ZH] 获取指定的工具坐标系 # [EN] Get a specific tool coordinate system tf, ret = arm.coordinate_system.TF.get(5) if ret != StatusCodeEnum.OK: print(f"获取工具坐标系失败,错误代码 / Get tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("获取工具坐标系成功 / Get tool coordinate system successfully") print(f" TF ID: {tf.id}") print(f" TF Name: {tf.name}") print(f" TF Comment: {tf.comment}") print(f" X: {tf.data.x}, Y: {tf.data.y}, Z: {tf.data.z}") print(f" A: {tf.data.a}, B: {tf.data.b}, C: {tf.data.c}") # [ZH] 更新工具坐标系的名称 # [EN] Update tool coordinate system name tf.name = "updated_test_tf" ret = arm.coordinate_system.TF.update(tf) if ret != StatusCodeEnum.OK: print(f"更新工具坐标系失败,错误代码 / Update tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("更新工具坐标系成功 / Update tool coordinate system successfully") # [ZH] 删除工具坐标系 # [EN] Delete tool coordinate system ret = arm.coordinate_system.TF.delete(5) if ret != StatusCodeEnum.OK: print(f"删除工具坐标系失败,错误代码 / Delete tool coordinate system failed, error code: {ret.errmsg}") arm.disconnect() exit(1) print("删除工具坐标系成功 / Delete tool coordinate system successfully") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` --- --- url: /zh/1-python/4-methods/4.11-modbus.html title: 4.11 Modbus 相关功能 --- # 4.11 Modbus 相关功能 [​](#4-11) ## 说明 [​](#说明) Modbus 模块封装了机器人作为 Modbus 主站时的从站管理、寄存器读写以及串口参数配置等能力。通过 `modbus` 接口可以按通道、从站 ID 获取 Slave 对象,再对线圈、保持 / 输入寄存器执行批量读写,并设置 / 查询串口通信参数,方便与 PLC、IO 扩展模块等 Modbus 设备联动。 备注:Modbus 相关功能与示教器上的总线配置冲突,不能同时使用。 ## 4.11.1 获取指定通道的指定从机 ID 的 Modbus 从机实例 [​](#4-11-1) | 方法名 | **modbus.get\_slave**( channel : ModbusChannel, slave\_id : int, master\_id : int = 0) -> 'Modbus.Slave' | | ---------- | -------------------------------------------------------------------------------------------------------- | | 描述 | 获取指定通道的指定从机 ID 的 Modbus 从机实例 | | 请求参数 | channel : [ModbusChannel](./../3-struct/#3-30) Modbus 通道 slave\_id : 从机 ID master\_id : 主机 ID | | 返回值 | Modbus.Slave: Modbus 从机实例 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.2 读取从机 Modbus 线圈寄存器 [​](#4-11-2) | 方法名 | **slave.read\_coils**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 线圈寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量(最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.3 写入从机 Modbus 线圈寄存器 [​](#4-11-3) | 方法名 | **slave.write\_coils**( address : int, value : list\[int\]) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------- | | 描述 | 写入从机 Modbus 线圈寄存器 | | 请求参数 | address : int 寄存器地址 value : list \[int\] 寄存器值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.4 读取从机 Modbus 保持寄存器 [​](#4-11-4) | 方法名 | **slave.read\_holding\_regs**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | ---------------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 保持寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量(最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.5 写入从机 Modbus 保持寄存器 [​](#4-11-5) | 方法名 | **slave.write\_holding\_regs**( address : int, value : list\[int\]) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 写入从机 Modbus 保持寄存器 | | 请求参数 | address : int 寄存器地址 value : list \[int\] 寄存器值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.6 读取从机 Modbus 离散输入寄存器 [​](#4-11-6) | 方法名 | **slave.read\_discrete\_inputs**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 离散输入寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量(最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.7 读取从机 Modbus 输入寄存器 [​](#4-11-7) | 方法名 | **slave.read\_input\_regs**( address : int, number : int ) -> tuple\[list\[int\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------------------------------- | | 描述 | 读取从机 Modbus 输入寄存器 | | 请求参数 | address : int 寄存器地址 number : int 寄存器数量(最大 120) | | 返回值 | list \[int\]:寄存器值 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | 示例代码 modbus.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: modbus使用示例 / Example of modbus usage """ from Agilebot import Arm, ModbusChannel, SerialParams, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the robot arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the robot ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 设置modbus参数 # [EN] Set Modbus parameters params = SerialParams(channel=ModbusChannel.CONTROLLER_TCP_TO_485, ip="10.27.1.80", port=502) id, ret_code = arm.modbus.set_parameter(params) if ret_code == StatusCodeEnum.OK: print("设置Modbus参数成功 / Set Modbus parameters successfully") else: print(f"设置Modbus参数失败,错误代码 / Set Modbus parameters failed, error code: {ret_code.errmsg}") arm.disconnect() exit(1) # [ZH] 创建从站 # [EN] Create a slave slave = arm.modbus.get_slave(ModbusChannel.CONTROLLER_TCP_TO_485, 1, 1) # [ZH] 写入 # [EN] Write to registers value = [1, 2, 3, 4] ret = slave.write_coils(0, value) if ret == StatusCodeEnum.OK: print("写入线圈成功 / Write coils successfully") else: print(f"写入线圈失败,错误代码 / Write coils failed, error code: {ret.errmsg}") arm.disconnect() exit(1) ret = slave.write_holding_regs(0, value) if ret == StatusCodeEnum.OK: print("写入保持寄存器成功 / Write holding registers successfully") else: print(f"写入保持寄存器失败,错误代码 / Write holding registers failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 读取 # [EN] Read registers res, ret = slave.read_coils(0, 4) if ret == StatusCodeEnum.OK: print("读取线圈成功 / Read coils successfully") print(f"读取的线圈值 / Read coil values:{res}") else: print(f"读取线圈失败,错误代码 / Read coils failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = slave.read_holding_regs(0, 4) if ret == StatusCodeEnum.OK: print("读取保持寄存器成功 / Read holding registers successfully") print(f"读取的寄存器值 / Read register values:{res}") else: print(f"读取保持寄存器失败,错误代码 / Read holding registers failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = slave.read_input_regs(0, 4) if ret == StatusCodeEnum.OK: print("读取输入寄存器成功 / Read input registers successfully") print(f"读取的输入寄存器值 / Read input register values:{res}") else: print(f"读取输入寄存器失败,错误代码 / Read input registers failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = slave.read_discrete_inputs(0, 4) if ret == StatusCodeEnum.OK: print("读取离散输入成功 / Read discrete inputs successfully") print(f"读取的离散输入值 / Read discrete input values:{res}") else: print(f"读取离散输入失败,错误代码 / Read discrete inputs failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 结束后断开机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.11.8 设置串口通讯参数 [​](#4-11-8) | 方法名 | **modbus.set\_parameter**( param : [SerialParams](./../3-struct/#3-30)) -> tuple\[int, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 设置串口通讯参数 | | 请求参数 | param : [SerialParams](./../3-struct/#3-30) 串口通讯参数 | | 返回值 | int:通道 ID [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | ## 4.11.9 获取串口通讯参数 [​](#4-11-9) | 方法名 | **modbus.get\_parameter**( channel : ModbusChannel, master\_id : int = 1) -> tuple\[[SerialParams](./../3-struct/#3-30), StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取串口通讯参数 | | 请求参数 | channel : [ModbusChannel](./../3-struct/#3-30) Modbus 通道 master\_id : int 主机 ID | | 返回值 | [SerialParams](./../3-struct/#3-30):串口通讯参数 [StatusCodeEnum](./../3-struct/#3-1):函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.6.0.0+ 工业 (Bronze): v7.6.0.0+ | --- --- url: /zh/1-python/4-methods/4.12-bas_script.html title: 4.12 BasScript 脚本程序类 --- # 4.12 BasScript 脚本程序类 [​](#4-12) ## 说明 [​](#说明) BasScript 用于在上位机以结构化方式构建示教器中的 BAS 指令序列,涵盖运动、逻辑、程序调用、通信、视觉和 Modbus 等指令。通过在 Python 侧按顺序调用 `BasScript.*` 方法即可生成与示教器一致的脚本流程,便于自动化生成、编辑或复用复杂程序。 ## 类构造函数 [​](#类构造函数) | 方法名 | **BasScript**( name ) | | ---------- | ---------------------------------------------- | | 描述 | 对应示教器程序编辑器中的指令 | | 请求参数 | name :脚本名称 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): v7.6.0.0+ | | 备注 | 本类下所有方法的兼容版本要求与本类一致 | ## 4.12.1 MoveJoint 运动到点指令 [​](#4-12-1) | 方法名 | **BasScript.move\_joint**( pose\_type , pose\_index , speed\_type , speed\_value , smooth\_type , smooth\_distance , extra\_param ) | | ---- | ----------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 MoveJoint 指令 | | 请求参数 | pose\_type :位姿类型 pose\_index :位姿索引 speed\_type :速度类型 speed\_value :速度值 smooth\_type :平滑类型 smooth\_distance :平滑距离 extra\_param :附加参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.2 MoveLine 直线运动到点指令 [​](#4-12-2) | 方法名 | **BasScript.move\_line**( pose\_type , pose\_index , speed\_type , speed\_value , smooth\_type , smooth\_distance , extra\_param ) | | ---- | ----------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 MoveLine 指令 | | 请求参数 | pose\_type :位姿类型 pose\_index :位姿索引 speed\_type :速度类型 speed\_value :速度值 smooth\_type :平滑类型 smooth\_distance :平滑距离 extra\_param :附加参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.3 MoveCircle 弧线运动到点指令 [​](#4-12-3) | 方法名 | **BasScript.move\_circle**( pose\_type1 , pose\_index1 , pose\_type2 , pose\_index2 , speed\_type , speed\_value , smooth\_type , smooth\_distance , extra\_param ) | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 MoveCircle 指令 | | 请求参数 | pose\_type1 :第一个位姿类型 pose\_index1 :第一个位姿索引 pose\_type2 :第二个位姿类型 pose\_index2 :第二个位姿索引 speed\_type :速度类型 speed\_value :速度值 smooth\_type :平滑类型 smooth\_distance :平滑距离 extra\_param :附加参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.4 LogiIf 条件指令 [​](#4-12-4) | 方法名 | **BasScript.logi\_if**( param1 , index , param2 , value , operator ) | | ---- | -------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 IF 逻辑语句 | | 请求参数 | param1 :第一个参数 index :索引 param2 :第二个参数 value :值 operator :逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.5 LogiElseIf 条件分支指令 [​](#4-12-5) | 方法名 | **BasScript.logi\_else\_if**( param1 , index , param2 , value , operator ) | | ---- | -------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 ELIF 逻辑语句 | | 请求参数 | param1 :第一个参数 index :索引 param2 :第二个参数 value :值 operator :逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.6 LogiElse 否则指令 [​](#4-12-6) | 方法名 | **BasScript.logi\_else**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 ELSE 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.7 LogiEndIf 结束条件指令 [​](#4-12-7) | 方法名 | **BasScript.logi\_end\_if**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 ENDIF 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.8 LogiWhile 循环指令 [​](#4-12-8) | 方法名 | **BasScript.logi\_while**( param1 , index , param2 , value , operator ) | | ---- | ----------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 WHILE 逻辑语句 | | 请求参数 | param1 :第一个参数 index :索引 param2 :第二个参数 value :值 operator :逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.9 LogiEndWhile 结束循环指令 [​](#4-12-9) | 方法名 | **BasScript.logi\_end\_while**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 ENDWHILE 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.10 LogiSwitch 多分支选择指令 [​](#4-12-10) | 方法名 | **BasScript.logi\_switch**( param , index ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 SWITCH 逻辑语句 | | 请求参数 | param :参数 index :索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.11 LogiCase 分支指令 [​](#4-12-11) | 方法名 | **BasScript.logi\_case**( param , value ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 CASE 逻辑语句 | | 请求参数 | param :参数 value :值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.12 LogiDefault 默认分支指令 [​](#4-12-12) | 方法名 | **BasScript.logi\_default**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 DEFAULT 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.13 LogiEndSwitch 结束多分支选择指令 [​](#4-12-13) | 方法名 | **BasScript.logi\_end\_switch**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 ENDSWITCH 逻辑语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.14 LogiGoto 跳转指令 [​](#4-12-14) | 方法名 | **BasScript.logi\_goto**( index ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 GOTO 跳转语句 | | 请求参数 | index :目标标签的索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.15 LogiLabel 标签指令 [​](#4-12-15) | 方法名 | **BasScript.logi\_label**( index ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 LABEL 标签语句 | | 请求参数 | index :标签的索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.16 LogiSkipCondition 跳过条件指令 [​](#4-12-16) | 方法名 | **BasScript.logi\_skip\_condition**( param1 , index , param2 , value , operator ) | | ---- | --------------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 SKIP CONDITION 跳转语句 | | 请求参数 | param1 :第一个参数 index :索引 param2 :第二个参数 value :值 operator :逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.17 LogiBreak 跳出循环指令 [​](#4-12-17) | 方法名 | **BasScript.logi\_break**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 BREAK 语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.18 LogiContinue 跳过循环指令 [​](#4-12-18) | 方法名 | **BasScript.logi\_continue**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 CONTINUE 语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.19 AssignValue 赋值指令 [​](#4-12-19) | 方法名 | **BasScript.assign\_value**( param1 , index , param2 , value , opt\_index , opt\_value ) | | ---- | ---------------------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 ASSIGN 赋值语句 | | 请求参数 | param1 :第一个参数 index :索引 param2 :第二个参数 value :值 opt\_index :可选索引 opt\_value :可选值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.20 Wait 等待条件指令 [​](#4-12-20) | 方法名 | **BasScript.wait**( param1 , index , param2 , value , operator ) | | ---- | ---------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 WAIT COND 等待条件语句 | | 请求参数 | param1 :第一个参数 index :索引 param2 :第二个参数 value :值 operator :逻辑运算符 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.21 WaitTime 等待时间指令 [​](#4-12-21) | 方法名 | **BasScript.wait\_time**( param , value ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 WAIT TIME 等待时间语句 | | 请求参数 | param :参数 value :时间值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.22 Pause 暂停指令 [​](#4-12-22) | 方法名 | **BasScript.pause**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 PAUSE 暂停语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.23 Abort 中断指令 [​](#4-12-23) | 方法名 | **BasScript.abort**() | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 ABORT 终止语句 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.24 Call 同步调用程序指令 [​](#4-12-24) | 方法名 | **BasScript.call**( name ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 CALL 同步调用程序 | | 请求参数 | name :程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.25 Run 异步调用程序指令 [​](#4-12-25) | 方法名 | **BasScript.run**( name ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 RUN 异步调用程序 | | 请求参数 | name :程序名 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.26 Load 加载程序指令 [​](#4-12-26) | 方法名 | **BasScript.load**( param , value ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 LOAD 载入程序 | | 请求参数 | param :参数 value :值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.27 Unload 卸载程序指令 [​](#4-12-27) | 方法名 | **BasScript.unload**( param , value ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 UNLOAD 卸载程序 | | 请求参数 | param :参数 value :值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.28 Exec 执行程序指令 [​](#4-12-28) | 方法名 | **BasScript.exec**( param , value ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 EXEC 执行程序 | | 请求参数 | param :参数 value :值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.29 SocketOpen 打开 socket 连接指令 [​](#4-12-29) | 方法名 | **BasScript.socket\_open**( index ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 SOCKET OPEN 打开 socket 连接 | | 请求参数 | index :SK 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.30 SocketClose 关闭 socket 连接指令 [​](#4-12-30) | 方法名 | **BasScript.socket\_close**( index ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 SOCKET CLOSE 关闭 socket 连接 | | 请求参数 | index :SK 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.31 SocketConnect 连接 socket 指令 [​](#4-12-31) | 方法名 | **BasScript.socket\_connect**( index ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 SOCKET CONNECT 连接 socket | | 请求参数 | index :SK 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.32 SocketSend 发送 socket 数据指令 [​](#4-12-32) | 方法名 | **BasScript.socket\_send**( index , msg\_type , value ) | | ---- | ------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 SOCKET SEND 发送数据 | | 请求参数 | index :SK 寄存器序号 msg\_type :消息类型 value :消息内容或序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.33 SocketRecv 接收 socket 数据指令 [​](#4-12-33) | 方法名 | **BasScript.socket\_recv**( index , msg\_length , msg\_type , value ) | | ---- | --------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 SOCKET RECV 接收数据 | | 请求参数 | index :SK 寄存器序号 msg\_length :消息长度 msg\_type :消息类型 value :消息内容或序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.34 ModbusReadMH 读取 Modbus 保持寄存器指令 [​](#4-12-34) | 方法名 | **BasScript.modbus\_read\_MH**( index , id , address , length , r\_index ) | | ---- | -------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 READ\_MH 读取 Modbus 保持寄存器 | | 请求参数 | index :通道序号 id :Modbus ID address :寄存器地址 length :寄存器长度 r\_index :R 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.35 ModbusReadMI 读取 Modbus 输入寄存器指令 [​](#4-12-35) | 方法名 | **BasScript.modbus\_read\_MI**( index , id , address , length , r\_index ) | | ---- | -------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 READ\_MI 读取 Modbus 输入寄存器 | | 请求参数 | index:通道序号 id :Modbus ID address :寄存器地址 length :寄存器长度 r\_index :R 寄存器序号 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.36 ModbusWriteMH 写入 Modbus 保持寄存器指令 [​](#4-12-36) | 方法名 | **BasScript.modbus\_write\_MH**( index , id , address , length , value\_type , value ) | | ---- | -------------------------------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 WRITE\_MH 写入 Modbus 保持寄存器 | | 请求参数 | index :通道序号 id :Modbus ID address :寄存器地址 length :寄存器长度 value\_type :值类型 value :值或索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.37 VisionFind 寻找视觉程序指令 [​](#4-12-37) | 方法名 | **BasScript.vision\_find**( name ) | | ---- | -------------------------------------------- | | 描述 | 对应示教器程序编写中的 VISION FIND 寻找视觉程序 | | 请求参数 | name :视觉程序名称 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.38 VisionGetOffset 获取视觉程序偏移量指令 [​](#4-12-38) | 方法名 | **BasScript.vision\_get\_offset**( name , index , label\_index ) | | ---- | ---------------------------------------------------------------- | | 描述 | 对应示教器程序编写中的 VISION GET OFFSET 获取视觉程序偏移量 | | 请求参数 | name :视觉程序名称 index :视觉寄存器索引 label\_index :标签索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.39 VisionGetQuantity 获取视觉程序结果指令 [​](#4-12-39) | 方法名 | **BasScript.vision\_get\_quantity**( name , index ) | | ---- | --------------------------------------------------- | | 描述 | 对应示教器程序编写中的 VISION GET QUANTITY 获取视觉程序结果 | | 请求参数 | name :视觉程序名称 index :R 寄存器索引 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.40 SetParam 设置参数指令 [​](#4-12-40) | 方法名 | **BasScript.set\_param**( type , value\_type , value ) | | ---- | ------------------------------------------------------ | | 描述 | 对应示教器程序编写中的 SET PARAM 设置参数 | | 请求参数 | type :参数类型 value\_type :值类型 value :值 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | ## 4.12.41 ExtraParam 额外参数类 [​](#4-12-41) | 方法名 | **ExtraParam**() | | ---- | -------------------- | | 描述 | 额外参数类,用于构建复杂的机器人控制命令 | | 请求参数 | 无 | | 返回值 | 无 | ### 4.12.41.1 设置加速度 [​](#4-12-41-1) | 方法名 | **ExtraParam.acceleration**( value ) | | ---- | ------------------------------------ | | 描述 | 设置加速度,范围为 1\~120 | | 请求参数 | value :加速度值(浮点数) | | 返回值 | 无 | ### 4.12.41.2 设置 RTCP 参数 [​](#4-12-41-2) | 方法名 | **ExtraParam.rctp**() | | ---- | --------------------- | | 描述 | 设置 RTCP 参数 | | 请求参数 | 无 | | 返回值 | 无 | ### 4.12.41.3 设置帧偏移 [​](#4-12-41-3) | 方法名 | **ExtraParam.offset**( index ) | | ---- | ------------------------------ | | 描述 | 设置帧偏移 | | 请求参数 | index :偏移索引(整数) | | 返回值 | 无 | ### 4.12.41.4 设置时间基准运行或赋值 [​](#4-12-41-4) | 方法名 | **ExtraParam.tb**( second , type , name \=None, index \=None, status \=None) | | ---- | ----------------------------------------------------------------------------------------- | | 描述 | 设置时间基准运行或赋值 | | 请求参数 | second :秒数(整数) type :执行类型(字符串) name :名称(用于运行,字符串) index :索引(用于赋值,整数) status :状态(用于赋值,字符串) | | 返回值 | 无 | ### 4.12.41.5 设置跳转 [​](#4-12-41-5) | 方法名 | **ExtraParam.skip**( index ) | | ---- | ---------------------------- | | 描述 | 设置跳转 | | 请求参数 | index :标签索引(整数) | | 返回值 | 无 | ## 4.12.42 JUMP 快速运动指令 [​](#4-12-42) ### 4.12.42.1 JUMP 快速运动指令 [​](#4-12-42-1) | 方法名 | **move\_jump**( pose\_type , pose\_index , speed\_value , speed\_ratio , lim\_Z\_type , lim\_Z\_value , smooth\_type , smooth\_distance \=0.0, extra\_param \=None) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 机器人点对点移动到指定位置 | | 请求参数 | pose\_type :目标位姿存储类型( MovePoseType ,目前支持 PR 寄存器) pose\_index :目标位置的索引(整数,表示在控制器上的 PR 寄存器中的位置) speed\_value :移动速度的值(浮点数,单位为 mm/s) speed\_ratio :移动速度的比率(浮点数,单位为 %,范围为 0\~100) lim\_Z\_type :Z 轴限制的类型( SpeedType ,可以是 MR 寄存器或数值 VALUE) lim\_Z\_value :Z 轴限制的值(如果 lim\_Z\_type 为 MR 寄存器,表示 MR 寄存器序号;如果为数值 VALUE,表示 Z 轴限制的值,单位为 mm/s,范围为 0\~100) smooth\_type :平滑类型( SmoothType ,可以是 FINE 或 SMOOTH\_DISTANCE) smooth\_distance :平滑距离(浮点数,仅在 smooth\_type 为 SMOOTH\_DISTANCE 时生效,范围为 0\~1000) extra\_param :额外参数( ExtraParam ,用于设置 MOVE 指令的额外参数,可选) | | 返回值 | 操作结果的状态码( StatusCodeEnum ) | ### 4.12.42.2 JUMP3 快速运动指令 [​](#4-12-42-2) | 方法名 | **move\_jump3**( pose\_type , pose\_index , speed\_value , speed\_ratio , smooth\_type , smooth\_distance \=0.0, extra\_param \=None) | | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 机器人点对点移动到指定位置 | | 请求参数 | pose\_type :目标位姿存储类型( MovePoseType ,目前支持 PR 寄存器) pose\_index :3 个目标位置的索引(列表,包含 3 个整数,表示在控制器上的 PR 寄存器中的位置) speed\_value :移动速度的值(浮点数,单位为 mm/s) speed\_ratio :移动速度的比率(浮点数,单位为 %,范围为 0\~100) smooth\_type :平滑类型( SmoothType ,可以是 FINE 或 SMOOTH\_DISTANCE) smooth\_distance :平滑距离(浮点数,仅在 smooth\_type 为 SMOOTH\_DISTANCE 时生效,范围为 0\~1000) extra\_param :额外参数( ExtraParam ,用于设置 MOVE 指令的额外参数,可选) | | 返回值 | 操作结果的状态码( StatusCodeEnum ) | ### 4.12.42.3 JUMP3CP 快速运动指令 [​](#4-12-42-3) | 方法名 | **move\_jump3cp**( pose\_type , pose\_index , speed\_value , smooth\_type , smooth\_distance \=0.0, extra\_param \=None) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 机器人点对点移动到指定位置 | | 请求参数 | pose\_type :目标位姿存储类型( MovePoseType ,目前支持 PR 寄存器) pose\_index :3 个目标位置的索引(列表,包含 3 个整数,表示在控制器上的 PR 寄存器中的位置) speed\_value :移动速度的值(浮点数,单位为 mm/s) smooth\_type :平滑类型( SmoothType ,可以是 FINE 或 SMOOTH\_DISTANCE) smooth\_distance :平滑距离(浮点数,仅在 smooth\_type 为 SMOOTH\_DISTANCE 时生效,范围为 0\~1000) extra\_param :额外参数( ExtraParam ,用于设置 MOVE 指令的额外参数,可选) | | 返回值 | 操作结果的状态码( StatusCodeEnum ) | --- url: /zh/1-python/4-methods/4.13-jogging.html title: 4.13 机器人示教运动 --- # 4.13 机器人示教运动 [​](#4-13) ## 说明 [​](#说明) Jogging 模块提供机器人在示教模式下的点动控制接口,支持单轴步进、连续点动、多轴联动及紧急停止等操作。通过 `jogging` API 可以在上位机远程执行与示教器一致的手动调姿,用于调试、示教或位置微调场景。 ## 4.13.1 机器人示教点动运动 [​](#4-13-1) | 方法名 | **jogging.step\_move**( aj\_num : int, step\_length : float = 0, step\_angle : float = 0) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 根据设定的步进量进行点动(单轴)运动 | | 请求参数 | aj\_num : int 取值 1\~6 对应当前坐标系的各轴;在笛卡尔坐标系下 x、y、z、rx、ry、rz 分别对应 1\~6;数值正负表示运动方向。 step\_length : float 单次直线步进量,单位 mm;不传则不修改当前步进量。 step\_angle : float 单次旋转步进量,单位 °;不传则不修改当前旋转步进量。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 jogging/step\_move.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 示教运动功能-步进关节点动运动使用示例 / Teaching motion function - Joint step motion usage example """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 仅支持手动模式下进行jogging # [EN] Only manual mode is supported for jogging # [ZH] 点动关节坐标系下的关节1 # [EN] Jog joint 1 under the joint coordinate system ret = arm.jogging.step_move(1, 2, 2) if ret == StatusCodeEnum.OK: print("点动运动开始成功 / Jogging movement started successfully") else: print(f"点动运动开始失败,错误代码 / Jogging movement start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.13.2 机器人示教连续运动 [​](#4-13-2) | 方法名 | **jogging.continuous\_move**( aj\_num : int) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------ | | 描述 | 控制机器人进行连续点动(单轴)运动 | | 请求参数 | aj\_num : int 取值 1\~6 对应当前坐标系的各轴;在笛卡尔坐标系下 x、y、z、rx、ry、rz 分别对应 1\~6;数值正负表示运动方向。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 jogging/continuous\_move.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 示教运动功能-单关节点动运动使用示例 / Example of Teaching motion function - Single-joint motion usage """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 仅支持手动模式下进行jogging # [EN] Only manual mode is supported for jogging # [ZH] 点动关节坐标系下的关节1 # [EN] Jog joint 1 under the joint coordinate system ret = arm.jogging.continuous_move(1) if ret == StatusCodeEnum.OK: print("点动运动开始成功 / Jogging movement started successfully") else: print(f"点动运动开始失败,错误代码 / Jogging movement start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 运动3s # [EN] Move for 3 seconds time.sleep(3) # [ZH] 停止 # [EN] Stop arm.jogging.stop() # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.13.3 机器人多轴示教连续运动 [​](#4-13-3) | 方法名 | **jogging.multi\_move**( aj\_num : List\[int\]) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人进行多轴连续点动运动 | | 请求参数 | aj\_num : List \[int\] 取值 1\~6 对应当前坐标系的各轴,列表中包含需要运动的轴编号;在笛卡尔坐标系下 x、y、z、rx、ry、rz 分别对应 1\~6;数值正负表示各轴运动方向。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 jogging/multi\_move.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 示教运动功能-多关节点动运动使用示例 / / Teaching motion function - Multi-joint motion usage example """ import time from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化Arm类 # [EN] Initialize the Arm class arm = Arm() # [ZH] 连接控制器 # [EN] Connect to the controller ret = arm.connect("10.27.1.254") if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 仅支持手动模式下进行jogging # [EN] Only manual mode is supported for jogging # [ZH] 点动关节坐标系下的关节1,2,3 # [EN] Jog joint 1,2,3 under the joint coordinate system ret = arm.jogging.multi_move([1, 2, 3]) if ret == StatusCodeEnum.OK: print("点动运动开始成功 / Jogging movement started successfully") else: print(f"点动运动开始失败,错误代码 / Jogging movement start failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 运动3s # [EN] Move for 3 seconds time.sleep(3) # [ZH] 停止 # [EN] Stop arm.jogging.stop() # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from the robot arm.disconnect() print("机器人断开连接成功 / Robot disconnected successfully") ``` ## 4.13.4 停止机器人连续运动 [​](#4-13-4) | 方法名 | **jogging.stop**() | | ---------- | ---------------------------------------------- | | 描述 | 终止机器人示教点动(JOG)运动 | | 请求参数 | 无参数 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/1-python/4-methods/4.14-subpub.html title: 4.14 机器人订阅发布接口 --- # 4.14 机器人订阅发布接口 [​](#4-14) ## 说明 [​](#说明) SubPub 模块提供机器人控制器 WebSocket 的订阅 / 发布通道管理能力,负责建立连接、订阅机器人状态 / 寄存器 / IO 等主题,并通过回调或阻塞接口接收实时数据。借助该模块可在上位机监听机器人运行信息、实现数据可视化及与外部系统联动。 ## 4.14.1 连接到 WebSocket 服务器 [​](#4-14-1) | 方法名 | **sub\_pub.connect**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 连接到机器人控制器的 WebSocket 服务器 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):连接状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.2 断开 WebSocket 服务器 [​](#4-14-2) | 方法名 | **sub\_pub.disconnect**() -> StatusCodeEnum | | ---------- | ---------------------------------------------- | | 描述 | 断开与机器人控制器 WebSocket 服务器的连接 | | 请求参数 | 无 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):断开状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.3 添加机器人状态订阅 [​](#4-14-3) | 方法名 | **sub\_pub.subscribe\_status**( topics : List\[[RobotTopicType](./../3-struct/#3-31-1)\], frequency : int = 200) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加机器人状态数据订阅 | | 请求参数 | topics : List\[[RobotTopicType](./../3-struct/#3-31-1)\] 需要订阅的机器人主题类型列表 frequency : int 订阅频率,单位 Hz,默认 200 | | 返回值 | StatusCodeEnum:订阅状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.4 添加寄存器订阅 [​](#4-14-4) | 方法名 | **sub\_pub.subscribe\_register**( reg\_type : [RegTopicType](./../3-struct/#3-31-2), reg\_ids : List\[int\], frequency : int = 200) -> StatusCodeEnum | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加寄存器数据订阅 | | 请求参数 | reg\_type : [RegTopicType](./../3-struct/#3-31-2) 寄存器类型 reg\_ids : List \[int\] 需要订阅的寄存器 ID 列表 frequency : int 订阅频率,单位 Hz,默认 200 | | 返回值 | StatusCodeEnum:订阅状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.5 添加 IO 订阅 [​](#4-14-5) | 方法名 | **sub\_pub.subscribe\_io**( io\_list : List\[tuple\[[IOTopicType](./../3-struct/#3-31-3), int\]\], frequency : int = 200) -> StatusCodeEnum | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 订阅 IO 信号数据,包括数字输入 / 输出等 | | 请求参数 | io\_list : List\[tuple\[[IOTopicType](./../3-struct/#3-31-3), int\]\] IO 列表,每个元素为 (IO 类型, IO ID) frequency : int 订阅频率,单位 Hz,默认 200 | | 返回值 | StatusCodeEnum:订阅状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.6 开始接收消息 [​](#4-14-6) | 方法名 | **sub\_pub.start\_receiving**( on\_message\_received : Callable\[\[Dict\[str, Any\]\], None\]) -> StatusCodeEnum | | ---------- | ---------------------------------------------------------------------------------------------------------------- | | 描述 | 开始接收订阅消息,并通过回调函数处理接收到的数据 | | 请求参数 | on\_message\_received : Callable \[\[Dict \[str, Any\]\], None\] 消息接收回调函数 | | 返回值 | StatusCodeEnum:接收状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.7 接收订阅消息的错误 [​](#4-14-7) | 方法名 | **sub\_pub.handle\_receive\_error**() -> StatusCodeEnum | | ---------- | ------------------------------------------------------- | | 描述 | 处理接收订阅消息的错误,当接收消息回调函数抛出异常时跳出循环 | | 请求参数 | 无 | | 返回值 | StatusCodeEnum:接收状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.14.8 接收下一条消息 [​](#4-14-8) | 方法名 | **sub\_pub.receive**() -> tuple\[Dict\[str, Any\], StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------- | | 描述 | 接收下一条消息并返回 | | 请求参数 | 无 | | 返回值 | tuple \[Dict \[str, Any\], StatusCodeEnum\]:接收到的消息字典和状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | 示例代码 sub\_pub.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: SubPub使用示例 / SubPub usage example """ import asyncio import logging from Agilebot import Arm, IOTopicType, RegTopicType, RobotTopicType, StatusCodeEnum # 配置日志 / Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def message_handler(message): """ 消息处理函数 / Message handler function :param message: 接收到的消息字典 / Received message dictionary """ logger.info(f"收到消息 / Received message: {message}") async def main(): """ 主函数,演示SubPub的使用 / Main function demonstrating SubPub usage """ # 创建Arm实例 / Create Arm instance arm = Arm() # 连接到控制器 / Connect to controller ret = arm.connect("10.27.1.254") if ret != StatusCodeEnum.OK: logger.error(f"连接失败 / Connection failed: {ret}") return logger.info("Arm连接成功 / Arm connected successfully") try: # 连接WebSocket / Connect WebSocket ret = await arm.sub_pub.connect() if ret != StatusCodeEnum.OK: logger.error(f"WebSocket连接失败 / WebSocket connection failed: {ret}") return logger.info("WebSocket连接成功 / WebSocket connected successfully") # 订阅机器人状态 / Subscribe to robot status topic_types = [ RobotTopicType.JOINT_POSITION, RobotTopicType.CARTESIAN_POSITION, RobotTopicType.ROBOT_STATUS, RobotTopicType.CTRL_STATUS, RobotTopicType.SERVO_STATUS, RobotTopicType.INTERPRETER_STATUS, RobotTopicType.TRAJECTORY_RECORD, RobotTopicType.USER_OP_MODE, RobotTopicType.USER_FRAME, RobotTopicType.TOOL_FRAME, RobotTopicType.VELOCITY_RATIO, RobotTopicType.TRAJECTORY_RECORD, ] ret = await arm.sub_pub.subscribe_status(topic_types, frequency=200) if ret != StatusCodeEnum.OK: logger.error(f"订阅机器人状态失败 / Failed to subscribe to robot status: {ret}") return logger.info("机器人状态订阅成功 / Robot status subscription successful") # 订阅寄存器 / Subscribe to registers ret = await arm.sub_pub.subscribe_register(RegTopicType.R, [1, 2, 3], frequency=200) if ret != StatusCodeEnum.OK: logger.error(f"订阅寄存器失败 / Failed to subscribe to registers: {ret}") return logger.info("寄存器订阅成功 / Register subscription successful") # 订阅IO信号 / Subscribe to IO signals io_list = [(IOTopicType.DI, 1), (IOTopicType.DO, 1)] ret = await arm.sub_pub.subscribe_io(io_list, frequency=200) if ret != StatusCodeEnum.OK: logger.error(f"订阅IO失败 / Failed to subscribe to IO: {ret}") return logger.info("IO订阅成功 / IO subscription successful") # 单次接收消息示例 / Single message receive example logger.info("尝试单次接收消息 / Attempting single message receive") try: # 设置超时 / Set timeout message, ret = await asyncio.wait_for(arm.sub_pub.receive(), timeout=5.0) if ret == StatusCodeEnum.OK: logger.info(f"单次接收消息成功 / Single message receive successful: {message}") else: logger.error(f"单次接收消息失败 / Single message receive failed: {ret}") except asyncio.TimeoutError: logger.warning("接收消息超时 / Message receive timeout") # 启动消息接收 / Start message receiving ret = await arm.sub_pub.start_receiving(message_handler) if ret != StatusCodeEnum.OK: logger.error(f"启动消息接收失败 / Failed to start message receiving: {ret}") return logger.info("开始接收消息 / Started receiving messages") # 运行一段时间 / Run for a while logger.info("运行10秒钟... / Running for 10 seconds...") await asyncio.sleep(10) except Exception as e: logger.error(f"运行过程中发生错误 / Error occurred during execution: {str(e)}") finally: # 断开连接 / Disconnect await arm.sub_pub.disconnect() arm.disconnect() logger.info("连接已断开 / Connection disconnected") if __name__ == "__main__": # 运行异步主函数 / Run async main function asyncio.run(main()) ``` --- url: /zh/1-python/4-methods/4.15-extension.html title: 4.15 插件管理 --- # 4.15 插件管理 [​](#4-15) ## 说明 [​](#说明) Extension 模块用于管理机器人控制器上的第三方插件,包含获取控制器 IP、查询 / 查看插件列表、切换启用状态以及调用插件服务等能力。通过 `extension` 接口可以在上位机侧统一管理插件生命周期,并向插件发送命令以扩展机器人功能。 ## 4.15.1 获取机器人的 IP 地址 [​](#4-15-1) | 方法名 | **extension.get\_robot\_ip**() -> str | | ---------- | ---------------------------------------------- | | 描述 | 根据 SDK 运行的环境,返回相应的机器人 IP 地址 | | 请求参数 | 无 | | 返回值 | str:IP 地址(可能返回 None) | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | **获取 IP 的逻辑说明:** 该方法会根据 SDK 运行的环境自动判断并返回相应的 IP 地址: 1. **工业示教器环境** :返回控制器的 IP 地址 2. **协作 AP 板环境** : * 如果使用 DHCP 模式:返回路由器的 IP 地址(默认网关) * 如果使用静态 IP 模式:返回配置的静态 IP 地址 3. **云端环境** 返回云端的内部 IP 地址 4. **其他环境**:返回 `None` :::tip 提示 * 该方法主要用于插件或示教器环境中,需要连接到机器人控制器的场景 ::: ## 4.15.2 获取插件列表 [​](#4-15-2) | 方法名 | **extension.get\_list**() → tuple\[list\[ExtensionInfo\], StatusCodeEnum\] | | ---------- | -------------------------------------------------------------------------- | | 描述 | 获取当前机器人上已安装的全部插件信息。 | | 请求参数 | 无 | | 返回值 | list\[ExtensionInfo\] :插件信息列表。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.3 获取插件详情 [​](#4-15-3) | 方法名 | **extension.get**( name : str) → tuple\[ExtensionInfo, StatusCodeEnum\] | | ---------- | ----------------------------------------------------------------------- | | 描述 | 根据插件名称查询单个插件的详细信息。 | | 请求参数 | name :插件名称。 | | 返回值 | ExtensionInfo :插件详细信息。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.4 切换插件启用状态 [​](#4-15-4) | 方法名 | **extension.toggle**( name : str) → StatusCodeEnum | | ---------- | -------------------------------------------------- | | 描述 | 切换指定插件的启用 / 禁用状态。 | | 请求参数 | name :插件名称。 | | 返回值 | [StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | ## 4.15.5 调用简单服务插件命令 [​](#4-15-5) | 方法名 | **extension.call\_service**( name : str, command : str, params : dict = None) → tuple\[Any, StatusCodeEnum\] | | ---------- | ------------------------------------------------------------------------------------------------------------ | | 描述 | 调用指定插件的简单服务命令,并返回执行结果。 | | 请求参数 | name :插件名称。 command :插件命令名称。 params :命令参数(可选,默认为 None)。 | | 返回值 | Any :插件命令执行结果。[StatusCodeEnum](./../3-struct/#3-1):函数执行结果。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): 不支持 | 示例代码 extension/extension\_operation.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 插件使用示例 / Example of extension usage """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if the connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connection successful") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) res, ret = arm.extension.get("MathService") if ret == StatusCodeEnum.OK: print("获取插件信息成功 / Get extension information successfully") print(f"插件信息 / Extension information: {res}") else: print(f"获取插件信息失败,错误代码 / Get extension information failed, error code: {ret.errmsg}") ret = arm.extension.toggle("MathService") if ret == StatusCodeEnum.OK: print("切换插件状态成功 / Toggle extension status successfully") else: print(f"切换插件状态失败,错误代码 / Toggle extension status failed, error code: {ret.errmsg}") res, ret = arm.extension.call_service("MathService", "add", dict([["a", 1], ["b", 2]])) if ret == StatusCodeEnum.OK: print("调用插件服务成功 / Call extension service successfully") print(f"调用插件服务结果 / Call extension service result: {res}") else: print(f"调用插件服务失败,错误代码 / Call extension service failed, error code: {ret.errmsg}") ``` --- --- url: /zh/1-python/4-methods/4.16-nlu_control.html title: 4.16 自然语言控制 --- # 4.16 自然语言控制 [​](#4-16) ## 说明 [​](#说明) NLUControl 模块提供了通过自然语言指令控制机器人的功能。用户可以使用日常语言描述期望的机器人动作,系统会自动将其转换为可执行的代码并在安全检查后执行。 ## 类构造函数 [​](#类构造函数) | 方法名 | **NLUControl**( controller\_ip : str) | | ---------- | ---------------------------------------------- | | 描述 | 自然语言控制类,通过自然语言控制机器人运动。通常通过 arm.nlu 访问,无需手动实例化。 | | 请求参数 | controller\_ip : str 控制柜 IP 地址 | | 返回值 | 无返回值 | | 备注 | 该类会在 Arm 类实例化时自动创建,用户直接通过 arm.nlu 访问即可。 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.16.1 执行自然语言指令 [​](#4-16-1) | 方法名 | **execute**( natural\_language : str) -> tuple\[NLUGeneratedCode, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 通过自然语言指令控制机器人,系统会将自然语言翻译为可执行代码并返回。 | | 请求参数 | natural\_language : str 自然语言指令,例如 "机器人移动到零点,并获取当前位置"支持复杂的多步骤指令,如顺序执行、条件判断等。 | | 返回值 | NLUGeneratedCode: 生成的代码对象,包含可执行代码和审批状态[StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | \- 返回的 NLUGeneratedCode 对象包含 needs\_approval 属性,指示是否需要用户审批\- 如果 needs\_approval=True , 必须先调用 approve() 方法批准后才能执行\- 可以通过 result.code 查看生成的代码内容 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## NLUGeneratedCode 类 [​](#nlugeneratedcode-类) ### 说明 [​](#说明-1) NLUGeneratedCode 类用于封装、管理和安全执行由 NLU 服务生成的 Python 代码片段。该类提供了代码审批和执行的安全机制,确保需要审批的代码必须经过明确批准才能执行。 ### 属性 [​](#属性) | 属性名 | 类型 | 描述 | | --------------- | ---- | --------------------- | | needs\_approval | bool | 是否需要审批才能执行,根据代码危险等级确定 | | code | str | 生成的可执行 Python 代码字符串 | ### 4.16.2 批准代码执行 [​](#4-16-2) | 方法名 | **approve**() | | ---------- | -------------------------------------------------------------------- | | 描述 | 批准代码执行。调用此方法后,代码将被标记为已审批,可以通过 execute\_code() 方法执行。 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | \- 仅当 needs\_approval=True 时需要调用此方法\- 未调用 approve() 直接执行需要审批的代码会返回错误 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ### 4.16.3 执行生成的代码 [​](#4-16-3) | 方法名 | **execute\_code**() -> tuple\[Any, StatusCodeEnum\] | | ---------- | --------------------------------------------------------------------------------------------------------- | | 描述 | 执行 NLU 生成的代码。如果代码需要审批且尚未批准,则返回错误。 | | 请求参数 | 无参数 | | 返回值 | Any: 代码执行结果,类型取决于生成的代码[StatusCodeEnum](./../3-struct/#3-1): 函数执行结果 | | 备注 | \- 如果 needs\_approval=True 但未调用 approve() , 会返回 NLU\_APPROVAL\_REQUIRED 错误\- 代码执行过程中的任何异常都会被捕获并返回相应的错误状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ### 4.16.4 打印生成的代码 [​](#4-16-4) | 方法名 | **print\_code**() | | ---------- | ---------------------------------------------- | | 描述 | 打印生成的代码,便于用户审查。输出格式包含语法高亮。 | | 请求参数 | 无参数 | | 返回值 | 无返回 | | 备注 | 建议在需要审批时先调用此方法查看代码内容,再决定是否批准执行 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 使用示例 [​](#使用示例) ### 示例 1: 基础查询操作 [​](#示例1-基础查询操作) nlu\_control/get\_controller\_version.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 自然语言基础控制示例 / Natural Language Basic Control Example """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 示例:使用自然语言获取控制器版本信息 # [EN] Example: Use natural language to get controller version information result, ret = arm.nlu.execute("获取控制器版本信息") if ret == StatusCodeEnum.OK: print("自然语言指令执行成功 / Natural language command executed successfully") if result.needs_approval: print("\n" + "=" * 50) print("警告:需要用户确认 / Warning: User Approval Required") print("=" * 50) result.print_code() print("\n请确认是否执行此代码 / Please confirm if you want to execute this code:") user_input = input("\n(yes/no): ").strip().lower() if user_input not in ["yes", "y"]: print("用户拒绝执行代码 / User rejected code execution") arm.disconnect() exit(1) else: result.approve() exec_result, ret = result.execute_code() if ret == StatusCodeEnum.OK: print(f"执行结果 / Execution result: {exec_result}") else: print(f"自然语言指令执行失败 / Natural language command failed: {ret.errmsg}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("\n机器人断开连接成功 / Robot disconnected successfully") ``` ### 示例 2: 顺序执行多个任务 [​](#示例2-顺序执行多个任务) nlu\_control/serial\_execution.py ```py #!python """ Copyright © 2016 Agilebot Robotics Ltd. All rights reserved. Instruction: 自然语言顺序执行示例 / Natural Language Sequential Execution Example """ from Agilebot import Arm, StatusCodeEnum # [ZH] 初始化捷勃特机器人 # [EN] Initialize the Agilebot robot arm = Arm() # [ZH] 连接捷勃特机器人 # [EN] Connect to the Agilebot robot ret = arm.connect("10.27.1.254") # [ZH] 检查是否连接成功 # [EN] Check if connection is successful if ret == StatusCodeEnum.OK: print("机器人连接成功 / Robot connected successfully") else: print(f"机器人连接失败,错误代码 / Robot connection failed, error code: {ret.errmsg}") arm.disconnect() exit(1) # [ZH] 示例:使用自然语言让机器人按顺序执行任务 # [EN] Example: Use natural language to instruct the robot to execute tasks sequentially result, ret = arm.nlu.execute( """ 按顺序执行: 1. 清除报警; 2. 控制机械臂所有关节运动至零点位置; 3. 启动程序 'Put_into_box',等待下发完成,并等待其执行结束; 4. 获取当前位姿。 """ ) if ret == StatusCodeEnum.OK: print("自然语言指令执行成功 / Natural language command executed successfully") if result.needs_approval: print("\n" + "=" * 50) print("警告:需要用户确认 / Warning: User Approval Required") print("=" * 50) result.print_code() print("\n请确认是否执行此代码 / Please confirm if you want to execute this code:") user_input = input("\n(yes/no): ").strip().lower() if user_input not in ["yes", "y"]: print("用户拒绝执行代码 / User rejected code execution") arm.disconnect() exit(1) else: result.approve() exec_result, ret = result.execute_code() if ret == StatusCodeEnum.OK: print(f"执行结果 / Execution result: {exec_result}") else: print(f"自然语言指令执行失败 / Natural language command failed: {ret.errmsg}") # [ZH] 断开捷勃特机器人连接 # [EN] Disconnect from Agilebot robot arm.disconnect() print("\n机器人断开连接成功 / Robot disconnected successfully") ``` --- url: /zh/1-python/Agilebot_Robot_Python_SDK_ChangeLog.html title: 捷勃特机器人 Python SDK 更新说明 --- # 捷勃特机器人 Python SDK 更新说明 [​](#捷勃特机器人-python-sdk-更新说明) ## 2.0.0.0 更新(2025/12/5) [​](#2000更新2025125) 1. 更改底层通信方式 2. 添加本地 proxy 服务支持 3. `Jogging` 类下添加 `step_move` 和 `continue_move` 接口 4. 添加插件相关接口 5. 添加获取最严重报警 `get_top_alarm` 接口 6. `BasScript` 类下添加 `JUMP` 相关指令 7. 添加轨迹复现相关接口 8. 优化坐标系信息类 9. 修改负载信息类 10. 获取所有报警 `get_all_active_alarms` 接口支持语言设置 11. `get_version` 接口改为 `get_controller_version` 接口 12. `is_connect` 接口改为 `is_connected` 接口 13. 添加获取机械臂的操作模式 `get_op_mode` 接口 14. 添加订阅类 `SubPub` ,用于订阅机器人状态、寄存器信息和 IO 信息 15. 坐标系类 `CoordinateSystem` 添加计算 `TF` / `UF` 的接口 16. 坐标系类 `CoordinateSystem` 下添加 `TF` 和 `UF` 两个子类 17. 插件管理类添加插件相关接口 18. 轨迹类 `Trajectory` 添加轨迹复现相关接口 19. 优化 python 依赖项,支持 python 版本 3.8 及以上 ## 1.7.1.3 更新(2025/7/3) [​](#1713更新202573) 1. 修复 `get_all_active_alarms` 接口可能发生错误的问题 2. 修复 `move_circle` 内部参数设置错误 3. 修改示例程序 4. 添加插件管理类,提供 `extension.get_robot_ip` 接口 5. 添加轨迹复现相关接口 ## 1.7.0.0 更新(2025/5/30) [​](#1700更新2025530) 1. 寄存器改动 1. 寄存器全部放在 `Registers` 类下,其他 `Registers` 后续废除 2. 接口名改为 `read_R` 、 `write_R` 、 `delete_R` 类似 3. 删除 `add` 方法,使用 `write_XX` 即可 4. 读取和写入寄存器 RPC 接口改为新的仅读取值的 RPC,提升速度 5. `read_R` 、 `read_MR` 、 `read_SR` 直接返回对应的值和执行结果 2. `arm` 类下接口改动 1. `get_arm_model_info` 、 `get_ctrl_status` 、 `get_robot_status` 、 `get_servo_status` 、 `get_soft_mode` 、 `get_version` 接口改为返回 ' 结果 + 执行状态' 2. `servo_on` 、 `servo_off` 、 `servo_reset` 接口移到 `arm` 下, `execution` 下后续废除 3. `motion` 类改动 1. paload 相关操作接口移到到 `motion.payload` 下 2. 新增负载测定相关接口 3. 新增 `get_OVC` 、 `set_OVC` 、 `get_OAC` 、 `set_OAC` 、 `get_TF` 、 `set_TF` 、 `get_UF` 、 `set_UF` 、 `get_TCS` 、 `set_TCS` 接口 4. `convert_cart_to_joint_simple` 接口新增 uf\_index 和 tf\_index 设置 5. 新增 `move_joint` 、 `move_line` 、 `move_circle` 接口 6. 新增 `convert_joint_to_cart` 、 `convert_cart_to_joint` 接口 7. 新增 `enter_position_control` 、 `exit_position_control` 、 `set_udp_feedback_params` 接口 4. `digital_signals` 类改为 `signals` 类,简化名称 5. `execution` 类添加 `execute_bas_script` 接口用于执行脚本 6. `jogging.move` 接口添加步进值修改 `move(*self*, *aj_num*: *int*, *move_mode*: MoveMode = None, *step_length*: *float* = 0)` 7. 新增 `bas_script` 类用于生成脚本 8. 新增 `modbus` 类用于直接控制 modbus 设备 --- url: /zh/2-csharp/0-prologue/0.1-version.html title: 版本记录 --- # 版本记录 [​](#版本记录) | 文档版本 | SDK 版本号 | 版本时间 | | ---- | -------- | ---------- | | V3.1 | 2.0.1.\* | 2025.10.23 | [更新说明](./../Agilebot%5FRobot%5FCSharp%5FSDK%5FChangeLog.html) --- url: /zh/2-csharp/0-prologue/0.2-compatibility.html title: 机器人版本兼容性 --- # 机器人版本兼容性 [​](#机器人版本兼容性) SDK 支持捷勃特 Scara,Puma 及协作机器人系列。须对已安装机器人软件的设备使用。兼容兼容的机器人软件版本。部分功能因版本不同,返回结果有所差异。 SDK 连接到机械臂时会对机械臂运动控制软件的版本进行检查,如果低于版本最低要求将无法连接,低于推荐版本要求将提示版本过低,请及时更新兼容的机器人软件版本 SDK 某些接口只支持对应的版本控制器,请注意查看具体接口兼容性 | SDK 版本 | 兼容的机器人软件版本 | 支持状态 | | ------- | ------------------------------- | ---- | | 0.1.1.X | Copper v7.5.X.X、Bronze v7.4.X.X | 不再支持 | | 0.1.2.X | Copper v7.5.X.X、Bronze v7.4.X.X | 不再支持 | | 0.2.0.X | Copper v7.5.X.X、Bronze v7.4.X.X | 不再支持 | | 1.0.0.X | Copper v7.6.X.X、Bronze v7.5.X.X | 支持中 | | 2.0.X.X | Copper v7.7.X.X、Bronze v7.7.X.X | 支持中 | --- url: /zh/2-csharp/1-intro/1.1-envronment.html title: 1.1 环境要求 --- # 1.1 环境要求 [​](#1-1) 系统: * Windows 10 及以上 * x86\_64 架构 * .NET 版本 * 6.0 以上 * .NET Framework 版本 * 4.7 以上 --- url: /zh/2-csharp/1-intro/1.2-install.html title: 1.2 安装 --- # 1.2 安装 [​](#1-2) 本节介绍开发环境准备、SDK 获取与常见运行注意事项,确保在最短时间内完成 Agilebot SDK 的本地调试。 ## IDE 安装与配置 [​](#ide-安装与配置) 1. 推荐使用 Visual Studio 作为 C# 开发环境,可在 [下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux](https://visualstudio.microsoft.com/zh-hans/downloads/) 获取最新版本。 2. 安装完成后启动 Visual Studio,并根据提示完成初始配置(例如登录、安装必要的工作负载)。 ## SDK 获取与项目创建 [​](#sdk-获取与项目创建) 1. 在 Visual Studio 中新建 **C# 控制台应用**,目标框架选择 `.NET 6.0 及以上` 或 `NET Framework 4.7 及以上` 。 ![示例图片](/docs/sdk/images/1.jpg) ![示例图片](/docs/sdk/images/2.jpg) 2. 进入项目属性,将目标操作系统设置为 **Windows**,目标版本选择 **7.0 或更高**,确保能够使用最新的 WinApp SDK 功能。 ![示例图片](/docs/sdk/images/8.jpg) ![示例图片](/docs/sdk/images/9.jpg) 3. 打开 `工具 > NuGet 包管理器 > 程序包管理器设置` ,在右上角的程序包源中添加 SDK 包所在目录。 ![示例图片](/docs/sdk/images/3.jpg) ![示例图片](/docs/sdk/images/4.jpg) ![示例图片](/docs/sdk/images/5.jpg) ![示例图片](/docs/sdk/images/6.jpg) 4. 返回 NuGet 程序包管理器,将程序包源切换为刚添加的目录,搜索并安装 `Agilebot.SDK` 包。 ![示例图片](/docs/sdk/images/7.jpg) ## 代理服务与常见问题 [​](#代理服务与常见问题) * 安装 SDK 后,项目会自动新增 `Tools` 文件夹,包含本地控制器代理服务所需的 `controller_proxy_service_windows_amd64.exe` 。若该文件未自动复制,可手动将其放入项目根目录与生成输出目录。 * 如程序异常退出导致代理服务残留,可在 Windows 任务管理器中终止 `controller_proxy_service_windows_amd64` 进程。 * 代理服务运行时,请勿将代理服务所在目录移动到其他位置。 ## 联网要求与调试 [​](#联网要求与调试) 1. 开始编写并运行示例代码前,确保上位机已接入机器人网络,或与机器人位于同一局域网。 2. 调试过程中请保持网络连接稳定,避免代理服务因断网而退出。 ![示例图片](/docs/sdk/images/10.jpg) ![示例图片](/docs/sdk/images/11.jpg) --- url: /zh/2-csharp/1-intro/1.3-example.html title: 1.3 示例程序使用方法 --- # 1.3 示例程序使用方法 [​](#1-3) 本章示范如何使用 SDK 附带的 `C#_example` 项目,通过切换不同的启动项来快速体验主要功能类。 ![示例图片](/docs/sdk/images/12.jpg) ## 运行步骤 [​](#运行步骤) 1. 打开 `C#_example` 并运行,程序会自动弹出终端窗口。 2. 按提示输入机器人 IP 地址。 3. 选择代理服务部署位置(机器人内部或本地)。 4. 点击 **“开始运行”** 即可加载对应示例。 ![示例图片](/docs/sdk/images/13.jpg) ## 代理类型说明 [​](#代理类型说明) * **机器人内部代理**:使用机器人控制柜自带的代理服务,代理运行在机器人控制柜上,适合机器人软件版本不低于 v7.7.0.0 的场景。 * **本地控制器代理**:使用 SDK 自带的代理服务,代理运行在上位机,占用资源极少,适用于所有版本,机器人软件版本低于 v7.7.0.0 时只能使用本地控制器代理。 * 在 **Airbot** 上仅支持机器人内部代理(本地代理无法与 AirBot 通信),请选择对应选项以确保连接成功。 --- url: /zh/2-csharp/2-glossary/ title: 2 名词解释 --- # 2 名词解释 [​](#2) | 名词 | 描述 | | ------ | ---------------------------------------------------------------- | | 示教器 | 连接在机器人上的手持设备,用于对机器人进行示教和控制 | | SDK | 软件开发工具包,用于对机器人进行编程和控制 | | 机器人网络 | 机器人与外部计算机之间的网络连接 | | 控制器 | 机器人的控制单元,负责执行运动指令、处理传感器数据和管理机器人状态 | | 机械臂 | 机器人的主要运动部分,由多个关节和连杆组成 | | 伺服系统 | 控制机器人关节运动的电机驱动系统,提供精确的位置和速度控制 | | 示教 | 通过手动操作机器人或示教器来记录机器人运动轨迹和动作的过程 | | 关节 | 机器人机械臂中连接各个连杆的可动部件,每个关节对应一个自由度 | | 笛卡尔坐标 | 以 X、Y、Z 三个相互垂直的轴为基准的三维坐标系统,用于描述机器人在空间中的位置和姿态 | | 位姿 | 机器人在空间中的位置和姿态的组合,包括位置坐标和旋转角度 | | 轨迹 | 机器人末端执行器在空间中移动的路径,通常由一系列位姿点组成 | | 负载 | 机器人末端执行器所承载的重量和物体,影响机器人的运动性能和精度 | | 坐标系 | 用于描述机器人位置和姿态的参考系统,包括基坐标系、工具坐标系、用户坐标系等 | | OVC | Overall Velocity Control,全局速度控制,用于设置机器人整体运动速度的倍率 | | OAC | Overall Acceleration Control,全局加速度控制,用于设置机器人整体加速度的倍率 | | TF | Tool Frame,工具坐标系,以机器人末端工具为原点的坐标系 | | UF | User Frame,用户坐标系,用户自定义的坐标系,便于编程和定位 | | TCS | Teach Coordinate System,示教坐标系,用于示教时的坐标参考系统 | | DH 参数 | Denavit-Hartenberg 参数,用于描述机器人连杆几何关系的标准参数 | | PR 寄存器 | Pose Register,位姿寄存器,用于存储机器人位姿信息的寄存器 | | MR 寄存器 | Motion Register,运动寄存器,用于存储运动相关参数的寄存器 | | SR 寄存器 | String Register,字符串寄存器,用于存储字符串信息的寄存器 | | R 寄存器 | Real Register,实数寄存器,用于存储数值信息的寄存器 | | MH 寄存器 | Modbus Holding Register,Modbus 保持寄存器,用于 Modbus 通信的保持寄存器 | | MI 寄存器 | Modbus Input Register,Modbus 输入寄存器,用于 Modbus 通信的输入寄存器 | | DI | Digital Input,数字信号输入,用于接收外部数字信号 | | DO | Digital Output,数字信号输出,用于控制外部设备或执行器 | | BAS | Basic Script,基础脚本语言,用于编写机器人控制程序的高级编程语言 | | Scara | Selective Compliance Assembly Robot Arm,选择性柔顺装配机器人手臂,一种四轴工业机器人类型 | | 协作机器人 | 能够与人类安全协作的机器人,通常具有力感知和碰撞检测功能 | | 工业机器人 | 用于工业自动化生产的机器人,通常具有高精度、高速度和高负载能力 | | Copper | 捷勃特协作机器人产品线的代号 | | Bronze | 捷勃特工业机器人产品线的代号 | --- url: /zh/2-csharp/3-struct/ title: 3 数据结构 --- # 3 数据结构 [​](#3) ## 3.1 StatusCode [​](#3-1) ### 说明 [​](#说明) 接口返回状态码 ### 导入 [​](#导入) ```c# using Agilebot.IR; ``` ### 字段 [​](#字段) | **名称** | **枚举值** | **描述** | | ---------------------------- | ------- | ----------------------- | | OK | 0 | 执行成功 | | INCOMPATIBLE\_VERSION | \-1 | 版本不兼容 | | TIMEOUT | \-3 | 连接超时 | | INTERFACE\_NOT\_IMPLEMENTED | \-4 | 接口未实现 | | INDEX\_OUT\_OF\_RANGE | \-5 | 索引越界 | | UNSUPPORTED\_FILETYPE | \-6 | 不支持的文件类型 | | UNSUPPORTED\_PARAMETER | \-7 | 不支持的机器人参数 | | UNSUPPORTED\_SIGNALTYPE | \-8 | 不支持的 IO 信号类型 | | PROGRAM\_NOT\_FOUND | \-9 | 找不到程序 | | PROGRAM\_POSE\_NOT\_FOUND | \-10 | 找不到程序位姿信息 | | WRITE\_PROGRAM\_FAILED | \-11 | 更新程序位姿信息失败 | | GET\_ALARM\_CODE\_FAILED | \-12 | 访问报警服务获取报警码失败 | | WRONG\_POSITION\_INFO | \-13 | 控制器返回错误的点位信息 | | UNSUPPORTED\_TRA\_TYPE | \-14 | 不支持的运动类型 | | FILE\_NOT\_FOUND | \-15 | 文件或文件夹未找到 | | FILE\_ALREADY\_EXIST | \-16 | 文件已存在 | | GET\_ALARM\_DESC\_FAILED | \-17 | 根据报警码获取报警信息失败 | | RESET\_ALARM\_ERRORS\_FAILED | \-18 | 重置报警信息失败 | | GET\_ALL\_ALARMS\_FAILED | \-19 | 获取所有报警信息失败 | | WRONG\_DATA\_FORMAT | \-20 | 接收的数据格式有误 | | CONNECT\_FAILED | \-21 | 初始化连接失败,请检查 ip 地址或控制柜服务 | | POSE\_INDEX\_DUPLICATED | \-23 | 位姿序号重复 | | CONTROLLER\_ERROR | \-254 | 控制器错误,请联系开发人员 | | OTHER\_REASON | \-255 | 其他原因 | ## 3.2 RobotState [​](#3-2) ### 说明 [​](#说明-1) 机器人运行状态 ### 导入 [​](#导入-1) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-1) | **名称** | **枚举值** | **描述** | | ------------------------- | ------- | --------------- | | WRONG\_DATA | \-1 | 未知状态 | | ROBOT\_IDLE | 0 | 机器人空闲 | | ROBOT\_RUNNING | 1 | 机器人运行中 | | ROBOT\_TEACHING | 2 | 机器人示教中 | | ROBOT\_IDLE\_TO\_RUNNING | 101 | 机器人中间状态 空闲转换为运行 | | ROBOT\_IDLE\_TO\_TEACHING | 102 | 机器人中间状态 空闲转换为示教 | | ROBOT\_RUNNING\_TO\_IDLE | 103 | 机器人中间状态 运行转换为空闲 | | ROBOT\_TEACHING\_TO\_IDLE | 104 | 机器人中间状态 示教转换为空闲 | ## 3.3 CtrlState [​](#3-3) ### 说明 [​](#说明-2) 控制器运行状态 ### 导入 [​](#导入-2) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-2) | 名称 | 枚举值 | 描述 | | --------------------------- | --- | --------------- | | WRONG\_DATA | \-1 | 未知的控制器状态 | | CTRL\_INIT | 0 | 控制器初始化 | | CTRL\_ENGAGED | 1 | 控制器使能 | | CTRL\_ESTOP | 2 | 控制器急停 | | CTRL\_TERMINATED | 3 | 控制器中止 | | CTRL\_ANY\_TO\_ESTOP | 101 | 控制器中间状态 其他转换为急停 | | CTRL\_ESTOP\_TO\_ENGAGED | 102 | 控制器中间状态 急停到使能 | | CTRL\_ESTOP\_TO\_TERMINATED | 103 | 控制器中间状态 急停到中止 | ## 3.4 ServoState [​](#3-4) ### 说明 [​](#说明-3) 伺服控制器状态 ### 导入 [​](#导入-3) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-3) | 名称 | 枚举值 | 描述 | | ------------------ | --- | ---------- | | WRONG\_DATA | \-1 | 未知的伺服控制器状态 | | SERVO\_IDLE | 1 | 伺服控制器空闲 | | SERVO\_RUNNING | 2 | 伺服控制器运行中 | | SERVO\_DISABLE | 3 | 伺服控制器关闭 | | SERVO\_WAIT\_READY | 4 | 伺服控制器等待就绪 | | SERVO\_WAIT\_DOWN | 5 | 伺服控制器等待关闭 | | SERVO\_INIT | 10 | 伺服控制器初始化 | ## 3.5 TransformStatusEnum [​](#3-5) ### 说明 [​](#说明-4) 离线轨迹文件转换状态的枚举 ### 导入 [​](#导入-4) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-4) | 名称 | 枚举值 | 描述 | | --------------------- | --- | --------- | | TRANSFORM\_START | 0 | 转换任务开始 | | TRANSFORM\_RUNNING | 1 | 转换任务执行中 | | TRANSFORM\_SUCCESS | 2 | 转换任务已完成 | | TRANSFORM\_FAILED | 3 | 转换任务失败 | | TRANSFORM\_NOT\_FOUND | 4 | 转换任务没找到 | | TRANSFORM\_UNKNOWN | \-1 | 未知的转换任务状态 | 以下是为 `PayloadInfo` 、 `MassCenter` 和 `InertiaMoment` 类生成的详细说明文档: --- ## 3.6 PayloadInfo [​](#3-6) ### 说明 [​](#说明-5) `PayloadInfo` 类用于存储机器人的负载信息,包括负载编号、重量、质心和惯性矩等参数。这些信息对于机器人在负载条件下的运动学和动力学分析至关重要,尤其是在进行路径规划和力矩计算时。 ### 导入 [​](#导入-5) ```c# using Agilebot.IR.Motion; ``` ### 属性 [​](#属性) | 属性 | 类型 | 描述 | | ------------- | ----------------------- | ------------------ | | Id | uint | 负载编号,用于唯一标识不同的负载配置 | | Comment | string | 注释,用于描述负载的额外信息 | | Weight | double | 负载的重量(单位:千克) | | MassCenter | [MassCenter](#3-6-1) | 负载的质心位置(X、Y、Z 坐标) | | InertiaMoment | [InertiaMoment](#3-6-2) | 负载的惯性矩(LX、LY、LZ) | ### 示例 [​](#示例) ```c# PayloadInfo payload = new PayloadInfo { Id = 1, Comment = "Sample Payload", Weight = 5.0, MassCenter = new MassCenter { X = 10.0, Y = 20.0, Z = 30.0 }, InertiaMoment = new InertiaMoment { LX = 0.1, LY = 0.2, LZ = 0.3 } }; ``` ### 3.6.1 MassCenter [​](#3-6-1) #### 说明 [​](#说明-6) `MassCenter` 类用于表示负载的质心位置,包含 X、Y 和 Z 三个坐标轴的值。质心位置是负载在空间中的几何中心,对于机器人运动控制和力矩计算非常重要。 #### 导入 [​](#导入-6) ```c# using Agilebot.IR.Motion; ``` #### 属性 [​](#属性-1) | 属性 | 类型 | 描述 | | -- | ------ | --------------- | | X | double | 质心的 X 坐标(单位:毫米) | | Y | double | 质心的 Y 坐标(单位:毫米) | | Z | double | 质心的 Z 坐标(单位:毫米) | ### 3.6.2 InertiaMoment [​](#3-6-2) #### 说明 [​](#说明-7) `InertiaMoment` 类用于表示负载的惯性矩,包含 LX、LY 和 LZ 三个方向的值。惯性矩是负载在旋转运动中抵抗变化的能力,对于机器人动力学分析和控制非常重要。 #### 导入 [​](#导入-7) ```c# using Agilebot.IR.Motion; ``` #### 属性 [​](#属性-2) | 属性 | 类型 | 描述 | | -- | ------ | --------------------- | | LX | double | 惯性矩的 X 分量(单位:千克・毫米 ²) | | LY | double | 惯性矩的 Y 分量(单位:千克・毫米 ²) | | LZ | double | 惯性矩的 Z 分量(单位:千克・毫米 ²) | ## 3.7 TransformState [​](#3-7) ### 说明 [​](#说明-8) 离线轨迹文件转换状态的枚举 ### 导入 [​](#导入-8) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-5) | 枚举值 | 值 | 描述 | | --------------------- | --- | --------- | | TRANSFORM\_START | 0 | 转换任务开始 | | TRANSFORM\_RUNNING | 1 | 转换任务执行中 | | TRANSFORM\_SUCCESS | 2 | 转换任务已完成 | | TRANSFORM\_FAILED | 3 | 转换任务失败 | | TRANSFORM\_NOT\_FOUND | 4 | 转换任务未找到 | | TRANSFORM\_UNKNOWN | \-1 | 数据错误,未知状态 | ## 3.8 TCSType [​](#3-8) ### 说明 [​](#说明-9) TCS 坐标系类型 ### 导入 [​](#导入-9) ```c# using Agilebot.IR.Types; ``` ### 字段 [​](#字段-6) | 名称 | 枚举值 | 描述 | | ----------- | --- | ---------- | | WRONG\_TYPE | \-1 | 错误类型 | | JOINT | 0 | 关节空间 | | BASE | 1 | 基坐标系 | | WORLD | 2 | 世界坐标系 | | USER | 3 | 用户坐标系 | | TOOL | 4 | 工具坐标系 | | RTCP\_USER | 5 | RTCP 用户坐标系 | | RTCP\_TOOL | 6 | RTCP 工具坐标系 | ## 3.9 MotionPose [​](#3-9) ### 说明 [​](#说明-10) 描述机器人点位的结构 坐标数据中,XYZ 方向距离数据单位为毫米 (mm),角度数据单位为 度 (°),部分版本角度信息为弧度,详见功能列表返回结果说明。 ### 导入 [​](#导入-10) ```c# using Agilebot.IR.Motion; ``` ### 属性 [​](#属性-3) | 属性 | 类型 | 描述 | | -------- | --------------------- | ---------------- | | CartData | [BaseCartData](#3-10) | 笛卡尔数据 | | Joint | [Joint](#3-11) | 关节数据 | | Pt | [PoseType](#3-12) | 点位类型,默认为 Unknown | ### 示例 [​](#示例-1) ```c# 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(9){0,0,0,0,0,0,0,0,0} }; MotionPose motionPose2 = new MotionPose(); motionPose2.Pt = PoseType.Joint; motionPose2.Joint = new Joint{ J1 = 0, J2 = 0, J3 = 60, J4 = 60, J5 = 0, J6 = 0 }; ``` ## 3.10 BaseCartData [​](#3-10) ### 说明 [​](#说明-11) 描述机器人在笛卡尔坐标系中的空间位置和姿态信息。其中,空间坐标使用毫米(mm)为单位,姿态信息包括腕部、臂部的姿态以及各个轴的回转数。 ### 导入 [​](#导入-11) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-4) | 属性 | 类型 | 描述 | | -------- | ------------------- | -------------------------- | | Position | [Position](#3-10-1) | 机器人的空间坐标(X, Y, Z, A, B, C) | | Posture | [Posture](#3-10-2) | 机器人的姿态信息(腕部、臂部姿态及轴的回转数) | ### 示例 [​](#示例-2) ```c# BaseCartData cartData = new BaseCartData(); cartData.Position.X = 100.0; cartData.Position.Y = 200.0; cartData.Position.Z = 300.0; cartData.Posture.ArmUpDown = 1; cartData.Posture.ArmBackFront = -1; Console.WriteLine(cartData.ToString()); ``` --- ### 3.10.1 Position [​](#3-10-1) #### 说明 [​](#说明-12) 描述机器人操作点的笛卡尔坐标系空间位置及旋转角度坐标。坐标数据中,X、Y、Z 方向的距离单位为毫米(mm),A、B、C 方向的角度单位为度(°)。 #### 导入 [​](#导入-12) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-5) | 属性 | 类型 | 描述 | | -- | ------ | --------------------- | | X | double | 笛卡尔坐标系 X 方向的距离(单位:毫米) | | Y | double | 笛卡尔坐标系 Y 方向的距离(单位:毫米) | | Z | double | 笛卡尔坐标系 Z 方向的距离(单位:毫米) | | A | double | 笛卡尔坐标系 A 方向的角度(单位:度) | | B | double | 笛卡尔坐标系 B 方向的角度(单位:度) | | C | double | 笛卡尔坐标系 C 方向的角度(单位:度) | #### 示例 [​](#示例-3) ```c# Position position = new Position(); position.X = 100.0; position.Y = 200.0; position.Z = 300.0; position.A = 45.0; position.B = 30.0; position.C = 60.0; Console.WriteLine(position.ToString()); ``` --- ### 3.10.2 Posture [​](#3-10-2) #### 说明 [​](#说明-13) 描述机器人的姿态信息,包括腕部、臂部的姿态以及各个轴的回转数。姿态信息用于定义机器人在空间中的具体姿态。 #### 导入 [​](#导入-13) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-6) | 属性 | 类型 | 描述 | | ------------ | --------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | WristFlip | int | 腕部翻转姿态,取值范围为 - 1、0、1。在 6 轴机器人 J5 关节配置中,值 = 1 表示腕向下翻转,值 =-1 表示腕向上翻转 | | ArmUpDown | int | 臂部上下姿态,取值范围为 - 1、0、1。在 6 轴机器人 J3 关节配置中,值 = 1 表示手臂在上(前向条件下,3 轴在 4 轴到 2 轴连线上方,3 轴关节角 <0),值 =-1 表示手臂在下(前向条件下,3 轴在 4 轴到 2 轴连线下方,3 轴关节角> 0) | | ArmBackFront | int | 臂部前后姿态,取值范围为 - 1、0、1。在 6 轴机器人 J1 关节配置中,值 = 1 表示手臂在前(协作面向前方,2 轴在 1 轴左侧的状态下),值 =-1 表示手臂在后(协作面向前方,2 轴在 1 轴右侧的状态下) | | ArmLeftRight | int | 臂部左右姿态,取值范围为 - 1、0、1。在 4 轴 Scara 机器人 J2 关节配置中,值 = 1 表示 Scara 手臂在右,值 =-1 表示 Scara 手臂在左 | | TurnCircle | List | 各个轴的回转数,取值范围为 - 1、0、1。各轴处在 0° 姿势下,回转数为 0。执行直线、圆弧动作时,目标点回转数自动选定,可能与示教位置资料不同。各轴回转数 >=180 对应值 = 1 或更大,-179.99\~179.99 对应值 = 0,<=-180 对应值 =-1 或更小 | #### 示例 [​](#示例-4) ```c# Posture posture = new Posture(); posture.TurnCircle = new List(9){0,0,0,0,0,0,0,0,0} posture.WristFlip = 1; posture.ArmUpDown = 1; posture.ArmBackFront = -1; posture.ArmLeftRight = 1; Console.WriteLine(posture.ToString()); ``` 以下是为 `Joint` 类生成的说明文档: --- ## 3.11 Joint [​](#3-11) ### 说明 [​](#说明-14) 描述机器人各个关节的角度数据。每个关节的角度值用于定义机器人在关节空间中的具体位置。角度单位通常为度(°),但具体单位需根据实际机器人系统确认。 ### 导入 [​](#导入-14) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-7) | 属性 | 类型 | 描述 | | -- | ------ | ---------- | | J1 | double | 机器人一轴的关节角度 | | J2 | double | 机器人二轴的关节角度 | | J3 | double | 机器人三轴的关节角度 | | J4 | double | 机器人四轴的关节角度 | | J5 | double | 机器人五轴的关节角度 | | J6 | double | 机器人六轴的关节角度 | | J7 | double | 机器人七轴的关节角度 | | J8 | double | 机器人八轴的关节角度 | | J9 | double | 机器人九轴的关节角度 | ### 示例 [​](#示例-5) ```c# Joint joint = new Joint(); joint.J1 = 45.0; joint.J2 = 30.0; joint.J3 = 60.0; joint.J4 = 90.0; joint.J5 = 120.0; joint.J6 = 135.0; joint.J7 = 150.0; joint.J8 = 180.0; joint.J9 = 225.0; Console.WriteLine(joint.ToString()); ``` ### 注意事项 [​](#注意事项) * 关节角度的单位通常为度(°),但某些机器人系统可能使用弧度(rad)。请根据具体机器人系统的文档确认单位。 * 关节角度的取值范围通常由机器人硬件限制,超出范围可能导致错误或损坏设备。 以下是为 `PoseType` 枚举生成的说明文档: --- ## 3.12 PoseType [​](#3-12) ### 说明 [​](#说明-15) 定义了机器人位姿数据的类型,用于区分数据是关节角度、笛卡尔空间坐标还是未知类型。该枚举用于标识机器人位姿数据的格式,以便在程序中正确处理不同类型的数据。 ### 导入 [​](#导入-15) ```c# using Agilebot.IR.Types; ``` ### 枚举值 [​](#枚举值) | 枚举值 | 描述 | | ------- | ---------------------- | | Unknown | 未知类型,表示位姿数据类型未定义 | | Joint | 关节角度数据类型,表示数据为关节角度 | | Cart | 笛卡尔空间坐标数据类型,表示数据为笛卡尔坐标 | 以下是为 `DHparam` 类生成的说明文档: --- ## 3.13 DHparam [​](#3-13) ### 说明 [​](#说明-16) `DHparam` 类用于描述机器人连杆的参数,基于 [Denavit-Hartenberg 参数](https://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg%5Fparameters)(D-H 参数)。这些参数用于定义机器人关节之间的几何关系,是机器人运动学和动力学分析的基础。 ### 导入 [​](#导入-16) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-8) | 属性 | 类型 | 描述 | | ------ | ------ | ----------------------------- | | id | uint | 杆件的唯一标识符,用于区分不同的连杆 | | a | double | 杆件长度,表示相邻关节的轴向距离(单位:毫米) | | alpha | double | 杆件扭角,表示相邻关节轴之间的夹角(单位:度或弧度) | | d | double | 关节距离,表示沿当前关节轴到下一个关节的距离(单位:毫米) | | offset | double | 关节转角偏移量,表示关节的初始角度偏移(单位:度或弧度) | ### 构造函数 [​](#构造函数) ```c# public DHparam(uint id, double d, double a, double alpha, double offset) ``` ### 注意事项 [​](#注意事项-1) * **单位一致性**: `a` 和 `d` 的单位应保持一致(通常为毫米),而 `alpha` 和 `offset` 的单位也应保持一致(通常为度或弧度)。 * **角度单位**:在某些机器人系统中,角度单位可能为弧度而非度。请根据实际需求确认并统一单位。 * **D-H 参数的定义**:D-H 参数的定义依赖于具体的机器人模型和坐标系约定。在使用 `DHparam` 类时,确保参数的定义与机器人的实际几何结构一致。 以下是为 `CartStatus` 、 `JointStatus` 和 `DragStatus` 类生成的详细说明文档: --- ## 3.14 CartStatus [​](#3-14) ### 说明 [​](#说明-17) `CartStatus` 类用于表示笛卡尔坐标系中各轴的状态。每个轴的状态用布尔值表示, `true` 表示轴可用, `false` 表示轴不可用。此状态类通常用于机器人运动控制中,以判断某个轴是否可以正常工作。 ### 导入 [​](#导入-17) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-9) | 属性 | 类型 | 描述 | | -- | ---- | -------------------- | | X | bool | X 方向状态,默认为 true (可用) | | Y | bool | Y 方向状态,默认为 true (可用) | | Z | bool | Z 方向状态,默认为 true (可用) | | A | bool | A 方向状态,默认为 true (可用) | | B | bool | B 方向状态,默认为 true (可用) | | C | bool | C 方向状态,默认为 true (可用) | --- ## 3.15 JointStatus [​](#3-15) ### 说明 [​](#说明-18) `JointStatus` 类用于表示机械臂各关节的状态。每个关节的状态用布尔值表示, `true` 表示关节可用, `false` 表示关节不可用。此状态类通常用于机器人运动控制中,以判断某个关节是否可以正常工作。 ### 导入 [​](#导入-18) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-10) | 属性 | 类型 | 描述 | | -- | ---- | --------------------- | | J1 | bool | 关节 1 状态,默认为 true (可用) | | J2 | bool | 关节 2 状态,默认为 true (可用) | | J3 | bool | 关节 3 状态,默认为 true (可用) | | J4 | bool | 关节 4 状态,默认为 true (可用) | | J5 | bool | 关节 5 状态,默认为 true (可用) | | J6 | bool | 关节 6 状态,默认为 true (可用) | | J7 | bool | 关节 7 状态,默认为 true (可用) | | J8 | bool | 关节 8 状态,默认为 true (可用) | | J9 | bool | 关节 9 状态,默认为 true (可用) | --- ## 3.16 DragStatus [​](#3-16) ### 说明 [​](#说明-19) `DragStatus` 类用于表示机械臂的拖动状态,包含笛卡尔坐标系状态和关节状态。此外,还包含一个标志位 `IsContinuousDrag` ,用于表示是否处于连续拖动模式。此状态类通常用于机器人拖动控制中,以判断当前的拖动模式和各轴 / 关节的状态。 ### 导入 [​](#导入-19) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-11) | 属性 | 类型 | 描述 | | ---------------- | -------------------- | -------------------- | | CartStatus | [CartStatus](#3-14) | 笛卡尔坐标系状态 | | JointStatus | [JointStatus](#3-15) | 关节状态 | | IsContinuousDrag | bool | 是否处于连续拖动模式,默认为 false | ### 构造函数 [​](#构造函数-1) ```c# public DragStatus() ``` * 初始化 `CartStatus` 和 `JointStatus` ,并设置 `IsContinuousDrag` 为 `false` 。 ### 示例 [​](#示例-6) ```c# DragStatus dragStatus = new DragStatus(); dragStatus.CartStatus.X = false; // X轴不可用 dragStatus.JointStatus.J3 = false; // 关节3不可用 dragStatus.IsContinuousDrag = true; // 设置为连续拖动模式 Console.WriteLine($"X轴状态: {dragStatus.CartStatus.X}, 关节3状态: {dragStatus.JointStatus.J3}, 是否连续拖动: {dragStatus.IsContinuousDrag}"); ``` ## 3.17 ProgramPose [​](#3-17) ### 说明 [​](#说明-20) `ProgramPose` 类用于表示程序中的一个位姿(姿态),可以是关节坐标或笛卡尔坐标。该类包含位姿的唯一标识符、数据(关节或笛卡尔坐标信息)、名称和注释。通过此类,可以方便地管理和操作机器人程序中的位姿信息。 ### 导入 [​](#导入-20) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-12) | 属性 | 类型 | 描述 | | -------- | -------------------------- | ------------------ | | Id | int | 位姿的唯一标识符 | | PoseData | [ProgramPoseData](#3-17-1) | 位姿的数据,包括关节或笛卡尔坐标信息 | | Name | string | 位姿的名称 | | Comment | string | 位姿的注释 | ### 构造函数 [​](#构造函数-2) ```c# public ProgramPose() ``` * 初始化 `Id` 、 `PoseData` 、 `Name` 和 `Comment` 。 ### 示例 [​](#示例-7) ```c# ProgramPose programPose = new ProgramPose(); programPose.Id = 1; // 设置位姿的唯一标识符 programPose.PoseData = new ProgramPoseData(); // 创建位姿数据 programPose.Name = "Pose1"; // 设置位姿名称 programPose.Comment = "这是一个示例位姿"; // 设置位姿注释 Console.WriteLine($"位姿ID: {programPose.Id}, 名称: {programPose.Name}, 注释: {programPose.Comment}"); ``` ### 3.17.1 ProgramPoseData [​](#3-17-1) #### 说明 [​](#说明-21) `ProgramPoseData` 类用于表示程序中的位姿数据,包含笛卡尔空间坐标和姿态信息、关节角度信息以及位姿类型。通过此类,可以方便地存储和管理位姿的具体数据。 #### 导入 [​](#导入-21) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-13) | 属性 | 类型 | 描述 | | -------- | -------------------------- | ---------------- | | CartData | [ProgramCartData](#3-17-2) | 笛卡尔数据 | | Joint | [Joint](#3-11) | 关节数据 | | Pt | [PoseType](#3-12) | 点位类型,默认为 Unknown | ### 3.17.2 ProgramCartData [​](#3-17-2) #### 说明 [​](#说明-22) `ProgramCartData` 类用于表示程序的笛卡尔坐标系数据。它通过引用 `BaseCartData` 类来包含空间坐标和姿态信息,并通过 `Uf` 和 `Tf` 的值来确定采用的坐标系类型。 `Uf` 表示用户坐标系(User Frame), `Tf` 表示工具坐标系(Tool Frame)。如果 `Uf` 和 `Tf` 的值为 `-1` ,则表示使用系统的默认坐标系。此类在机器人编程中用于定义和管理笛卡尔空间中的位姿信息。 #### 导入 [​](#导入-22) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-14) | 属性 | 类型 | 描述 | | -------- | --------------------- | --------------------------------- | | BaseCart | [BaseCartData](#3-10) | 机器人的笛卡尔点位和姿态信息 | | Uf | int | 用户坐标系(User Frame), \-1 表示使用系统的坐标系 | | Tf | int | 工具坐标系(Tool Frame), \-1 表示使用系统的坐标系 | ## 3.18 FileType [​](#3-18) ### 说明 [​](#说明-23) `FileType` 枚举用于定义文件上传时允许的文件类型。它通过不同的枚举值来区分机器人程序文件的来源和格式。此枚举在机器人编程环境中用于文件管理、上传和程序解析等场景,帮助系统正确识别和处理不同类型的程序文件。 ### 导入 [​](#导入-23) ```c# using Agilebot.IR.Types; ``` ### 枚举值 [​](#枚举值-1) | 枚举值 | 描述 | | ----------------- | ----------------------------------------------- | | UserProgram | 用户通过点选生成的程序文件,每个程序包含 .xml 和 .json 两个文件。 | | BlockProgram | 用户通过积木块生成的程序文件,每个程序包含 .block 、 .xml 和 .json 文件。 | | TrajectoryProgram | 离线轨迹程序文件,通常用于离线编程生成的路径规划文件。 | ## 3.19 SignalType [​](#3-19) ### 说明 [​](#说明-24) `SignalType` 枚举用于定义机器人系统中支持的信号类型。它通过不同的枚举值来区分各种数字信号和模拟信号的用途和来源。此枚举在机器人控制系统中用于信号配置、信号处理和逻辑判断等场景,帮助系统准确识别和管理不同类型的信号。 ### 导入 [​](#导入-24) ```c# using Agilebot.IR.Types; ``` ### 枚举值 [​](#枚举值-2) | 枚举值 | 描述 | | --- | ------------------------------------------ | | DI | 数字信号输入(Digital Input),用于接收外部数字信号。 | | DO | 数字信号输出(Digital Output),用于控制外部设备或执行器。 | | RI | 机器人手臂数字信号输入(Robot Input),用于接收机器人手腕部分的数字信号。 | | RO | 机器人手臂数字信号输出(Robot Output),用于控制机器人手腕部分的执行器。 | | UI | 用户数字信号输入(User Input),用于接收用户自定义的数字信号。 | | UO | 用户数字信号输出(User Output),用于输出用户自定义的数字信号。 | | TDI | 工具数字信号输入(Tool Digital Input),用于接收工具端的数字信号。 | | TDO | 工具数字信号输出(Tool Digital Output),用于控制工具端的执行器。 | | GI | 组输入(Group Input),用于接收一组数字信号的组合输入。 | | GO | 组输出(Group Output),用于输出一组数字信号的组合输出。 | | AI | 模拟输入(Analog Input),用于接收连续变化的模拟信号。 | | AO | 模拟输出(Analog Output),用于输出连续变化的模拟信号。 | | TAI | 手腕模拟输入(Tool Analog Input),用于接收工具端的模拟信号。 | ## 3.20 PoseRegister [​](#3-20) ### 说明 [​](#说明-25) `PoseRegister` 类用于表示 PR 寄存器中的位姿(姿态),可以是关节坐标或笛卡尔坐标。该类包含位姿的唯一标识符、数据(关节或笛卡尔坐标信息)、名称和注释。通过此类,可以方便地管理和操作机器人程序中的位姿信息。 ### 导入 [​](#导入-25) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-15) | 属性 | 类型 | 描述 | | -------- | --------------------------- | ------------------ | | Id | int | 位姿的唯一标识符 | | PoseData | [PoseRegisterData](#3-20-1) | 位姿的数据,包括关节或笛卡尔坐标信息 | | Name | string | 位姿的名称 | | Comment | string | 位姿的注释 | ### 构造函数 [​](#构造函数-3) ```c# public PoseRegister() ``` * 初始化 `Id` 、 `PoseData` 、 `Name` 和 `Comment` 。 ### 示例 [​](#示例-8) ```c# PoseRegister pose = new PoseRegister(); pose.Id = 1; // 设置位姿的唯一标识符 pose.PoseData = new PoseRegisterData(); // 创建位姿数据 pose.Name = "Pose1"; // 设置位姿名称 pose.Comment = "这是一个示例位姿"; // 设置位姿注释 Console.WriteLine($"位姿ID: {pose.Id}, 名称: {pose.Name}, 注释: {pose.Comment}"); ``` ### 3.20.1 PoseRegisterData [​](#3-20-1) #### 说明 [​](#说明-26) `PoseRegisterData` 类用于表示 PR 寄存器中的位姿数据,包含笛卡尔空间坐标和姿态信息、关节角度信息以及位姿类型。通过此类,可以方便地存储和管理位姿的具体数据。 #### 导入 [​](#导入-26) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-16) | 属性 | 类型 | 描述 | | -------- | --------------------- | ---------------- | | CartData | [BaseCartData](#3-10) | 笛卡尔数据 | | Joint | [Joint](#3-11) | 关节数据 | | Pt | [PoseType](#3-12) | 点位类型,默认为 Unknown | ## 3.22 Coordinate [​](#3-22) ### 说明 [​](#说明-27) `Coordinate` 类用于表示机器人系统中的一个坐标系。它包含了坐标系的基本信息,如唯一标识符(ID)、名称、备注、运动组编号以及具体的位姿数据。此类在机器人编程和控制系统中用于定义和管理坐标系的具体位置和姿态信息,便于在程序中进行运动规划和路径控制。 ### 导入 [​](#导入-27) ```c# using Agilebot.IR.Types; ``` ### 属性 [​](#属性-17) | 属性 | 类型 | 描述 | | ------- | -------- | -------------------------- | | Id | int | 坐标系的唯一标识符。 | | Name | string | 坐标系的名称,用于标识和描述坐标系。 | | Comment | string | 坐标系的备注信息,用于进一步说明坐标系的用途或特点。 | | GroupId | int | 坐标系所属的运动组编号,用于分类管理坐标系。 | | Data | Position | 坐标系的具体位姿数据,包含位置和姿态信息。 | ### 示例 [​](#示例-9) ```c# // 创建一个 Coordinate 实例 Coordinate coordinate = new Coordinate { Id = 1, // 设置唯一标识符 Name = "UserCoordinate1", // 设置名称 Comment = "这是一个用户自定义坐标系", // 设置备注 GroupId = 1, // 设置运动组编号 Data = new Position { X = 100, Y = 200, Z = 300, A = 45, B = 30, C = 60 } // 设置位姿数据 }; ``` ### 3.22.1 CoordinateType [​](#3-22-1) #### 说明 [​](#说明-28) `CoordinateType` 枚举用于定义坐标系的类型。它通过不同的枚举值来区分用户坐标系和工具坐标系。此枚举在机器人编程和控制系统中用于明确指定坐标系的用途,帮助系统正确处理坐标系相关的操作。 #### 导入 [​](#导入-28) ```c# using Agilebot.IR.Types; ``` #### 枚举值 [​](#枚举值-3) | 枚举值 | 描述 | | -------------- | ------------------------- | | UserCoordinate | 用户坐标系,用于定义用户自定义的坐标系。 | | ToolCoordinate | 工具坐标系,用于定义工具(如末端执行器)的坐标系。 | ### 3.22.2 CoordSummary [​](#3-22-2) #### 说明 [​](#说明-29) `CoordSummary` 类用于表示坐标系的概要信息。它包含坐标系的类型、唯一标识符、名称、注释和组 ID 等信息。此类在机器人编程环境中用于管理和存储坐标系的元数据,便于在程序中快速访问和操作坐标系。 #### 导入 [​](#导入-29) ```c# using Agilebot.IR.Types; ``` #### 属性 [​](#属性-18) | 属性 | 类型 | 描述 | | ------- | -------------- | --------------------- | | Type | CoordinateType | 坐标系类型,可以是用户坐标系或工具坐标系。 | | Id | int | 坐标系的唯一标识符。 | | Name | string | 坐标系的名称。 | | Comment | string | 坐标系的注释,用于描述坐标系的用途或特点。 | | GroupId | int | 坐标系所属的组 ID,用于分类管理坐标系。 | ### 示例 [​](#示例-10) ```c# // 创建一个 CoordSummary 实例 CoordSummary coordSummary = new CoordSummary { Type = CoordinateType.UserCoordinate, // 设置为用户坐标系 Id = 1, // 设置唯一标识符 Name = "UserCoord1", // 设置名称 Comment = "这是一个用户自定义坐标系", // 设置注释 GroupId = 0 // 设置组ID }; ``` --- url: /zh/2-csharp/4-methods/4.1-arm.html title: 4.1 机器人基础操作 --- # 4.1 机器人基础操作 [​](#4-1) | 方法名 | **Arm**( string controllerIP , string teachPanelIP \= null, bool localProxy \= true ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 捷勃特机器人类构造函数,包含所有可用的机器人控制接口。需要先初始化并连接机器人后才能使用其他功能 | | 请求参数 | controllerIP : string 机器人控制器 IP 地址 teachPanelIP : string 可选,示教器侧 IP;不提供时回退到 controllerIP localProxy : bool 是否使用本地控制器代理服务,默认为 true。当为 true 时将在本地启动控制器代理服务;当为 false 时则需要机器人控制器中已安装代理服务(需要机器人软件版本 7.7 及以上) | | 返回值 | [StatusCode](./../3-struct/#3-1): 构造函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.1 连接机器人 [​](#4-1-1) | 方法名 | **ConnectSync**() | | ---------- | ---------------------------------------------- | | 描述 | 建立与捷勃特机器人的网络连接。必须先调用 Arm 构造函数初始化机器人实例 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 连接操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.2 判断与机械臂的连接是否有效 [​](#4-1-2) | 方法名 | **IsConnected**() | | ---------- | ---------------------------------------------- | | 描述 | 检查与机器人的网络连接状态是否有效 | | 请求参数 | 无参数 | | 返回值 | bool: 连接状态,true 表示连接有效,false 表示连接失效或未连接 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.3 与机器人断开连接 [​](#4-1-3) | 方法名 | **DisconnectSync**() | | ---------- | ---------------------------------------------- | | 描述 | 断开与捷勃特机器人的网络连接,释放相关资源 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 断开连接操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/Connect.cs ```cs using Agilebot.IR; public class Connect { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 检查连接状态 // [EN] Check the connection status var state = controller.IsConnected(); Console.WriteLine("Connected: " + state); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.4 获取当前机器人型号 [​](#4-1-4) | 方法名 | **GetArmModelInfo**() | | ---------- | ------------------------------------------------------------------------ | | 描述 | 获取当前连接的捷勃特机器人型号信息 | | 请求参数 | 无参数 | | 返回值 | string: 机器人型号字符串,例如 "GBT-C5A" [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetArmModelInfo.cs ```cs using Agilebot.IR; public class GetArmModelInfo { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取机器人型号信息 // [EN] Get the robot model information (string info, code) = controller.GetArmModelInfo(); if (code != StatusCode.OK) { Console.WriteLine("Get Robot Model Failed: " + code.GetDescription()); } else { Console.WriteLine("Model: " + info); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.5 获取机器人运行状态 [​](#4-1-5) | 方法名 | **GetRobotState**() | | ---------- | --------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人的当前运行状态 | | 请求参数 | 无参数 | | 返回值 | [RobotState](./../3-struct/#3-2): 机器人运行状态枚举值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetRobotState.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetRobotState { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取机器人运行状态 // [EN] Get the robot running state (RobotState state, code) = controller.GetRobotState(); if (code != StatusCode.OK) { Console.WriteLine("Get RobotState Failed: " + code.GetDescription()); } else { Console.WriteLine("RobotState: " + state); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.6 获取当前控制器运行状态 [​](#4-1-6) | 方法名 | **GetCtrlState**() | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人控制器的当前运行状态 | | 请求参数 | 无参数 | | 返回值 | [CtrlState](./../3-struct/#3-3): 控制器运行状态枚举值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetCtrlState.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetCtrlState { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取控制器运行状态 // [EN] Get the controller running state (CtrlState state, code) = controller.GetCtrlState(); if (code != StatusCode.OK) { Console.WriteLine("Get CtrlState Failed: " + code.GetDescription()); } else { Console.WriteLine("CtrlState: " + state); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.7 获取当前伺服状态 [​](#4-1-7) | 方法名 | **GetServoState**() | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 获取捷勃特机器人伺服系统的当前状态 | | 请求参数 | 无参数 | | 返回值 | [ServoState](./../3-struct/#3-4): 伺服系统状态枚举值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetServoState.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetServoState { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取伺服运行状态 // [EN] Get the servo operating state (ServoState state, code) = controller.GetServoState(); if (code != StatusCode.OK) { Console.WriteLine("Get ServoState Failed: " + code.GetDescription()); } else { Console.WriteLine("ServoState: " + state); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.8 获取机器人控制器版本 [​](#4-1-8) | 方法名 | **GetVersion**() | | ---------- | ------------------------------------------------------------- | | 描述 | 获取捷勃特机器人控制器的软件版本信息 | | 请求参数 | 无参数 | | 返回值 | string: 控制器软件版本字符串 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/GetVersion.cs ```cs using Agilebot.IR; public class GetVersion { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 获取机器人控制器版本 // [EN] Get the robot controller version string version; (version, code) = controller.GetVersion(); if (code != StatusCode.OK) { Console.WriteLine("Get version Failed: " + code.GetDescription()); } else { Console.WriteLine("Version: " + version); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.9 设置机器人的 LED 指示灯 [​](#4-1-9) | 方法名 | **SwitchLedLight**( bool mode ) | | ---------- | -------------------------------------------- | | 描述 | 控制捷勃特机器人 LED 指示灯的开关状态 | | 请求参数 | mode : bool LED 指示灯控制模式,true 表示开启,false 表示关闭 | | 返回值 | [StatusCode](./../3-struct/#3-1): 操作执行结果 | | 兼容性 | 仅支持协作机器人,需要控制器版本 1.3.6 及以上,工业机器人不支持 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.1.3+ 工业 (Bronze): 不支持 | 示例代码 Arm/SwitchLedLight.cs ```cs using Agilebot.IR; public class SwitchLedLight { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 关闭灯光 // [EN] Turn off the LED light code = controller.SwitchLedLight(false); if (code != StatusCode.OK) { Console.WriteLine("Switch Led Failed: " + code.GetDescription()); } else { Console.WriteLine("Switch Led Light Off."); } Thread.Sleep(2000); // [ZH] 打开灯光 // [EN] Turn on the LED light code = controller.SwitchLedLight(true); if (code != StatusCode.OK) { Console.WriteLine("Switch Led Failed: " + code.GetDescription()); } else { Console.WriteLine("Switch Led Light On."); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Disconnect from the robot StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.10 机器人伺服启动 [​](#4-1-10) | 方法名 | **ServoOn**() | | ---------- | ---------------------------------------------- | | 描述 | 启动捷勃特机器人的伺服系统,使机器人进入可控制状态 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 伺服启动操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.11 机器人伺服关闭 [​](#4-1-11) | 方法名 | **ServoOff**() | | ---------- | ---------------------------------------------- | | 描述 | 关闭捷勃特机器人的伺服系统,使机器人进入安全停止状态 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 伺服关闭操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.1.12 让机器人伺服重置 [​](#4-1-12) | 方法名 | **ServoReset**() | | ---------- | ---------------------------------------------- | | 描述 | 重置捷勃特机器人的伺服系统,清除错误状态并准备重新启动 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 伺服重置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/ServoOperation.cs ```cs using Agilebot.IR; public class ServoOperation { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 机械臂伺服重置 // [EN] Reset the robot arm servo code = controller.ServoReset(); if (code != StatusCode.OK) { Console.WriteLine("Servo Reset Failed: " + code.GetDescription()); } else { Console.WriteLine("Servo Reset Success."); } Thread.Sleep(3000); // [ZH] 机械臂伺服关闭 // [EN] Turn off the robot arm servo code = controller.ServoOff(); if (code != StatusCode.OK) { Console.WriteLine("Servo Off Failed: " + code.GetDescription()); } else { Console.WriteLine("Servo Off Success."); } Thread.Sleep(3000); // [ZH] 机械臂伺服打开 // [EN] Turn on the robot arm servo code = controller.ServoOn(); if (code != StatusCode.OK) { Console.WriteLine("Servo On Failed: " + code.GetDescription()); } else { Console.WriteLine("Servo On Success."); } Thread.Sleep(3000); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.1.13 机器人紧急停止 [​](#4-1-13) | 方法名 | **Estop**() | | ---------- | ---------------------------------------------- | | 描述 | 执行捷勃特机器人的紧急停止,立即停止所有运动并进入安全状态 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 紧急停止操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Arm/Estop.cs ```cs using Agilebot.IR; public class Estop { 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(); if (code != StatusCode.OK) { Console.WriteLine("Connect Robot Failed: " + code.GetDescription()); return code; } try { // [ZH] 触发机器人急停 // [EN] Trigger the robot emergency stop code = controller.Estop(); if (code != StatusCode.OK) { Console.WriteLine("Emergency Stop Failed: " + code.GetDescription()); } else { Console.WriteLine("Emergency Stop Success"); } } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.2-motion.html title: 4.2 机器人运动控制和状态 --- # 4.2 机器人运动控制和状态 [​](#4-2) ## 4.2.1 获取机器人参数 [​](#4-2-1) ### 4.2.1.1 获取 OVC 全局速度比率 [​](#4-2-1-1) | 方法名 | **Motion.GetOVC**() | | ---------- | ---------------------------------------------------------- | | 描述 | 获取当前机器人的 OVC(Overall Velocity Control)全局速度比率,比率范围为 0\~1 | | 请求参数 | 无 | | 返回值 | double: 全局速度比率值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.2 获取 OAC 全局加速度比率 [​](#4-2-1-2) | 方法名 | **Motion.GetOAC**() | | ---------- | -------------------------------------------------------------- | | 描述 | 获取当前机器人的 OAC(Overall Acceleration Control)全局加速度比率,比率范围为 0\~1.2 | | 请求参数 | 无 | | 返回值 | double: 全局加速度比率值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.3 获取当前使用的 TF [​](#4-2-1-3) | 方法名 | **Motion.GetTF**() | | ---------- | ---------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TF(Tool Frame)工具坐标系序号,序号范围为 0\~10 | | 请求参数 | 无 | | 返回值 | int: TF 工具坐标系序号 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.4 获取当前使用的 UF [​](#4-2-1-4) | 方法名 | **Motion.GetUF**() | | ---------- | ---------------------------------------------------------- | | 描述 | 获取当前机器人使用的 UF(User Frame)用户坐标系序号,序号范围为 0\~10 | | 请求参数 | 无 | | 返回值 | int: UF 用户坐标系序号 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.1.5 获取当前使用的 TCS 示教坐标系 [​](#4-2-1-5) | 方法名 | **Motion.GetTCS**() | | ---------- | ---------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人使用的 TCS(Teach Coordinate System)示教坐标系类型,具体参见[ TCSType](./../3-struct/#3-8) | | 请求参数 | 无 | | 返回值 | [TCSType](./../3-struct/#3-8): TCS 示教坐标系类型枚举值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (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> 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) ### 4.2.2.1 设置 OVC 全局速度比率 [​](#4-2-2-1) | 方法名 | **Motion.SetOVC**( double value ) | | ---------- | ---------------------------------------------- | | 描述 | 设置当前机器人的 OVC(Overall Velocity Control)全局速度比率 | | 请求参数 | value : double 速度比率,范围为 0\~1 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.2 设置 OAC 全局加速度比率 [​](#4-2-2-2) | 方法名 | **Motion.SetOAC**( double value ) | | ---------- | ------------------------------------------------- | | 描述 | 设置当前机器人的 OAC(Overall Acceleration Control)全局加速度比率 | | 请求参数 | value : double 加速度比率,范围为 0\~1.2 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.3 设置当前使用的 TF 用户坐标系编号 [​](#4-2-2-3) | 方法名 | **Motion.SetTF**( int value ) | | ---------- | ---------------------------------------------- | | 描述 | 设置当前使用的 TF(Tool Frame)工具坐标系序号 | | 请求参数 | value : int TF 序号,范围为 0\~10 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.4 设置当前使用的 UF 工具坐标系编号 [​](#4-2-2-4) | 方法名 | **Motion.SetUF**( int value ) | | ---------- | ---------------------------------------------- | | 描述 | 设置当前使用的 UF(User Frame)用户坐标系序号 | | 请求参数 | value : int UF 序号,范围为 0\~10 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.2.5 设置当前使用的 TCS 示教坐标系 [​](#4-2-2-5) | 方法名 | **Motion.SetTCS**( TCSType value ) | | ---------- | ------------------------------------------------- | | 描述 | 设置当前使用的 TCS(Teach Coordinate System)示教坐标系 | | 请求参数 | value : [TCSType](./../3-struct/#3-8) TCS 示教坐标系类型 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (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 将笛卡尔点位转换成关节值点位 [​](#4-2-3) | 方法名 | **Motion.ConvertCartToJoint**( MotionPose pose , int ufIndex \= 0, int tfIndex \= 0 ) | | ---------- | -------------------------------------------------------------------------------------------------------- | | 描述 | 将位姿数据从笛卡尔坐标转换为关节坐标 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 机器人的位姿数据 ufIndex : int 用户坐标系索引,默认为 0 tfIndex : int 工具坐标系索引,默认为 0 | | 返回值 | [MotionPose](./../3-struct/#3-9): 转换后的机器人位姿数据 [StatusCode](./../3-struct/#3-1): 转换操作执行结果 | | 兼容的机器人软件版本 | 协作 (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(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 将关节值点位转换成笛卡尔点位 [​](#4-2-4) | 方法名 | **Motion.ConvertJointToCart**( MotionPose pose , int ufIndex \= 0, int tfIndex \= 0 ) | | ---------- | -------------------------------------------------------------------------------------------------------- | | 描述 | 将位姿数据从关节坐标转换为笛卡尔坐标 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 机器人的位姿数据 ufIndex : int 用户坐标系索引,默认为 0 tfIndex : int 工具坐标系索引,默认为 0 | | 返回值 | [MotionPose](./../3-struct/#3-9): 转换后的机器人位姿数据 [StatusCode](./../3-struct/#3-1): 转换操作执行结果 | | 兼容的机器人软件版本 | 协作 (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 机器人末端移动到指定的位置 [​](#4-2-5) | 方法名 | **Motion.MoveJoint**( MotionPose pose , double vel \= 1, double acc \= 1 ) | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 让机器人末端移动到指定位置,移动方式为最快路径(关节运动) | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 笛卡尔空间或关节坐标系上的目标位置坐标 vel : double 运动速度,范围为 0\~1,表示最大速度的倍数 acc : double 加速度,范围为 0\~1.2,表示最大加速度的倍数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | | 兼容的机器人软件版本 | 协作 (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 让机器人末端沿直线移动到指定的位置 [​](#4-2-6) | 方法名 | **Motion.MoveLine**(MotionPose pose , double vel \= 100, double acc \= 1) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 让机器人末端沿直线移动到指定位置,移动方式为两点之间的直线路径 | | 请求参数 | pose : [MotionPose](./../3-struct/#3-9) 笛卡尔空间或关节坐标系上的目标位置坐标 vel : double 运动速度,范围为 0\~5000mm/s,表示机械臂末端移动速度 acc : double 加速度,范围为 0\~1.2,表示最大加速度的倍数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | | 兼容的机器人软件版本 | 协作 (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 机器人末端沿弧线移动到指定的位置 [​](#4-2-7) | 方法名 | **Motion.MoveCircle**(MotionPose pose1 , MotionPose pose2 , double vel = 100, double acc = 1) | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 让机器人末端沿弧线移动到指定位置 | | 请求参数 | pose1 : [MotionPose](./../3-struct/#3-9) 机械臂运动的途径点位姿 pose2 : [MotionPose](./../3-struct/#3-9) 机械臂运动的终点位姿 vel : double 运动速度,范围为 0\~5000mm/s,表示机械臂末端移动速度 acc : double 加速度,范围为 0\~1.2,表示最大加速度的倍数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | | 兼容的机器人软件版本 | 协作 (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 获取机器人的当前位姿 [​](#4-2-8) | 方法名 | **Motion.GetCurrentPose**(PoseType pt , int ufIndex \= 0, int tfIndex \= 0) | | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 获取机器人的当前位姿,可获取笛卡尔空间或关节坐标系下的位姿信息 | | 请求参数 | pt : [PoseType](./../3-struct/#3-12) 位姿类型 ufIndex : int 当使用 PoseType.CART 时需传入用户坐标系索引,默认为 0 tfIndex : int 当使用 PoseType.CART 时需传入工具坐标系索引,默认为 0 | | 返回值 | [MotionPose](./../3-struct/#3-9): 机器人位姿数据 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (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 参数 [​](#4-2-9) | 方法名 | **Motion.GetDHParam**() | | ---------- | ----------------------------------------------------------------------------------------- | | 描述 | 获取机器人的 DH(Denavit-Hartenberg)参数 | | 请求参数 | 无参数 | | 返回值 | List<[DHparam](./../3-struct/#3-13)\>: DH 参数列表 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (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 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 参数 [​](#4-2-10) | 方法名 | **Motion.SetDHParam**(List<[DHparam](./../3-struct/#3-13)\> dHparams ) | | ---------- | ---------------------------------------------------------------------- | | 描述 | 设置机器人的 DH(Denavit-Hartenberg)参数 | | 请求参数 | dHparams : List<[DHparam](./../3-struct/#3-13)\> DH 参数列表 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (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 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 获取机器人轴锁定状态 [​](#4-2-11) | 方法名 | **Motion.GetDragSet**() | | ---------- | --------------------------------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人轴锁定状态,轴锁定只针对示教运动 | | 请求参数 | 无参数 | | 返回值 | [DragStatus](./../3-struct/#3-16): 轴锁定状态,True 表示该轴为可移动状态,False 表示被锁定 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | ## 4.2.12 设定机器人轴锁定状态 [​](#4-2-12) | 方法名 | **Motion.SetDragSet**(DragStatus dragStatus ) | | ---------- | --------------------------------------------------------------------- | | 描述 | 设定当前机器人轴锁定状态,轴锁定只针对示教运动 | | 请求参数 | dragStatus : [DragStatus](./../3-struct/#3-16) 轴锁定状态,默认全部为 True: 解锁状态 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): 不支持 | ## 4.2.13 设定当前机器人是否启动拖动示教 [​](#4-2-13) | 方法名 | **Motion.EnableDrag**(bool dragState ) | | ---------- | ------------------------------------------------------ | | 描述 | 设定当前机器人是否启动拖动示教功能 | | 请求参数 | dragState : bool 机器人的拖动状态,true 表示进入拖动状态,false 表示退出拖动状态 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (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 进入实时位置控制模式 [​](#4-2-14) | 方法名 | **Motion.EnterPositionControl**() | | ---------- | -------------------------------------------- | | 描述 | 进入实时位置控制模式,允许对机器人进行精确的位置控制 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 模式切换操作执行结果 | | 备注 | 在进入实时控制模式后,必须通过 UDP 发送控制指令 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ## 4.2.15 退出实时位置控制模式 [​](#4-2-15) | 方法名 | **Motion.ExitPositionControl**() | | ---------- | -------------------------------------------- | | 描述 | 退出实时位置控制模式,恢复默认的机器人控制状态 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 模式切换操作执行结果 | | 备注 | 退出后,机器人将不再接受实时控制指令 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ## 4.2.16 设置订阅参数 [​](#4-2-16) | 方法名 | **Motion.SetUDPFeedbackParams**( bool flag , string ip , int interval , int feedbackType , List> DOList \= null ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 配置机器人向指定 IP 地址推送数据的订阅参数 | | 请求参数 | flag : bool 是否开启 UDP 数据推送 ip : string 接收端的 IP 地址 interval : int 发送数据的间隔(单位:毫秒) feedbackType : int 反馈数据格式(0:XML 格式) DOList : List 期望获取的 DO 信号列表(最多十个,可选) | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置操作执行结果 | | 备注 | 参数设置仅在 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: 笛卡尔位置** | X | 工具坐标系下 X 方向值,单位为毫米 | | Y | 工具坐标系下 Y 方向值,单位为毫米 | | | Z | 工具坐标系下 Z 方向值,单位为毫米 | | | A | 工具坐标系下绕 X 方向旋转,单位为度 | | | B | 工具坐标系下绕 Y 方向旋转,单位为度 | | | C | 工具坐标系下绕 Z 方向旋转,单位为度 | | | **AIPos: 关节位置** | A1-A6 | 六个关节的值,单位为角度 | | **EIPos: 附加轴数据** | EIPos | 附加轴数据 | | **WristBtnState: 手腕按键状态** | 按键状态 | 1 = 按键按下,0 = 按键抬起 | | DragModel | 拖拽按键状态 | | | RcordJoint | 示教记录按键状态 | | | PauseResume | 暂停恢复按键状态 | | | **Digout: DO 输出** | Digout | 数字输出(DO)的状态 | | **ProgramStatus: 程序状态** | ProgId | 程序 ID | | Status | 解释器执行状态:0 = INTERPRETER\_IDLE1 = INTERPRETER\_EXECUTE2 = INTERPRETER\_PAUSED | | | Xpath | 程序片段返回值,格式为 程序名:行号 | | | **IPOC: 时间戳** | IPOC | 时间戳 | ## 4.2.17 获取机器人软限位 [​](#4-2-17) | 方法名 | **Motion.GetUserSoftLimit**() | | ---------- | --------------------------------------------------------------------------------------------------- | | 描述 | 获取当前机器人软限位信息 | | 请求参数 | 无 | | 返回值 | List>: 机器人软限位信息,列表第一层代表各轴,第二层代表每个轴的下限位和上限位值 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.18 指定 UDP 位置控制的相关参数 [​](#4-2-18) | 方法名 | **Motion.SetPositionTrajectoryParams**(int maxTimeoutCount , int timeout , double wristElbowThreshold , double shoulderThreshold ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置 UDP 位置控制的相关参数 | | 请求参数 | maxTimeoutCount : int 最大超时次数 timeout : int 超时时间(即发送间隔,默认为 20ms) wristElbowThreshold : double 腕 / 肘部接近奇异点的阈值 shoulderThreshold : double 接近肩部奇异点的阈值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.2.19 负载相关接口 [​](#4-2-19) ### 4.2.19.1 获取当前激活的负载 [​](#4-2-19-1) | 方法名 | **Motion.Payload.GetCurrentPayload**() | | ---------- | --------------------------------------------------------- | | 描述 | 获取当前激活的负载信息 | | 请求参数 | 无 | | 返回值 | int: 当前激活负载的索引 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.19.2 获取对应的负载 [​](#4-2-19-2) | 方法名 | **Motion.Payload.GetPayloadById**( int index ) | | ---------- | ---------------------------------------------- | | 描述 | 根据索引获取对应的负载信息 | | 请求参数 | index : int 负载索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.19.3 激活对应的负载 [​](#4-2-19-3) | 方法名 | **Motion.Payload.SetCurrentPayload**( int index ) | | ---------- | ------------------------------------------------- | | 描述 | 激活指定索引的负载 | | 请求参数 | index : int 负载索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 激活操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 负载 ID 必须是当前设备中存在的 | ### 4.2.19.4 获取所有负载信息 [​](#4-2-19-4) | 方法名 | **Motion.Payload.GetAllPayloadInfo**() | | ---------- | --------------------------------------------------------------------------- | | 描述 | 获取所有负载的详细信息 | | 请求参数 | 无 | | 返回值 | Dictionary: 负载信息字典 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.19.5 添加负载 [​](#4-2-19-5) | 方法名 | **Motion.Payload.AddPayload**( PayloadInfo payload ) | | ---------- | ---------------------------------------------------- | | 描述 | 添加新的负载 | | 请求参数 | payload : [PayloadInfo](./../3-struct/#3-6) 负载对象 | | 返回值 | [StatusCode](./../3-struct/#3-1): 添加操作执行结果 | | 备注 | 新的负载 ID 必须是当前设备中没有的且在 1\~10 之间 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ### 4.2.19.6 删除指定负载 [​](#4-2-19-6) | 方法名 | **Motion.Payload.DeletePayload**( int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定索引的负载 | | 请求参数 | index : int 负载索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 注意:无法删除当前激活的负载,如果要删除激活的负载,请先激活其他负载再删除当前负载 | ### 4.2.19.7 更新指定负载 [​](#4-2-19-7) | 方法名 | **Motion.Payload.UpdatePayload**( PayloadInfo payload ) | | ---------- | ------------------------------------------------------- | | 描述 | 更新指定负载信息 | | 请求参数 | payload : [PayloadInfo](./../3-struct/#3-6) 负载对象 | | 返回值 | [StatusCode](./../3-struct/#3-1): 更新操作执行结果 | | 备注 | 负载 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 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.19.8 检测 3 轴是否水平 [​](#4-2-19-8) | 方法名 | **Motion.Payload.CheckAxisThreeHorizontal**() | | ---------- | ----------------------------------------------------------- | | 描述 | 检测 3 轴是否水平 | | 请求参数 | 无 | | 返回值 | double: 3 轴的水平角度 [StatusCode](./../3-struct/#3-1): 检测操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 水平的角度必须在 - 1\~1 之间才能进行负载测定 | ### 4.2.19.9 获取负载测定状态 [​](#4-2-19-9) | 方法名 | **Motion.Payload.GetPayloadIdentifyState**() | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 获取负载测定的状态 | | 请求参数 | 无 | | 返回值 | [PayloadIdentifyState](./../3-struct/#3-7): 负载测定状态 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.19.10 开始负载测定 [​](#4-2-19-10) | 方法名 | **Motion.Payload.StartPayloadIdentify**(double weight , double angle ) | | ---------- | ---------------------------------------------------------------------- | | 描述 | 开始负载测定 | | 请求参数 | weight : double 负载重量(未知重量填 - 1) angle : double 6 轴允许转动的角度(30-90 度) | | 返回值 | [StatusCode](./../3-struct/#3-1): 负载测定启动操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | | 备注 | 开始负载测定前必须先进入负载测定状态 | ### 4.2.19.11 获取负载测定结果 [​](#4-2-19-11) | 方法名 | **Motion.Payload.PayloadIdentifyResult**() | | ---------- | ------------------------------------------------------------------------------------ | | 描述 | 获取负载测定的结果 | | 请求参数 | 无 | | 返回值 | [PayloadInfo](./../3-struct/#3-6): 负载测定结果 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.19.12 开始干涉检查 [​](#4-2-19-12) | 方法名 | **Motion.Payload.InterferenceCheckForPayloadIdentify**(double weight , double angle ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 开始负载测定的干涉检查,用于查看是否会发生碰撞 | | 请求参数 | weight : double 负载重量(未知重量填 - 1) angle : double 6 轴允许转动的角度(30-90 度) | | 返回值 | [StatusCode](./../3-struct/#3-1): 干涉检查操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.19.13 进入负载测定状态 [​](#4-2-19-13) | 方法名 | **Motion.Payload.PayloadIdentifyStart**() | | ---------- | -------------------------------------------- | | 描述 | 进入负载测定状态 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 状态切换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.19.14 结束负载测定状态 [​](#4-2-19-14) | 方法名 | **Motion.Payload.PayloadIdentifyDone**() | | ---------- | -------------------------------------------- | | 描述 | 结束负载测定状态 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 状态切换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 | ### 4.2.19.15 负载测定全流程 [​](#4-2-19-15) | 方法名 | **Motion.Payload.PayloadIdentify**( double weight \= -1, double angle \= 90 ) | | ---------- | -------------------------------------------------------------------------------------- | | 描述 | 完整的负载测定流程,包含上述负载测定全部接口,无特殊需求负载测定只用该接口即可 | | 请求参数 | weight : double 负载重量(未知重量填 - 1) angle : double 6 轴允许转动的角度(30-90 度) | | 返回值 | [PayloadInfo](./../3-struct/#3-6): 负载测定结果 [StatusCode](./../3-struct/#3-1): 负载测定操作执行结果 | | 备注 | 返回的负载可以新增到机器人中或写入机器人中已有的某个负载 全流程步骤: 1\. 进入负载测定状态 2\. 开始负载测定 3\. 获取负载测定结果 4\. 结束负载测定状态 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.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; } } ``` --- --- url: /zh/2-csharp/4-methods/4.3-execution.html title: 4.3 机器人操作类 --- # 4.3 机器人操作类 [​](#4-3) ## 4.3.1 执行指定的程序 [​](#4-3-1) | 方法名 | **Execution.Start**(string programName ) | | ---------- | ---------------------------------------------- | | 描述 | 启动执行机器人控制器中指定的程序 | | 请求参数 | programName : string 需要执行的程序名称 | | 返回值 | [StatusCode](./../3-struct/#3-1): 程序启动操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.2 停止正在执行的程序 [​](#4-3-2) | 方法名 | **Execution.Stop**(string programName \= null) | | ---------- | ---------------------------------------------------------- | | 描述 | 停止正在执行的程序或停止机器人当前正在执行的运动指令 | | 请求参数 | programName : string 需要停止的程序名称,默认为 null,表示停止当前正在运行的程序或运动指令 | | 返回值 | [StatusCode](./../3-struct/#3-1): 停止操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.3 返回所有正在运行的程序详细信息 [​](#4-3-3) | 方法名 | **Execution.AllRunningPrograms**() | | ---------- | ----------------------------------------------------------------------------------- | | 描述 | 获取所有正在运行程序的详细信息,信息包含程序 ID 和程序名称 | | 请求参数 | 无参数 | | 返回值 | Dictionary: 运行的程序 ID 和程序名列表 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.4 暂停程序运行 [​](#4-3-4) | 方法名 | **Execution.Pause**(string programName \= null) | | ---------- | ----------------------------------------------------- | | 描述 | 暂停当前正在执行的程序或暂停当前机器人正在执行的运动 | | 请求参数 | programName : string 需要暂停的程序名称,不传参时默认控制当前运行程序或正在执行的动作 | | 返回值 | [StatusCode](./../3-struct/#3-1): 暂停操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.3.5 恢复程序运行 [​](#4-3-5) | 方法名 | **Execution.Resume**(string programName \= null) | | ---------- | ------------------------------------------------------- | | 描述 | 继续运行某个处于暂停状态的程序或恢复当前机器人处于暂停的运动 | | 请求参数 | programName : string 需要继续运行的程序名称,不传参时默认控制当前运行程序或正在执行的动作 | | 返回值 | [StatusCode](./../3-struct/#3-1): 恢复操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Execution/ProgramExecution.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ProgramExecution { /// /// 测试程序执行完整流程功能 /// 验证程序的启动、暂停、恢复和停止等完整操作流程 /// 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 { Console.WriteLine("开始程序执行完整流程/Starting Program Execution Complete Flow"); // [ZH] 获取测试文件路径 // [EN] Get test file path string file_user_program = GetTestFilePath("test_prog.xml"); // [ZH] 设置程序名称 // [EN] Set program name string progName = "test_prog"; // [ZH] 上传用户程序文件 // [EN] Upload user program file code = controller.FileManager.Upload(file_user_program, FileType.UserProgram, true); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件上传成功/User Program File Upload Success: {progName}"); } else { Console.WriteLine($"用户程序文件上传失败/User Program File Upload Failed: {code.GetDescription()}"); return code; } // [ZH] 等待 // [EN] Wait Thread.Sleep(3000); // [ZH] 启动程序 // [EN] Start program code = controller.Execution.Start(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序启动成功/Program Started Successfully: {progName}"); } else { Console.WriteLine($"程序启动失败/Program Start Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 获取所有正在运行的程序列表 // [EN] Get all running programs list Dictionary progList; (progList, code) = controller.Execution.AllRunningPrograms(); if (code == StatusCode.OK) { Console.WriteLine("获取运行程序列表成功/Get Running Programs List Success"); Console.WriteLine($"运行程序数量/Running Programs Count: {progList.Count}"); foreach (var prog in progList) { Console.WriteLine($" 程序/Program: {prog.Key}, 状态/Status: {prog.Value}"); } } else { Console.WriteLine($"获取运行程序列表失败/Get Running Programs List Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 暂停程序 // [EN] Pause program code = controller.Execution.Pause(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序暂停成功/Program Paused Successfully: {progName}"); } else { Console.WriteLine($"程序暂停失败/Program Pause Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 恢复程序 // [EN] Resume program code = controller.Execution.Resume(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序恢复成功/Program Resumed Successfully: {progName}"); } else { Console.WriteLine($"程序恢复失败/Program Resume Failed: {code.GetDescription()}"); return code; } Thread.Sleep(2000); // [ZH] 停止程序 // [EN] Stop program code = controller.Execution.Stop(progName); if (code == StatusCode.OK) { Console.WriteLine($"程序停止成功/Program Stopped Successfully: {progName}"); } else { Console.WriteLine($"程序停止失败/Program Stop Failed: {code.GetDescription()}"); return code; } // [ZH] 删除用户程序文件 // [EN] Delete user program file code = controller.FileManager.Delete(progName, FileType.UserProgram); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件删除成功/User Program File Delete Success: {progName}"); } else { Console.WriteLine($"用户程序文件删除失败/User Program File Delete Failed: {code.GetDescription()}"); return code; } Console.WriteLine("程序执行完整流程结束/Program Execution Complete Flow Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } /// /// 获取test_files文件夹中文件的路径示例方法 /// 展示如何获取当前程序目录下的test_files文件夹中的文件路径 /// private static string GetTestFilePath(string fileName) { // [ZH] 获取当前程序集的目录 // [EN] Get current assembly directory string? codeFilePath = new System.Diagnostics.StackTrace(true).GetFrame(0)?.GetFileName(); if (string.IsNullOrEmpty(codeFilePath)) { throw new InvalidOperationException("无法获取当前文件路径/Cannot get current file path"); } string? codeDirectory = Path.GetDirectoryName(codeFilePath); if (string.IsNullOrEmpty(codeDirectory)) { throw new InvalidOperationException("无法获取当前目录路径/Cannot get current directory path"); } // [ZH] 构建test_files文件夹路径 // [EN] Build test_files folder path string testFilesDirectory = Path.Combine(codeDirectory, "test_files"); // [ZH] 构建文件完整路径 // [EN] Build complete file path string filePath = Path.Combine(testFilesDirectory, fileName); return filePath; } } ``` ## 4.3.6 执行 BAS 脚本程序 [​](#4-3-6) | 方法名 | **Execution.ExecuteBasScript**(BasScript script ) | | ---------- | ---------------------------------------------------------------- | | 描述 | 执行用户自定义的 BAS 脚本程序 | | 请求参数 | script : [BasScript](./4.10-basScript.html#4-10) 用户自定义的 BAS 脚本程序 | | 返回值 | [StatusCode](./../3-struct/#3-1): 脚本执行操作执行结果 | | 备注 | BAS 脚本程序的暂停、恢复、停止方法同普通程序 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 工业机器人: 7.6.0.0 | 示例代码 Execution/ExecuteBasScript.cs ```cs using Agilebot.IR; using Agilebot.IR.BasScript; using Agilebot.IR.Execution; using Agilebot.IR.Types; public class ExecuteBasScript { /// /// 测试执行Bas脚本功能 /// 验证能否成功执行包含条件判断、运动控制和赋值操作的Bas脚本 /// 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 { Console.WriteLine("开始执行Bas脚本程序/Starting Execute BasScript"); // [ZH] 创建BAS脚本程序 // [EN] Create BAS script program BasScript script = new BasScript("test_bas"); // [ZH] 添加条件判断到脚本 // [EN] Add conditional statement to script code = script.Logical.IF(RegisterType.R, 1, OtherType.VALUE, 0); if (code != StatusCode.OK) { Console.WriteLine($"添加条件判断失败/Add Conditional Statement Failed: {code.GetDescription()}"); return code; } // [ZH] 添加运动控制到脚本 // [EN] Add motion control to script BasScript.ExtraParam param = new BasScript.ExtraParam(); param.Acceleration(80); code = script.Motion.MoveJoint( MovePoseType.PR, 1, SpeedType.VALUE, 30, SmoothType.SD, 10, extraParam: param ); if (code != StatusCode.OK) { Console.WriteLine($"添加运动控制失败/Add Motion Control Failed: {code.GetDescription()}"); return code; } // [ZH] 添加赋值操作到脚本 // [EN] Add assignment operation to script code = script.AssignValue(AssignType.R, 1, 99); if (code != StatusCode.OK) { Console.WriteLine($"添加赋值操作失败/Add Assignment Operation Failed: {code.GetDescription()}"); return code; } // [ZH] 结束条件判断 // [EN] End conditional statement code = script.Logical.END_IF(); if (code != StatusCode.OK) { Console.WriteLine($"结束条件判断失败/End Conditional Statement Failed: {code.GetDescription()}"); return code; } // [ZH] 等待上一个测试结束 // [EN] Wait for previous test to end Thread.Sleep(1000); // [ZH] 执行BAS脚本程序 // [EN] Execute BAS script program code = controller.Execution.ExecuteBasScript(script); if (code == StatusCode.OK) { Console.WriteLine("BAS脚本执行成功/Execute BasScript Success"); Console.WriteLine( "脚本包含条件判断、运动控制和赋值操作/Script includes conditional statements, motion control and assignment operations" ); } else { Console.WriteLine($"BAS脚本执行失败/Execute BasScript Failed: {code.GetDescription()}"); } Console.WriteLine("执行Bas脚本测试完成/Execute BasScript Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.4-programPoses.html title: 4.4 程序信息读写 --- # 4.4 程序信息读写 [​](#4-4) ## 4.4.1 获取指定程序中指定位姿点值 [​](#4-4-1) | 方法名 | **ProgramPoses.Read**(string programName , int index , FileType ft \= FileType.UserProgram) | | ---------- | ------------------------------------------------------------------------------------------- | | 描述 | 读取指定程序中指定序号的位姿点数据 | | 请求参数 | programName : string 指定程序名称 index : int 指定位姿点的序号 ft : [FileType](./../3-struct/#3-18) 文件类型 | | 返回值 | [ProgramPose](./../3-struct/#3-17) 程序中的机器人位姿数据 [StatusCode](./../3-struct/#3-1): 读取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/ReadProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class ReadProgramPose { 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] Set program name and pose index string progName = "test_prog"; int index = 1; // [ZH] 读取指定程序中指定位姿点值 // [EN] Read specified pose value in specified program ProgramPose pose; (pose, code) = controller.ProgramPoses.Read(progName, index); if (code == StatusCode.OK) { Console.WriteLine("读取程序位姿点成功/Read Program Pose Success"); Console.WriteLine($"位姿信息/Pose Info: {pose}"); } else { Console.WriteLine($"读取程序位姿点失败/Read Program Pose Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.2 修改指定程序中指定位姿点值 [​](#4-4-2) | 方法名 | **ProgramPoses.Write**(string programName , int index , ProgramPose value , FileType ft \= FileType.UserProgram) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 修改指定程序中指定序号的位姿点数据 | | 请求参数 | programName : string 指定程序名称 index : int 指定位姿点的序号 value : [ProgramPose](./../3-struct/#3-17) 程序中的机器人位姿数据 ft : [FileType](./../3-struct/#3-18) 文件类型 | | 返回值 | [StatusCode](./../3-struct/#3-1): 写入操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/WriteProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class WriteProgramPose { 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] Set program name and pose index string progName = "test_prog"; int index = 2; // [ZH] 生成随机位姿点 // [EN] Generate random pose ProgramPose rndPose = ProgramPose.GenerateRandomPose(index); // [ZH] 修改指定程序中指定位姿点值 // [EN] Write specified pose value in specified program code = controller.ProgramPoses.Write(progName, index, rndPose); if (code == StatusCode.OK) { Console.WriteLine("写入程序位姿点成功/Write Program Pose Success"); } else { Console.WriteLine($"写入程序位姿点失败/Write Program Pose Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.3 添加指定程序位姿点 [​](#4-4-3) | 方法名 | **ProgramPoses.Add**(string programName , int index , ProgramPose value , FileType ft \= FileType.UserProgram) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 在指定程序中指定序号位置添加位姿点数据 | | 请求参数 | programName : string 指定程序名称 index : int 指定位姿点的序号 value : [ProgramPose](./../3-struct/#3-17) 程序中的机器人位姿数据 ft : [FileType](./../3-struct/#3-18) 文件类型 | | 返回值 | [StatusCode](./../3-struct/#3-1): 添加操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/AddProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class AddProgramPose { 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] Set program name and pose index string progName = "test_prog"; int index = 3; // [ZH] 生成随机位姿点 // [EN] Generate random pose ProgramPose rndPose = ProgramPose.GenerateRandomPose(index); // [ZH] 添加指定程序中指定位姿点 // [EN] Add specified pose in specified program code = controller.ProgramPoses.Add(progName, index, rndPose); if (code == StatusCode.OK) { Console.WriteLine("添加程序位姿点成功/Add Program Pose Success"); } else { Console.WriteLine($"添加程序位姿点失败/Add Program Pose Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.4 删除指定程序中指定序号的位姿点 [​](#4-4-4) | 方法名 | **ProgramPoses.Delete**(string programName , int index , FileType ft \= FileType.UserProgram) | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 删除指定程序中指定序号的位姿点 | | 请求参数 | programName : string 指定程序名称 index : int 指定位姿点的序号 ft : [FileType](./../3-struct/#3-18) 文件类型 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/DeleteProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class DeleteProgramPose { 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] Set program name and pose index string progName = "test_prog"; int index = 3; // [ZH] 删除指定程序中指定位姿点 // [EN] Delete specified pose in specified program code = controller.ProgramPoses.Delete(progName, index); if (code == StatusCode.OK) { Console.WriteLine("删除程序位姿点成功/Delete Program Pose Success"); } else { Console.WriteLine($"删除程序位姿点失败/Delete Program Pose Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.5 获取指定程序中所有的位姿点 [​](#4-4-5) | 方法名 | **ProgramPoses.ReadAllPoses**(string programName , FileType ft \= FileType.UserProgram) | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 获取指定程序中所有的位姿点信息 | | 请求参数 | programName : string 指定程序名称 ft : [FileType](./../3-struct/#3-18) 文件类型 | | 返回值 | List<[ProgramPose](./../3-struct/#3-17)\>: 位姿点数据列表 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/ReadAllProgramPoses.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class ReadAllProgramPoses { 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] Set program name string progName = "test_prog"; // [ZH] 读取指定程序中所有位姿点 // [EN] Read all poses in specified program List poses; (poses, code) = controller.ProgramPoses.ReadAllPoses(progName); if (code == StatusCode.OK) { Console.WriteLine("读取所有程序位姿点成功/Read All Program Poses Success"); Console.WriteLine($"位姿点数量/Number of poses: {poses.Count}"); for (int i = 0; i < poses.Count; i++) { Console.WriteLine($"位姿点 {i + 1}/Pose {i + 1}: {poses[i]}"); } } else { Console.WriteLine($"读取所有程序位姿点失败/Read All Program Poses Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.4.6 机器人程序位姿点类型转换 [​](#4-4-6) | 方法名 | **ProgramPoses.ConvertPose**(ProgramPose pose , PoseType toType ) | | ---------- | --------------------------------------------------------------------------------------------------------- | | 描述 | 将程序中机器人位姿点在关节坐标和笛卡尔空间坐标之间转换 | | 请求参数 | pose : [ProgramPose](./../3-struct/#3-17) 程序中的机器人位姿数据 toType : [PoseType](./../3-struct/#3-12) 希望转换后的坐标类型 | | 返回值 | [ProgramPose](./../3-struct/#3-17): 转换后的位姿数据 [StatusCode](./../3-struct/#3-1): 转换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 ProgramPoses/ConvertProgramPose.cs ```cs using Agilebot.IR; using Agilebot.IR.ProgramPoses; using Agilebot.IR.Types; public class ConvertProgramPose { 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] Set program name and pose index string progName = "test_prog"; int cartIndex = 1; // [ZH] 先读取一个位姿点 // [EN] First read a pose ProgramPose cartPose; (cartPose, code) = controller.ProgramPoses.Read(progName, cartIndex); if (code != StatusCode.OK) { Console.WriteLine($"读取位姿点失败/Read Pose Failed: {code.GetDescription()}"); return code; } // [ZH] 转换位姿点类型(从笛卡尔坐标转换为关节坐标) // [EN] Convert pose type (from Cartesian to Joint coordinates) ProgramPose pose; (pose, code) = controller.ProgramPoses.ConvertPose(cartPose, PoseType.Joint); if (code == StatusCode.OK) { Console.WriteLine("转换程序位姿点成功/Convert Program Pose Success"); Console.WriteLine($"原始位姿/Original Pose: {cartPose}"); Console.WriteLine($"转换后位姿/Converted Pose: {pose}"); } else { Console.WriteLine($"转换程序位姿点失败/Convert Program Pose Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.5-signals.html title: 4.5 IO信号 --- # 4.5 IO 信号 [​](#4-5) ## 4.5.1 读取指定类型指定端口 IO 的值 [​](#4-5-1) | 方法名 | **Signals.Read**(SignalType type , int index ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 读取指定类型指定端口的 IO 信号值 | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 要读取的 IO 信号类型 index : int 要读取的 IO 端口序号,从 1 开始 | | 返回值 | int: IO 信号值,1 代表高电平,0 代表低电平 [StatusCode](./../3-struct/#3-1): 读取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Signals/ReadSignal.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ReadSignal { 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] 设置IO信号类型和索引 // [EN] Set IO signal type and index SignalType type = SignalType.DI; int index = 1; // [ZH] 读取指定类型指定端口IO的值 // [EN] Read specified type and port IO value int res; (res, code) = controller.Signals.Read(type, index); if (code == StatusCode.OK) { Console.WriteLine("读取IO信号成功/Read Signal Success"); Console.WriteLine($"{type}:{index} 的值为/has value {res}"); Console.WriteLine($"信号状态/Signal Status: {(res == 1 ? "高电平/High Level" : "低电平/Low Level")}"); } else { Console.WriteLine($"读取IO信号失败/Read Signal Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.5.2 写指定类型指定端口 IO 的值 [​](#4-5-2) | 方法名 | **Signals.Write**(SignalType type , int index , double value ) | | ---------- | ---------------------------------------------------------------------------------------------------------------------------- | | 描述 | 写入指定类型指定端口的 IO 信号值 | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 要写入的 IO 信号类型 index : int 要写入的 IO 端口序号,从 1 开始 value : double 要写入的信号值,1 代表高电平,0 代表低电平 | | 返回值 | [StatusCode](./../3-struct/#3-1): 写入操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | UI/UO 信号只能读取不能写入 | 示例代码 Signals/WriteSignal.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class WriteSignal { 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] 设置IO信号类型、索引和值 // [EN] Set IO signal type, index and value SignalType type = SignalType.DO; int index = 1; int value = 1; // [ZH] 写指定类型指定端口IO的值 // [EN] Write specified type and port IO value code = controller.Signals.Write(type, index, value); if (code == StatusCode.OK) { Console.WriteLine("写入IO信号成功/Write Signal Success"); Console.WriteLine($"{type}:{index} 设置为/set to value {value}"); Console.WriteLine($"信号状态/Signal Status: {(value == 1 ? "高电平/High Level" : "低电平/Low Level")}"); } else { Console.WriteLine($"写入IO信号失败/Write Signal Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.5.3 批量写入 DO 信号 [​](#4-5-3) | 方法名 | **Signals.MultiWrite**(SignalType type , List ioData ) | | ---------- | ------------------------------------------------------------------------------------------------------------------- | | 描述 | 批量写入多个 DO 端口的值,参数为扁平化端口 - 值对。 | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 仅支持 DO ioData : List 形如 \[port1, state1, port2, state2, ...\] ,长度需为偶数 | | 返回值 | [StatusCode](./../3-struct/#3-1) 写入执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 仅支持 DO 批量写入;UI/UO 不支持写入,DI/RI 仅支持单点读取 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; Arm controller = new Arm(controllerIP); StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 批量写入 DO1=1, DO2=0 code = controller.Signals.MultiWrite(SignalType.DO, new List { 1, 1, 2, 0 }); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "MultiWrite Success"); code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` --- ## 4.5.4 批量读取 DO 信号 [​](#4-5-4) | 方法名 | **Signals.MultiRead**(SignalType type , List indexes ) | | ---------- | --------------------------------------------------------------------------------------- | | 描述 | 批量读取多个 DO 端口的值,返回顺序与输入索引一致。 | | 请求参数 | type : [SignalType](./../3-struct/#3-19) 仅支持 DO indexes : List 待读取的端口序号列表,至少包含一个端口 | | 返回值 | List 端口值列表(顺序与输入一致)与 [StatusCode](./../3-struct/#3-1) | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | | 备注 | 仅支持 DO 批量读取;UI/UO 不支持写入,DI/RI 仅支持单点读取 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; Arm controller = new Arm(controllerIP); StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 批量读取 DO1、DO2 (List values, StatusCode readCode) = controller.Signals.MultiRead(SignalType.DO, new List { 1, 2 }); if (readCode == StatusCode.OK) { Console.WriteLine($"MultiRead Success: DO1={values[0]}, DO2={values[1]}"); } code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` --- --- url: /zh/2-csharp/4-methods/4.6-registers.html title: 4.6 寄存器信息 --- # 4.6 寄存器信息 [​](#4-6) ## 4.6.1 R 数值寄存器相关操作 [​](#4-6-1) ### 4.6.1.1 获取一个 R 寄存器的值 [​](#4-6-1-1) | 方法名 | **Registers.Read\_R**(int index ) | | ---------- | ---------------------------------------------------------- | | 描述 | 读取 R 数值寄存器的值 | | 请求参数 | index : int 要读取的 R 寄存器编号 | | 返回值 | double: R 寄存器数值 [StatusCode](./../3-struct/#3-1): 读取操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.1.2 写入一个 R 寄存器的值 [​](#4-6-1-2) | 方法名 | **Registers.Write\_R**(int index , double value ) | | ---------- | ---------------------------------------------------- | | 描述 | 写入 R 数值寄存器的值 | | 请求参数 | index : int 要写入的 R 寄存器编号 value : double 要写入的 R 寄存器数值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 写入操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.1.3 删除一个 R 寄存器 [​](#4-6-1-3) | 方法名 | **Registers.Delete\_R**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 R 数值寄存器 | | 请求参数 | index : int 要删除的 R 寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/RRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class RRegisterOperations { 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] Set register index and value int index = 1; double value = 9.9; // [ZH] 写入R寄存器 // [EN] Write R register code = controller.Registers.Write_R(index, value); if (code == StatusCode.OK) { Console.WriteLine("写入R寄存器成功/Write R Register Success"); } else { Console.WriteLine($"写入R寄存器失败/Write R Register Failed: {code.GetDescription()}"); } // [ZH] 读取R寄存器 // [EN] Read R register double readValue; (readValue, code) = controller.Registers.Read_R(index); if (code == StatusCode.OK) { Console.WriteLine($"读取R寄存器成功/Read R Register Success: 值/Value = {readValue}"); } else { Console.WriteLine($"读取R寄存器失败/Read R Register Failed: {code.GetDescription()}"); } // [ZH] 删除R寄存器 // [EN] Delete R register code = controller.Registers.Delete_R(index); if (code == StatusCode.OK) { Console.WriteLine("删除R寄存器成功/Delete R Register Success"); } else { Console.WriteLine($"删除R寄存器失败/Delete R Register Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.2 MR 运动寄存器相关操作 [​](#4-6-2) ### 4.6.2.1 获取一个 MR 寄存器的值 [​](#4-6-2-1) | 方法名 | **Registers.Read\_MR**(int index ) | | ---------- | -------------------------------------------------------- | | 描述 | 读取 MR 运动寄存器的值 | | 请求参数 | index : int 要读取的 MR 寄存器编号 | | 返回值 | int: MR 寄存器数值 [StatusCode](./../3-struct/#3-1): 读取操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.2.2 写入一个 MR 寄存器的值 [​](#4-6-2-2) | 方法名 | **Registers.Write\_MR**(int index , int value ) | | ---------- | --------------------------------------------------- | | 描述 | 写入 MR 运动寄存器的值 | | 请求参数 | index : int 要写入的 MR 寄存器编号 value : int 要写入的 MR 寄存器数值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 写入操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.2.3 删除一个 MR 寄存器 [​](#4-6-2-3) | 方法名 | **Registers.Delete\_MR**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 MR 运动寄存器 | | 请求参数 | index : int 要删除的 MR 寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/MRRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class MRRegisterOperations { 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] Set register index and value int index = 1; int value = 9; // [ZH] 写入MR寄存器 // [EN] Write MR register code = controller.Registers.Write_MR(index, value); if (code == StatusCode.OK) { Console.WriteLine("写入MR寄存器成功/Write MR Register Success"); } else { Console.WriteLine($"写入MR寄存器失败/Write MR Register Failed: {code.GetDescription()}"); } // [ZH] 读取MR寄存器 // [EN] Read MR register int readValue; (readValue, code) = controller.Registers.Read_MR(index); if (code == StatusCode.OK) { Console.WriteLine($"读取MR寄存器成功/Read MR Register Success: 值/Value = {readValue}"); } else { Console.WriteLine($"读取MR寄存器失败/Read MR Register Failed: {code.GetDescription()}"); } // [ZH] 删除MR寄存器 // [EN] Delete MR register code = controller.Registers.Delete_MR(index); if (code == StatusCode.OK) { Console.WriteLine("删除MR寄存器成功/Delete MR Register Success"); } else { Console.WriteLine($"删除MR寄存器失败/Delete MR Register Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.3 SR 字符串寄存器相关操作 [​](#4-6-3) ### 4.6.3.1 获取一个 SR 寄存器的值 [​](#4-6-3-1) | 方法名 | **Registers.Read\_SR**(int index ) | | ---------- | ------------------------------------------------------------- | | 描述 | 读取 SR 字符串寄存器的值 | | 请求参数 | index : int 要读取的 SR 寄存器编号 | | 返回值 | string: SR 寄存器字符串值 [StatusCode](./../3-struct/#3-1): 读取操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.3.2 写入一个 SR 寄存器的值 [​](#4-6-3-2) | 方法名 | **Registers.Write\_SR**(int index , string value ) | | ---------- | -------------------------------------------------------- | | 描述 | 写入 SR 字符串寄存器的值 | | 请求参数 | index : int 要写入的 SR 寄存器编号 value : string 要写入的 SR 寄存器字符串值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 写入操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.3.3 删除一个 SR 寄存器 [​](#4-6-3-3) | 方法名 | **Registers.Delete\_SR**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 SR 字符串寄存器 | | 请求参数 | index : int 要删除的 SR 寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/SRRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class SRRegisterOperations { 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] Set register index and value int index = 1; string value = "test"; // [ZH] 写入SR寄存器 // [EN] Write SR register code = controller.Registers.Write_SR(index, value); if (code == StatusCode.OK) { Console.WriteLine("写入SR寄存器成功/Write SR Register Success"); } else { Console.WriteLine($"写入SR寄存器失败/Write SR Register Failed: {code.GetDescription()}"); } // [ZH] 读取SR寄存器 // [EN] Read SR register string readValue; (readValue, code) = controller.Registers.Read_SR(index); if (code == StatusCode.OK) { Console.WriteLine($"读取SR寄存器成功/Read SR Register Success: 值/Value = {readValue}"); } else { Console.WriteLine($"读取SR寄存器失败/Read SR Register Failed: {code.GetDescription()}"); } // [ZH] 删除SR寄存器 // [EN] Delete SR register code = controller.Registers.Delete_SR(index); if (code == StatusCode.OK) { Console.WriteLine("删除SR寄存器成功/Delete SR Register Success"); } else { Console.WriteLine($"删除SR寄存器失败/Delete SR Register Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.4 PR 位姿寄存器相关操作 [​](#4-6-4) ### 4.6.4.1 获取一个 PR 寄存器的值 [​](#4-6-4-1) | 方法名 | **Registers.Read\_PR**(int index ) | | ---------- | ------------------------------------------------------------------------------------------ | | 描述 | 读取 PR 位姿寄存器的值 | | 请求参数 | index : int 要读取的 PR 寄存器编号 | | 返回值 | [PoseRegister](./../3-struct/#3-20): PR 寄存器位姿数据 [StatusCode](./../3-struct/#3-1): 读取操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.4.2 写入一个 PR 寄存器的值 [​](#4-6-4-2) | 方法名 | **Registers.Write\_PR**(int index , PoseRegister value ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 写入 PR 位姿寄存器的值 | | 请求参数 | index : int 要写入的 PR 寄存器编号 value : [PoseRegister](./../3-struct/#3-20) 要写入的 PR 寄存器位姿数据 | | 返回值 | [StatusCode](./../3-struct/#3-1): 写入操作执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.1 工业机器人: 7.6.0.0 | ### 4.6.4.3 删除一个 PR 寄存器 [​](#4-6-4-3) | 方法名 | **Registers.Delete\_PR**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 删除指定的 PR 位姿寄存器 | | 请求参数 | index : int 要删除的 PR 寄存器编号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Registers/PRRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Registers; using Agilebot.IR.Types; public class PRRegisterOperations { 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] Set register index int index = 1; // [ZH] 生成位姿寄存器 // [EN] Generate pose register var pose = new PoseRegister { Id = 1, Name = "Test", Comment = "Test", PoseRegisterData = new PoseRegisterData { Pt = PoseType.Joint, Joint = new Joint { J1 = 6.6, J2 = 6.6, J3 = 6.6, J4 = 6.6, J5 = 6.6, J6 = 6.6, }, CartData = null, }, }; // [ZH] 写入PR寄存器 // [EN] Write PR register code = controller.Registers.Write_PR(pose); if (code == StatusCode.OK) { Console.WriteLine("写入PR寄存器成功/Write PR Register Success"); } else { Console.WriteLine($"写入PR寄存器失败/Write PR Register Failed: {code.GetDescription()}"); } // [ZH] 读取PR寄存器 // [EN] Read PR register PoseRegister readValue; (readValue, code) = controller.Registers.Read_PR(index); if (code == StatusCode.OK) { Console.WriteLine($"读取PR寄存器成功/Read PR Register Success: ID = {readValue.Id}"); } else { Console.WriteLine($"读取PR寄存器失败/Read PR Register Failed: {code.GetDescription()}"); } // [ZH] 删除PR寄存器 // [EN] Delete PR register code = controller.Registers.Delete_PR(index); if (code == StatusCode.OK) { Console.WriteLine("删除PR寄存器成功/Delete PR Register Success"); } else { Console.WriteLine($"删除PR寄存器失败/Delete PR Register Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.6.5 Modbus 寄存器(MH 保持寄存器、MI 输入寄存器) [​](#4-6-5) ### 4.6.5.1 获取一个 MH 寄存器的值 [​](#4-6-5-1) | 方法名 | **Registers.Read\_MH**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 获取 MH 寄存器的值 | | 请求参数 | index : int 希望获取的寄存器编号 | | 返回值 | 寄存器信息 [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | ### 4.6.5.2 获取一个 MI 寄存器的值 [​](#4-6-5-2) | 方法名 | **Registers.Read\_MI**(int index ) | | ---------- | ---------------------------------------------- | | 描述 | 获取 MI 寄存器的值 | | 请求参数 | index : int 希望获取的寄存器编号 | | 返回值 | 寄存器信息 [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | ### 4.6.5.3 写入一个 MH 寄存器的值 [​](#4-6-5-3) | 方法名 | **Registers.Write\_MH**(int index , int value ) | | ---------- | ----------------------------------------------- | | 描述 | 更新一个 MH 寄存器的值 | | 请求参数 | index : int 寄存器的编号 value : int 需要更新的寄存器信息 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | ### 4.6.5.4 写入一个 MI 寄存器的值 [​](#4-6-5-4) | 方法名 | **Registers.Write\_MI**(int index , int value ) | | ---------- | ----------------------------------------------- | | 描述 | 更新一个 MI 寄存器的值 | | 请求参数 | index : int 寄存器的编号 value : int 需要更新的寄存器信息 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作机器人: 7.6.0.0 工业机器人: 7.6.0.0 | 示例代码 Registers/ModbusRegisterOperations.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ModbusRegisterOperations { 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] Set register index and value int index = 1; int writeValue = 8; // [ZH] 写入MH保持寄存器 // [EN] Write MH holding register code = controller.Registers.Write_MH(index, writeValue); if (code == StatusCode.OK) { Console.WriteLine("写入MH保持寄存器成功/Write MH Holding Register Success"); } else { Console.WriteLine($"写入MH保持寄存器失败/Write MH Holding Register Failed: {code.GetDescription()}"); } // [ZH] 写入MI输入寄存器 // [EN] Write MI input register code = controller.Registers.Write_MI(index, writeValue + 1); if (code == StatusCode.OK) { Console.WriteLine("写入MI输入寄存器成功/Write MI Input Register Success"); } else { Console.WriteLine($"写入MI输入寄存器失败/Write MI Input Register Failed: {code.GetDescription()}"); } // [ZH] 读取MH保持寄存器 // [EN] Read MH holding register int mhValue; (mhValue, code) = controller.Registers.Read_MH(index); if (code == StatusCode.OK) { Console.WriteLine($"读取MH保持寄存器成功/Read MH Holding Register Success: 值/Value = {mhValue}"); } else { Console.WriteLine($"读取MH保持寄存器失败/Read MH Holding Register Failed: {code.GetDescription()}"); } // [ZH] 读取MI输入寄存器 // [EN] Read MI input register int miValue; (miValue, code) = controller.Registers.Read_MI(index); if (code == StatusCode.OK) { Console.WriteLine($"读取MI输入寄存器成功/Read MI Input Register Success: 值/Value = {miValue}"); } else { Console.WriteLine($"读取MI输入寄存器失败/Read MI Input Register Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.7-trajectory.html title: 4.7 轨迹控制 --- # 4.7 轨迹控制 [​](#4-7) ## 4.7.1 设置待执行的离线轨迹文件 [​](#4-7-1) | 方法名 | **Trajectory.SetOffLineTrajectoryFile**(string path ) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 设置待执行的离线轨迹文件 | | 请求参数 | path : string 离线轨迹文件路径,如示例文件 A.trajectoryA.trajectory 轨迹文件格式为**文本文件**,说明如下: \- 第 1 行:6 代表 6 个轴,0.001 代表两个点之间间隔 1ms,8093 代表一共 8093 个轨迹点 \- 第二行:表示 6 个轴的起始位置 \- 3-8095 行:表示轨迹点,包括 6 个轴的位置、速度、加速度、力矩前馈、do 端口、do 端口的值 \- do\_port 代表使用的 do 端口(取值范围 1-24) \- do\_port 为 - 1,表示在该位置不会触发 IO 信号 \- do\_port 为 1,do\_state 为 1,则表明 do1 端口会在该位置触发 ON 信号 \- do\_port 为 1,do\_state 为 0,则表明 do1 端口会在该位置触发 OFF 信号 用户通过 FileManager.upload 将离线文件发送到机器人控制器根目录,用 4.7.2 和 4.7.3 指令执行轨迹 | | 返回值 | [StatusCode](./../3-struct/#3-1): 设置操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.2 机器人移动到离线轨迹中的起始点 [​](#4-7-2) | 方法名 | **Trajectory.PrepareOfflineTrajectory**() | | ---------- | ---------------------------------------------- | | 描述 | 让机器人以安全速度移动到离线轨迹的起始点 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 准备操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.3 机器人开始执行离线轨迹文件 [​](#4-7-3) | 方法名 | **Trajectory.ExecuteOfflineTrajectory**() | | ---------- | ---------------------------------------------- | | 描述 | 让机器人开始执行离线轨迹文件 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 执行操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.4 将 CSV 轨迹文件转换为 Trajectory 格式 [​](#4-7-4) | 方法名 | **Trajectory.TransformCsvToTrajectory**(string fileName ) | | ---------- | ------------------------------------------------------------------------- | | 描述 | 将轨迹 CSV 文件转换成 trajectory 格式的轨迹文件并存放在控制柜的轨迹文件目录上 | | 请求参数 | fileName : string CSV 轨迹文件名 | | 返回值 | string: 成功转换后的 trajectory 文件路径 [StatusCode](./../3-struct/#3-1): 转换操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.7.5 查询轨迹转换状态 [​](#4-7-5) | 方法名 | **Trajectory.CheckTransformStatus**(string fileName ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 查询 TransformCsvToTrajectory 流程工作状态 | | 请求参数 | fileName : string TransformCsvToTrajectory 接口返回的结果 | | 返回值 | [TransformState](./../3-struct/#3-7): 转换状态 [StatusCode](./../3-struct/#3-1): 查询操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | **示例代码** Trajectory/OfflineTrajectory.cs ```cs using System.IO; using Agilebot.IR; using Agilebot.IR.Trajectory; using Agilebot.IR.Types; public class OfflineTrajectory { 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( $"离线轨迹执行必须在机器人自动模式下/Offline trajectory execution must be in automatic mode" ); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 添加程序文件到机器人中 // [EN] Add program file to robot string file_user_program = GetTestFilePath("test.csv"); StatusCode ret_code = controller.FileManager.Upload(file_user_program, FileType.TmpFile, true); if (ret_code != StatusCode.OK) { Console.WriteLine($"上传文件失败/Upload file failed: {ret_code.GetDescription()}"); return ret_code; } Console.WriteLine("文件上传成功/File upload success"); // [ZH] 测试CSV转换为轨迹文件功能 // [EN] Test CSV to trajectory file conversion functionality string csvFilename = "test.csv"; (string trajFileName, StatusCode transformCode) = controller.Trajectory.TransformCsvToTrajectory( csvFilename ); if (transformCode != StatusCode.OK) { Console.WriteLine($"CSV转换失败/CSV conversion failed: {transformCode.GetDescription()}"); return transformCode; } Console.WriteLine($"CSV转换成功/CSV conversion success, trajectory file: {trajFileName}"); // [ZH] 检查转换状态 // [EN] Check conversion status var startTime = System.DateTime.Now; TransformState state; StatusCode statusCode; do { (state, statusCode) = controller.Trajectory.CheckTransformStatus( System.IO.Path.GetFileName(trajFileName) ); if (statusCode != StatusCode.OK) { Console.WriteLine($"检查转换状态失败/Check transform status failed: {statusCode.GetDescription()}"); return statusCode; } Console.WriteLine($"转换状态/Transform state: {state}"); Thread.Sleep(2000); // 等待2秒 if (System.DateTime.Now - startTime > System.TimeSpan.FromSeconds(60)) { Console.WriteLine("转换状态检查超时/Transform status check timeout"); break; } } while (state != TransformState.TRANSFORM_SUCCESS && state != TransformState.TRANSFORM_FAILED); if (state == TransformState.TRANSFORM_FAILED) { Console.WriteLine("CSV转换失败/CSV conversion failed"); return StatusCode.OtherReason; } // [ZH] 转换任务成功并进行了结果查询后 服务端不会继续保存转换任务的状态 // [EN] After the conversion task is successful and the result is queried, the server will not continue to save the conversion task status (TransformState finalState, StatusCode finalCode) = controller.Trajectory.CheckTransformStatus( System.IO.Path.GetFileName(trajFileName) ); if (finalCode != StatusCode.OK) { Console.WriteLine($"最终状态检查失败/Final status check failed: {finalCode.GetDescription()}"); return finalCode; } Console.WriteLine($"最终转换状态/Final transform state: {finalState}"); // [ZH] 设置轨迹文件 // [EN] Set trajectory file code = controller.Trajectory.SetOffLineTrajectoryFile("test_torque.trajectory"); if (code != StatusCode.OK) { Console.WriteLine($"设置轨迹文件失败/Set trajectory file failed: {code.GetDescription()}"); return code; } Console.WriteLine("设置轨迹文件成功/Set trajectory file success"); // [ZH] 准备离线轨迹 // [EN] Prepare offline trajectory code = controller.Trajectory.PrepareOfflineTrajectory(); if (code != StatusCode.OK) { Console.WriteLine($"准备离线轨迹失败/Prepare offline trajectory failed: {code.GetDescription()}"); return code; } Console.WriteLine("准备离线轨迹成功/Prepare offline trajectory success"); // [ZH] 等待机器人和伺服器空闲 // [EN] Wait for robot and servo to be idle startTime = System.DateTime.Now; RobotState robotStatus; ServoState servoStatus; StatusCode robotStatusCode; StatusCode servoStatusCode; do { (robotStatus, robotStatusCode) = controller.GetRobotState(); if (robotStatusCode != StatusCode.OK) { Console.WriteLine($"获取机器人状态失败/Get robot state failed: {robotStatusCode.GetDescription()}"); return robotStatusCode; } (servoStatus, servoStatusCode) = controller.GetServoState(); if (servoStatusCode != StatusCode.OK) { Console.WriteLine($"获取伺服状态失败/Get servo state failed: {servoStatusCode.GetDescription()}"); return servoStatusCode; } Console.WriteLine($"机器人状态/Robot state: {robotStatus}, 伺服状态/Servo state: {servoStatus}"); if (robotStatus == RobotState.ROBOT_IDLE && servoStatus == ServoState.SERVO_IDLE) { Console.WriteLine("机器人和伺服器已空闲/Robot and servo are idle"); break; } Thread.Sleep(2000); // 等待2秒 if (System.DateTime.Now - startTime > System.TimeSpan.FromSeconds(60)) { Console.WriteLine("等待机器人和伺服器空闲超时/Waiting for robot and servo idle timeout"); break; } } while (true); // [ZH] 执行离线轨迹 // [EN] Execute offline trajectory code = controller.Trajectory.ExecuteOfflineTrajectory(); if (code == StatusCode.OK) { Console.WriteLine("执行离线轨迹成功/Execute offline trajectory success"); Console.WriteLine("机器人开始执行轨迹程序/Robot started executing trajectory program"); } else { Console.WriteLine($"执行离线轨迹失败/Execute offline trajectory failed: {code.GetDescription()}"); } } catch (Exception ex) { Console.WriteLine( $"执行过程中发生异常/Exception occurred during execution/Exception occurred during execution: {ex.Message}" ); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } /// /// 获取test_files文件夹中文件的路径示例方法 /// 展示如何获取当前程序目录下的test_files文件夹中的文件路径 /// private static string GetTestFilePath(string fileName) { // 获取当前程序集的目录 string? codeFilePath = new System.Diagnostics.StackTrace(true).GetFrame(0)?.GetFileName(); if (string.IsNullOrEmpty(codeFilePath)) { throw new InvalidOperationException("无法获取当前文件路径/Cannot get current file path"); } string? codeDirectory = Path.GetDirectoryName(codeFilePath); if (string.IsNullOrEmpty(codeDirectory)) { throw new InvalidOperationException("无法获取当前目录路径/Cannot get current directory path"); } // 构建test_files文件夹路径 string testFilesDirectory = Path.Combine(codeDirectory, "test_files"); // 构建文件完整路径 string filePath = Path.Combine(testFilesDirectory, fileName); return filePath; } } ``` --- url: /zh/2-csharp/4-methods/4.8-alarm.html title: 4.8 报警信息 --- # 4.8 报警信息 [​](#4-8) ## 4.8.1 获取最严重的一条报警 [​](#4-8-1) | 方法名 | **Alarm.GetTopAlarm**() | | ---------- | ---------------------------------------------------------- | | 描述 | 获取当前最严重的一条报警信息 | | 请求参数 | 无参数 | | 返回值 | string: 报警信息字符串 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Alarm/GetTopAlarm.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetTopAlarm { 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 the most severe alarm string topError; (topError, code) = controller.Alarm.GetTopAlarm(); if (code == StatusCode.OK) { Console.WriteLine("获取最严重报警成功/Get Top Alarm Success"); if (string.IsNullOrEmpty(topError)) { Console.WriteLine("当前无报警/No current alarms"); } else { Console.WriteLine($"最严重报警/Most Severe Alarm: {topError}"); } } else { Console.WriteLine($"获取最严重报警失败/Get Top Alarm Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.8.2 获取所有的活动的报警 [​](#4-8-2) | 方法名 | **Alarm.GetAllActiveAlarms**() | | ---------- | --------------------------------------------------------------- | | 描述 | 获取所有当前活动的报警信息 | | 请求参数 | 无参数 | | 返回值 | List: 报警信息列表 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Alarm/GetAllActiveAlarms.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class GetAllActiveAlarms { 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 all active alarms List errors; (errors, code) = controller.Alarm.GetAllActiveAlarms(); if (code == StatusCode.OK) { Console.WriteLine("获取所有活动报警成功/Get All Active Alarm Success"); Console.WriteLine($"活动报警数量/Active Alarm Count: {errors.Count}"); if (errors.Count == 0) { Console.WriteLine("当前无活动报警/No active alarms"); } else { Console.WriteLine("活动报警列表/Active Alarm List:"); for (int i = 0; i < errors.Count; i++) { Console.WriteLine($" {i + 1}. {errors[i]}"); } } } else { Console.WriteLine($"获取所有活动报警失败/Get All Active Alarm Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.8.3 复位错误 [​](#4-8-3) | 方法名 | **Alarm.ResetAlarms**() | | ---------- | ---------------------------------------------- | | 描述 | 复位错误 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/2-csharp/4-methods/4.9-fileManager.html title: 4.9 文件服务类 --- # 4.9 文件服务类 [​](#4-9) ## 4.9.1 上传本地文件到机器人 [​](#4-9-1) | 方法名 | **FileManager.Upload**(string filePath , FileType ft , bool overWriting \= false) | | ---------- | -------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 上传本地文件到机器人控制器 | | 请求参数 | filePath : string 需要上传的本地文件的绝对路径 ft : [FileType](./../3-struct/#3-18) 上传的文件类型 overWriting : bool 是否覆盖机器人控制器中已存在的文件,默认为 false 不覆盖 | | 备注 | USER\_PROGRAM 和 BLOCK\_PROGRAM 文件上传只需填写程序名,无需填写后缀 | | 返回值 | [StatusCode](./../3-struct/#3-1): 上传操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.9.2 下载机器人文件到本地 [​](#4-9-2) | 方法名 | **FileManager.Download**(string fileName , FileType ft , string savePath ) | | ---------- | ----------------------------------------------------------------------------------------------------------- | | 描述 | 从机器人控制器下载文件到本地 | | 请求参数 | fileName : string 要下载的文件名,无需带后缀 ft : [FileType](./../3-struct/#3-18) 要下载的文件类型 savePath : string 下载文件的本地保存路径 | | 返回值 | [StatusCode](./../3-struct/#3-1): 下载操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | ## 4.9.3 删除机器人上的文件 [​](#4-9-3) | 方法名 | **FileManager.Delete**(string fileName , FileType ft ) | | ---------- | ----------------------------------------------------------------------------- | | 描述 | 删除机器人控制器上的文件 | | 请求参数 | fileName : string 要删除的文件名,无需带后缀 ft : [FileType](./../3-struct/#3-18) 要删除的文件类型 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 FileManager/UserProgramOperations.cs ```cs using System.Collections.Generic; using System.IO; using Agilebot.IR; using Agilebot.IR.FileManager; using Agilebot.IR.Types; public class UserProgramOperations { /// /// 测试用户程序文件的完整操作流程:上传、下载、搜索和删除 /// 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 { Console.WriteLine("开始用户程序文件操作测试/Starting User Program File Operations Test"); // [ZH] 获取测试文件路径 // [EN] Get test file path string file_user_program = GetTestFilePath("test_prog.xml"); string fileName = "test_prog"; string save_path = GetTestFilePath("download"); // [ZH] 上传用户程序文件 // [EN] Upload user program file code = controller.FileManager.Upload(file_user_program, FileType.UserProgram, true); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件上传成功/User Program File Upload Success: {fileName}"); } else { Console.WriteLine($"用户程序文件上传失败/User Program File Upload Failed: {code.GetDescription()}"); return code; } // [ZH] 等待下载 // [EN] Wait before download Thread.Sleep(1000); // [ZH] 下载用户程序文件 // [EN] Download user program file code = controller.FileManager.Download(fileName, FileType.UserProgram, save_path); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件下载成功/User Program File Download Success: {fileName}"); } else { Console.WriteLine($"用户程序文件下载失败/User Program File Download Failed: {code.GetDescription()}"); return code; } // [ZH] 搜索用户程序文件 // [EN] Search user program file List results = new List(); (results, code) = controller.FileManager.Search(fileName); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件搜索成功/User Program File Search Success"); Console.WriteLine($"搜索结果数量/Search Results Count: {results.Count}"); foreach (var result in results) { Console.WriteLine($" 找到文件/Found File: {result}"); } } else { Console.WriteLine($"用户程序文件搜索失败/User Program File Search Failed: {code.GetDescription()}"); return code; } // [ZH] 等待删除 // [EN] Wait before delete Thread.Sleep(1000); // [ZH] 删除用户程序文件 // [EN] Delete user program file code = controller.FileManager.Delete(fileName, FileType.UserProgram); if (code == StatusCode.OK) { Console.WriteLine($"用户程序文件删除成功/User Program File Delete Success: {fileName}"); } else { Console.WriteLine($"用户程序文件删除失败/User Program File Delete Failed: {code.GetDescription()}"); return code; } Console.WriteLine("用户程序文件操作测试完成/User Program File Operations Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } /// /// 获取test_files文件夹中文件的路径示例方法 /// 展示如何获取当前程序目录下的test_files文件夹中的文件路径 /// private static string GetTestFilePath(string fileName) { // [ZH] 获取当前程序集的目录 // [EN] Get current assembly directory string? codeFilePath = new System.Diagnostics.StackTrace(true).GetFrame(0)?.GetFileName(); if (string.IsNullOrEmpty(codeFilePath)) { throw new InvalidOperationException("无法获取当前文件路径/Cannot get current file path"); } string? codeDirectory = Path.GetDirectoryName(codeFilePath); if (string.IsNullOrEmpty(codeDirectory)) { throw new InvalidOperationException("无法获取当前目录路径/Cannot get current directory path"); } // [ZH] 构建test_files文件夹路径 // [EN] Build test_files folder path string testFilesDirectory = Path.Combine(codeDirectory, "test_files"); // [ZH] 构建文件完整路径 // [EN] Build complete file path string filePath = Path.Combine(testFilesDirectory, fileName); return filePath; } } ``` ## 4.9.4 用户提供一个 pattern 查找机器人上符合 pattern 模式的文件 [​](#4-9-4) | 方法名 | **FileManager.Search**(string pattern , ref List fl ) | | ---------- | ------------------------------------------------------------- | | 描述 | 在机器人控制器上查找符合 pattern 模式的文件 | | 请求参数 | pattern : string 文件名称匹配模式字符串 fl : ref List 返回的文件列表 | | 返回值 | [StatusCode](./../3-struct/#3-1): 搜索操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- --- url: /zh/2-csharp/4-methods/4.10-basScript.html title: 4.10 BasScript脚本程序类 --- # 4.10 BasScript 脚本程序类 [​](#4-10) | 方法名 | **BasScript**(string name ) | | ---------- | -------------------------------------------------------- | | 描述 | BasScript 脚本程序类构造函数,对应示教器程序编写中的程序指令 | | 请求参数 | name : string 脚本程序名称 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.2.0+ 工业 (Bronze): 不支持 工业机器人: 7.6.0.0 | | 备注 | BasScript 脚本程序类下所有方法兼容的机器人软件版本要求同本类的兼容的机器人软件版本要求一致 | ## 4.10.1 MoveJoint 运动到点指令 [​](#4-10-1) | 方法名 | **BasScript.BasMotion.MoveJoint**(poseType, poseIndex, speedType, speedValue, smoothType, smoothDistance, extraParam) | | ---- | ---------------------------------------------------------------------------------------------------------------------------- | | 描述 | 移动机器人关节到指定位置,对应示教器程序编写中的 MoveJoint 指令 | | 请求参数 | poseType : 位姿类型 poseIndex : 位姿索引 speedType : 速度类型 speedValue : 速度值 smoothType : 平滑类型 smoothDistance : 平滑距离 extraParam : 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.2 MoveLine 直线运动到点指令 [​](#4-10-2) | 方法名 | **BasScript.BasMotion.MoveLine**(poseType, poseIndex, speedType, speedValue, smoothType, smoothDistance, extraParam) | | ---- | ---------------------------------------------------------------------------------------------------------------------------- | | 描述 | 沿直线移动机器人到指定位置,对应示教器程序编写中的 MoveLine 指令 | | 请求参数 | poseType : 位姿类型 poseIndex : 位姿索引 speedType : 速度类型 speedValue : 速度值 smoothType : 平滑类型 smoothDistance : 平滑距离 extraParam : 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.3 MoveCircle 弧线运动到点指令 [​](#4-10-3) | 方法名 | **BasScript.BasMotion.MoveCircle**(poseType1, poseIndex1, poseType2, poseIndex2, speedType, speedValue, smoothType, smoothDistance, extraParam) | | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 沿圆弧移动机器人到指定位置,对应示教器程序编写中的 MoveCircle 指令 | | 请求参数 | poseType1 : 第一个位姿类型 poseIndex1 : 第一个位姿索引 poseType2 : 第二个位姿类型 poseIndex2 : 第二个位姿索引 speedType : 速度类型 speedValue : 速度值 smoothType : 平滑类型 smoothDistance : 平滑距离 extraParam : 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.4 Jump 点对点移动指令 [​](#4-10-4) | 方法名 | **BasScript.BasMotion.Jump**(poseType, poseIndex, speedValue, speedRatio, limZType, limZValue, smoothType, smoothDistance, extraParam) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | JUMP 指令,机器人点对点移动到指定位置 | | 请求参数 | poseType : 目标位姿存储类型 poseIndex : 目标位置的索引 speedValue : 移动速度的值 speedRatio : 移动速度的比率 limZType : Z 轴限制的类型 limZValue : Z 轴限制的值 smoothType : 平滑类型 smoothDistance : 平滑距离 extraParam : 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.5 Jump3 三点跳跃指令 [​](#4-10-5) | 方法名 | **BasScript.BasMotion.Jump3**(poseType, poseIndex, speedValue, speedRatio, smoothType, smoothDistance, extraParam) | | ---- | --------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | JUMP3 指令,机器人点对点移动到指定位置 | | 请求参数 | poseType : 目标位姿存储类型 poseIndex : 3 个目标位置的索引 speedValue : 移动速度的值 speedRatio : 移动速度的比率 smoothType : 平滑类型 smoothDistance : 平滑距离 extraParam : 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.6 Jump3CP 三点跳跃 CP 指令 [​](#4-10-6) | 方法名 | **BasScript.BasMotion.Jump3CP**(poseType, poseIndex, speedValue, smoothType, smoothDistance, extraParam) | | ---- | ------------------------------------------------------------------------------------------------------------------------ | | 描述 | JUMP3CP 指令,机器人点对点移动到指定位置 | | 请求参数 | poseType : 目标位姿存储类型 poseIndex : 3 个目标位置的索引 speedValue : 移动速度的值 smoothType : 平滑类型 smoothDistance : 平滑距离 extraParam : 额外参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 运动指令执行结果 | ## 4.10.7 ExtraParam 额外参数类 [​](#4-10-7) | 方法名 | **ExtraParam.Acceleration**(double value) | | ---- | ------------------------------------------ | | 描述 | 设置附加加速度参数 | | 请求参数 | value : double 加速度值,范围为 1\~120 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | | 方法名 | **ExtraParam.RTCP**() | | ---- | ------------------------------------------ | | 描述 | 设置 RTCP(Real-Time Control Protocol)参数 | | 请求参数 | 无参数 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | | 方法名 | **ExtraParam.Offset**(int index) | | ---- | ------------------------------------------ | | 描述 | 设置坐标偏移参数 | | 请求参数 | index : int 偏移用的 PR 索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | | 方法名 | **ExtraParam.TB**(double second, string type, string name) | | ---- | ---------------------------------------------------------- | | 描述 | 设置在当前指令运行后执行程序指令的延时参数 | | 请求参数 | second : double 延时秒数 type : string 指令类型 name : string 程序名称 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | | 方法名 | **ExtraParam.TB**(double second, string type, int index, int status) | | ---- | ------------------------------------------------------------------------------ | | 描述 | 设置在当前指令运行后给指定 IO 赋值的延时参数 | | 请求参数 | second : double 延时秒数 type : string IO 类型 index : int IO 索引 status : int 要赋予的状态 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | | 方法名 | **ExtraParam.SKIP**(int index) | | ---- | ------------------------------------------ | | 描述 | 设置跳转指令参数 | | 请求参数 | index : int 跳转到指定的 LABEL 序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 参数设置执行结果 | ## 4.10.8 AssignValue 赋值指令 [​](#4-10-8) | 方法名 | **BasScript.AssignValue**(param1, index, param2, value, optIndex, optValue) | | ---- | --------------------------------------------------------------------------------------------------------- | | 描述 | 执行赋值指令 | | 请求参数 | param1 : 参数 1 类型 index : 参数 1 索引 param2 : 参数 2 类型 value : 参数 2 值 optIndex : 参数 1 附加索引 optValue : 参数 2 附加值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 赋值指令执行结果 | ## 4.10.9 AssignValue 赋值指令 [​](#4-10-9) | 方法名 | **BasScript.AssignValue**(param, index, value) | | ---- | ------------------------------------------------------------------------------- | | 描述 | 为指定变量赋值 | | 请求参数 | param : 参数类型(AssignType) index : int 索引(整数) value : 值(IOStatus、double 或 string) | | 返回值 | [StatusCode](./../3-struct/#3-1): 赋值操作执行结果 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; using Agilebot.IR.BasScript; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; // 初始化捷勃特机器人 Arm controller = new Arm(controllerIP); // 连接捷勃特机器人 StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 生成脚本程序 BasScript script = new BasScript("test"); code = script.BasMotion.MoveJoint(MovePoseType.PR, 1, SpeedType.VALUE, 25, SmoothType.FINE); BasScript.ExtraParam param = new(); param.Acceleration(80); code = script.BasMotion.MoveJoint(MovePoseType.PR, 2, SpeedType.VALUE, 50, SmoothType.FINE, extraParam: param); // 执行脚本程序 code = controller.Execution.ExecuteBasScript(script); // 关闭连接 code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` ## 4.10.10 IF 条件指令 [​](#4-10-10) | 方法名 | **BasScript.BasLogical.IF**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 IF 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 索引(整数) param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.11 ELSE\_IF 条件分支指令 [​](#4-10-11) | 方法名 | **BasScript.BasLogical.ELSE\_IF**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 ELSE IF 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 索引(整数) param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.12 ELSE 否则指令 [​](#4-10-12) | 方法名 | **BasScript.BasLogical.ELSE**() | | ---- | ---------------------------------------- | | 描述 | 添加一个逻辑 ELSE 语句到脚本中 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.13 END\_IF 结束条件指令 [​](#4-10-13) | 方法名 | **BasScript.BasLogical.END\_IF**() | | ---- | ---------------------------------------- | | 描述 | 结束逻辑 IF 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; using Agilebot.IR.BasScript; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; // 初始化捷勃特机器人 Arm controller = new Arm(controllerIP); // 连接捷勃特机器人 StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 生成脚本程序 BasScript script = new BasScript("test"); code = script.BasLogical.IF(RegisterType.R, 1, OtherType.VALUE, 1); code = script.BasMotion.MoveJoint(MovePoseType.PR, 1, SpeedType.VALUE, 25, SmoothType.FINE); code = script.BasLogical.ELSE_IF(RegisterType.R, 1, OtherType.VALUE, 2); code = script.BasMotion.MoveJoint(MovePoseType.PR, 2, SpeedType.VALUE, 50, SmoothType.FINE); code = script.BasLogical.ELSE(); code = script.BasMotion.MoveJoint(MovePoseType.PR, 3, SpeedType.VALUE, 50, SmoothType.FINE); code = script.BasLogical.END_IF(); // 执行脚本程序 code = controller.Execution.ExecuteBasScript(script); // 关闭连接 code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` ## 4.10.14 WHILE 循环指令 [​](#4-10-14) | 方法名 | **BasScript.BasLogical.WHILE**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 WHILE 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 索引(整数) param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.15 END\_WHILE 结束循环指令 [​](#4-10-15) | 方法名 | **BasScript.BasLogical.END\_WHILE**() | | ---- | ---------------------------------------- | | 描述 | 结束逻辑 While 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | 示例代码 ```cs using Agilebot.IR; using Agilebot.IR.Types; using Agilebot.IR.BasScript; public class Test { public static async Task Main() { string controllerIP = "10.27.1.254"; // 初始化捷勃特机器人 Arm controller = new Arm(controllerIP); // 连接捷勃特机器人 StatusCode code = await controller.Connect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully connected."); // 生成脚本程序 BasScript script = new BasScript("test"); code = script.BasLogical.WHILE(IOType.DO, 1, OtherType.IO_STATUS, IOStatus.ON); code = script.BasMotion.MoveJoint(MovePoseType.PR, 1, SpeedType.VALUE, 25, SmoothType.FINE); code = script.BasLogical.END_WHILE(); // 执行脚本程序 code = controller.Execution.ExecuteBasScript(script); // 关闭连接 code = controller.Disconnect(); Console.WriteLine(code != StatusCode.OK ? code.GetDescription() : "Successfully disconnected."); } } ``` ## 4.10.16 SWITCH 多分支选择指令 [​](#4-10-16) | 方法名 | **BasScript.BasLogical.SWITCH**(param, index) | | ---- | -------------------------------------------------- | | 描述 | 添加一个逻辑 SWITCH 语句到脚本中 | | 请求参数 | param : 参数,类型为 RegisterType 或 IOType index : 参数的索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.17 CASE 分支指令 [​](#4-10-17) | 方法名 | **BasScript.BasLogical.CASE**(param, value) | | ---- | --------------------------------------------------------------------- | | 描述 | 添加一个逻辑 CASE 语句到脚本中 | | 请求参数 | param : 参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.18 DEFAULT 默认分支指令 [​](#4-10-18) | 方法名 | **BasScript.BasLogical.DEFAULT**() | | ---- | ---------------------------------------- | | 描述 | 添加一个逻辑 DEFAULT 语句到脚本中 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.19 END\_SWITCH 结束多分支选择指令 [​](#4-10-19) | 方法名 | **BasScript.BasLogical.END\_SWITCH**() | | ---- | ---------------------------------------- | | 描述 | 结束逻辑 SWITCH 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.20 SKIP\_CONDITION 跳过条件指令 [​](#4-10-20) | 方法名 | **BasScript.BasLogical.SKIP\_CONDITION**(param1, index, param2, value, operatorType) | | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 SKIP CONDITION 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 参数一的索引 param2 : 第二个参数,类型为 RegisterType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.21 WAIT 等待条件指令 [​](#4-10-21) | 方法名 | **BasScript.BasStructure.WAIT**(param1, index, param2, value, operatorType) | | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 描述 | 添加一个逻辑 WAIT COND 语句到脚本中 | | 请求参数 | param1 : 第一个参数,类型为 RegisterType 或 IOType index : 参数一的索引 param2 : 第二个参数,类型为 ValuesType、IOType 或 OtherType value : 值,类型为索引、数值、字符串或 IOStatus operatorType : 布尔操作符,默认为等于 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.22 WAIT\_TIME 等待时间指令 [​](#4-10-22) | 方法名 | **BasScript.BasStructure.WAIT\_TIME**(param, value) | | ---- | --------------------------------------------------- | | 描述 | WAIT TIME 等待一定时间 | | 请求参数 | param : 参数类型 value : 等待的时间值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.23 GOTO 跳转指令 [​](#4-10-23) | 方法名 | **BasScript.BasLogical.GOTO**(index) | | ---- | ---------------------------------------- | | 描述 | GOTO 跳转语句 | | 请求参数 | index : 目标标签的索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.24 LABEL 标签指令 [​](#4-10-24) | 方法名 | **BasScript.BasLogical.LABEL**(index) | | ---- | ---------------------------------------- | | 描述 | LABEL 语句 | | 请求参数 | index : 标签的索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.25 BREAK 跳出循环指令 [​](#4-10-25) | 方法名 | **BasScript.BasLogical.BREAK**() | | ---- | ---------------------------------------- | | 描述 | BREAK 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.26 CONTINUE 跳过循环指令 [​](#4-10-26) | 方法名 | **BasScript.BasLogical.CONTINUE**() | | ---- | ---------------------------------------- | | 描述 | CONTINUE 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.27 PAUSE 暂停指令 [​](#4-10-27) | 方法名 | **BasScript.BasStructure.PAUSE**() | | ---- | ---------------------------------------- | | 描述 | PAUSE 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.28 ABORT 中断指令 [​](#4-10-28) | 方法名 | **BasScript.BasStructure.ABORT**() | | ---- | ---------------------------------------- | | 描述 | ABORT 语句 | | 请求参数 | 无 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.29 CALL 同步调用程序指令 [​](#4-10-29) | 方法名 | **BasScript.BasStructure.CALL**(name) | | ---- | ---------------------------------------- | | 描述 | CALL 同步调用程序 | | 请求参数 | name : 程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.30 RUN 异步调用程序指令 [​](#4-10-30) | 方法名 | **BasScript.BasStructure.RUN**(name) | | ---- | ---------------------------------------- | | 描述 | RUN 异步调用程序 | | 请求参数 | name : 程序名 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.31 LOAD 加载程序指令 [​](#4-10-31) | 方法名 | **BasScript.BasStructure.LOAD**(param, value) | | ---- | -------------------------------------------------- | | 描述 | LOAD 载入程序 | | 请求参数 | param : 参数,R 寄存器、SR 寄存器、数值或字符串 value : 参数的值,数值或字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.32 UNLOAD 卸载程序指令 [​](#4-10-32) | 方法名 | **BasScript.BasStructure.UNLOAD**(param, value) | | ---- | -------------------------------------------------- | | 描述 | UNLOAD 卸载程序 | | 请求参数 | param : 参数,R 寄存器、SR 寄存器、数值或字符串 value : 参数的值,数值或字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.33 EXEC 执行程序指令 [​](#4-10-33) | 方法名 | **BasScript.BasStructure.EXEC**(param, value) | | ---- | -------------------------------------------------- | | 描述 | EXEC 执行程序 | | 请求参数 | param : 参数,R 寄存器、SR 寄存器、数值或字符串 value : 参数的值,数值或字符串 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.34 OPEN 打开 socket 连接指令 [​](#4-10-34) | 方法名 | **BasScript.BasSocket.OPEN**(index) | | ---- | ---------------------------------------- | | 描述 | SOCKET OPEN 打开 socket 连接 | | 请求参数 | index : SK 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.35 CLOSE 关闭 socket 连接指令 [​](#4-10-35) | 方法名 | **BasScript.BasSocket.CLOSE**(index) | | ---- | ---------------------------------------- | | 描述 | SOCKET CLOSE 关闭 socket 连接 | | 请求参数 | index : SK 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.36 CONNECT 连接 socket 指令 [​](#4-10-36) | 方法名 | **BasScript.BasSocket.CONNECT**(index) | | ---- | ---------------------------------------- | | 描述 | SOCKET CONNECT 连接 socket | | 请求参数 | index : SK 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.37 SEND 发送 socket 数据指令 [​](#4-10-37) | 方法名 | **BasScript.BasSocket.SEND**(index, msgType, value) | | ---- | --------------------------------------------------- | | 描述 | SOCKET SEND 通过 socket 发送数据 | | 请求参数 | index : SK 寄存器序号 msgType : 消息类型 value : 消息内容或序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.38 RECV 接收 socket 数据指令 [​](#4-10-38) | 方法名 | **BasScript.BasSocket.RECV**(index, msgLength, msgType, value) | | ---- | ---------------------------------------------------------------- | | 描述 | SOCKET RECV 接收 socket 数据 | | 请求参数 | index : SK 寄存器序号 msgLength : 消息长度 msgType : 消息类型 value : 消息内容或序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.39 READ\_MH 读取 Modbus 保持寄存器指令 [​](#4-10-39) | 方法名 | **BasScript.BasModbus.READ\_MH**(index, id, address, length, rIndex) | | ---- | ------------------------------------------------------------------------------- | | 描述 | READ MH 读取 Modbus 保持寄存器 | | 请求参数 | index : 通道序号 id : Modbus ID address : 寄存器地址 length : 寄存器长度 rIndex : 写入的 R 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.40 READ\_MI 读取 Modbus 输入寄存器指令 [​](#4-10-40) | 方法名 | **BasScript.BasModbus.READ\_MI**(index, id, address, length, rIndex) | | ---- | ------------------------------------------------------------------------------- | | 描述 | READ MI 读取 Modbus 输入寄存器 | | 请求参数 | index : 通道序号 id : Modbus ID address : 寄存器地址 length : 寄存器长度 rIndex : 写入的 R 寄存器序号 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.41 WRITE\_MH 写入 Modbus 保持寄存器指令 [​](#4-10-41) | 方法名 | **BasScript.BasModbus.WRITE\_MH**(index, id, address, length, valueType, value) | | ---- | --------------------------------------------------------------------------------------- | | 描述 | WRITE MH 用于写入 Modbus 保持寄存器 | | 请求参数 | index : 通道序号 id : Modbus ID address : 寄存器地址 length : 寄存器长度 valueType : 值类型 value : 值或索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.42 FIND 寻找视觉程序指令 [​](#4-10-42) | 方法名 | **BasScript.BasVision.FIND**(name) | | ---- | ---------------------------------------- | | 描述 | VISION FIND 寻找视觉程序 | | 请求参数 | name : 视觉程序名称 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.43 GET\_OFFSET 获取视觉程序偏移量指令 [​](#4-10-43) | 方法名 | **BasScript.BasVision.GET\_OFFSET**(name, index, labelIndex) | | ---- | ------------------------------------------------------------ | | 描述 | VISION GET OFFSET 获取视觉程序偏移量 | | 请求参数 | name : 视觉程序名称 index : 视觉寄存器索引 labelIndex : 标签索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.44 GET\_QUANTITY 获取视觉程序结果指令 [​](#4-10-44) | 方法名 | **BasScript.BasVision.GET\_QUANTITY**(name, index) | | ---- | -------------------------------------------------- | | 描述 | VISION GET QUANTITY 获取视觉程序结果 | | 请求参数 | name : 视觉程序名称 index : R 寄存器索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | ## 4.10.45 SetParam 设置参数指令 [​](#4-10-45) | 方法名 | **BasScript.SetParam**(type, valueType, value) | | ---- | ---------------------------------------------- | | 描述 | SET PARAM 设置参数 | | 请求参数 | type : 参数类型 valueType : 值类型 value : 值 | | 返回值 | [StatusCode](./../3-struct/#3-1): 函数执行结果 | --- --- url: /zh/2-csharp/4-methods/4.11-coordinateSystem.html title: 4.11 坐标系类 --- # 4.11 坐标系类 [​](#4-11) ## 4.11.1 获取指定坐标系信息 [​](#4-11-1) | 方法名 | **CoordinateSystem.Get**(CoordinateType type , int index ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型和索引,获取对应的坐标系信息 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型 index : int 坐标系索引 | | 返回值 | [Coordinate](./../3-struct/#3-22): 坐标系信息数据 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.2 更新坐标系信息 [​](#4-11-2) | 方法名 | **CoordinateSystem.Update**(CoordinateType type , Coordinate coordinate ) | | ---------- | ------------------------------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型和坐标系信息,更新对应的坐标系 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型 coordinate : [Coordinate](./../3-struct/#3-22) 要更新的坐标系信息 | | 返回值 | [StatusCode](./../3-struct/#3-1): 更新操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.3 添加坐标系信息 [​](#4-11-3) | 方法名 | **CoordinateSystem.Add**(CoordinateType type , Coordinate coordinate ) | | ---------- | ------------------------------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型和坐标系信息,添加一个新的坐标系 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型 coordinate : [Coordinate](./../3-struct/#3-22) 要添加的坐标系信息 | | 返回值 | [StatusCode](./../3-struct/#3-1): 添加操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.4 删除指定坐标系信息 [​](#4-11-4) | 方法名 | **CoordinateSystem.Delete**(CoordinateType type , int index ) | | ---------- | ---------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型和索引,删除对应的坐标系信息 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型 index : int 坐标系索引 | | 返回值 | [StatusCode](./../3-struct/#3-1): 删除操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | --- ## 4.11.5 获取坐标系信息列表 [​](#4-11-5) | 方法名 | **CoordinateSystem.GetCoordinateList**(CoordinateType type ) | | ---------- | ------------------------------------------------------------------------------------- | | 描述 | 根据指定的坐标系类型,获取所有坐标系信息的列表 | | 请求参数 | type : [CoordinateType](./../3-struct/#3-22-1) 坐标系类型 | | 返回值 | List<\[CoordSummary\]\[#3.22.2\]>: 坐标系信息列表 [StatusCode](./../3-struct/#3-1): 获取操作执行结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 CoordinateSystem/TFCoordinateTest.cs ```cs using Agilebot.IR; using Agilebot.IR.CoordinateSystem; using Agilebot.IR.Types; public class TFCoordinateTest { /// /// 测试 TF 坐标系的计算、添加、获取列表、获取单个坐标系、更新和删除操作 /// 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] Prepare test data var poseData = new List { new Position(847.0999429718556, 166.7999999999656, 276.8195498896624, 90, 0, -70), new Position(809.0227439212846, 166.79999999994843, 459.80354972094295, 90, 0, -45), new Position(717.1223240422377, 166.79999999993265, 654.0891675073312, 90, 0, -30), new Position(572.917828754028, 166.79999999992168, 825.1862002007621, 90, 0, -40), }; Console.WriteLine("开始TF坐标系测试/Starting TF Coordinate Test"); // [ZH] 计算坐标系 // [EN] Calculate coordinate system Coordinate calculatedCoord = new Coordinate(); (Position coord, StatusCode calculateCode) = controller.CoordinateSystem.Calculate( CoordinateType.ToolCoordinate, poseData ); if (code == StatusCode.OK) { Console.WriteLine("计算TF坐标系成功/Calculate TF Coordinate Success"); } else { Console.WriteLine($"计算TF坐标系失败/Calculate TF Coordinate Failed: {code.GetDescription()}"); return code; } calculatedCoord.Id = 5; calculatedCoord.Data = coord; // [ZH] 删除可能存在的坐标系 // [EN] Delete existing coordinate if exists StatusCode deleteCode = controller.CoordinateSystem.Delete( CoordinateType.ToolCoordinate, calculatedCoord.Id ); Console.WriteLine($"删除现有坐标系/Delete Existing Coordinate: {deleteCode.GetDescription()}"); // [ZH] 添加坐标系 // [EN] Add coordinate system StatusCode addCode = controller.CoordinateSystem.Add(CoordinateType.ToolCoordinate, calculatedCoord); if (addCode == StatusCode.OK) { Console.WriteLine("添加TF坐标系成功/Add TF Coordinate Success"); } else { Console.WriteLine($"添加TF坐标系失败/Add TF Coordinate Failed: {addCode.GetDescription()}"); return addCode; } // [ZH] 获取坐标系列表 // [EN] Get coordinate list List listRes; (listRes, code) = controller.CoordinateSystem.GetCoordinateList(CoordinateType.ToolCoordinate); if (code == StatusCode.OK) { Console.WriteLine("获取TF坐标系列表成功/Get TF Coordinate List Success"); Console.WriteLine($"坐标系列表数量/Coordinate List Count: {listRes.Count}"); } else { Console.WriteLine($"获取TF坐标系列表失败/Get TF Coordinate List Failed: {code.GetDescription()}"); return code; } // [ZH] 获取单个坐标系 // [EN] Get single coordinate Coordinate getCoord; (getCoord, code) = controller.CoordinateSystem.Get(CoordinateType.ToolCoordinate, calculatedCoord.Id); if (code == StatusCode.OK) { Console.WriteLine("获取TF坐标系成功/Get TF Coordinate Success"); Console.WriteLine($"坐标系名称/Coordinate Name: {getCoord.Name}"); } else { Console.WriteLine($"获取TF坐标系失败/Get TF Coordinate Failed: {code.GetDescription()}"); return code; } // [ZH] 更新坐标系 // [EN] Update coordinate system getCoord.Name = "test"; StatusCode updateCode = controller.CoordinateSystem.Update(CoordinateType.ToolCoordinate, getCoord); if (updateCode == StatusCode.OK) { Console.WriteLine("更新TF坐标系成功/Update TF Coordinate Success"); } else { Console.WriteLine($"更新TF坐标系失败/Update TF Coordinate Failed: {updateCode.GetDescription()}"); return updateCode; } // [ZH] 删除坐标系 // [EN] Delete coordinate system deleteCode = controller.CoordinateSystem.Delete(CoordinateType.ToolCoordinate, calculatedCoord.Id); if (deleteCode == StatusCode.OK) { Console.WriteLine("删除TF坐标系成功/Delete TF Coordinate Success"); } else { Console.WriteLine($"删除TF坐标系失败/Delete TF Coordinate Failed: {deleteCode.GetDescription()}"); return deleteCode; } Console.WriteLine("TF坐标系测试完成/TF Coordinate Test Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.12-jogging.html title: 4.12 机器人示教运动 --- # 4.12 机器人示教运动 [​](#4-12) ## 4.12.1 机器人 Jogging 运动 [​](#4-12-1) | 方法名 | **Jogging.Move**(int ajNum , MoveMode moveMode , double stepLength \= 0, double stepAngle \= 0) | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 描述 | 控制机器人以连续运动或者根据进给量运动 | | 请求参数 | ajNum : int 数值 1\~6 对应关节值号 \[1 \~ 6\],或笛卡尔坐标系 x, y, z, rx, ry, rz,具体取决于当前示教的坐标系。正数代表正方向运动,负数代表负方向运动 moveMode : MoveMode 机械臂运动模式,支持增量运动或连续运动 stepLength : double 步长,单位为 mm 或角度(仅在增量运动模式下有效) stepAngle : double 步角度,单位为角度(仅在增量运动模式下有效) | | 返回值 | [StatusCode](./../3-struct/#3-1): 返回点动是否成功的状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Jogging/StepJogging.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class StepJogging { 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.UNLIMITED_MANUAL && opMode != UserOpMode.LIMIT_MANUAL) { Console.WriteLine($"示教运动必须在机器人手动模式下/Jogging must be in manual mode"); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 设置单步示教运动参数 // [EN] Set step jogging parameters int ajNum = 1; // 轴序号,正数表示正方向运动 MoveMode moveMode = MoveMode.Stepping; // 单步运动模式 double stepLength = 5.0; // 步长,单位为mm或角度 double stepAngle = 5.0; // 轴旋转角度,单位为角度 Console.WriteLine("开始单步示教运动/Starting Step Jogging"); Console.WriteLine($"轴序号/Axis Number: {ajNum}"); Console.WriteLine($"运动模式/Move Mode: {moveMode}"); Console.WriteLine($"步长/Step Length: {stepLength}"); // [ZH] 执行单步示教运动 // [EN] Execute step jogging movement code = controller.Jogging.Move(ajNum, moveMode, stepLength, stepAngle); if (code == StatusCode.OK) { Console.WriteLine("单步示教运动执行成功/Step Jogging Executed Successfully"); Console.WriteLine( $"轴{ajNum}向正方向移动{stepLength}单位/Axis {ajNum} moved {stepLength} units in positive direction" ); } else { Console.WriteLine($"单步示教运动执行失败/Step Jogging Execution Failed: {code.GetDescription()}"); } // [ZH] 等待一秒后执行反向运动 // [EN] Wait one second then execute reverse movement Thread.Sleep(1000); // [ZH] 执行反向单步运动 // [EN] Execute reverse step movement int reverseAjNum = -ajNum; // 负数表示负方向运动 code = controller.Jogging.Move(reverseAjNum, moveMode, stepLength, stepAngle); if (code == StatusCode.OK) { Console.WriteLine("反向单步示教运动执行成功/Reverse Step Jogging Executed Successfully"); Console.WriteLine( $"轴{Math.Abs(reverseAjNum)}向负方向移动{stepLength}单位/Axis {Math.Abs(reverseAjNum)} moved {stepLength} units in negative direction" ); } else { Console.WriteLine( $"反向单步示教运动执行失败/Reverse Step Jogging Execution Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.12.2 机器人多轴同时连续运动 [​](#4-12-2) | 方法名 | **Jogging.MultiMove**(int\[\] ajNums ) | | ---------- | --------------------------------------------------------------------------------------------------------- | | 描述 | 控制机器人多轴同时连续运动 | | 请求参数 | ajNums : int \[\] 数值 1\~6 对应关节值号 \[1 \~ 6\],或笛卡尔坐标系 x, y, z, rx, ry, rz,具体取决于当前示教的坐标系。正数代表正方向运动,负数代表负方向运动 | | 返回值 | [StatusCode](./../3-struct/#3-1): 返回点动是否成功的状态码 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Jogging/MultiJogging.cs ```cs using Agilebot.IR; using Agilebot.IR.Jogging; using Agilebot.IR.Types; public class MultiJogging { 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.UNLIMITED_MANUAL && opMode != UserOpMode.LIMIT_MANUAL) { Console.WriteLine($"示教运动必须在机器人手动模式下/Jogging must be in manual mode"); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } Console.WriteLine("开始多轴示教运动/Starting Multi-axis Jogging"); Console.WriteLine("演示多轴运动/Demo multi-axis step movements"); // [ZH] 多轴运动 // [EN] Multi-axis step movement Console.WriteLine("\n=== 多轴运动/Multi-axis Step Movement ==="); int[] axes = { 1, 2, 3 }; // 正方向运动 code = controller.Jogging.MultiMove(axes); if (code == StatusCode.OK) { Console.WriteLine("连续示教运动启动成功/Continuous Jogging Started Successfully"); Console.WriteLine("运动3秒后自动停止/Moving for 3 seconds then auto stop"); // [ZH] 运动3秒 // [EN] Move for 3 seconds Thread.Sleep(3000); // [ZH] 停止示教运动 // [EN] Stop jogging movement controller.Jogging.Stop(); Console.WriteLine("示教运动已停止/Jogging Movement Stopped"); } else { Console.WriteLine($"连续示教运动启动失败/Continuous Jogging Start Failed: {code.GetDescription()}"); } Console.WriteLine("\n多轴示教运动完成/Multi-axis Jogging Completed"); } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); code = StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` ## 4.12.3 停止机器人 Jogging 运动 [​](#4-12-3) | 方法名 | **Jogging.Stop**() | | ---------- | ---------------------------------------------- | | 描述 | 停止运动 | | 请求参数 | 无 | | 返回值 | void | | 备注 | 仅在连续运动模式下需要使用此方法停止运动 | | 兼容的机器人软件版本 | 协作 (Copper): v7.5.0.0+ 工业 (Bronze): v7.5.0.0+ | 示例代码 Jogging/ContinuousJogging.cs ```cs using Agilebot.IR; using Agilebot.IR.Types; public class ContinuousJogging { 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.UNLIMITED_MANUAL && opMode != UserOpMode.LIMIT_MANUAL) { Console.WriteLine($"示教运动必须在机器人手动模式下/Jogging must be in manual mode"); return StatusCode.OtherReason; } } else { Console.WriteLine($"获取机器人模式失败/Failed to get robot mode: {opCode.GetDescription()}"); } // [ZH] 设置示教运动参数 // [EN] Set jogging parameters int ajNum = 3; // 轴序号,正数表示正方向运动 MoveMode moveMode = MoveMode.Continuous; // 连续运动模式 Console.WriteLine("开始连续示教运动/Starting Continuous Jogging"); Console.WriteLine($"轴序号/Axis Number: {ajNum}"); Console.WriteLine($"运动模式/Move Mode: {moveMode}"); // [ZH] 启动连续示教运动 // [EN] Start continuous jogging movement code = controller.Jogging.Move(ajNum, moveMode); if (code == StatusCode.OK) { Console.WriteLine("连续示教运动启动成功/Continuous Jogging Started Successfully"); Console.WriteLine("运动3秒后自动停止/Moving for 3 seconds then auto stop"); // [ZH] 运动3秒 // [EN] Move for 3 seconds Thread.Sleep(3000); // [ZH] 停止示教运动 // [EN] Stop jogging movement controller.Jogging.Stop(); Console.WriteLine("示教运动已停止/Jogging Movement Stopped"); } else { Console.WriteLine($"连续示教运动启动失败/Continuous Jogging Start Failed: {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(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } return code; } } ``` --- --- url: /zh/2-csharp/4-methods/4.13-subpub.html title: 4.13 机器人订阅发布接口 --- # 4.13 机器人订阅发布接口 [​](#4-13) ## 4.13.1 连接到 WebSocket 服务器 [​](#4-13-1) | 方法名 | **SubPub.Connect**() | | ---------- | ---------------------------------------------- | | 描述 | 连接到机器人控制器的 WebSocket 服务器 | | 请求参数 | 无 | | 返回值 | Task:异步连接操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.2 断开 WebSocket 服务器 [​](#4-13-2) | 方法名 | **SubPub.Disconnect**() | | ---------- | ---------------------------------------------- | | 描述 | 断开与机器人控制器 WebSocket 服务器的连接 | | 请求参数 | 无 | | 返回值 | Task:异步断开操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.3 添加机器人状态订阅 [​](#4-13-3) | 方法名 | **SubPub.SubscribeStatus**(RobotTopicType\[\] topicTypes , int frequency \= 200) | | ---------- | ----------------------------------------------------------------------------------- | | 描述 | 添加机器人状态数据订阅 | | 请求参数 | topicTypes : RobotTopicType \[\] 需要订阅的机器人主题类型列表 frequency : int 订阅频率,单位为 Hz,默认值 200 | | 返回值 | Task:异步订阅操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.4 添加寄存器订阅 [​](#4-13-4) | 方法名 | **SubPub.SubscribeRegister**(RegTopicType regType , int\[\] regIds , int frequency \= 200) | | ---------- | ------------------------------------------------------------------------------------------------- | | 描述 | 添加寄存器数据订阅 | | 请求参数 | regType : RegTopicType 寄存器类型 regIds : int \[\] 需要订阅的寄存器 ID 列表 frequency : int 订阅频率,单位为 Hz,默认值 200 | | 返回值 | Task:异步订阅操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.5 添加 IO 订阅 [​](#4-13-5) | 方法名 | **SubPub.SubscribeIO**((IOTopicType, int)\[\] ioList , int frequency \= 200) | | ---------- | --------------------------------------------------------------------------------------------- | | 描述 | 订阅 IO 信号数据,包括数字输入输出等 | | 请求参数 | ioList : (IOTopicType, int)\[\] IO 列表,每个元素为 (IO类型, IO ID) frequency : int 订阅频率,单位为 Hz,默认值 200 | | 返回值 | Task:异步订阅操作结果 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | ## 4.13.6 开始接收消息 [​](#4-13-6) | 方法名 | **SubPub.StartReceiving**(Func, Task> onMessageReceived ) | | ---------- | ------------------------------------------------------------------------------------ | | 描述 | 开始接收订阅消息,并通过回调函数处理接收到的数据 | | 请求参数 | onMessageReceived : Func, Task> 消息接收回调函数 | | 返回值 | Task:异步接收任务 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | 示例代码 SubPub/CallbackReceiving.cs ```cs using Agilebot.IR; using Agilebot.IR.SubPub; using Agilebot.IR.Types; public class CallbackReceiving { 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."); // [ZH] 初始化捷勃特机器人SubPub // [EN] Initialize the Agilebot robot SubPub var subPub = controller.SubPub; try { Console.WriteLine("开始回调方式接收消息测试/Starting Callback Receiving Test"); // [ZH] 连接到WebSocket服务器 // [EN] Connect to WebSocket server subPub.Connect().Wait(); Console.WriteLine("WebSocket连接成功/WebSocket Connected Successfully"); // [ZH] 订阅机器人状态 // [EN] Subscribe to robot status var topicTypes = new RobotTopicType[] { RobotTopicType.TopicCurrentJoint, RobotTopicType.TopicRobotStatus }; subPub.SubscribeStatus(topicTypes, frequency: 100).Wait(); Console.WriteLine("机器人状态订阅成功/Robot Status Subscription Successful"); // [ZH] 订阅寄存器 // [EN] Subscribe to registers var regIds = new int[] { 1, 2, 3 }; subPub.SubscribeRegister(RegTopicType.R, regIds, frequency: 100).Wait(); Console.WriteLine("寄存器订阅成功/Register Subscription Successful"); // [ZH] 订阅IO // [EN] Subscribe to IO var ioList = new (IOTopicType, int)[] { (IOTopicType.DI, 0), (IOTopicType.DO, 1) }; subPub.SubscribeIO(ioList, frequency: 100).Wait(); Console.WriteLine("IO订阅成功/IO Subscription Successful"); int messageCount = 0; int maxMessages = 10; // 接收10条消息后停止 Console.WriteLine("开始接收消息/Starting to receive messages..."); // [ZH] 开始接收消息(回调方式) // [EN] Start receiving messages (callback method) subPub .StartReceiving(async message => { messageCount++; Console.WriteLine($"\n=== 收到第{messageCount}条消息/Received Message #{messageCount} ==="); foreach (var kv in message) { Console.WriteLine($"{kv.Key}: {kv.Value}"); } // [ZH] 接收指定数量消息后主动断开 // [EN] Disconnect after receiving specified number of messages if (messageCount >= maxMessages) { Console.WriteLine( $"已接收{maxMessages}条消息,准备断开连接/Received {maxMessages} messages, preparing to disconnect" ); subPub.Disconnect().Wait(); Console.WriteLine("WebSocket断开成功/WebSocket Disconnected Successfully"); } await Task.CompletedTask; }) .Wait(); Console.WriteLine("回调方式接收消息测试完成/Callback Receiving Test Completed"); return StatusCode.OK; } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); return StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } } } ``` ## 4.13.7 接收下一条文本消息 [​](#4-13-7) | 方法名 | **SubPub.Receive**() | | ---------- | ---------------------------------------------- | | 描述 | 接收下一条文本消息并返回 | | 请求参数 | 无 | | 返回值 | Task>:接收到的消息字典 | | 兼容的机器人软件版本 | 协作 (Copper): v7.7.0.0+ 工业 (Bronze): v7.7.0.0+ | 示例代码 SubPub/PollingReceiving.cs ```cs using Agilebot.IR; using Agilebot.IR.SubPub; using Agilebot.IR.Types; public class PollingReceiving { 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."); // [ZH] 初始化捷勃特机器人SubPub // [EN] Initialize the Agilebot robot SubPub var subPub = controller.SubPub; try { Console.WriteLine("开始轮询方式接收消息测试/Starting Polling Receiving Test"); // [ZH] 连接到WebSocket服务器 // [EN] Connect to WebSocket server subPub.Connect().Wait(); Console.WriteLine("WebSocket连接成功/WebSocket Connected Successfully"); // [ZH] 订阅机器人状态 // [EN] Subscribe to robot status var topicTypes = new RobotTopicType[] { RobotTopicType.TopicCurrentJoint, RobotTopicType.TopicRobotStatus }; subPub.SubscribeStatus(topicTypes, frequency: 100).Wait(); Console.WriteLine("机器人状态订阅成功/Robot Status Subscription Successful"); // [ZH] 订阅寄存器 // [EN] Subscribe to registers var regIds = new int[] { 1, 2, 3 }; subPub.SubscribeRegister(RegTopicType.R, regIds, frequency: 100).Wait(); Console.WriteLine("寄存器订阅成功/Register Subscription Successful"); // [ZH] 订阅IO // [EN] Subscribe to IO var ioList = new (IOTopicType, int)[] { (IOTopicType.DI, 0), (IOTopicType.DO, 1) }; subPub.SubscribeIO(ioList, frequency: 100).Wait(); Console.WriteLine("IO订阅成功/IO Subscription Successful"); int messageCount = 0; int maxMessages = 10; // 接收10条消息后停止 Console.WriteLine("开始轮询接收消息/Starting to poll messages..."); // [ZH] 循环接收消息直到达到期望数量 // [EN] Loop to receive messages until reaching desired count do { messageCount++; try { // [ZH] 接收单条消息 // [EN] Receive single message var message = subPub.Receive().Result; Console.WriteLine($"\n=== 收到第{messageCount}条消息/Received Message #{messageCount} ==="); foreach (var kv in message) { Console.WriteLine($"{kv.Key}: {kv.Value}"); } } catch (Exception ex) { Console.WriteLine($"接收消息时发生异常/Exception while receiving message: {ex.Message}"); break; } } while (messageCount < maxMessages); // [ZH] 断开连接 // [EN] Disconnect subPub.Disconnect().Wait(); Console.WriteLine("WebSocket断开成功/WebSocket Disconnected Successfully"); Console.WriteLine("轮询方式接收消息测试完成/Polling Receiving Test Completed"); return StatusCode.OK; } catch (Exception ex) { Console.WriteLine($"执行过程中发生异常/Exception occurred during execution: {ex.Message}"); return StatusCode.OtherReason; } finally { // [ZH] 关闭连接 // [EN] Close the connection StatusCode disconnectCode = controller.Disconnect(); if (disconnectCode != StatusCode.OK) { Console.WriteLine(disconnectCode.GetDescription()); if (code == StatusCode.OK) code = disconnectCode; } } } } ``` --- url: /zh/2-csharp/Agilebot_Robot_CSharp_SDK_ChangeLog.html title: 捷勃特机器人 C# SDK 更新说明 --- # 捷勃特机器人 C# SDK 更新说明 [​](#捷勃特机器人-c-sdk-更新说明) ## 2.0.3.\* 更新(2025/12/17) [​](#203更新20251217) 1. Arm 构造函数增加 teachPanelIP 参数 2. 去除 System.Text.Json 依赖 3. 增加同步连接接口 ConnectSync ## 2.0.2.\* 更新(2025/12/12) [​](#202更新20251212) 1. 修复 PR 寄存器结构体中数据读写顺序错误 ## 2.0.1.\* 更新(2025/10/21) [​](#201更新20251021) 1. 修复 jogging 持续运动时卡顿的问题 2. 修复构建项目时可能会报 proxy 执行文件无法复制的问题 ## 2.0.0.\* 更新(2025/9/10) [​](#200更新2025910) 1. 修改底层请求模式,添加本地控制器代理服务 2. 添加订阅功能 3. 调整 BasScript 类结构 4. 全面支持 .NET Framework 和 .NET ## 1.0.1.0 更新(2025/7/7) [​](#1010更新202577) 1. 增加旧的寄存器接口类 RegistersOld 兼容 7.6.0.0 以前的机器人版本 2. 增加 Estop 紧急制动接口 3. 修复文档中的示例程序 ## 1.0.0.0 更新(2025/5/30) [​](#1000更新2025530) 1. 改用 RPC 方式实现 2. 所有接口定义同步 Python 版本 --- url: /zh/3-help/ai-coding.html title: AI 编程支持 --- # AI 编程支持 [​](#ai-编程支持) 本文档介绍如何使用 AI 辅助工具(如 CodeBuddy、Codex、Cursor 等)快速开发机器人插件。 ## 准备工作 [​](#准备工作) 使用 AI 编程前,需要准备参考文档: * **SDK 文档**: > **提示**:如果您使用的 AI Agent 无法很好地读取 URL,建议将以上 txt 文档下载到本地项目目录中,然后在 prompt 中引用本地文件路径。 ## 示例 Prompt [​](#示例-prompt) 以下是一个完整的示例,用于创建一个读取机器人状态的 Python 程序: ``` 阅读以下文档,写一个Python程序,用于读取机器人的当前位置、坐标系编号、伺服状态等信息。 参考资料: SDK文档:https://dev.sh-agilebot.com/docs/sdk/knowledge/docs.txt ``` 如果使用本地文档,可以修改为: ``` 阅读以下文档,写一个Python程序,用于读取机器人的当前位置、坐标系编号、伺服状态等信息。 参考资料: SDK文档:./docs/sdk_docs.txt ``` ## 使用技巧 [​](#使用技巧) 1. **明确需求**:清晰描述要实现的功能 2. **提供上下文**:引用相关文档和示例 3. **分步实现**:复杂功能可以分步骤让 AI 生成 ## 注意事项 [​](#注意事项) 1. AI 生成的代码需要经过验证和测试 2. 确保代码符合项目编码规范 3. 涉及机器人控制的代码必须进行安全审查 --- url: /zh/1-python/0-prologue/ title: 序章 --- # 序章 [​](#序章) --- url: /zh/1-python/1-intro/ title: 1 简介与部署 --- # 1 简介与部署 [​](#1) --- url: /zh/1-python/4-methods/ title: 4 方法与示例 --- # 4 方法与示例 [​](#4) --- url: /zh/1-python/ title: Python SDK --- # Python SDK [​](#python-sdk) --- url: /zh/2-csharp/0-prologue/ title: 序章 --- # 序章 [​](#序章) --- url: /zh/2-csharp/1-intro/ title: 1 简介与部署 --- # 1 简介与部署 [​](#1) --- url: /zh/2-csharp/4-methods/ title: 4 方法与示例 --- # 4 方法与示例 [​](#4) --- url: /zh/2-csharp/ title: C# SDK --- # C# SDK [​](#c-sdk) --- url: /zh/3-help/ title: 帮助 --- # 帮助 [​](#帮助) --- url: /zh/ title: Agilebot Robot SDK --- # Agilebot Robot SDK捷勃特机器人 SDK [Python SDK](./1-python/0-prologue/0.1-version.html) [C# SDK](./2-csharp/0-prologue/0.1-version.html) 💻 ## 多语言支持 提供Python和C#两种SDK版本,满足不同开发环境和团队的技术栈需求。 🤖 ## 机器人运动控制 完整的机器人运动控制API,支持关节运动、直线运动、轨迹规划和实时控制。 ⚡ ## 实时数据交互 基于gRPC的高性能通信机制,支持实时状态监控、寄存器读写和硬件状态获取。 👁️ ## 飞拍视觉功能 集成飞拍视觉系统,支持高速运动中的精确视觉识别和定位功能。 🔧 ## ROS2集成 提供ROS2接口支持,便于集成到现有的机器人生态系统和工作流中。 🌐 ## 跨平台兼容 支持Windows和Ubuntu系统,兼容X86和ARM架构,适应多种硬件环境。 📚 ## 丰富示例代码 提供完整的示例程序和测试用例,帮助开发者快速上手和集成SDK功能。 🧩 ## 模块化设计 模块化的API设计,包括运动控制、IO操作、状态监控、文件管理等独立功能模块。